Subversion Repositories f9daq

Rev

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

Rev Author Line No. Line
146 f9daq 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
 
167 f9daq 17
   // Prepare the default open directory (basedir)
172 f9daq 18
   currentMeasDir = new char[1024];
19
   sprintf(currentMeasDir, "%s/results", rootdir);
20
   currentAnalDir = new char[1024];
21
   sprintf(currentAnalDir, "%s/results", rootdir);
167 f9daq 22
 
146 f9daq 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
{
173 f9daq 153
   int ret = 0;
146 f9daq 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:
173 f9daq 167
         SaveMeasSettings();
146 f9daq 168
         break;
169
 
170
      case M_FILE_SAVE_ASETTINGS:
173 f9daq 171
         SaveAnalSettings();
146 f9daq 172
         break;
173
 
173 f9daq 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
 
146 f9daq 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);
173 f9daq 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);
146 f9daq 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;
173 f9daq 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
146 f9daq 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();
173 f9daq 564
   numform[5] = 215000; //numform[5] = 375000;  // use commented part if Z is the longer axis and X the shorter
146 f9daq 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();
173 f9daq 576
   numform[5] = 215000; //numform[5] = 375000;  // use commented part if Z is the longer axis and X the shorter
146 f9daq 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();
173 f9daq 583
   numform[5] = 215000; //numform[5] = 375000;  // use commented part if Z is the longer axis and X the shorter
146 f9daq 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
172 f9daq 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");
146 f9daq 596
   posButtons = new TSubStructure();
172 f9daq 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"))
146 f9daq 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;
173 f9daq 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
146 f9daq 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();
173 f9daq 611
   numform[5] = 215000;
146 f9daq 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();
173 f9daq 618
   numform[5] = 375000; //numform[5] = 215000;  // use commented part if Z is the longer axis and X the shorter
146 f9daq 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();
173 f9daq 623
   numform[5] = 215000;
146 f9daq 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
173 f9daq 658
   if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *rotButtons -> 4 buttons (set rotation, read current rotation, home the motor, reset controller)\n");
146 f9daq 659
   rotButtons = new TSubStructure();
173 f9daq 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"))
146 f9daq 662
      fG1->AddFrame(rotButtons->outsidebox, f1expandXpad);
173 f9daq 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);
146 f9daq 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
 
172 f9daq 747
   Pixel_t pixel_color;
748
   gClient->GetColorByName("white", pixel_color);
749
   posButtons->widgetTB[4]->SetTextColor(pixel_color);
173 f9daq 750
   rotButEmergency->widgetTB[0]->SetTextColor(pixel_color);
172 f9daq 751
   gClient->GetColorByName("red", pixel_color);
752
   posButtons->widgetTB[4]->SetBackgroundColor(pixel_color);
173 f9daq 753
   rotButEmergency->widgetTB[0]->SetBackgroundColor(pixel_color);
172 f9daq 754
 
146 f9daq 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)");
172 f9daq 764
   posButtons->widgetTB[4]->Connect("Clicked()", "TGAppMainFrame", this, "PositionSet(=4)");
146 f9daq 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)");
173 f9daq 769
   rotButEmergency->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "RotationSet(=4)");
146 f9daq 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
181 f9daq 927
   if(DBGSIG > 1) printf("AppLayout(): Creating TSubStructure *relPde -> 1 check buttons (normalization)\n");
146 f9daq 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
 
167 f9daq 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
 
146 f9daq 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 -----------------------------------------------------------------
173 f9daq 1236
 
1237
   // Setting starting settings (when opening program)
1238
   GetMeasSettings();
1239
   GetAnalSettings();
146 f9daq 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
// -------------------------------------------------------------------