Subversion Repositories f9daq

Rev

Rev 173 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include "../include/sipmscan.h"
  2. #include "../include/workstation.h"
  3. #include "../include/substructure.h"
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. // Main window constructor (+layout) ---------------------------------
  9.  
  10. TGAppMainFrame::TGAppMainFrame(const TGWindow *p, int w, int h)
  11. {
  12.    TGCompositeFrame *fT1;
  13.    idtotal = 0;
  14.  
  15.    char *cTemp;
  16.  
  17.    // Prepare the default open directory (basedir)
  18.    currentMeasDir = new char[1024];
  19.    sprintf(currentMeasDir, "%s/results", rootdir);
  20.    currentAnalDir = new char[1024];
  21.    sprintf(currentAnalDir, "%s/results", rootdir);
  22.  
  23.    // CAMAC and Scope objects
  24.    gDaq = new daq();
  25.    gScopeDaq = new daqscope();
  26.  
  27.    // Define main window and menubar
  28.    fMain = new TGMainFrame(p, w, h, kVerticalFrame);
  29.    
  30.    // Initialize the menu
  31.    fMenuBar = new TGMenuBar(fMain, 200, 30);
  32.    InitMenu();
  33.    fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsExpandX | kLHintsTop));
  34.  
  35.    // Prepare the tabbed structure
  36.    fTab = new TGTab(fMain, 500, 500);
  37.  
  38.    // Read the layout we wish to use
  39.    int frmWidth[measwin+analysiswin], frmHeight[measwin+analysiswin];
  40.    LayoutRead(measwin+analysiswin, frmWidth, frmHeight);
  41.  
  42.    // Structure the measurement layout window
  43.    int *vert, *hor, *wPane, *hPane;
  44.  
  45.    vert = new int[2]; hor = new int;
  46.    *hor = 1;
  47.    vert[0] = 1; vert[1] = 0;
  48.  
  49.    const char *measFrmTit[] = {"Settings pane", "Display", "Main measurement window"};
  50.    wPane = new int[measwin]; hPane = new int[measwin];
  51.    for(int i = 0; i < measwin; i++)
  52.    {
  53.       wPane[i] = frmWidth[i];
  54.       hPane[i] = frmHeight[i];
  55.    }
  56.  
  57.    fT1 = fTab->AddTab("Measurement");
  58.    TGSplitter(fT1, "horizontal", hor, vert, measFrmTit, measLayout, wPane, hPane);
  59.    fT1->AddFrame(fLayout[idtotal], new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
  60.    idtotal++;
  61.    delete[] vert; delete hor; delete[] wPane; delete[] hPane;
  62.  
  63.    // Structure the analysis layout window
  64.    vert = new int[2]; hor = new int;
  65.    *hor = 1;
  66.    vert[0] = 1; vert[1] = 1;
  67.  
  68.    const char *analysisFrmTit[] = {"Histogram file selection", "Analysis", "Histogram", "Histogram controls"};
  69.    wPane = new int[analysiswin]; hPane = new int[analysiswin];
  70.    for(int i = 0; i < analysiswin; i++)
  71.    {
  72.       wPane[i] = frmWidth[i+measwin];
  73.       hPane[i] = frmHeight[i+measwin];
  74.    }
  75.  
  76.    fT1 = fTab->AddTab("Analysis");
  77.    TGSplitter(fT1, "horizontal", hor, vert, analysisFrmTit, analysisLayout, wPane, hPane);
  78.    fT1->AddFrame(fLayout[idtotal], new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
  79.    idtotal++;
  80.    delete[] vert; delete hor; delete[] wPane; delete[] hPane;
  81.  
  82.    // Structure the monitoring layout window (Fieldpoint) //TODO
  83.    fT1 = fTab->AddTab("Monitoring");
  84.    fTab->SetEnabled(2,kFALSE); //TODO
  85.  
  86.    // Structure the help layout window
  87.    fT1 = fTab->AddTab("Help");
  88.    TGTextView *helpdesc;
  89.    const TGFont *tfont = gClient->GetFont(HELPFONT);
  90.    FontStruct_t helpFont = tfont->GetFontStruct();
  91.    helpdesc = new TGTextView(fT1,100,100);
  92.    helpdesc->SetFont(helpFont);
  93.    helpdesc->SetForegroundColor(0x000000);
  94.    fT1->AddFrame(helpdesc, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
  95.    
  96.    cTemp = new char[1024];
  97.    sprintf(cTemp, "%s/doc/README", rootdir);
  98.    if(helpdesc->LoadFile(cTemp))
  99.    {
  100.       if(DBGSIG) printf("TGAppMainFrame(): Help file correctly loaded.\n");
  101.    }
  102.    else
  103.       printf("Error! Help file not loaded.\n");
  104.    delete[] cTemp;
  105.    helpdesc->AddLine("");
  106.  
  107.    fMain->AddFrame(fTab, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
  108.  
  109.    // Set the inner layout of each frame
  110.    AppLayout();
  111.  
  112.    fMain->SetWindowName(WINDOW_NAME);
  113.    fMain->MapSubwindows();
  114.    fMain->MapWindow();
  115.    fMain->Layout();
  116.  
  117.    // Prepare initial settings
  118.    EnableScan(0);       //.
  119.    EnableScan(1);       // Grey out scan
  120.    EnableScan(2);       // options by default
  121.    EnableScan(3);       //.
  122.    EnableLiveUpdate();  //. Disable the live histogram update at beginning
  123.    VoltOut(1);          //. Get the output voltage save in file
  124.    HistogramOptions(1); //. Enable clean plots by default
  125.    plotType->widgetTB[0]->SetDown(kTRUE);                       //.
  126.    fMenuHisttype->CheckEntry(M_ANALYSIS_HISTTYPE_1DADC);        // Set the ADC histogram
  127.    fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC);      // to show by default
  128.    fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D);         //.
  129.    acqStarted = false;  //. At program start, the acquisition is stopped
  130.    ToolTipSet();        //. Turn on tooltips
  131.    PositionSet(1);      //. Get starting table position
  132.    RotationSet(1);      //. Get starting rotation
  133.  
  134.    if(DBGSIG > 1)
  135.    {
  136.       printf("TGAppMainFrame(): At end of constructor\n");
  137.       gObjectTable->Print();
  138.    }
  139. }
  140.  
  141. TGAppMainFrame::~TGAppMainFrame()
  142. {
  143.    fMain->Cleanup();
  144.    delete fMain;
  145. }
  146.  
  147. // -------------------------------------------------------------------
  148.  
  149. // Event handler for menubar actions ---------------------------------
  150.  
  151. void TGAppMainFrame::HandleMenu(Int_t id)
  152. {
  153.    int ret = 0;
  154.    char cmd[256];
  155.  
  156.    switch(id)
  157.    {
  158.       case M_FILE_SET_LAYOUT:
  159.          LayoutSet();
  160.          break;
  161.  
  162.       case M_FILE_SAVE_LAYOUT:
  163.          LayoutSave();
  164.          break;
  165.  
  166.       case M_FILE_SAVE_MSETTINGS:
  167.          SaveMeasSettings();
  168.          break;
  169.  
  170.       case M_FILE_SAVE_ASETTINGS:
  171.          SaveAnalSettings();
  172.          break;
  173.  
  174.       case M_FILE_DEF_MSETTINGS:
  175.          printf("Reseting measurement settings to default.\n");
  176.          sprintf(cmd, "cp %s/settings/default_measurement_settings.txt %s/settings/measurement_settings.txt", rootdir, rootdir);
  177.          ret = system(cmd);
  178.          break;
  179.  
  180.       case M_FILE_DEF_ASETTINGS:
  181.          printf("Reseting analysis settings to default.\n");
  182.          sprintf(cmd, "cp %s/settings/default_analysis_settings.txt %s/settings/analysis_settings.txt", rootdir, rootdir);
  183.          ret = system(cmd);
  184.          break;
  185.  
  186.       case M_FILE_DEF_SETTINGS:
  187.          printf("Reseting all settings to default.\n");
  188.          sprintf(cmd, "cp %s/settings/default_measurement_settings.txt %s/settings/measurement_settings.txt", rootdir, rootdir);
  189.          ret = system(cmd);
  190.          sprintf(cmd, "cp %s/settings/default_analysis_settings.txt %s/settings/analysis_settings.txt", rootdir, rootdir);
  191.          ret = system(cmd);
  192.          break;
  193.  
  194.       case M_FILE_CHECK_WIDTH:
  195.          printf("\nSettings window: %dx%d\n", measLayout[0]->GetWidth(), measLayout[0]->GetHeight());
  196.          printf("Histogram window: %dx%d\n", measLayout[1]->GetWidth(), measLayout[1]->GetHeight());
  197.          printf("Main measurement window: %dx%d\n", measLayout[2]->GetWidth(), measLayout[2]->GetHeight());
  198.          printf("Histogram file window: %dx%d\n", analysisLayout[0]->GetWidth(), analysisLayout[0]->GetHeight());
  199.          printf("Analysis window: %dx%d\n", analysisLayout[1]->GetWidth(), analysisLayout[1]->GetHeight());
  200.          printf("Histogram window: %dx%d\n", analysisLayout[2]->GetWidth(), analysisLayout[2]->GetHeight());
  201.          printf("Histogram controls window: %dx%d\n", analysisLayout[3]->GetWidth(), analysisLayout[3]->GetHeight());
  202.  
  203.          printf("Main window: %dx%d\n", fMain->GetWidth(), fMain->GetHeight());
  204.          printf("Menu bar: %dx%d\n", fMenuBar->GetWidth(), fMenuBar->GetHeight());
  205.          printf("Tab window: %dx%d\n", fTab->GetWidth(), fTab->GetHeight());
  206.          break;
  207.  
  208.       case M_FILE_EXIT:
  209.          CloseWindow();
  210.          break;
  211.  
  212.       case M_ANALYSIS_HISTTYPE_1DADC:
  213.          ChangeHisttype(0);
  214.          break;
  215.  
  216.       case M_ANALYSIS_HISTTYPE_1DTDC:
  217.          ChangeHisttype(1);
  218.          break;
  219.  
  220.       case M_ANALYSIS_HISTTYPE_2D:
  221.          ChangeHisttype(2);
  222.          break;
  223.  
  224.       case M_ANALYSIS_INTEG:
  225.          fTab->SetTab(1);
  226.          analTab->SetTab(0);
  227.          for(int i = 0; i < 3; i++)
  228.          {
  229.             if(intSpect->widgetChBox[i]->IsDown())
  230.                intSpect->widgetChBox[i]->SetState(kButtonUp);
  231.          }
  232.          break;
  233.  
  234.       case M_ANALYSIS_INTEGX:
  235.          fTab->SetTab(1);
  236.          analTab->SetTab(0);
  237.          for(int i = 0; i < 3; i++)
  238.          {
  239.             if(i == 0)
  240.                intSpect->widgetChBox[i]->SetState(kButtonDown);
  241.             else
  242.             {
  243.                if(intSpect->widgetChBox[i]->IsDown())
  244.                   intSpect->widgetChBox[i]->SetState(kButtonUp);
  245.             }
  246.          }
  247.          break;
  248.  
  249.       case M_ANALYSIS_INTEGY:
  250.          fTab->SetTab(1);
  251.          analTab->SetTab(0);
  252.          for(int i = 0; i < 3; i++)
  253.          {
  254.             if(i == 1)
  255.                intSpect->widgetChBox[i]->SetState(kButtonDown);
  256.             else
  257.             {
  258.                if(intSpect->widgetChBox[i]->IsDown())
  259.                   intSpect->widgetChBox[i]->SetState(kButtonUp);
  260.             }
  261.          }
  262.          break;
  263.  
  264.       case M_ANALYSIS_PHOTMU:
  265.          fTab->SetTab(1);
  266.          analTab->SetTab(1);
  267.          for(int i = 0; i < 3; i++)
  268.          {
  269.             if(i == 2)
  270.                intSpect->widgetChBox[i]->SetState(kButtonDown);
  271.             else
  272.             {
  273.                if(intSpect->widgetChBox[i]->IsDown())
  274.                   intSpect->widgetChBox[i]->SetState(kButtonUp);
  275.             }
  276.          }
  277.          break;
  278.  
  279.       case M_ANALYSIS_BREAKDOWN:
  280.          fTab->SetTab(1);
  281.          analTab->SetTab(2);
  282.          break;
  283.  
  284.       case M_ANALYSIS_SURFSCAN:
  285.          fTab->SetTab(1);
  286.          analTab->SetTab(3);
  287.          break;
  288.  
  289.       case M_ANALYSIS_TIMING:
  290.          fTab->SetTab(1);
  291.          analTab->SetTab(4);
  292.          break;
  293.  
  294.       case M_HELP_WEBHELP:
  295.          printf("TGAppMainFrame::HandleMenu(): Opening %s/doc/documentation.html in a web browser.\n", rootdir);
  296.          sprintf(cmd, "xdg-open %s/doc/documentation.html &", rootdir);
  297.          system(cmd);
  298.          break;
  299.  
  300.       case M_HELP_ABOUT:
  301.          About();
  302.          break;
  303.  
  304.       default:
  305. //         fMainFrame->SetCurrent(id);
  306.          break;
  307.    }
  308. }
  309.  
  310. // -------------------------------------------------------------------
  311.  
  312. // Initialize the main window menu -----------------------------------
  313.  
  314. void TGAppMainFrame::InitMenu()
  315. {
  316.    fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
  317.  
  318.    // Popup menu in menubar for File controls
  319.    fMenuFile = new TGPopupMenu(gClient->GetRoot());
  320.    fMenuFile->AddEntry(new TGHotString("Set &user layout"), M_FILE_SET_LAYOUT);
  321.    fMenuFile->AddEntry(new TGHotString("Save &current layout"), M_FILE_SAVE_LAYOUT);
  322.    fMenuFile->AddSeparator();
  323.    fMenuFile->AddEntry(new TGHotString("Save current &measurement settings"), M_FILE_SAVE_MSETTINGS);
  324.    fMenuFile->AddEntry(new TGHotString("Save current &analysis settings"), M_FILE_SAVE_ASETTINGS);
  325.    fMenuFile->AddEntry(new TGHotString("Set default measurement settings"), M_FILE_DEF_MSETTINGS);
  326.    fMenuFile->AddEntry(new TGHotString("Set default analysis settings"), M_FILE_DEF_ASETTINGS);
  327.    fMenuFile->AddEntry(new TGHotString("Set default settings"), M_FILE_DEF_SETTINGS);
  328.    fMenuFile->AddEntry(new TGHotString("&Check frame width (Testing)"), M_FILE_CHECK_WIDTH);
  329.    fMenuFile->AddSeparator();
  330.    fMenuFile->AddEntry(new TGHotString("E&xit"), M_FILE_EXIT);
  331.  
  332.    // Popup menu in menubar for Analysis controls
  333.    fMenuHisttype = new TGPopupMenu(gClient->GetRoot()); // adds a cascade menu that will be incorporated into analysis controls
  334.    fMenuHisttype->AddEntry(new TGHotString("1D &ADC histogram"), M_ANALYSIS_HISTTYPE_1DADC);
  335.    fMenuHisttype->AddEntry(new TGHotString("1D &TDC histogram"), M_ANALYSIS_HISTTYPE_1DTDC);
  336.    fMenuHisttype->AddEntry(new TGHotString("&2D ADC vs. TDC histogram"), M_ANALYSIS_HISTTYPE_2D);
  337.  
  338.    fMenuAnalysis = new TGPopupMenu(gClient->GetRoot()); // adds a new popup menu to the menubar
  339.    fMenuAnalysis->AddPopup(new TGHotString("&Histogram type"), fMenuHisttype);
  340.    fMenuAnalysis->AddEntry(new TGHotString("&Integrate spectrum"), M_ANALYSIS_INTEG);
  341.    fMenuAnalysis->AddEntry(new TGHotString("Integrate spectrum (&X direction)"), M_ANALYSIS_INTEGX);
  342.    fMenuAnalysis->AddEntry(new TGHotString("Integrate spectrum (&Y direction)"), M_ANALYSIS_INTEGY);
  343.    fMenuAnalysis->AddEntry(new TGHotString("&Relative PDE"), M_ANALYSIS_PHOTMU);
  344.    fMenuAnalysis->AddEntry(new TGHotString("&Breakdown voltage"), M_ANALYSIS_BREAKDOWN);
  345.    fMenuAnalysis->AddEntry(new TGHotString("Surface 2&D scan"), M_ANALYSIS_SURFSCAN);
  346.    fMenuAnalysis->AddEntry(new TGHotString("&Timing analysis"), M_ANALYSIS_TIMING);
  347.  
  348.    // Popup menu in menubar for File controls
  349.    fMenuHelp = new TGPopupMenu(gClient->GetRoot());
  350.    fMenuHelp->AddEntry(new TGHotString("Open &help in web browser"), M_HELP_WEBHELP);
  351.    fMenuHelp->AddEntry(new TGHotString("&About"), M_HELP_ABOUT);
  352.  
  353.    // Connect all menu items with actions
  354.    fMenuFile->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
  355.    fMenuAnalysis->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
  356.    fMenuHelp->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
  357.  
  358.    // Draw the created popup menus on the menubar
  359.    fMenuBar->AddPopup(new TGHotString("&File"), fMenuFile, fMenuBarItemLayout);
  360.    fMenuBar->AddPopup(new TGHotString("&Analysis"),fMenuAnalysis,fMenuBarItemLayout);
  361.    fMenuBar->AddPopup(new TGHotString("&Help"), fMenuHelp, fMenuBarItemLayout);
  362. }
  363.  
  364. // -------------------------------------------------------------------
  365.  
  366. // Setting the application subwindow layout --------------------------
  367.  
  368. void TGAppMainFrame::AppLayout()
  369. {
  370.    double numform[6], numform2[6];
  371.    int *checksel;
  372.    char selected[256];
  373.    int subgroup[2];
  374.    TGCompositeFrame *fH1, *fV1, *fH2, *fT1;
  375.    TGGroupFrame *fG1;
  376.  
  377.    TGLayoutHints *f0centerX = new TGLayoutHints(kLHintsCenterX,2,2,2,2);
  378.    TGLayoutHints *f0leftX = new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2);
  379.    TGLayoutHints *f0leftXnoleft = new TGLayoutHints(kLHintsLeft | kLHintsTop,0,2,2,2);
  380.    TGLayoutHints *f0leftXpad = new TGLayoutHints(kLHintsLeft | kLHintsTop,12,12,2,2);
  381.    TGLayoutHints *f0rightX = new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2);
  382.    TGLayoutHints *f0rightXpad = new TGLayoutHints(kLHintsRight | kLHintsTop,12,12,2,2);
  383.    TGLayoutHints *f0centerY = new TGLayoutHints(kLHintsCenterY,2,2,2,2);
  384.    TGLayoutHints *f0center2d = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,2,2,2,2);
  385.    TGLayoutHints *f1expandX = new TGLayoutHints(kLHintsExpandX,2,2,2,2);
  386.    TGLayoutHints *f1expand2d = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,2,2,2,2);
  387.    TGLayoutHints *f1expandXpad = new TGLayoutHints(kLHintsExpandX,12,12,2,2);
  388.  
  389. // Settings pane ---------------------------------------------------------------------------
  390.    subgroup[0] = (measLayout[0]->GetWidth())-4;
  391.  
  392.    // Check buttons to toggle voltage, surface and Z axis scans
  393.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *scansOn -> 4 check buttons (voltage, surface, Z axis, incidence angle scans)\n");
  394.    scansOn = new TSubStructure();
  395.    checksel = new int[4];
  396.    checksel[0] = 0; checksel[1] = 0; checksel[2] = 0; checksel[3] = 0;
  397.    const char *selnames[] = {"Voltage scan ON/OFF", "Surface scan ON/OFF", "Z-axis scan ON/OFF","Rotation scan ON/OFF","0","0","0","0","0","0","0","0","0","0","0","0"};
  398.    if(scansOn->TGCheckList(measLayout[0], subgroup[0], 30, 4, selnames, checksel, "vertical", "center"))
  399.       measLayout[0]->AddFrame(scansOn->outsidebox, f1expandXpad);
  400.    delete[] checksel;
  401.  
  402.    // Hard limit for maximum voltage we can set
  403.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vHardlimit -> Number entry for voltage limit\n");
  404.    vHardlimit = new TSubStructure();
  405.    for(int i = 0; i < 6; i++) numform[i] = 0;
  406.    numform[0] = 6; numform[1] = 2;
  407.    if(vHardlimit->TGLabelNEntry(measLayout[0], subgroup[0], 30, "Voltage limit:", 70.00, numform, "center"))
  408.       measLayout[0]->AddFrame(vHardlimit->outsidebox, f1expandXpad);
  409.  
  410.    // Number of used channels
  411.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *NCH -> Number entry for number of channels to capture\n");
  412.    NCH = new TSubStructure();
  413.    for(int i = 0; i < 6; i++) numform[i] = 0;
  414.    numform[0] = 3; numform[2] = 2; numform[3] = 2; numform[4] = 1; numform[5] = 8;
  415.    if(NCH->TGLabelNEntry(measLayout[0], subgroup[0], 30, "Nr. of channels:", 1, numform, "center"))
  416.       measLayout[0]->AddFrame(NCH->outsidebox, f1expandXpad);
  417.  
  418.    // Select the units to use for table positioning (micrometer, table position units)
  419.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *posUnits -> Dropdown menu for selecting the units for table positioning\n");
  420.    posUnits = new TSubStructure();
  421.    selnames[0] = "table units"; selnames[1] = "micrometers";
  422.    sprintf(selected, "table units");
  423.    if(posUnits->TGLabelDrop(measLayout[0], 2*subgroup[0]/3, 30, "Position units:", 2, selnames, selected))
  424.       measLayout[0]->AddFrame(posUnits->outsidebox, f1expandXpad);
  425.  
  426.    // Select the units to use for rotation platform (degrees, table rotation units)
  427.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotUnits -> Dropdown menu for selecting the units for rotation\n");
  428.    rotUnits = new TSubStructure();
  429.    selnames[0] = "table units"; selnames[1] = "degrees";
  430.    sprintf(selected, "degrees");
  431.    if(rotUnits->TGLabelDrop(measLayout[0], 2*subgroup[0]/3, 30, "Rotation units:", 2, selnames, selected))
  432.       measLayout[0]->AddFrame(rotUnits->outsidebox, f1expandXpad);
  433.  
  434.    // Button and textbox to enter the oscilloscope IP address
  435.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *oscConnect -> Text Entry (oscilloscope IP address)\n");
  436.    oscConnect = new TSubStructure();
  437.    if(oscConnect->TGLabelTEntryButton(measLayout[0], subgroup[0], 30, "Scope IP:", "178.172.43.157", "Connect", "twoline"))
  438.       measLayout[0]->AddFrame(oscConnect->outsidebox, f1expandXpad);
  439.  
  440.    // Laser settings (freq., tune, ND filter)
  441.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *laserInfo -> Text Entry (Laser setting information)\n");
  442.    laserInfo = new TSubStructure();
  443.    if(laserInfo->TGLabelTEntry(measLayout[0], subgroup[0], 30, "Laser settings:", "kHz, tune, ND", "twoline"))
  444.       measLayout[0]->AddFrame(laserInfo->outsidebox, f1expandXpad);
  445.  
  446.    // Chamber temperature (will only be manually set until we can get it directly from the chamber)
  447.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *chtemp -> Number entry for chamber temperature\n");
  448.    chtemp = new TSubStructure();
  449.    for(int i = 0; i < 6; i++) numform[i] = 0;
  450.    numform[0] = 5; numform[1] = 1; numform[3] = 2; numform[4] = -70.; numform[5] = 140.;
  451.    if(chtemp->TGLabelNEntry(measLayout[0], subgroup[0], 30, "Chamber temp.:", 25.0, numform, "center"))
  452.       measLayout[0]->AddFrame(chtemp->outsidebox, f1expandXpad);
  453.  
  454.    // Check button to toggle live update of histogram (in display canvas)
  455.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *liveDisp -> 1 check button (live histogram update)\n");
  456.    liveDisp = new TSubStructure();
  457.    checksel = new int;
  458.    *checksel = 0;
  459.    selnames[0] = "Live histogram ON/OFF";
  460.    if(liveDisp->TGCheckList(measLayout[0], subgroup[0], 30, 1, selnames, checksel, "vertical", "center"))
  461.       measLayout[0]->AddFrame(liveDisp->outsidebox, f1expandXpad);
  462.    delete checksel;
  463.  
  464.    // Actions for Settings pane //TODO
  465.    scansOn->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EnableScan(=0)");
  466.    scansOn->widgetChBox[1]->Connect("Clicked()", "TGAppMainFrame", this, "EnableScan(=1)");
  467.    scansOn->widgetChBox[2]->Connect("Clicked()", "TGAppMainFrame", this, "EnableScan(=2)");
  468.    scansOn->widgetChBox[3]->Connect("Clicked()", "TGAppMainFrame", this, "EnableScan(=3)");
  469.    vHardlimit->widgetNE[0]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "VoltageLimit()");
  470.    (vHardlimit->widgetNE[0]->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "VoltageLimit()");
  471.    posUnits->widgetCB->Connect("Selected(Int_t)", "TGAppMainFrame", this, "ChangeUnits(Int_t)");
  472.    rotUnits->widgetCB->Connect("Selected(Int_t)", "TGAppMainFrame", this, "ChangeUnitsRot(Int_t)");
  473.    liveDisp->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EnableLiveUpdate()");
  474. // Settings pane ---------------------------------------------------------------------------
  475.  
  476. // Main window -----------------------------------------------------------------------------
  477.    TGTab *setTab;
  478.  
  479.    // Voltage, position and incidence angle tab
  480.    subgroup[0] = 2*(measLayout[2]->GetWidth())/7-14;
  481.    subgroup[1] = (measLayout[2]->GetHeight())/2-4;
  482.    setTab = new TGTab(measLayout[2], subgroup[0], subgroup[1]);
  483.  
  484.    fT1 = setTab->AddTab("Voltage, position and incidence angle");
  485.    fH1 = new TGCompositeFrame(fT1, measLayout[2]->GetWidth(), subgroup[1], kFixedHeight | kHorizontalFrame);
  486.  
  487.    // Left pane (Bias voltage controls)
  488.    fV1 = new TGCompositeFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight | kVerticalFrame);
  489.    fG1 = new TGGroupFrame(fV1, "Bias voltage controls");
  490.  
  491.    // Output voltage supply channel
  492.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOutCh -> Dropdown menu for bias voltage channel\n");
  493.    vOutCh = new TSubStructure();
  494.    selnames[0] = "U0"; selnames[1] = "U1"; selnames[2] = "U2"; selnames[3] = "U3"; selnames[4] = "U4"; selnames[5] = "U5"; selnames[6] = "U6"; selnames[7] = "U7"; selnames[8] = "U100"; selnames[9] = "U101"; selnames[10] = "U102"; selnames[11] = "U103"; selnames[12] = "U104"; selnames[13] = "U105"; selnames[14] = "U106"; selnames[15] = "U107";
  495.    sprintf(selected, "U0");
  496.    if(vOutCh->TGLabelDrop(fG1, 2*subgroup[0]/3, 30, "Output channel:", 16, selnames, selected))
  497.       fG1->AddFrame(vOutCh->outsidebox, f1expandXpad);
  498.  
  499.    // Output voltage setting
  500.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOutOpt -> 2 check buttons (negative polarity, ON/OFF toggle switch)\n");
  501.    vOutOpt = new TSubStructure();
  502.    checksel = new int[2];
  503.    checksel[0] = 0; checksel[1] = 0;
  504.    selnames[1] = "Output ON/OFF"; selnames[0] = "Negative polarity";
  505.    if(vOutOpt->TGCheckList(fG1, 3*subgroup[0]/4, 30, 2, selnames, checksel, "vertical", "center"))
  506.       fG1->AddFrame(vOutOpt->outsidebox, f1expandXpad);
  507.    delete[] checksel;
  508.  
  509.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOut -> Number entry for bias voltage\n");
  510.    vOut = new TSubStructure();
  511.    for(int i = 0; i < 6; i++) numform[i] = 0;
  512.    numform[0] = 7; numform[1] = 2; numform[3] = 2; numform[4] = 0.; numform[5] = vHardlimit->widgetNE[0]->GetNumber();
  513.    if(vOut->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "Output voltage:", 0.00, numform, "center"))
  514.       fG1->AddFrame(vOut->outsidebox, f1expandXpad);
  515.    
  516.    // Set, get and reset voltage buttons
  517.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOutButtons -> 3 buttons (set bias voltage, read current bias voltage, reset voltage output when it gets interlocked)\n");
  518.    vOutButtons = new TSubStructure();
  519.    selnames[0] = "Set"; selnames[1] = "Get"; selnames[2] = "Reset";
  520.    if(vOutButtons->TGMultiButton(fG1, 3*subgroup[0]/4, 30, 3, selnames, "center"))
  521.       fG1->AddFrame(vOutButtons->outsidebox, f1expandXpad);
  522.  
  523.    // Voltage scan controls
  524.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOutStart -> Number entry for starting bias voltage\n");
  525.    vOutStart = new TSubStructure();
  526.    for(int i = 0; i < 6; i++) numform[i] = 0;
  527.    numform[0] = 7; numform[1] = 2;
  528.    if(vOutStart->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "V (min):", 0.00, numform, "center"))
  529.       fG1->AddFrame(vOutStart->outsidebox, f1expandXpad);
  530.  
  531.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOutStop -> Number entry for starting bias voltage\n");
  532.    vOutStop = new TSubStructure();
  533.    for(int i = 0; i < 6; i++) numform[i] = 0;
  534.    numform[0] = 7; numform[1] = 2;
  535.    if(vOutStop->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "V (max):", 0.00, numform, "center"))
  536.       fG1->AddFrame(vOutStop->outsidebox, f1expandXpad);
  537.  
  538.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *vOutStep -> Number entry for starting bias voltage\n");
  539.    vOutStep = new TSubStructure();
  540.    for(int i = 0; i < 6; i++) numform[i] = 0;
  541.    numform[0] = 7; numform[1] = 2;
  542.    if(vOutStep->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "V (step):", 0.00, numform, "center"))
  543.       fG1->AddFrame(vOutStep->outsidebox, f1expandXpad);
  544.  
  545.    fV1->AddFrame(fG1, f1expand2d);
  546.    // Left pane (Bias voltage controls)
  547.    fH1->AddFrame(fV1, f0leftX);
  548.  
  549.    // Center pane (Table position controls)
  550.    subgroup[0] = 3*(measLayout[2]->GetWidth())/7-13;
  551.    fV1 = new TGCompositeFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight | kVerticalFrame);
  552.    fG1 = new TGGroupFrame(fV1, "Table position controls");
  553.  
  554.    // X, Y and Z positions
  555.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *xPos, *yPos, *zPos, *zPosMin, *zPosMax, *zPosStep -> Settings for position and Z axis scan\n");
  556.    fH2 = new TGCompositeFrame(fG1, 3*subgroup[0]/4, 30, kFixedWidth | kHorizontalFrame);
  557.    xPos = new TSubStructure();
  558.    for(int i = 0; i < 6; i++) numform[i] = 0;
  559.    numform[0] = 9; numform[3] = 2; numform[4] = -100; numform[5] = 375000; //numform[4] = -100; numform[5] = 215000;    // use commented part if Z is the longer axis and X the shorter
  560.    if(xPos->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "X:", 0, numform, "center"))
  561.       fH2->AddFrame(xPos->outsidebox, f0centerX);
  562.  
  563.    zPosMin = new TSubStructure();
  564.    numform[5] = 215000; //numform[5] = 375000;  // use commented part if Z is the longer axis and X the shorter
  565.    if(zPosMin->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Z (min):", 0, numform, "center"))
  566.       fH2->AddFrame(zPosMin->outsidebox, f0centerX);
  567.    fG1->AddFrame(fH2, f1expandXpad);
  568.  
  569.    fH2 = new TGCompositeFrame(fG1, 3*subgroup[0]/4, 30, kFixedWidth | kHorizontalFrame);
  570.    yPos = new TSubStructure();
  571.    numform[5] = 215000;
  572.    if(yPos->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Y:", 0, numform, "center"))
  573.       fH2->AddFrame(yPos->outsidebox, f0centerX);
  574.  
  575.    zPosMax = new TSubStructure();
  576.    numform[5] = 215000; //numform[5] = 375000;  // use commented part if Z is the longer axis and X the shorter
  577.    if(zPosMax->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Z (max):", 0, numform, "center"))
  578.       fH2->AddFrame(zPosMax->outsidebox, f0centerX);
  579.    fG1->AddFrame(fH2, f1expandXpad);
  580.    
  581.    fH2 = new TGCompositeFrame(fG1, 3*subgroup[0]/4, 30, kFixedWidth | kHorizontalFrame);
  582.    zPos = new TSubStructure();
  583.    numform[5] = 215000; //numform[5] = 375000;  // use commented part if Z is the longer axis and X the shorter
  584.    if(zPos->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Z:", 0, numform, "center"))
  585.       fH2->AddFrame(zPos->outsidebox, f0centerX);
  586.  
  587.    zPosStep = new TSubStructure();
  588.    for(int i = 0; i < 6; i++) numform[i] = 0;
  589.    numform[0] = 9;
  590.    if(zPosStep->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Z (step):", 0, numform, "center"))
  591.       fH2->AddFrame(zPosStep->outsidebox, f0centerX);
  592.    fG1->AddFrame(fH2, f1expandXpad);
  593.    
  594.    // Set, get, home and reset position buttons
  595.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *posButtons -> 5 buttons (set position, read current position, home the motor, reset all three controllers and emergency stop)\n");
  596.    posButtons = new TSubStructure();
  597.    selnames[0] = "Set"; selnames[1] = "Get"; selnames[2] = "Home"; selnames[3] = "Reset"; selnames[4] = "Emergency stop";
  598.    if(posButtons->TGMultiButton(fG1, 3*subgroup[0]/4, 30, 5, selnames, "center"))
  599.       fG1->AddFrame(posButtons->outsidebox, f1expandXpad);
  600.  
  601.    // Position scan controls
  602.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *xPosMin, *xPosMax, *xPosStep, *yPosMin, *yPosMax, *yPosStep -> Settings for X and Y axis scans\n");
  603.    fH2 = new TGCompositeFrame(fG1, 3*subgroup[0]/4, 30, kFixedWidth | kHorizontalFrame);
  604.    xPosMin = new TSubStructure();
  605.    for(int i = 0; i < 6; i++) numform[i] = 0;
  606.    numform[0] = 9; numform[3] = 2; numform[4] = -100; numform[5] = 375000; //numform[5] = 215000;       // use commented part if Z is the longer axis and X the shorter
  607.    if(xPosMin->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "X (min):", 0, numform, "center"))
  608.       fH2->AddFrame(xPosMin->outsidebox, f0centerX);
  609.  
  610.    yPosMin = new TSubStructure();
  611.    numform[5] = 215000;
  612.    if(yPosMin->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Y (min):", 0, numform, "center"))
  613.       fH2->AddFrame(yPosMin->outsidebox, f0centerX);
  614.    fG1->AddFrame(fH2, f1expandXpad);
  615.  
  616.    fH2 = new TGCompositeFrame(fG1, 3*subgroup[0]/4, 30, kFixedWidth | kHorizontalFrame);
  617.    xPosMax = new TSubStructure();
  618.    numform[5] = 375000; //numform[5] = 215000;  // use commented part if Z is the longer axis and X the shorter
  619.    if(xPosMax->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "X (max):", 0, numform, "center"))
  620.       fH2->AddFrame(xPosMax->outsidebox, f0centerX);
  621.  
  622.    yPosMax = new TSubStructure();
  623.    numform[5] = 215000;
  624.    if(yPosMax->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Y (max):", 0, numform, "center"))
  625.       fH2->AddFrame(yPosMax->outsidebox, f0centerX);
  626.    fG1->AddFrame(fH2, f1expandXpad);
  627.  
  628.    fH2 = new TGCompositeFrame(fG1, 3*subgroup[0]/4, 30, kFixedWidth | kHorizontalFrame);
  629.    xPosStep = new TSubStructure();
  630.    for(int i = 0; i < 6; i++) numform[i] = 0;
  631.    numform[0] = 9;
  632.    if(xPosStep->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "X (step):", 0, numform, "center"))
  633.       fH2->AddFrame(xPosStep->outsidebox, f0centerX);
  634.  
  635.    yPosStep = new TSubStructure();
  636.    if(yPosStep->TGLabelNEntry(fH2, 8*subgroup[0]/16, 30, "Y (step):", 0, numform, "center"))
  637.       fH2->AddFrame(yPosStep->outsidebox, f0centerX);
  638.    fG1->AddFrame(fH2, f1expandXpad);
  639.  
  640.    fV1->AddFrame(fG1, f1expand2d);
  641.    // Center pane (Table position controls)
  642.    fH1->AddFrame(fV1, f0leftX);
  643.  
  644.    // Right pane (Incidence angle controls)
  645.    subgroup[0] = 2*(measLayout[2]->GetWidth())/7-14;
  646.    fV1 = new TGCompositeFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight | kVerticalFrame);
  647.    fG1 = new TGGroupFrame(fV1, "Incidence angle controls");
  648.  
  649.    // Rotation positions
  650.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotPos -> Setting for rotation position\n");
  651.    rotPos = new TSubStructure();
  652.    for(int i = 0; i < 6; i++) numform[i] = 0;
  653.    numform[0] = 7; numform[1] = 2; numform[3] = 2; numform[4] = -180.; numform[5] = 180.;
  654.    if(rotPos->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "Incidence angle:", 0., numform, "center"))
  655.       fG1->AddFrame(rotPos->outsidebox, f1expandXpad);
  656.    
  657.    // Set, get, home and reset rotation buttons
  658.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotButtons -> 4 buttons (set rotation, read current rotation, home the motor, reset controller)\n");
  659.    rotButtons = new TSubStructure();
  660.    selnames[0] = "Set"; selnames[1] = "Get"; selnames[2] = "Home"; selnames[3] = "Reset";
  661.    if(rotButtons->TGMultiButton(fG1, 3*subgroup[0]/4, 30, 4, selnames, "center"))
  662.       fG1->AddFrame(rotButtons->outsidebox, f1expandXpad);
  663.    
  664.    // Emergency stop rotation buttons
  665.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotButEmergency -> 1 button (emergency stop)\n");
  666.    rotButEmergency = new TSubStructure();
  667.    selnames[0] = "Emergency stop";
  668.    if(rotButEmergency->TGMultiButton(fG1, 3*subgroup[0]/4, 30, 1, selnames, "center"))
  669.       fG1->AddFrame(rotButEmergency->outsidebox, f1expandXpad);
  670.  
  671.    // Rotation scan controls
  672.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotPosMin -> Number entry for starting angle\n");
  673.    rotPosMin = new TSubStructure();
  674.    if(rotPosMin->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "Angle (min):", 0.0, numform, "center"))
  675.       fG1->AddFrame(rotPosMin->outsidebox, f1expandXpad);
  676.  
  677.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotPosMax -> Number entry for finishing angle\n");
  678.    rotPosMax = new TSubStructure();
  679.    if(rotPosMax->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "Angle (max):", 0.0, numform, "center"))
  680.       fG1->AddFrame(rotPosMax->outsidebox, f1expandXpad);
  681.  
  682.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotPosStep -> Number entry for angle step\n");
  683.    rotPosStep = new TSubStructure();
  684.    for(int i = 0; i < 6; i++) numform[i] = 0;
  685.    numform[0] = 7; numform[1] = 1;
  686.    if(rotPosStep->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "Angle (step):", 0.0, numform, "center"))
  687.       fG1->AddFrame(rotPosStep->outsidebox, f1expandXpad);
  688.  
  689.    fV1->AddFrame(fG1, f1expand2d);
  690.    // Right pane (Incidence angle controls)
  691.    fH1->AddFrame(fV1, f0leftX);
  692.    
  693.    fT1->AddFrame(fH1, f1expand2d);
  694.  
  695.    // Waveform tab
  696.    //TODO
  697.    measLayout[2]->AddFrame(setTab, f0leftX);
  698.  
  699.    // Bottom pane (File controls)
  700.    subgroup[0] = measLayout[2]->GetWidth()-19;
  701.    subgroup[1] = (measLayout[2]->GetHeight())/4-4;
  702.    fH1 = new TGCompositeFrame(measLayout[2], subgroup[0], subgroup[1], kFixedWidth | kFixedHeight | kHorizontalFrame);
  703.    fG1 = new TGGroupFrame(fH1, "Event/Data file controls");
  704.  
  705.    // Number of events
  706.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *evtNum -> Number entry for set number of events to acquire\n");
  707.    evtNum = new TSubStructure();
  708.    for(int i = 0; i < 6; i++) numform[i] = 0;
  709.    numform[0] = 8; numform[2] = 1;
  710.    if(evtNum->TGLabelNEntry(fG1, 3*subgroup[0]/4, 30, "Number of events:", 10000, numform, "left"))
  711.       fG1->AddFrame(evtNum->outsidebox, f0leftXpad);
  712.  
  713.    // Time stamp display
  714.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *timeStamp -> Text entry for timestamp\n");
  715.    timeStamp = new TSubStructure();
  716.    if(timeStamp->TGLabelTEntry(fG1, 3*subgroup[0]/4, 30, "Time stamp:", "", "oneline"))
  717.    {
  718.       timeStamp->widgetTE->SetState(kFALSE);
  719.       fG1->AddFrame(timeStamp->outsidebox, f1expandXpad);
  720.    }
  721.  
  722.    // Save to file
  723.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *fileName -> Text entry for timestamp\n");
  724.    fileName = new TSubStructure();
  725.    char *cTemp;
  726.    cTemp = new char[256];
  727.    sprintf(cTemp, "%s/results/test%s", rootdir, histext);
  728.    if(fileName->TGLabelTEntryButton(fG1, 3*subgroup[0]/4, 30, "Save to file:", cTemp, "...", "oneline"))
  729.    {
  730.       fileName->widgetTE->SetState(kFALSE);
  731.       fG1->AddFrame(fileName->outsidebox, f1expandXpad);
  732.    }
  733.  
  734.    fH1->AddFrame(fG1, new TGLayoutHints(kLHintsExpandX,8,2,2,2));
  735.    // Bottom pane (File controls)
  736.    measLayout[2]->AddFrame(fH1, f0leftX);
  737.  
  738.    // Start acquisition and progress bar
  739.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *measProgress -> Button to start acquiring data and horizontal progress bar\n");
  740.    measProgress = new TSubStructure();
  741.    if(measProgress->TGButtonProgressTEntry(measLayout[2], 3*subgroup[0]/4, 30, "Start acquisition", "Estimated end time: "))
  742.    {
  743.       measProgress->widgetTE->SetState(kFALSE);
  744.       measLayout[2]->AddFrame(measProgress->outsidebox, f1expandXpad);
  745.    }
  746.  
  747.    Pixel_t pixel_color;
  748.    gClient->GetColorByName("white", pixel_color);
  749.    posButtons->widgetTB[4]->SetTextColor(pixel_color);
  750.    rotButEmergency->widgetTB[0]->SetTextColor(pixel_color);
  751.    gClient->GetColorByName("red", pixel_color);
  752.    posButtons->widgetTB[4]->SetBackgroundColor(pixel_color);
  753.    rotButEmergency->widgetTB[0]->SetBackgroundColor(pixel_color);
  754.  
  755.    // Actions for Main window //TODO
  756.    vOutOpt->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "NegativePolarity()");
  757.    vOutButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "VoltOut(=0)");
  758.    vOutButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "VoltOut(=1)");
  759.    vOutButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "VoltOut(=2)");
  760.    posButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "PositionSet(=0)");
  761.    posButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "PositionSet(=1)");
  762.    posButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "PositionSet(=2)");
  763.    posButtons->widgetTB[3]->Connect("Clicked()", "TGAppMainFrame", this, "PositionSet(=3)");
  764.    posButtons->widgetTB[4]->Connect("Clicked()", "TGAppMainFrame", this, "PositionSet(=4)");
  765.    rotButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "RotationSet(=0)");
  766.    rotButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "RotationSet(=1)");
  767.    rotButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "RotationSet(=2)");
  768.    rotButtons->widgetTB[3]->Connect("Clicked()", "TGAppMainFrame", this, "RotationSet(=3)");
  769.    rotButEmergency->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "RotationSet(=4)");
  770.    fileName->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "SaveFile()");
  771.    measProgress->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "StartAcq()");
  772.    // TODO - Save file
  773.  
  774. // Main window -----------------------------------------------------------------------------
  775.  
  776. // Display pane ----------------------------------------------------------------------------
  777.    measCanvas = new TRootEmbeddedCanvas("measCanvas",measLayout[1],300,300);
  778.    measLayout[1]->AddFrame(measCanvas, f1expand2d);
  779. // Display pane ----------------------------------------------------------------------------
  780.  
  781. // Histogram file selection pane -----------------------------------------------------------
  782.    subgroup[0] = (analysisLayout[0]->GetWidth())-4;
  783.  
  784.    // Open browser for file selection
  785.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *selectDir -> Button to open histogram files\n");
  786.    selectDir = new TSubStructure();
  787.    if(selectDir->TGLabelButton(analysisLayout[0], 3*subgroup[0]/4, 30, "File selection:", "...", "left"))
  788.       analysisLayout[0]->AddFrame(selectDir->outsidebox, f0leftXpad);
  789.  
  790.    // List view of the opened files
  791.    if(DBGSIG > 1) printf("AppLayout(): Creating TGListBox *fileList -> List box for opened histograms\n");
  792.    fileList = new TGListBox(analysisLayout[0],1);
  793.    fileList->GetVScrollbar();
  794.    fileList->Resize(300, (3*analysisLayout[0]->GetHeight()/7)-10 );
  795.    analysisLayout[0]->AddFrame(fileList, f1expandXpad);
  796.  
  797.    fH1 = new TGCompositeFrame(analysisLayout[0], subgroup[0], 30, kHorizontalFrame);
  798.    // Multiple file selection toggle
  799.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *multiSelect -> 2 check buttons (enable multiple select, select everything)\n");
  800.    multiSelect = new TSubStructure();
  801.    checksel = new int[2];
  802.    checksel[0] = 0; checksel[1] = 0;
  803.    selnames[0] = "Multiple file select"; selnames[1] = "Select all listed files";
  804.    if(multiSelect->TGCheckList(fH1, subgroup[0]/2, 30, 2, selnames, checksel, "horizontal", "left"))
  805.       fH1->AddFrame(multiSelect->outsidebox, f0leftX);
  806.    delete[] checksel;
  807.    
  808.    // Previous/next controls, clear list and edit header
  809.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *fileListCtrl -> Multiple buttons for controlling and displaying the histograms in list box\n");
  810.    fileListCtrl = new TSubStructure();
  811.    selnames[0] = "<<"; selnames[1] = ">>"; selnames[2] = "Edit header"; selnames[3] = "Clear list";
  812.    if(fileListCtrl->TGMultiButton(fH1, subgroup[0]/3, 30, 4, selnames, "right"))
  813.       fH1->AddFrame(fileListCtrl->outsidebox, f0rightX);
  814.  
  815.    analysisLayout[0]->AddFrame(fH1, f1expandXpad);
  816.  
  817.    // Header information of opened file
  818.    fG1 = new TGGroupFrame(analysisLayout[0], "Opened file header information");
  819.  
  820.    fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
  821.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *dispTime -> Display text Entry for opened histogram (time stamp)\n");
  822.    dispTime = new TSubStructure();
  823.    if(dispTime->TGLabelTEntry(fH1, 3*subgroup[0]/4-24, 30, "Time:", "", "oneline"))
  824.       fH1->AddFrame(dispTime->outsidebox, f0leftXnoleft);
  825.    dispTime->widgetTE->SetState(kFALSE);
  826.  
  827.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *dispBias -> Number entry for opened histogram (bias voltage)\n");
  828.    dispBias = new TSubStructure();
  829.    for(int i = 0; i < 6; i++) numform[i] = 0;
  830.    numform[0] = 7; numform[1] = 2;
  831.    if(dispBias->TGLabelNEntry(fH1, subgroup[0]/4-24, 30, "Bias voltage:", 0.00, numform, "center"))
  832.       fH1->AddFrame(dispBias->outsidebox, f0leftX);
  833.    dispBias->widgetNE[0]->SetState(kFALSE);
  834.    fG1->AddFrame(fH1, f0leftXpad);
  835.  
  836.    fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
  837.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *dispPos -> Display text Entry for opened histogram (table position)\n");
  838.    dispPos = new TSubStructure();
  839.    if(dispPos->TGLabelTEntry(fH1, subgroup[0]/2-12, 30, "Position:", "", "oneline"))
  840.       fH1->AddFrame(dispPos->outsidebox, f0leftXnoleft);
  841.    dispPos->widgetTE->SetState(kFALSE);
  842.  
  843.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *dispTemp -> Number entry for opened histogram (temperature)\n");
  844.    dispTemp = new TSubStructure();
  845.    for(int i = 0; i < 6; i++) numform[i] = 0;
  846.    numform[0] = 6; numform[1] = 1;
  847.    if(dispTemp->TGLabelNEntry(fH1, subgroup[0]/4-18, 30, "Temperature:", 0.0, numform, "center"))
  848.       fH1->AddFrame(dispTemp->outsidebox, f0leftX);
  849.    dispTemp->widgetNE[0]->SetState(kFALSE);
  850.  
  851.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *dispAngle -> Number entry for opened histogram (incidence angle)\n");
  852.    dispAngle = new TSubStructure();
  853.    for(int i = 0; i < 6; i++) numform[i] = 0;
  854.    numform[0] = 7; numform[1] = 2;
  855.    if(dispAngle->TGLabelNEntry(fH1, subgroup[0]/4-18, 30, "Angle:", 0.00, numform, "center"))
  856.       fH1->AddFrame(dispAngle->outsidebox, f0leftX);
  857.    dispAngle->widgetNE[0]->SetState(kFALSE);
  858.    fG1->AddFrame(fH1, f0leftXpad);
  859.  
  860.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *dispLaser -> Display text Entry for opened histogram (laser and additional info)\n");
  861.    dispLaser = new TSubStructure();
  862.    if(dispLaser->TGLabelTEntry(fG1, 3*subgroup[0]/4, 30, "Laser settings:", "", "oneline"))
  863.       fG1->AddFrame(dispLaser->outsidebox, f1expandXpad);
  864.    dispLaser->widgetTE->SetState(kFALSE);
  865.  
  866.    analysisLayout[0]->AddFrame(fG1, f1expandX);
  867.  
  868.    // Actions for histogram file selection pane
  869.    selectDir->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "SelectDirectory()");
  870.    multiSelect->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "ListMultiSelect(=0)");
  871.    multiSelect->widgetChBox[1]->Connect("Clicked()", "TGAppMainFrame", this, "ListMultiSelect(=1)");
  872.    fileList->Connect("DoubleClicked(Int_t)", "TGAppMainFrame", this, "FileListNavigation(Int_t)");
  873.    fileListCtrl->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "FileListNavigation(=-2)");
  874.    fileListCtrl->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "FileListNavigation(=-3)");
  875.    fileListCtrl->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "HeaderEdit()");
  876.    fileListCtrl->widgetTB[3]->Connect("Clicked()", "TGAppMainFrame", this, "ClearHistogramList()");
  877.  
  878. // Histogram file selection pane -----------------------------------------------------------
  879.  
  880. // Analysis pane ---------------------------------------------------------------------------
  881.    fH1 = new TGCompositeFrame(analysisLayout[1], analysisLayout[1]->GetWidth(), 30, kHorizontalFrame);
  882.  
  883.    subgroup[0] = (analysisLayout[1]->GetWidth())/2-4;
  884.    subgroup[1] = (analysisLayout[1]->GetHeight())-4;
  885.  
  886.    analTab = new TGTab(fH1, subgroup[0], subgroup[1]);
  887.  
  888.    // Analysis tabs
  889.    // Integrate spectrum tab
  890.    fT1 = analTab->AddTab("Integ. spectrum");
  891.    fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame | kFixedWidth | kFixedHeight);
  892.  
  893.    // Check buttons to toggle direction of integration and normalization
  894.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *intSpect -> 3 check buttons (direction of integration, normalization)\n");
  895.    intSpect = new TSubStructure();
  896.    checksel = new int[3];
  897.    checksel[0] = 0; checksel[1] = 0; checksel[2] = 1;
  898.    selnames[0] = "X direction (for edge scans)";
  899.    selnames[1] = "Y direction (for edge scans)";
  900.    selnames[2] = "Normalize to number of events";
  901.    if(intSpect->TGCheckList(fV1, subgroup[0], 30, 3, selnames, checksel, "vertical", "center"))
  902.       fV1->AddFrame(intSpect->outsidebox, f1expandXpad);
  903.    delete[] checksel;
  904.  
  905.    // Values for 2D plot pixel resolution
  906.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *resol2d -> Pixel resolution for 2D plots\n");
  907.    resol2d = new TSubStructure();
  908.    for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  909.    numform[0] = 5; numform2[0] = 5; numform[2] = 2; numform2[2] = 2;
  910.    if(resol2d->TGLabelDoubleNEntry(fV1, subgroup[0], 30, "2D plot pixel resolution (X, Y):", 40, numform, 40, numform2, "center"))
  911.       fV1->AddFrame(resol2d->outsidebox, f1expandX);
  912.  
  913.    // Start integrating or set its defaults
  914.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *intSpectButtons -> 2 buttons for integrating spectra\n");
  915.    intSpectButtons = new TSubStructure();
  916.    selnames[0] = "Start"; selnames[1] = "Start and edit"; selnames[2] = "Default values";
  917.    if(intSpectButtons->TGMultiButton(fV1, subgroup[0], 30, 3, selnames, "center"))
  918.       fV1->AddFrame(intSpectButtons->outsidebox, f1expandX);
  919.  
  920.    fT1->AddFrame(fV1, f1expandX);
  921.  
  922.    // Relative photon detection efficiency tab (PDE)
  923.    fT1 = analTab->AddTab("Relative PDE");
  924.    fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame | kFixedWidth | kFixedHeight);
  925.  
  926.    // Check button to toggle normalization
  927.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *relPde -> 1 check buttons (normalization)\n");
  928.    relPde = new TSubStructure();
  929.    checksel = new int;
  930.    *checksel = 1;
  931.    selnames[0] = "Normalize to number of events";
  932.    if(relPde->TGCheckList(fV1, subgroup[0], 30, 1, selnames, checksel, "vertical", "center"))
  933.       fV1->AddFrame(relPde->outsidebox, f1expandXpad);
  934.    delete[] checksel;
  935.  
  936.    // Calculate relative PDE using the middle of the pedestal peak
  937.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *midPeak -> Calculate the relative PDE, by setting the middle of the pedestal peak.\n");
  938.    midPeak = new TSubStructure();
  939.    checksel = new int;
  940.    *checksel = 0;
  941.    selnames[0] = "Pedestal entries end at middle of ped. peak";
  942.    if(midPeak->TGCheckList(fV1, subgroup[0], 30, 1, selnames, checksel, "vertical", "center"))
  943.       fV1->AddFrame(midPeak->outsidebox, f1expandX);
  944.    delete checksel;
  945.  
  946.    // Select the dark run
  947.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *darkRun -> Button to open histogram files of a dark run\n");
  948.    darkRun = new TSubStructure();
  949.    if(darkRun->TGLabelTEntryButton(fV1, 3*subgroup[0]/4, 30, "Select dark run histogram:", "", "...", "oneline"))
  950.    {
  951.       darkRun->widgetTE->SetState(kFALSE);
  952.       fV1->AddFrame(darkRun->outsidebox, f1expandXpad);
  953.    }
  954.  
  955.    // Select the offset of 0 angle
  956.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *zeroAngle -> Set the offset for 0 angle\n");
  957.    zeroAngle = new TSubStructure();
  958.    for(int i = 0; i < 6; i++) numform[i] = 0;
  959.    numform[0] = 6; numform[1] = 2;
  960.    if(zeroAngle->TGLabelNEntry(fV1, 3*subgroup[0]/4, 30, "Offset to zero angle:", 0., numform, "center"))
  961.       fV1->AddFrame(zeroAngle->outsidebox, f0centerX);
  962.  
  963.    // Start calculating the PDE or set its defaults
  964.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *relPdeButtons -> 2 buttons for calculating the relative PDE\n");
  965.    relPdeButtons = new TSubStructure();
  966.    selnames[0] = "Start"; selnames[1] = "Start and edit"; selnames[2] = "Default values";
  967.    if(relPdeButtons->TGMultiButton(fV1, subgroup[0], 30, 3, selnames, "center"))
  968.       fV1->AddFrame(relPdeButtons->outsidebox, f1expandX);
  969.  
  970.    fT1->AddFrame(fV1, f1expandX);
  971.  
  972.    // Breaktown voltage tab
  973.    fT1 = analTab->AddTab("Breakdown voltage");
  974.    fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame | kFixedWidth | kFixedHeight);
  975.  
  976.    // Select the minumum number of peaks for fitting to be initiated
  977.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *minPeak -> Minimum number of peaks to fit for peak fitting\n");
  978.    minPeak = new TSubStructure();
  979.    for(int i = 0; i < 6; i++) numform[i] = 0;
  980.    numform[0] = 4; numform[2] = 1; numform[3] = 2; numform[4] = 1; numform[5] = 20;
  981.    if(minPeak->TGLabelNEntry(fV1, subgroup[0], 30, "Min. nr. of peaks:", 2, numform, "center"))
  982.       fV1->AddFrame(minPeak->outsidebox, f0centerX);
  983.  
  984.    // Select which separation to use
  985.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *peakSepCalc -> Make the separation between the selected peaks\n");
  986.    peakSepCalc = new TSubStructure();
  987.    for(int i = 0; i < 6; i++) numform[i] = 0;
  988.    numform[0] = 4; numform[2] = 1; numform[3] = 2; numform[4] = 1; numform[5] = 3;
  989.    if(peakSepCalc->TGLabelNEntry(fV1, subgroup[0], 30, "Calculate peak separation between N pe and N+1 pe peaks:", 1, numform, "center"))
  990.       fV1->AddFrame(peakSepCalc->outsidebox, f0centerX);
  991.  
  992.    // Start calculating the breakdown voltage or set its defaults
  993.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *brDownButtons -> 2 buttons for calculating the breakdown voltage\n");
  994.    brDownButtons = new TSubStructure();
  995.    selnames[0] = "Start"; selnames[1] = "Start and edit"; selnames[2] = "Default values";
  996.    if(brDownButtons->TGMultiButton(fV1, subgroup[0], 30, 3, selnames, "center"))
  997.       fV1->AddFrame(brDownButtons->outsidebox, f1expandX);
  998.  
  999.    fT1->AddFrame(fV1, f1expandX);
  1000.  
  1001.    // Surface scan tab
  1002.    fT1 = analTab->AddTab("Surface scan");
  1003.    fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame | kFixedWidth | kFixedHeight);
  1004.  
  1005.    // Check button to toggle normalization
  1006.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *surfScanOpt -> 2 check buttons (normalization, zero bottom-left corner)\n");
  1007.    surfScanOpt = new TSubStructure();
  1008.    checksel = new int[2];
  1009.    checksel[0] = 1; checksel[1] = 0;
  1010.    selnames[0] = "Normalize to number of events"; selnames[1] = "Zero the bottom left corner";
  1011.    if(surfScanOpt->TGCheckList(fV1, subgroup[0], 30, 2, selnames, checksel, "vertical", "center"))
  1012.       fV1->AddFrame(surfScanOpt->outsidebox, f1expandXpad);
  1013.    delete[] checksel;
  1014.  
  1015.    // Values for 2D plot pixel resolution
  1016.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *resolSurf -> Pixel resolution for surface plots\n");
  1017.    resolSurf = new TSubStructure();
  1018.    for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  1019.    numform[0] = 5; numform2[0] = 5; numform[2] = 2; numform2[2] = 2;
  1020.    if(resolSurf->TGLabelDoubleNEntry(fV1, subgroup[0], 30, "Surface plot pixel resolution (X, Y):", 40, numform, 40, numform2, "center"))
  1021.       fV1->AddFrame(resolSurf->outsidebox, f1expandX);
  1022.  
  1023.    // Start calculating the breakdown voltage or set its defaults
  1024.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *surfButtons -> 2 buttons for calculating the surface scan\n");
  1025.    surfButtons = new TSubStructure();
  1026.    selnames[0] = "Start"; selnames[1] = "Start and edit"; selnames[2] = "Default values";
  1027.    if(surfButtons->TGMultiButton(fV1, subgroup[0], 30, 3, selnames, "center"))
  1028.       fV1->AddFrame(surfButtons->outsidebox, f1expandX);
  1029.  
  1030.    fT1->AddFrame(fV1, f1expandX);
  1031.  
  1032.    // Timing tab
  1033.    fT1 = analTab->AddTab("Timing");
  1034.    fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame | kFixedWidth | kFixedHeight);
  1035.  
  1036.    fT1->AddFrame(fV1, f1expandX);
  1037.  
  1038.    // Analysis tabs
  1039.    fH1->AddFrame(analTab, /*f1expandX*/f0leftX);
  1040.  
  1041.    // Peak fitting settings
  1042.    fV1 = new TGCompositeFrame(fH1, subgroup[0], 30, kVerticalFrame);
  1043.  
  1044.    fH2 = new TGCompositeFrame(fV1, subgroup[0], 30, kHorizontalFrame);
  1045.    // Select the sigma for peak fitting
  1046.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *fitSigma -> Sigma for peak fitting\n");
  1047.    fitSigma = new TSubStructure();
  1048.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1049.    numform[0] = 6; numform[1] = 3; numform[2] = 2;
  1050.    if(fitSigma->TGLabelNEntry(fH2, subgroup[0]/2, 30, "Peak sigma:", 1.2, numform, "center"))
  1051.       fH2->AddFrame(fitSigma->outsidebox, f0centerX);
  1052.    // Select the signal to noise treshold for peak fitting
  1053.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *fitTresh -> S/N ratio for peak fitting\n");
  1054.    fitTresh = new TSubStructure();
  1055.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1056.    numform[0] = 6; numform[1] = 3; numform[2] = 2;
  1057.    if(fitTresh->TGLabelNEntry(fH2, subgroup[0]/2, 30, "S/N ratio:", 0.005, numform, "center"))
  1058.       fH2->AddFrame(fitTresh->outsidebox, f0centerX);
  1059.    fV1->AddFrame(fH2, f1expandXpad);
  1060.  
  1061.    // Select the background interpolation for peak fitting
  1062.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *fitInter -> Background interpolation for peak fitting\n");
  1063.    fitInter = new TSubStructure();
  1064.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1065.    numform[0] = 5; numform[2] = 1;
  1066.    if(fitInter->TGLabelNEntry(fV1, subgroup[0], 30, "Back. interpolation:", 7, numform, "center"))
  1067.       fV1->AddFrame(fitInter->outsidebox, f0centerX);
  1068.  
  1069.    // Select the ADC offset
  1070.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *adcOffset -> Select the offset for all ADC spectra\n");
  1071.    adcOffset = new TSubStructure();
  1072.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1073.    numform[0] = 6; numform[1] = 2;
  1074.    if(adcOffset->TGLabelNEntry(fV1, subgroup[0], 30, "ADC spectrum offset:", 0.00, numform, "center"))
  1075.       fV1->AddFrame(adcOffset->outsidebox, f0centerX);
  1076.  
  1077.    // Select the acceptable error for peak fitting
  1078.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *accError -> Acceptable peak fitting error for peak fitting\n");
  1079.    accError = new TSubStructure();
  1080.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1081.    numform[0] = 6; numform[1] = 2; numform[2] = 1;
  1082.    if(accError->TGLabelNEntry(fV1, subgroup[0], 30, "Max. peak fit error:", 0.15, numform, "center"))
  1083.       fV1->AddFrame(accError->outsidebox, f0centerX);
  1084.  
  1085.    // Select the pedestal lower limit for peak fitting
  1086.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *pedesLow -> Lower ADC limit of pedestal peak for peak fitting\n");
  1087.    pedesLow = new TSubStructure();
  1088.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1089.    numform[0] = 6; numform[1] = 1; numform[2] = 2;
  1090.    if(pedesLow->TGLabelNEntry(fV1, subgroup[0], 30, "Pedestal low limit:", 0.0, numform, "center"))
  1091.       fV1->AddFrame(pedesLow->outsidebox, f0centerX);
  1092.  
  1093.    // Check buttons to toggle subtracting the background and exporting the fitted spectra
  1094.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *fitChecks -> 2 check buttons (substracting background, exporting fitted spectra)\n");
  1095.    fitChecks = new TSubStructure();
  1096.    checksel = new int[2];
  1097.    checksel[0] = 1; checksel[1] = 0;
  1098.    selnames[0] = "Backround subtraction ON/OFF";
  1099.    selnames[1] = "Export fitted spectra ON/OFF";
  1100.    if(fitChecks->TGCheckList(fV1, subgroup[0], 30, 2, selnames, checksel, "vertical", "center"))
  1101.       fV1->AddFrame(fitChecks->outsidebox, f1expandXpad);
  1102.    delete[] checksel;
  1103.  
  1104.    // Analysis progress bar
  1105.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *analysisProgress -> Horizontal progress bar for analysis\n");
  1106.    analysisProgress = new TSubStructure();
  1107.    if(analysisProgress->TGLabelProgress(fV1, subgroup[0], 30, "Current analysis:"))
  1108.       fV1->AddFrame(analysisProgress->outsidebox, f1expandXpad);
  1109.  
  1110.    fH1->AddFrame(fV1, f1expandX);
  1111.  
  1112.    analysisLayout[1]->AddFrame(fH1, f1expandXpad);
  1113.  
  1114.    // Actions for analysis pane
  1115.    intSpectButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=0)");
  1116.    intSpectButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=1)");
  1117.    intSpectButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisDefaults()");
  1118.  
  1119.    relPdeButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=0)");
  1120.    relPdeButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=1)");
  1121.    relPdeButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisDefaults()");
  1122.    darkRun->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "SelectDarkHist()");
  1123.  
  1124.    brDownButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=0)");
  1125.    brDownButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=1)");
  1126.    brDownButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisDefaults()");
  1127.  
  1128.    surfButtons->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=0)");
  1129.    surfButtons->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisHandle(=1)");
  1130.    surfButtons->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "AnalysisDefaults()");
  1131. // Analysis pane ---------------------------------------------------------------------------
  1132.  
  1133. // Histogram pane --------------------------------------------------------------------------
  1134.    analysisCanvas = new TRootEmbeddedCanvas("analysisCanvas",analysisLayout[2],300,300);
  1135.    analysisLayout[2]->AddFrame(analysisCanvas, f1expand2d);
  1136.    analysisCanvas->GetCanvas()->SetGrid();
  1137. // Histogram pane --------------------------------------------------------------------------
  1138.  
  1139. // Histogram controls pane -----------------------------------------------------------------
  1140.    subgroup[0] = (analysisLayout[3]->GetWidth())-4;
  1141.  
  1142.    // Control for histogram X range
  1143.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *adcRange -> Range for ADC histogram\n");
  1144.    adcRange = new TSubStructure();
  1145.    for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  1146.    numform[0] = 6; numform2[0] = 6;
  1147.    if(adcRange->TGLabelDoubleNEntry(analysisLayout[3], subgroup[0], 30, "ADC range (min, max):", 0, numform, 0, numform2, "center"))
  1148.       analysisLayout[3]->AddFrame(adcRange->outsidebox, f1expandXpad);
  1149.  
  1150.    // TDC window for getting data
  1151.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *tdcRange -> Range for TDC histogram\n");
  1152.    tdcRange = new TSubStructure();
  1153.    for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  1154.    numform[0] = 8; numform[1] = 2; numform2[0] = 8; numform2[1] = 2;
  1155.    if(tdcRange->TGLabelDoubleNEntry(analysisLayout[3], subgroup[0], 30, "TDC range (min, max):", -0.5, numform, 221.8, numform2, "center"))
  1156.       analysisLayout[3]->AddFrame(tdcRange->outsidebox, f1expandXpad);
  1157.  
  1158.    // Y axis range settings
  1159.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *yRange -> Y axis range\n");
  1160.    yRange = new TSubStructure();
  1161.    for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  1162.    numform[0] = 8; numform[1] = 1; numform2[0] = 8; numform2[1] = 1;
  1163.    if(yRange->TGLabelDoubleNEntry(analysisLayout[3], subgroup[0], 30, "Y range (min, max):", 0, numform, 0, numform2, "center"))
  1164.       analysisLayout[3]->AddFrame(yRange->outsidebox, f1expandXpad);
  1165.  
  1166.    fH1 = new TGHorizontalFrame(analysisLayout[3], subgroup[0], 30);
  1167.    // Select the channel to display
  1168.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *selectCh -> Channel to display\n");
  1169.    selectCh = new TSubStructure();
  1170.    for(int i = 0; i < 6; i++) numform[i] = 0;
  1171.    numform[0] = 3; numform[2] = 2; numform[3] = 2; numform[4] = 0; numform[5] = 7; // TODO - ko odprem file, nastavi zgornjo limito
  1172.    if(selectCh->TGLabelNEntry(fH1, subgroup[0]/2-24, 30, "Display channel:", 0, numform, "center"))
  1173.       fH1->AddFrame(selectCh->outsidebox, f0leftX);
  1174.    selChannel = -1;
  1175.  
  1176.    // Change plot type
  1177.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *plotType -> 3 buttons for selecting the plot type (ADC, TDC, ADC/TDC)\n");
  1178.    plotType = new TSubStructure();
  1179.    selnames[0] = "ADC"; selnames[1] = "TDC"; selnames[2] = "ADC/TDC";
  1180.    if(plotType->TGMultiButton(fH1, subgroup[0]/2-24, 30, 3, selnames, "center"))
  1181.       fH1->AddFrame(plotType->outsidebox, f1expandX);
  1182.    analysisLayout[3]->AddFrame(fH1, f1expandXpad);
  1183.  
  1184.    // Check button to toggle logarithmic scale
  1185.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *histOpt -> 2 check buttons (histogram logarithmic scale, clean plots)\n");
  1186.    histOpt = new TSubStructure();
  1187.    checksel = new int[2];
  1188.    checksel[0] = 0; checksel[1] = 1;
  1189.    selnames[0] = "Logarithmic scale ON/OFF";
  1190.    selnames[1] = "Clean plots ON/OFF";
  1191.    if(histOpt->TGCheckList(analysisLayout[3], subgroup[0], 30, 2, selnames, checksel, "vertical", "center"))
  1192.       analysisLayout[3]->AddFrame(histOpt->outsidebox, f1expandXpad);
  1193.    delete[] checksel;
  1194.  
  1195.    // Export the selected files
  1196.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *exportHist -> Button to export current histogram\n");
  1197.    exportHist = new TSubStructure();
  1198.    if(exportHist->TGLabelButton(analysisLayout[3], subgroup[0], 30, "Export selected histograms:", "Export", "center"))
  1199.       analysisLayout[3]->AddFrame(exportHist->outsidebox, f1expandXpad);
  1200.  
  1201.    // Edit the selected histograms
  1202.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *editSelHist -> Button to additionally edit the selected histograms (make a canvas clone in a new tab)\n");
  1203.    editSelHist = new TSubStructure();
  1204.    if(editSelHist->TGLabelButton(analysisLayout[3], subgroup[0], 30, "Edit selected histograms:", "Edit", "center"))
  1205.       analysisLayout[3]->AddFrame(editSelHist->outsidebox, f1expandXpad);
  1206.  
  1207.    // Select position units to use for ploting (micrometer, table position units)
  1208.    if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *posUnitsPlot -> Dropdown menu for selecting the position units for ploting\n");
  1209.    posUnitsPlot = new TSubStructure();
  1210.    selnames[0] = "table units"; selnames[1] = "micrometers";
  1211.    sprintf(selected, "table units");
  1212.    if(posUnitsPlot->TGLabelDrop(analysisLayout[3], 2.*subgroup[0]/3., 30, "Position units for plots:", 2, selnames, selected))
  1213.       analysisLayout[3]->AddFrame(posUnitsPlot->outsidebox, f0centerX);
  1214.  
  1215.    // Actions for histogram controls pane //TODO
  1216.    for(int i = 0; i < 2; i++)
  1217.    {
  1218.       adcRange->widgetNE[i]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "UpdateHistogram(=0)");
  1219. //      (adcRange->widgetNE[i]->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "UpdateHistogram(=0)");
  1220.       tdcRange->widgetNE[i]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "UpdateHistogram(=0)");
  1221. //      (tdcRange->widgetNE[i]->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "UpdateHistogram(=0)");
  1222.       yRange->widgetNE[i]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "UpdateHistogram(=0)");
  1223. //      (yRange->widgetNE[i]->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "UpdateHistogram(=0)");
  1224.    }
  1225.    plotType->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=0)");
  1226.    plotType->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=1)");
  1227.    plotType->widgetTB[2]->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=2)");
  1228.    selectCh->widgetNE[0]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "UpdateHistogram(=2)");
  1229.    selectCh->widgetNE[0]->Connect("ValueChanged(Long_t)", "TGAppMainFrame", this, "UpdateHistogram(=2)");
  1230.    (selectCh->widgetNE[0]->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "UpdateHistogram(=2)");
  1231.    histOpt->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "HistogramOptions(=0)");
  1232.    histOpt->widgetChBox[1]->Connect("Clicked()", "TGAppMainFrame", this, "HistogramOptions(=1)");
  1233.    exportHist->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "UpdateHistogram(=1)");
  1234.  
  1235. // Histogram controls pane -----------------------------------------------------------------
  1236.  
  1237.    // Setting starting settings (when opening program)
  1238.    GetMeasSettings();
  1239.    GetAnalSettings();
  1240. }
  1241.  
  1242. // -------------------------------------------------------------------
  1243.  
  1244. // Closing main window and checking about information ----------------
  1245.  
  1246. void TGAppMainFrame::CloseWindow()
  1247. {
  1248.    gApplication->Terminate(0);
  1249. }
  1250.  
  1251. Bool_t TGAppMainFrame::About()
  1252. {
  1253.    int ret = 0;
  1254.  
  1255.    new TGMsgBox(gClient->GetRoot(), fMain, fMain->GetWindowName(), "Software for SiPM characterization with\nCAMAC, scope, bias voltage and table position support\n\nCreated by Gasper Kukec Mezek (gasper.kukec@ung.si),\nUpdated on July 17th 2015", kMBIconQuestion, kMBClose, &ret);
  1256.  
  1257.    return kFALSE;
  1258. }
  1259.  
  1260. // -------------------------------------------------------------------
  1261.  
  1262. // Subwindow constructor (+layout) and close subwindow ---------------
  1263. /*
  1264. TGMdiSubwindow::TGMdiSubwindow(TGMdiMainFrame *main, int w, int h)
  1265. {
  1266.    // Create a new subwindow
  1267.    fMdiFrame = new TGMdiFrame(main, w, h);
  1268.    fMdiFrame->Connect("CloseWindow()", "TGMdiSubwindow", this, "CloseWindow(=0)");
  1269.    fMdiFrame->DontCallClose();
  1270. }
  1271.  
  1272. Bool_t TGMdiSubwindow::CloseWindow(int layoutchange)
  1273. {
  1274.    int ret = 0;
  1275.  
  1276.    if(layoutchange == 0)
  1277.       new TGMsgBox(gClient->GetRoot(), fMdiFrame, fMdiFrame->GetWindowName(), "Really want to close the window?", kMBIconExclamation, kMBYes | kMBNo, &ret);
  1278.    else if(layoutchange == 1)
  1279.       ret = kMBYes;
  1280.    if(ret == kMBYes)
  1281.    {
  1282.       if(strcmp("Information window", fMdiFrame->GetWindowName()) == 0)
  1283.          id = -1;
  1284.       return fMdiFrame->CloseWindow();
  1285.    }
  1286.  
  1287.    return kFALSE;
  1288. }*/
  1289.  
  1290. // -------------------------------------------------------------------
  1291.  
  1292. // Main function -----------------------------------------------------
  1293. void root_app()
  1294. {
  1295.    if(DBGSIG > 1)
  1296.    {
  1297.       printf("root_app(): Starting objects\n");
  1298.       gObjectTable->Print();
  1299.    }
  1300.  
  1301.    int winWidth = 1240;
  1302.    int winHeight = 800;
  1303.    layoutMainWindow(&winWidth, &winHeight);
  1304.  
  1305.    new TGAppMainFrame(gClient->GetRoot(), winWidth, winHeight);
  1306. }
  1307.  
  1308. int main(int argc, char **argv)
  1309. {
  1310.    if(DBGSIG > 1)
  1311.    {
  1312.       printf("main(): Starting objects\n");
  1313.       gObjectTable->Print();
  1314.    }
  1315.  
  1316.    TApplication theApp("MdiTest", &argc, argv);
  1317.    root_app();
  1318.    theApp.Run();
  1319.  
  1320.    return 0;
  1321. }
  1322.  
  1323. // -------------------------------------------------------------------
  1324.