]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - TPC/AliTPCCalibViewerGUI.cxx
Removing flags unrecognised by clang
[u/mrichter/AliRoot.git] / TPC / AliTPCCalibViewerGUI.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16
17///////////////////////////////////////////////////////////////////////////////
18// //
19// GUI for the AliTPCCalibViewer //
20// used for the calibration monitor //
21// All functionalities of the AliTPCCalibViewer are here available
22//
23// Example usage: //
24/*
25 aliroot
26 AliTPCCalibViewerGUI::ShowGUI("CalibTree.root")
27
28*/
29// //
30// //
31///////////////////////////////////////////////////////////////////////////////
32
33
34#include "AliTPCCalibViewerGUI.h"
35#include "AliTPCCalPad.h"
36#include <iostream>
37
38#include <TCanvas.h>
39#include <TPad.h>
40#include <TVirtualPad.h>
41
42#include <TROOT.h>
43#include <TMath.h>
44#include <TObjArray.h>
45#include <TObjString.h>
46#include <TVector.h>
47#include <string.h>
48#include <TH1.h>
49#include "TStyle.h"
50#include "TGFileDialog.h"
51#include "TGInputDialog.h"
52#include "AliTPCCalibViewer.h"
53#include "AliTPCPreprocessorOnline.h"
54
55// #include "TGListBox.h"
56// #include "TGNumberEntry"
57// #include "TGSplitter"
58// #include "TGTab"
59// #include "TGLabel"
60// #include "TGButtonGroup"
61// #include "TGComboBox"
62// #include "TRootEmbeddedCanvas"
63// #include "TGButton"
64// #include "TGRadioButton"
65// #include "GTCheckButton"
66// #include "TGTextEntry"
67
68
69
70
71ClassImp(AliTPCCalibViewerGUI)
72
73AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h, char* fileName)
74 : TGCompositeFrame(p, w, h),
75 fViewer(0),
76 fPreprocessor(0),
77 fContTopBottom(0),
78 fContLCR(0),
79 fContLeft(0),
80 ftabLeft(0),
81 ftabLeft0(0),
82 ftabLeft1(0),
83 ftabRight(0),
84 fTabRight0(0),
85 fTabRight1(0),
86 fContRight(0),
87 fContCenter(0),
88 fContPlotOpt(0),
89 fContDrawOpt(0),
90 fContDrawOptSub1D2D(0),
91 fContNormalized(0),
92 fContCustom(0),
93 fContCuts(0),
94 fContSector(0),
95 fContAddCuts(0),
96 fContFit(0),
97 fContAddFit(0),
98 fContScaling(0),
99 fContSetMax(0),
100 fContSetMin(0),
101 fContAddDrawOpt(0),
102 fListVariables(0),
103 fBtnDraw(0),
104 fBtnFit(0),
105 fBtnAddFitFunction(0),
106 fBtnGetMinMax(0),
107 fCanvMain(0),
108 fRadioRaw(0),
109 fRadioNormalized(0),
110 fRadioPredefined(0),
111 fRadioCustom(0),
112 fRadio1D(0),
113 fRadio2D(0),
114 fRadioTPC(0),
115 fRadioSideA(0),
116 fRadioSideC(0),
117 fRadioROC(0),
118 fRadioSector(0),
119 fComboAddDrawOpt(0),
120 fChkAuto(0),
121 fChkAutoAppend(0),
122 fComboMethod(0),
123 fListNormalization(0),
124 fComboCustom(0),
125 fLblCustomDraw(0),
126 fChkAddDrawOpt(0),
127 fNmbSector(0),
128 fLblSector(0),
129 fChkCutZero(0),
130 fChkAddCuts(0),
131 fLblAddCuts(0),
132 fComboAddCuts(0),
133 fComboCustomFit(0),
134 fChkSetMax(0),
135 fChkSetMin(0),
136 fChkGetMinMaxAuto(0),
137 fTxtSetMax(0),
138 fTxtSetMin(0) ,
139 fContDrawOpt1D(0),
140 fcontDrawOpt1DSubLR(0),
141 fContDrawOpt1DSubNSC(0),
142 fRadioNorm(0),
143 fRadioSigma(0),
144 fTxtSigmas(0),
145 fContCumuLR(0),
146 fContCumLeft(0),
147 fContCumRight(0),
148 fLblSigmaMax(0),
149 fTxtSigmaMax(0),
150 fRadioCumulative(0),
151 fCheckCumulativePM(0),
152 fRadioIntegrate(0),
153 fContDrawOpt1DSubMML(0),
154 fChkMean(0),
155 fChkMedian(0),
156 fChkLTM(0),
157 fContStatOpt(0),
158 fChkStatName(0),
159 fChkStatEntries(0),
160 fContStatMean(0),
161 fChkStatMean(0),
162 fChkStatMeanPM(0),
163 fContStatRMS(0),
164 fChkStatRMS(0),
165 fChkStatRMSPM(0),
166 fChkStatUnderflow(0),
167 fChkStatOverflow(0),
168 fChkStatIntegral(0),
169 fContStatSkew(0),
170 fChkStatSkewness(0),
171 fChkStatSkewnessPM(0),
172 fContStatKurt(0),
173 fChkStatKurtosis(0),
174 fChkStatKurtosisPM(0),
175 fBtnUnchekAll(0),
176 fContLabeling(0),
177 fChkLabelTitle(0),
178 fTxtLabelTitle(0),
179 fChkLabelXaxis(0),
180 fTxtLabelXaxis(0),
181 fChkLabelYaxis(0),
182 fTxtLabelYaxis(0),
183 fChkLabelGetAuto(0),
184 fContSave(0),
185 fBtnSave(0),
186 fContAddSaveOpt(0),
187 fChkAddSaveOpt(0),
188 fComboAddSaveOpt(0),
189 fContExport(0),
190 fContAddExport(0),
191 fComboExportName(0),
192 fBtnExport(0),
193 fBtnAddNorm(0),
194 fContTree(0),
195 fBtnDumpToFile(0),
196 fBtnLoadTree(0),
197 fChkAddAsReference(0),
198 fTxtRefName(0),
199 fInitialized(0)
200{
201 //
202 // AliTPCCalibViewerGUI constructor; fileName specifies the ROOT tree used for drawing
203 //
204
205 // draw the GUI:
206 fPreprocessor = new AliTPCPreprocessorOnline();
207 DrawGUI(p, w, h);
208 // initialize the AliTPCCalibViewer:
209 if (fileName) Initialize(fileName);
210 // set default button states:
211 SetInitialValues();
212 // do first drawing:
213 if (fileName) DoDraw();
214}
215
216
217void AliTPCCalibViewerGUI::DrawGUI(const TGWindow *p, UInt_t w, UInt_t h) {
218 //
219 // draw the GUI
220 //
221 // ======================================================================
222 // ************************* Display everything *************************
223 // ======================================================================
224
225 SetCleanup(kDeepCleanup);
226 p = p; // to avoid compiler warnings
227
228 // *****************************************************************************
229 // ************************* content of this MainFrame *************************
230 // *****************************************************************************
231 // top level container with horizontal layout
232 fContTopBottom = new TGCompositeFrame(this, w, h, kVerticalFrame | kFixedWidth | kFixedHeight);
233 AddFrame(fContTopBottom, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
234
235 fContLCR = new TGCompositeFrame(fContTopBottom, w, h, kHorizontalFrame | kFixedWidth | kFixedHeight);
236 fContTopBottom->AddFrame(fContLCR, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
237
238 // ***********************************************************************
239 // ************************* content of fContLCR *************************
240 // ***********************************************************************
241 // left container
242 fContLeft = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
243 fContLCR->AddFrame(fContLeft, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 5, 3, 3, 3));
244
245 // left vertical splitter
246 TGVSplitter *splitLeft = new TGVSplitter(fContLCR);
247 splitLeft->SetFrame(fContLeft, kTRUE);
248 fContLCR->AddFrame(splitLeft, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
249
250 // right container
251 fContRight = new TGCompositeFrame(fContLCR, 150, 200, kVerticalFrame | kFixedWidth | kFitHeight);
252 fContLCR->AddFrame(fContRight, new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandY, 3, 5, 3, 3));
253
254 // center container
255 fContCenter = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
256 fContLCR->AddFrame(fContCenter, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
257
258 // right vertical splitter
259 TGVSplitter *splitRight = new TGVSplitter(fContLCR);
260 splitRight->SetFrame(fContRight, kFALSE);
261 fContLCR->AddFrame(splitRight, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
262
263
264 // ========================================================================
265 // ************************* content of fContLeft *************************
266 // ========================================================================
267 // --- draw button and tabLeft ---
268 // draw button
269 fBtnDraw = new TGTextButton(fContLeft, "&Draw");
270 fContLeft->AddFrame(fBtnDraw, new TGLayoutHints(kLHintsExpandX, 10, 10, 0, 0));
271 //fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoTest(=\"fBtnDraw clicked\")");
272 fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoDraw()");
273 fBtnDraw->SetToolTipText("Press here to draw according to selections.");
274
275 // tabs on the left side:
276 ftabLeft = new TGTab(fContLeft);
277 fContLeft->AddFrame(ftabLeft, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
278 ftabLeft0 = ftabLeft->AddTab("General");
279 ftabLeft1 = ftabLeft->AddTab("More plot options");
280
281
282 // **************************** content of tabLeft0 *******************************
283
284 // draw options container *** fcontDrawOpt *** " Plot options "
285 fContDrawOpt = new TGGroupFrame(ftabLeft0, "Plot options", kVerticalFrame | kFitWidth | kFitHeight);
286 ftabLeft0->AddFrame(fContDrawOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
287 fContDrawOptSub1D2D = new TGCompositeFrame(fContDrawOpt, 200, 23, kHorizontalFrame | kFitWidth | kFixedHeight);
288 fContDrawOpt->AddFrame(fContDrawOptSub1D2D, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
289
290 // ------------------------- content of fContDrawOpt -------------------------
291 // -- radio1D, radio2D, chkAuto
292 // 1D radio button
293 fRadio1D = new TGRadioButton(fContDrawOptSub1D2D, "1D", 30);
294 fContDrawOptSub1D2D->AddFrame(fRadio1D, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
295 fRadio1D->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
296 fRadio1D->SetToolTipText("1D drawing \nSelect this if you want to have the full control for the custom draw.");
297
298 // 2D radio button
299 fRadio2D = new TGRadioButton(fContDrawOptSub1D2D, "2D", 31);
300 fContDrawOptSub1D2D->AddFrame(fRadio2D, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0));
301 fRadio2D->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
302 fRadio2D->SetToolTipText("2D drawing");
303
304 // additional draw options container
305 fContAddDrawOpt = new TGCompositeFrame(fContDrawOpt, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
306 fContDrawOpt->AddFrame(fContAddDrawOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
307
308 // content of --- fContAddDrawOpt ---
309 // addition draw options label
310 fChkAddDrawOpt = new TGCheckButton(fContAddDrawOpt, "Draw options:");
311 //fChkAddDrawOpt->SetTextJustify(kTextLeft);
312 fContAddDrawOpt->AddFrame(fChkAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
313 fChkAddDrawOpt->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
314 fChkAddDrawOpt->SetToolTipText("Enter additional draw options like 'prof' or 'colz' here.\nBe careful with the option 'same' for 2D drawings as it will crash (ROOT feature).");
315
316 // additional draw options combo box
317 fComboAddDrawOpt = new TGComboBox(fContAddDrawOpt);
318 fComboAddDrawOpt->Resize(0, fBtnDraw->GetDefaultHeight());
319 fComboAddDrawOpt->EnableTextInput(kTRUE);
320 fContAddDrawOpt->AddFrame(fComboAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
321 fComboAddDrawOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=14)");
322 fComboAddDrawOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
323
324 // automatic redraw check button
325 fChkAuto = new TGCheckButton(fContDrawOpt, "Auto redraw");
326 fContDrawOpt->AddFrame(fChkAuto, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
327 fChkAuto->SetToolTipText("Decide if you want an automatic redraw on each new selection.\nNot recommended on a slow machine, during remote connection or if your draw option is 'same'.");
328
329 // automatic append ending check button
330 fChkAutoAppend = new TGCheckButton(fContDrawOpt, "Auto add appending");
331 fContDrawOpt->AddFrame(fChkAutoAppend, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
332 fChkAutoAppend->SetToolTipText("Tries to repair your custom draw string or custom cut string, if you forgot '~' or '.fElements' \nThis function may be buggy!");
333
334
335 // *** predefined radio button *** " Predefined "
336 fRadioPredefined = new TGRadioButton(ftabLeft0, "Predefined: ", 13);
337 ftabLeft0->AddFrame(fRadioPredefined, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
338 fRadioPredefined->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
339 fRadioPredefined->SetToolTipText("Draw predefined variables according to selection.");
340
341 // list of variables
342 fListVariables = new TGListBox(ftabLeft0);
343 ftabLeft0->AddFrame(fListVariables, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 10, 0, 0, 0));
344 fListVariables->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
345
346
347 // normalization options container *** fContPlotOpt ***
348 //fContPlotOpt = new TGCompositeFrame(fContLeft, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
349 fContPlotOpt = new TGGroupFrame(ftabLeft0, "Normalization options", kVerticalFrame | kFitWidth | kFitHeight);
350 ftabLeft0->AddFrame(fContPlotOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 0, 0, 0));
351
352 // ------------------------- content of fContPlotOpt -------------------------
353 // raw radio button
354 fRadioRaw = new TGRadioButton(fContPlotOpt, "Raw", 10);
355 fContPlotOpt->AddFrame(fRadioRaw, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
356 fRadioRaw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
357 fRadioRaw->SetToolTipText("Plot without normalization");
358
359 // normalized radio button
360 fRadioNormalized = new TGRadioButton(fContPlotOpt, "Normalized", 11);
361 fContPlotOpt->AddFrame(fRadioNormalized, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
362 fRadioNormalized->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
363 fRadioNormalized->SetToolTipText("Normalize data");
364
365 // normalized options container *** fContNormalized ***
366 fContNormalized = new TGCompositeFrame(fContPlotOpt, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
367 fContPlotOpt->AddFrame(fContNormalized, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 15, 0, 0, 0));
368
369 // --- content of fContNormalized ---
370 // --- combo box to select 'subtract' or 'divide', list of normalization variables
371 // method drop down combo box
372 fComboMethod = new TGComboBox(fContNormalized);
373 fComboMethod->Resize(0, fBtnDraw->GetDefaultHeight());
374 fContNormalized->AddFrame(fComboMethod, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
375 fComboMethod->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
376
377 // list of normalization variables
378 fListNormalization = new TGListBox(fContNormalized);
379 fContNormalized->AddFrame(fListNormalization, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
380 fListNormalization->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
381
382 // custom radio button
383 fRadioCustom = new TGRadioButton(ftabLeft0, "Custom: ", 12);
384 ftabLeft0->AddFrame(fRadioCustom, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
385 fRadioCustom->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
386 fRadioCustom->SetToolTipText("Draw data according to user specific text entry in the 'Custom Draw' line. Remember '~' (= '.fElements')!");
387 // custom options container is located further down
388
389 // **************************** content of tabLeft1 *******************************
390
391 // draw options container *** fcontDrawOpt1D *** " Plot options "
392 fContDrawOpt1D = new TGGroupFrame(ftabLeft1, "1D Plot options", kVerticalFrame | kFitWidth | kFitHeight);
393 ftabLeft1->AddFrame(fContDrawOpt1D, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
394
395 fcontDrawOpt1DSubLR = new TGCompositeFrame(fContDrawOpt1D, 1, 1, kVerticalFrame | kFitWidth | kFitHeight);
396 fContDrawOpt1D->AddFrame(fcontDrawOpt1DSubLR, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
397
398 // ***** content of fContDrawOpt1DSubLR *****
399 fContDrawOpt1DSubNSC = new TGCompositeFrame(fcontDrawOpt1DSubLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
400 fcontDrawOpt1DSubLR->AddFrame(fContDrawOpt1DSubNSC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
401
402 // --------------------------- content of fContDrawOpt1DSubNSC -----------------
403 fRadioNorm = new TGRadioButton(fContDrawOpt1DSubNSC, "Normal", 110);
404 fContDrawOpt1DSubNSC->AddFrame(fRadioNorm, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
405 fRadioNorm->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
406 fRadioNorm->SetToolTipText("Produce a normal 1D plot, a histogram of the selected data.");
407
408 fRadioSigma = new TGRadioButton(fContDrawOpt1DSubNSC, "Sigma", 111);
409 fContDrawOpt1DSubNSC->AddFrame(fRadioSigma, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
410 fRadioSigma->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
411 fRadioSigma->SetToolTipText("Draw a normal histogram, but also lines that indicate the mean/median/LTM \nand sigmas of the selected data.");
412
413 fTxtSigmas = new TGTextEntry(fContDrawOpt1DSubNSC, "2; 4; 6", 111);
414 fContDrawOpt1DSubNSC->AddFrame(fTxtSigmas, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 10, 15, 0, 0));
415 fTxtSigmas->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtons1D(=111)");
416 fTxtSigmas->SetToolTipText("Enter sigma intervals you would like to be indicated by lines. \nExample: '2; 4; 6'");
417
418 fContCumuLR = new TGCompositeFrame(fContDrawOpt1DSubNSC, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
419 fContDrawOpt1DSubNSC->AddFrame(fContCumuLR, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 0));
420
421 fContCumLeft = new TGCompositeFrame(fContCumuLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
422 fContCumuLR->AddFrame(fContCumLeft, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
423
424 fRadioCumulative = new TGRadioButton(fContCumLeft, "Cumulative", 112);
425 fContCumLeft->AddFrame(fRadioCumulative, new TGLayoutHints(kLHintsNormal, 0, 10, 0, 0));
426 fRadioCumulative->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
427 fRadioCumulative->SetToolTipText("Draw the cumulative (SigmaCut) of the given selection. \nThe data distribution is integrated, starting from the mean/median/LTM.");
428
429 fCheckCumulativePM = new TGCheckButton(fContCumLeft, "Plus/Minus");
430 fContCumLeft->AddFrame(fCheckCumulativePM, new TGLayoutHints(kLHintsNormal, 10, 15, 0, 0));
431 fCheckCumulativePM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
432 fCheckCumulativePM->SetToolTipText("Decide whether you want the cumulative integration for each direction (+/-) \nor only for the absolute distance to the mean/median/LTM value.");
433
434 fRadioIntegrate = new TGRadioButton(fContCumLeft, "Integrate", 113);
435 fContCumLeft->AddFrame(fRadioIntegrate, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
436 fRadioIntegrate->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
437 fRadioIntegrate->SetToolTipText("Draw the integral of the given selection.");
438
439 fContCumRight = new TGCompositeFrame(fContCumuLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
440 fContCumuLR->AddFrame(fContCumRight, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
441
442 fLblSigmaMax = new TGLabel(fContCumRight, "SigmaMax:");
443 fLblSigmaMax->SetTextJustify(kTextLeft);
444 fContCumRight->AddFrame(fLblSigmaMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
445
446 fTxtSigmaMax = new TGTextEntry(fContCumRight, "5", 112);
447 fContCumRight->AddFrame(fTxtSigmaMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 10, 15, 0, 0));
448 fTxtSigmaMax->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtons1D(=112)");
449 fTxtSigmaMax->SetToolTipText("Enter up to which multiple of sigma you want to integrate.");
450
451
452 fContDrawOpt1DSubMML = new TGCompositeFrame(fcontDrawOpt1DSubLR, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
453 fcontDrawOpt1DSubLR->AddFrame(fContDrawOpt1DSubMML, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 0));
454
455 // -------------- content of fcontDrawOpt1DSubLR
456 fChkMean = new TGCheckButton(fContDrawOpt1DSubMML, "Mean");
457 fContDrawOpt1DSubMML->AddFrame(fChkMean, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
458 fChkMean->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
459 fChkMean->SetToolTipText("Activate Mean for Sigma/Cumulative/Integrate");
460
461 fChkMedian = new TGCheckButton(fContDrawOpt1DSubMML, "Median");
462 fContDrawOpt1DSubMML->AddFrame(fChkMedian, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
463 fChkMedian->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
464 fChkMedian->SetToolTipText("Activate Median for Sigma/Cumulative/Integrate");
465
466 fChkLTM = new TGCheckButton(fContDrawOpt1DSubMML, "LTM");
467 fContDrawOpt1DSubMML->AddFrame(fChkLTM, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
468 fChkLTM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
469 fChkLTM->SetToolTipText("Activate LTM for Sigma/Cumulative/Integrate");
470
471
472 // statistic options container *** fcontStatOpt1D *** " Statistic options "
473 fContStatOpt = new TGGroupFrame(ftabLeft1, "Statistic options", kVerticalFrame | kFitWidth | kFitHeight);
474 ftabLeft1->AddFrame(fContStatOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
475
476 fChkStatName = new TGCheckButton(fContStatOpt, "Name");
477 fContStatOpt->AddFrame(fChkStatName, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
478 fChkStatName->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
479 fChkStatName->SetToolTipText("Display the name in the statistics legend.");
480
481 fChkStatEntries = new TGCheckButton(fContStatOpt, "Entries");
482 fContStatOpt->AddFrame(fChkStatEntries, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
483 fChkStatEntries->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
484 fChkStatEntries->SetToolTipText("Display the number of entries in the statistics legend.");
485
486 fContStatMean = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
487 fContStatOpt->AddFrame(fContStatMean, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
488
489 fChkStatMean = new TGCheckButton(fContStatMean, "Mean");
490 fContStatMean->AddFrame(fChkStatMean, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
491 fChkStatMean->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
492 fChkStatMean->SetToolTipText("Display the mean value of the data in the statistics legend.");
493
494 fChkStatMeanPM = new TGCheckButton(fContStatMean, "+- Error");
495 fContStatMean->AddFrame(fChkStatMeanPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
496 fChkStatMeanPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
497 fChkStatMeanPM->SetToolTipText("Display the mean value's error in the statistics legend.");
498
499 fContStatRMS = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
500 fContStatOpt->AddFrame(fContStatRMS, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
501
502 fChkStatRMS = new TGCheckButton(fContStatRMS, "RMS");
503 fContStatRMS->AddFrame(fChkStatRMS, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
504 fChkStatRMS->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
505 fChkStatRMS->SetToolTipText("Display the RMS value of the data in the statistics legend.");
506
507 fChkStatRMSPM = new TGCheckButton(fContStatRMS, "+- Error");
508 fContStatRMS->AddFrame(fChkStatRMSPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
509 fChkStatRMSPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
510 fChkStatRMSPM->SetToolTipText("Display the RMS value's error in the statistics legend.");
511
512 fChkStatUnderflow = new TGCheckButton(fContStatOpt, "Underflow");
513 fContStatOpt->AddFrame(fChkStatUnderflow, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
514 fChkStatUnderflow->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
515 fChkStatUnderflow->SetToolTipText("Display the number of entries in the underflow bin.");
516
517 fChkStatOverflow = new TGCheckButton(fContStatOpt, "Overflow");
518 fContStatOpt->AddFrame(fChkStatOverflow, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
519 fChkStatOverflow->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
520 fChkStatOverflow->SetToolTipText("Display the number of entries in the overflow bin.");
521
522 fChkStatIntegral = new TGCheckButton(fContStatOpt, "Integral");
523 fContStatOpt->AddFrame(fChkStatIntegral, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
524 fChkStatIntegral->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
525 fChkStatIntegral->SetToolTipText("Display the integral of the data in the statistics legend.");
526
527 fContStatSkew = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
528 fContStatOpt->AddFrame(fContStatSkew, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
529
530 fChkStatSkewness = new TGCheckButton(fContStatSkew, "Skewness");
531 fContStatSkew->AddFrame(fChkStatSkewness, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
532 fChkStatSkewness->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
533 fChkStatSkewness->SetToolTipText("Display the skewness of the data in the statistics legend. \nBe careful! Sometimes the skewness causes a floating point exception that hangs the GUI!");
534
535 fChkStatSkewnessPM = new TGCheckButton(fContStatSkew, "+- Error");
536 fContStatSkew->AddFrame(fChkStatSkewnessPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
537 fChkStatSkewnessPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
538 fChkStatSkewnessPM->SetToolTipText("Display the skewness' error in the statistics legend.");
539
540 fContStatKurt = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
541 fContStatOpt->AddFrame(fContStatKurt, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
542
543 fChkStatKurtosis = new TGCheckButton(fContStatKurt, "Kurtosis");
544 fContStatKurt->AddFrame(fChkStatKurtosis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
545 fChkStatKurtosis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
546 fChkStatKurtosis->SetToolTipText("Display the kurtosis of the data in the statistics legend.");
547
548 fChkStatKurtosisPM = new TGCheckButton(fContStatKurt, "+- Error");
549 fContStatKurt->AddFrame(fChkStatKurtosisPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
550 fChkStatKurtosisPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
551 fChkStatKurtosisPM->SetToolTipText("Display the kurtosis' error in the statistics legend.");
552
553 fBtnUnchekAll = new TGTextButton(fContStatOpt, "&Uncheck all");
554 fContStatOpt->AddFrame(fBtnUnchekAll, new TGLayoutHints(kLHintsExpandX, 10, 10, 0, 0));
555 //fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoTest(=\"fBtnDraw clicked\")");
556 fBtnUnchekAll->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "UnchekAllStat()");
557 fBtnUnchekAll->SetToolTipText("Disable all statistics legend entries, \nno statistics legend.");
558
559
560 // custom options container
561 // --- fComboCustom --- the custom draw line on the very low
562 fContCustom = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
563 fContTopBottom->AddFrame(fContCustom, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
564
565 // ------------------------- content of fContCustom -------------------------
566 fLblCustomDraw = new TGLabel(fContCustom, "Custom draw: ");
567 fLblCustomDraw->SetTextJustify(kTextLeft);
568 fContCustom->AddFrame(fLblCustomDraw, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
569 // text field for custom draw command
570 fComboCustom = new TGComboBox(fContCustom);
571 fComboCustom->Resize(0, fBtnDraw->GetDefaultHeight());
572 fComboCustom->EnableTextInput(kTRUE);
573 fContCustom->AddFrame(fComboCustom, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
574 fComboCustom->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=42)");
575 fComboCustom->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
576
577
578 // additional cuts container
579 fContAddCuts = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
580 fContTopBottom->AddFrame(fContAddCuts, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
581
582 // ------------------------- content of fContAddCuts -------------------------
583 fLblAddCuts = new TGLabel(fContAddCuts, "Custom cuts: ");
584 fLblAddCuts->SetTextJustify(kTextLeft);
585 fContAddCuts->AddFrame(fLblAddCuts, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
586 // combo text field for additional cuts
587 fComboAddCuts = new TGComboBox(fContAddCuts);
588 fComboAddCuts->Resize(0, fBtnDraw->GetDefaultHeight());
589 fComboAddCuts->EnableTextInput(kTRUE);
590 fContAddCuts->AddFrame(fComboAddCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
591 fComboAddCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts(=31)");
592 fComboAddCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
593
594 // ==========================================================================
595 // ************************* content of fContCenter *************************
596 // ========================================================================
597 // main drawing canvas
598 fCanvMain = new TRootEmbeddedCanvas("Main_Canvas", fContCenter, 200, 200, kFitWidth | kFitHeight);
599 fContCenter->AddFrame(fCanvMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
600 fCanvMain->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "AliTPCCalibViewerGUI", this, "MouseMove(Int_t, Int_t, Int_t, TObject*)");
601 fCanvMain->GetCanvas()->Connect("RangeAxisChanged()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
602 fCanvMain->GetCanvas()->SetToolTipText("The Main_Canvas, here your plots are displayed.");
603
604
605 // =========================================================================
606 // ************************* content of fContRight *************************
607 // ========================================================================
608
609 // tabs on the right side:
610 ftabRight = new TGTab(fContRight);
611 fContRight->AddFrame(ftabRight, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
612 fTabRight0 = ftabRight->AddTab("Basic");
613 fTabRight1 = ftabRight->AddTab("Advanced");
614
615
616 // **************************** content of tabLeft0 *******************************
617 // cut options container
618 fContCuts = new TGGroupFrame(fTabRight0, "Cuts", kVerticalFrame | kFitWidth | kFitHeight);
619 fTabRight0->AddFrame(fContCuts, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
620
621
622 // ************************* content of fContCuts *************************
623 // TPC radio button
624 fRadioTPC = new TGRadioButton(fContCuts, "Whole TPC", 20);
625 fContCuts->AddFrame(fRadioTPC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
626 fRadioTPC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
627 fRadioTPC->SetToolTipText("No cuts, use the whole TPC. \nIn 2D mode, A side and C side are superimposed!");
628
629 // side A radio button
630 fRadioSideA = new TGRadioButton(fContCuts, "Side A", 21);
631 fContCuts->AddFrame(fRadioSideA, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
632 fRadioSideA->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
633 fRadioSideA->SetToolTipText("Use only side A.");
634
635 // side C radio button
636 fRadioSideC = new TGRadioButton(fContCuts, "Side C", 22);
637 fContCuts->AddFrame(fRadioSideC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
638 fRadioSideC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
639 fRadioSideC->SetToolTipText("Use only side C.");
640
641 // roc radio button
642 fRadioROC = new TGRadioButton(fContCuts, "ROC", 23);
643 fContCuts->AddFrame(fRadioROC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
644 fRadioROC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
645 fRadioROC->SetToolTipText("Use only one ROC (readout chamber).");
646
647 // sector radio button
648 fRadioSector = new TGRadioButton(fContCuts, "Sector", 24);
649 fContCuts->AddFrame(fRadioSector, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
650 fRadioSector->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
651 fRadioSector->SetToolTipText("Use only one Sector (0-17 A-Side, 18-35 C-Side).");
652
653 // sector options container
654 fContSector = new TGCompositeFrame(fContCuts, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
655 fContCuts->AddFrame(fContSector, new TGLayoutHints(kLHintsExpandX, 5, 0, 0, 0));
656
657 // ------------------------- content of fContSector -------------------------
658 // sector number entry
659 fNmbSector = new TGNumberEntry(fContSector, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, 71);
660 fContSector->AddFrame(fNmbSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
661 fNmbSector->Connect("ValueSet(Long_t)", "AliTPCCalibViewerGUI", this, "ChangeSector()");
662
663 // sector number label
664 fLblSector = new TGLabel(fContSector, "IROC, A");
665 fLblSector->SetTextJustify(kTextLeft);
666 fContSector->AddFrame(fLblSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
667
668 // cut zeros check button
669 fChkCutZero = new TGCheckButton(fContCuts, "Cut zeros");
670 fContCuts->AddFrame(fChkCutZero, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
671 fChkCutZero->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
672 fChkCutZero->SetToolTipText("Use only values that are not zero. \nWhen doing a custom draw this cut is composed of the draw string\nup to the first ':' or '>>' and the condition that this should not be zero.");
673
674 // additional cuts check button
675 fChkAddCuts = new TGCheckButton(fContCuts, "Custom cuts");
676 fContCuts->AddFrame(fChkAddCuts, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
677 fChkAddCuts->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
678 fChkAddCuts->SetToolTipText("Activate the custom cuts on the bottom. Remember '~' (= '.fElements')!");
679 // fContAddCuts' content is locaed further op
680
681
682 // Scaling options container
683 fContScaling = new TGGroupFrame(fTabRight0, "Scaling", kVerticalFrame | kFitWidth | kFitHeight);
684 fTabRight0->AddFrame(fContScaling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
685
686 // ************************* content of fContScaling *************************
687 // SetMaximum container
688 fContSetMax = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
689 fContScaling->AddFrame(fContSetMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
690
691 // ------------------------- content of fContSetMax -------------------------
692 // SetMaximum - checkbox
693 fChkSetMax = new TGCheckButton(fContSetMax, "Set fixed max.");
694 fContSetMax->AddFrame(fChkSetMax, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
695 fChkSetMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
696 fChkSetMax->SetToolTipText("Set the maximum fixed to the value specified here.");
697
698 // text field for maximum value
699 fTxtSetMax = new TGTextEntry(fContSetMax, "", 41);
700 fContSetMax->AddFrame(fTxtSetMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
701 fTxtSetMax->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
702 fTxtSetMax->SetToolTipText("maximum value for the drawing");
703
704 // SetMinimum container
705 fContSetMin = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
706 fContScaling->AddFrame(fContSetMin, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
707
708 // ------------------------- content of fContSetMin -------------------------
709 // SetMinimum - checkbox
710 fChkSetMin = new TGCheckButton(fContSetMin, "Set fixed min.");
711 fContSetMin->AddFrame(fChkSetMin, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
712 fChkSetMin->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
713 fChkSetMin->SetToolTipText("Set the minimum fixed to the value specified here.");
714
715 // text field for minimum value
716 fTxtSetMin = new TGTextEntry(fContSetMin, "", 40);
717 fContSetMin->AddFrame(fTxtSetMin, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
718 fTxtSetMin->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
719 fTxtSetMin->SetToolTipText("minimum value for the drawing");
720
721 // get Min & Max from Plot - button
722 fBtnGetMinMax = new TGTextButton(fContScaling, "&Get scale from plot");
723 fContScaling->AddFrame(fBtnGetMinMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
724 fBtnGetMinMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
725 fBtnGetMinMax->SetToolTipText("Get min and max from plot, e.g. after rescaling by dragging the palette. \nObsolete! The button's function will change to 'Unzoom all'.");
726
727 // GetMinMaxAuto - checkbox
728 fChkGetMinMaxAuto = new TGCheckButton(fContScaling, "Get Min + Max auto.");
729 fContScaling->AddFrame(fChkGetMinMaxAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
730 fChkGetMinMaxAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
731 fChkGetMinMaxAuto->SetToolTipText("Get minimum and maximum automatically from each new plot. \nDeactivate this, if you want to 'save' your specified minimum and maximum.");
732
733 // labeling container *** fContLabeling *** " Labeling "
734 fContLabeling = new TGGroupFrame(fTabRight0, "Labeling", kVerticalFrame | kFitWidth | kFitHeight);
735 fTabRight0->AddFrame(fContLabeling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
736
737 fChkLabelTitle = new TGCheckButton(fContLabeling, "Set title:");
738 fContLabeling->AddFrame(fChkLabelTitle, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
739 fChkLabelTitle->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
740 fChkLabelTitle->SetToolTipText("Set the plot title.");
741
742 fTxtLabelTitle = new TGTextEntry(fContLabeling, "Title", 500);
743 fContLabeling->AddFrame(fTxtLabelTitle, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
744 fTxtLabelTitle->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=50)");
745 fTxtLabelTitle->SetToolTipText("plot title");
746
747 fChkLabelXaxis = new TGCheckButton(fContLabeling, "Set X-axis label:");
748 fContLabeling->AddFrame(fChkLabelXaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
749 fChkLabelXaxis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
750 fChkLabelXaxis->SetToolTipText("Set the X-axis label.");
751
752 fTxtLabelXaxis = new TGTextEntry(fContLabeling, "XaxisLabel", 500);
753 fContLabeling->AddFrame(fTxtLabelXaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
754 fTxtLabelXaxis->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=51)");
755 fTxtLabelXaxis->SetToolTipText("X-axis label");
756
757 fChkLabelYaxis = new TGCheckButton(fContLabeling, "Set Y-axis label:");
758 fContLabeling->AddFrame(fChkLabelYaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
759 fChkLabelYaxis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
760 fChkLabelYaxis->SetToolTipText("Set the Y-axis label.");
761
762 fTxtLabelYaxis = new TGTextEntry(fContLabeling, "YaxisLabel", 500);
763 fContLabeling->AddFrame(fTxtLabelYaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
764 fTxtLabelYaxis->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=52)");
765 fTxtLabelYaxis->SetToolTipText("Y-axis label");
766
767 fChkLabelGetAuto = new TGCheckButton(fContLabeling, "Get labels auto.");
768 fContLabeling->AddFrame(fChkLabelGetAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
769 fChkLabelGetAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
770 fChkLabelGetAuto->SetToolTipText("Get labels automatically from each new plot \nDeactivate this, if you want to 'save' your specified labels.");
771
772
773 // **************************** content of ftabRight1 *******************************
774 // Save container
775 fContSave = new TGGroupFrame(fTabRight1, "Save", kVerticalFrame | kFitWidth | kFitHeight);
776 fTabRight1->AddFrame(fContSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
777 // save button
778 fBtnSave = new TGTextButton(fContSave, "&Save picture");
779 fContSave->AddFrame(fBtnSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
780 fBtnSave->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "SavePicture()");
781 fBtnSave->SetToolTipText("Open a 'Save as...' dialog to save the current plot as picture or macro.");
782
783 // additional save options container
784 fContAddSaveOpt = new TGCompositeFrame(fContSave, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
785 fContSave->AddFrame(fContAddSaveOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
786
787 // content of --- fContAddSaveOpt ---
788 // addition save options label
789 fChkAddSaveOpt = new TGCheckButton(fContAddSaveOpt, "Save options:");
790 fContAddSaveOpt->AddFrame(fChkAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
791 fChkAddSaveOpt->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
792 fChkAddSaveOpt->SetToolTipText("Additional save options (see documentation for TPad::Print()).");
793
794 // additional save options combo box
795 fComboAddSaveOpt = new TGComboBox(fContAddSaveOpt);
796 fContAddSaveOpt->AddFrame(fComboAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
797 fComboAddSaveOpt->Resize(0, fBtnDraw->GetDefaultHeight());
798 fComboAddSaveOpt->EnableTextInput(kTRUE);
799 fComboAddSaveOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "SavePicture()");
800 // fComboAddSaveOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "SavePicture()");
801
802 // calPad export container
803 fContExport = new TGGroupFrame(fTabRight1, "Export AliTPCCalPad", kVerticalFrame | kFitWidth | kFitHeight);
804 fTabRight1->AddFrame(fContExport, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
805
806 // ------------------------- content of fContExport -------------------------
807 // container for export name
808 fContAddExport = new TGCompositeFrame(fContExport, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
809 fContExport->AddFrame(fContAddExport, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
810
811 fComboExportName = new TGComboBox(fContAddExport);
812 fComboExportName->Resize(0, fBtnDraw->GetDefaultHeight());
813 fContAddExport->AddFrame(fComboExportName, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
814 fComboExportName->AddEntry("calPad", 0); // first default value
815 fComboExportName->Select(0); // select default value before connecting
816 fComboExportName->EnableTextInput(kTRUE);
817 fComboExportName->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "DoExport()");
818 fComboExportName->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoExport()");
819
820 // export button
821 fBtnExport = new TGTextButton(fContExport, "&Export to CINT");
822 fContExport->AddFrame(fBtnExport, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
823 fBtnExport->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoExport()");
824 fBtnExport->SetToolTipText("Export the current 2D view as AliTPCCalPad to the CINT command line interpreter, use the specified name. \nThis works only in 2D mode.");
825
826 // add to normalisation button
827 fBtnAddNorm = new TGTextButton(fContExport, "&Add to normalization");
828 fContExport->AddFrame(fBtnAddNorm, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
829 fBtnAddNorm->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoExportNorm()");
830 fBtnAddNorm->SetToolTipText("Use the current 2D view as normalization variable, use the specified name. \nNot yet working!");
831
832 // Tree container
833 fContTree = new TGGroupFrame(fTabRight1, "Tree", kVerticalFrame | kFitWidth | kFitHeight);
834 fTabRight1->AddFrame(fContTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
835
836 // dump tree to file button
837 fBtnDumpToFile = new TGTextButton(fContTree, "&Dump to File");
838 fContTree->AddFrame(fBtnDumpToFile, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
839 fBtnDumpToFile->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoDumpToFile()");
840 fBtnDumpToFile->SetToolTipText("Write the exported CalPads to a new CalibTree");
841
842 // dump tree to file button
843 fBtnLoadTree = new TGTextButton(fContTree, "&Load Tree");
844 fContTree->AddFrame(fBtnLoadTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
845 fBtnLoadTree->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoLoadTree()");
846 fBtnLoadTree->SetToolTipText("Load and initialize a new calibration tree. ");
847
848 fChkAddAsReference = new TGCheckButton(fContTree, "as reference:");
849 fContTree->AddFrame(fChkAddAsReference, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
850 fChkAddAsReference->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoLoadTree()");
851 fChkAddAsReference->SetToolTipText("To add a new tree as reference tree.");
852
853 fTxtRefName = new TGTextEntry(fContTree, "R", 500);
854 fContTree->AddFrame(fTxtRefName, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 15, 0, 0, 0));
855 // fTxtRefName->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=50)");
856 fTxtRefName->SetToolTipText("Reference Name");
857
858
859 // Fit options container
860 fContFit = new TGGroupFrame(fTabRight1, "Custom fit", kVerticalFrame | kFitWidth | kFitHeight);
861 fTabRight1->AddFrame(fContFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
862
863 // ------------------------- content of fContFit -------------------------
864 // container for additional fits
865 fContAddFit = new TGCompositeFrame(fContFit, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
866 fContFit->AddFrame(fContAddFit, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
867
868 // --- content of fContAddFit ---
869 // text field for custom fit
870 fComboCustomFit = new TGComboBox(fContAddFit);
871 fComboCustomFit->Resize(0, fBtnDraw->GetDefaultHeight());
872 fComboCustomFit->EnableTextInput(kTRUE);
873 fContAddFit->AddFrame(fComboCustomFit, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
874 fComboCustomFit->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "DoFit()");
875 fComboCustomFit->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoFit()");
876
877 // fit button
878 fBtnFit = new TGTextButton(fContAddFit, "&Fit");
879 fContAddFit->AddFrame(fBtnFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
880 fBtnFit->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoFit()");
881 fBtnFit->SetToolTipText("Fit a whole TPC side, e.g. with gx~ ++ gy~, the result is printed to the console \nNot yet final status.");
882
883 // add fit function button
884 //fBtnAddFitFunction = new TGTextButton(fContAddFit, "&Add fit function to normalization");
885 //fContAddFit->AddFrame(fBtnAddFitFunction, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
886 //fBtnAddFitFunction->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "AddFitFunction()");
887
888 SetWindowName("AliTPCCalibViewer GUI");
889 MapSubwindows();
890 Resize(GetDefaultSize());
891 MapWindow();
892}
893
894
895void AliTPCCalibViewerGUI::SetInitialValues() {
896 //
897 // Set the default button states
898 //
899 fChkAuto->SetState(kButtonUp);
900 fRadioPredefined->SetState(kButtonDown);
901 fRadioRaw->SetState(kButtonDown);
902 fRadioTPC->SetState(kButtonDown);
903 fRadio1D->SetState(kButtonDown);
904 fChkAddCuts->SetState(kButtonUp);
905 fChkGetMinMaxAuto->SetState(kButtonDown);
906 fChkSetMin->SetState(kButtonUp);
907 fChkSetMax->SetState(kButtonUp);
908 fRadioNorm->SetState(kButtonDown);
909 fRadioSigma->SetState(kButtonUp);
910 fRadioCumulative->SetState(kButtonUp);
911 fChkMean->SetState(kButtonDown);
912 fCheckCumulativePM->SetState(kButtonUp);
913
914 fChkLabelGetAuto->SetState(kButtonDown);
915
916 // TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
917 // TODO Set the checkboxes state as it is really TODO
918 // TODO in gStyle TODO
919 // TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
920// k = 1; kurtosis printed
921// k = 2; kurtosis and kurtosis error printed
922// s = 1; skewness printed
923// s = 2; skewness and skewness error printed
924// i = 1; integral of bins printed
925// o = 1; number of overflows printed
926// u = 1; number of underflows printed
927// r = 1; rms printed
928// r = 2; rms and rms error printed
929// m = 1; mean value printed
930// m = 2; mean and mean error values printed
931// e = 1; number of entries printed
932// n = 1; name of histogram is printed
933// (default = 000001111)
934
935 Int_t statOpt = gStyle->GetOptStat();
936 if (statOpt == 1) statOpt = 1111;
937 if (statOpt / 200000000 >= 1) {
938 fChkStatKurtosis->SetState(kButtonDown);
939 fChkStatKurtosisPM->SetState(kButtonDown);
940 statOpt -= 200000000;
941 }
942 if (statOpt / 100000000 >= 1) {
943 fChkStatKurtosis->SetState(kButtonDown);
944 statOpt -= 100000000;
945 }
946 if (statOpt / 20000000 >= 1) {
947 fChkStatSkewness->SetState(kButtonDown);
948 fChkStatSkewnessPM->SetState(kButtonDown);
949 statOpt -= 20000000;
950 }
951 if (statOpt / 10000000 >= 1) {
952 fChkStatSkewness->SetState(kButtonDown);
953 statOpt -= 10000000;
954 }
955 if (statOpt / 1000000 >= 1) {
956 fChkStatIntegral->SetState(kButtonDown);
957 statOpt -= 1000000;
958 }
959 if (statOpt / 100000 >= 1) {
960 fChkStatOverflow->SetState(kButtonDown);
961 statOpt -= 100000;
962 }
963 if (statOpt / 10000 >= 1) {
964 fChkStatUnderflow->SetState(kButtonDown);
965 statOpt -= 10000;
966 }
967 if (statOpt / 2000 >= 1) {
968 fChkStatRMS->SetState(kButtonDown);
969 fChkStatRMSPM->SetState(kButtonDown);
970 statOpt -= 2000;
971 }
972 if (statOpt / 1000 >= 1) {
973 fChkStatRMS->SetState(kButtonDown);
974 statOpt -= 1000;
975 }
976 if (statOpt / 200 >= 1) {
977 fChkStatMean->SetState(kButtonDown);
978 fChkStatMeanPM->SetState(kButtonDown);
979 statOpt -= 200;
980 }
981 if (statOpt / 100 >= 1) {
982 fChkStatMean->SetState(kButtonDown);
983 statOpt -= 100;
984 }
985 if (statOpt / 10 >= 1) {
986 fChkStatEntries->SetState(kButtonDown);
987 statOpt -= 10;
988 }
989 if (statOpt / 1 >= 1) {
990 fChkStatName->SetState(kButtonDown);
991 statOpt -= 1;
992 }
993
994 /*
995 fChkStatName->SetState(kButtonDown);
996 fChkStatEntries->SetState(kButtonDown);
997 fChkStatMean->SetState(kButtonDown);
998 fChkStatRMS->SetState(kButtonDown);
999 */
1000// fChkStatMeanPM->SetState(kButtonUp);
1001// fChkStatRMSPM->SetState(kButtonUp);
1002// fChkStatUnderflow->SetState(kButtonUp);
1003// fChkStatOverflow->SetState(kButtonUp);
1004// fChkStatIntegral->SetState(kButtonUp);
1005// fChkStatSkewness->SetState(kButtonUp);
1006// fChkStatSkewnessPM->SetState(kButtonUp);
1007// fChkStatKurtosis->SetState(kButtonDown);
1008// fChkStatKurtosisPM->SetState(kButtonDown);
1009
1010 // fill fComboAddDrawOpt with some additional drawing options
1011 fComboAddDrawOpt->AddEntry("same", 0);
1012 fComboAddDrawOpt->AddEntry("profbox", 1);
1013 fComboAddDrawOpt->AddEntry("profcolz", 2);
1014 fComboAddDrawOpt->AddEntry("profcont0", 3);
1015 fComboAddDrawOpt->AddEntry("proflego", 4);
1016 fComboAddDrawOpt->AddEntry("proflego2", 5);
1017 fComboAddDrawOpt->AddEntry("profsurf", 6);
1018 fComboAddDrawOpt->AddEntry("profsurf1", 7);
1019 fComboAddDrawOpt->AddEntry("profsurf2", 8);
1020 fComboAddDrawOpt->AddEntry("box", 9);
1021 fComboAddDrawOpt->AddEntry("colz", 10);
1022 fComboAddDrawOpt->AddEntry("cont0", 11);
1023 fComboAddDrawOpt->AddEntry("lego", 12);
1024 fComboAddDrawOpt->AddEntry("lego2", 13);
1025 fComboAddDrawOpt->AddEntry("surf", 14);
1026 fComboAddDrawOpt->AddEntry("surf1", 15);
1027 fComboAddDrawOpt->AddEntry("surf2", 16);
1028
1029 // fill fComboAddSaveOpt with some additional drawing options
1030 fComboAddSaveOpt->AddEntry("Portrait", 0);
1031 fComboAddSaveOpt->AddEntry("Landscape", 1);
1032 fComboAddSaveOpt->AddEntry("Preview", 2);
1033 fComboAddSaveOpt->AddEntry("+50", 3);
1034
1035 // fill fComboMethod
1036 fComboMethod->AddEntry("subtract", 0);
1037 fComboMethod->AddEntry("divide by", 1);
1038
1039 // fill fComboExportName
1040// fComboExportName->AddEntry("calPad", 0);
1041 // fComboExportName->AddEntry("calPad2", 1);
1042 fBtnExport->SetEnabled(kFALSE);
1043 fBtnAddNorm->SetEnabled(kFALSE);
1044
1045 // select initial variables
1046 fListVariables->Select(0);
1047 fListNormalization->Select(0);
1048 fComboMethod->Select(0);
1049// fComboExportName->Select(0);
1050// fComboExportName->EnableTextInput(kTRUE);
1051
1052 //fCanvMain->GetCanvas()->ToggleEventStatus(); // klappt nicht
1053 //fCanvMain->GetCanvas()->GetCanvasImp()->ShowStatusBar(kTRUE); // klappt auch nicht
1054 fListVariables->IntegralHeight(kFALSE); // naja
1055 fListNormalization->IntegralHeight(kFALSE); // naja
1056 fChkAuto->SetState(kButtonDown);
1057
1058 // Make first drawing:
1059 // DoDraw();
1060}
1061
1062
1063AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
1064 : TGCompositeFrame(c.fParent, c.fWidth, c.fHeight),
1065 fViewer(0),
1066 fPreprocessor(0),
1067 fContTopBottom(0),
1068 fContLCR(0),
1069 fContLeft(0),
1070 ftabLeft(0),
1071 ftabLeft0(0),
1072 ftabLeft1(0),
1073 ftabRight(0),
1074 fTabRight0(0),
1075 fTabRight1(0),
1076 fContRight(0),
1077 fContCenter(0),
1078 fContPlotOpt(0),
1079 fContDrawOpt(0),
1080 fContDrawOptSub1D2D(0),
1081 fContNormalized(0),
1082 fContCustom(0),
1083 fContCuts(0),
1084 fContSector(0),
1085 fContAddCuts(0),
1086 fContFit(0),
1087 fContAddFit(0),
1088 fContScaling(0),
1089 fContSetMax(0),
1090 fContSetMin(0),
1091 fContAddDrawOpt(0),
1092 fListVariables(0),
1093 fBtnDraw(0),
1094 fBtnFit(0),
1095 fBtnAddFitFunction(0),
1096 fBtnGetMinMax(0),
1097 fCanvMain(0),
1098 fRadioRaw(0),
1099 fRadioNormalized(0),
1100 fRadioPredefined(0),
1101 fRadioCustom(0),
1102 fRadio1D(0),
1103 fRadio2D(0),
1104 fRadioTPC(0),
1105 fRadioSideA(0),
1106 fRadioSideC(0),
1107 fRadioROC(0),
1108 fRadioSector(0),
1109 fComboAddDrawOpt(0),
1110 fChkAuto(0),
1111 fChkAutoAppend(0),
1112 fComboMethod(0),
1113 fListNormalization(0),
1114 fComboCustom(0),
1115 fLblCustomDraw(0),
1116 fChkAddDrawOpt(0),
1117 fNmbSector(0),
1118 fLblSector(0),
1119 fChkCutZero(0),
1120 fChkAddCuts(0),
1121 fLblAddCuts(0),
1122 fComboAddCuts(0),
1123 fComboCustomFit(0),
1124 fChkSetMax(0),
1125 fChkSetMin(0),
1126 fChkGetMinMaxAuto(0),
1127 fTxtSetMax(0),
1128 fTxtSetMin(0),
1129 fContDrawOpt1D(0),
1130 fcontDrawOpt1DSubLR(0),
1131 fContDrawOpt1DSubNSC(0),
1132 fRadioNorm(0),
1133 fRadioSigma(0),
1134 fTxtSigmas(0),
1135 fContCumuLR(0),
1136 fContCumLeft(0),
1137 fContCumRight(0),
1138 fLblSigmaMax(0),
1139 fTxtSigmaMax(0),
1140 fRadioCumulative(0),
1141 fCheckCumulativePM(0),
1142 fRadioIntegrate(0),
1143 fContDrawOpt1DSubMML(0),
1144 fChkMean(0),
1145 fChkMedian(0),
1146 fChkLTM(0),
1147 fContStatOpt(0),
1148 fChkStatName(0),
1149 fChkStatEntries(0),
1150 fContStatMean(0),
1151 fChkStatMean(0),
1152 fChkStatMeanPM(0),
1153 fContStatRMS(0),
1154 fChkStatRMS(0),
1155 fChkStatRMSPM(0),
1156 fChkStatUnderflow(0),
1157 fChkStatOverflow(0),
1158 fChkStatIntegral(0),
1159 fContStatSkew(0),
1160 fChkStatSkewness(0),
1161 fChkStatSkewnessPM(0),
1162 fContStatKurt(0),
1163 fChkStatKurtosis(0),
1164 fChkStatKurtosisPM(0),
1165 fBtnUnchekAll(0),
1166 fContLabeling(0),
1167 fChkLabelTitle(0),
1168 fTxtLabelTitle(0),
1169 fChkLabelXaxis(0),
1170 fTxtLabelXaxis(0),
1171 fChkLabelYaxis(0),
1172 fTxtLabelYaxis(0),
1173 fChkLabelGetAuto(0),
1174 fContSave(0),
1175 fBtnSave(0),
1176 fContAddSaveOpt(0),
1177 fChkAddSaveOpt(0),
1178 fComboAddSaveOpt(0),
1179 fContExport(0),
1180 fContAddExport(0),
1181 fComboExportName(0),
1182 fBtnExport(0),
1183 fBtnAddNorm(0),
1184 fContTree(0),
1185 fBtnDumpToFile(0),
1186 fBtnLoadTree(0),
1187 fChkAddAsReference(0),
1188 fTxtRefName(0),
1189 fInitialized(0)
1190{
1191 //
1192 // dummy AliTPCCalibViewerGUI copy constructor
1193 //
1194}
1195
1196
1197AliTPCCalibViewerGUI & AliTPCCalibViewerGUI::operator =(const AliTPCCalibViewerGUI & /*param*/) {
1198 //
1199 // dummy assignment operator
1200 //
1201 return (*this);
1202}
1203
1204
1205AliTPCCalibViewerGUI::~AliTPCCalibViewerGUI() {
1206 //
1207 // Destructor
1208 //
1209 if (fCanvMain && fCanvMain->GetCanvas()) {
1210 for (Int_t i = 0; i < fCanvMain->GetCanvas()->GetListOfPrimitives()->GetEntries(); i++) {
1211 if (strcmp(fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->ClassName(), "TFrame") != 0)
1212 fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->Delete();
1213 }
1214 }
1215 Cleanup();
1216 if (fViewer) fViewer->Delete();
1217 delete fPreprocessor;
1218}
1219
1220
1221/*
1222void AliTPCCalibViewerGUI::CloseWindow() {
1223 DeleteWindow();
1224}
1225*/
1226
1227
1228void AliTPCCalibViewerGUI::Initialize(const char* fileName, const char* treeName) {
1229 //
1230 // initialize the GUI with a calibrationTree from fileName
1231 //
1232
1233 // create AliTPCCalibViewer object, which will be used for generating all drawings
1234 if (fViewer) delete fViewer;
1235 fViewer = new AliTPCCalibViewer(fileName, treeName);
1236 Initialize(fViewer);
1237}
1238
1239
1240void AliTPCCalibViewerGUI::Initialize(AliTPCCalibViewer *viewer) {
1241 //
1242 // initializes the GUI with default settings and opens tree for drawing
1243 //
1244
1245 fViewer = viewer;
1246 TString selectedVariable("");
1247 TString selectedNormalization("");
1248 Int_t variableId = -1;
1249 Int_t normalizationId = -1;
1250 if (fInitialized) {
1251 // remember the selected entry
1252 if (fListVariables->GetSelectedEntry()) selectedVariable = fListVariables->GetSelectedEntry()->GetTitle();
1253 if (fListNormalization->GetSelectedEntry()) selectedNormalization = fListNormalization->GetSelectedEntry()->GetTitle();
1254 }
1255
1256 // fill fListVariables, list of drawable variables:
1257 TObjArray* arr = fViewer->GetListOfVariables();
1258 if (!arr) return;
1259 TIterator* iter = arr->MakeIterator();
1260 iter->Reset();
1261 TObjString* currentStr = 0;
1262 Int_t id = 0;
1263 fListVariables->RemoveAll();
1264 while ((currentStr = (TObjString*)(iter->Next()))) {
1265 fListVariables->AddEntry(currentStr->GetString().Data(), id);
1266 if (fInitialized && currentStr->GetString() == selectedVariable) variableId = id;
1267 id++;
1268 }
1269
1270 // fill fListNorm, list of normalization variables:
1271 TObjArray *arrNorm = fViewer->GetListOfNormalizationVariables();
1272 TIterator *iterNorm = arrNorm->MakeIterator();
1273 iterNorm->Reset();
1274 currentStr = 0;
1275 id = 0;
1276 fListNormalization->RemoveAll();
1277 while ((currentStr = (TObjString*)(iterNorm->Next()))) {
1278 fListNormalization->AddEntry(currentStr->GetString().Data(), id);
1279 if (fInitialized && currentStr->GetString() == selectedNormalization) normalizationId = id;
1280 id++;
1281 }
1282 currentStr = 0;
1283 iter->Reset();
1284 //Add draw variables to the list of normalisation
1285 while ((currentStr = (TObjString*)(iter->Next()))) {
1286 if (currentStr->GetString().BeginsWith("Map")) continue; //don't add mapping information
1287 fListNormalization->AddEntry(currentStr->GetString().Data(), id);
1288 if (fInitialized && currentStr->GetString() == selectedNormalization) normalizationId = id;
1289 id++;
1290 }
1291
1292 delete iterNorm;
1293 arrNorm->Delete();
1294 delete arrNorm;
1295
1296 delete iter;
1297 arr->Delete();
1298 delete arr;
1299
1300 // trick do display the entries corectly after reinitialization
1301 // otherwise all the entries would appear as one kryptic entry
1302 // resizing the listbox somehow fixes the problem...
1303 if (fInitialized) fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight());
1304 if (fInitialized) fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight());
1305 if (fInitialized) fListNormalization->Resize(fListNormalization->GetWidth()-1, fListNormalization->GetHeight());
1306 if (fInitialized) fListNormalization->Resize(fListNormalization->GetWidth()+1, fListNormalization->GetHeight());
1307
1308 // select the last selected variable and normalization
1309 if (fInitialized && variableId != -1) fListVariables->Select(variableId);
1310 if (fInitialized && normalizationId != -1)fListVariables->Select(normalizationId);
1311
1312 if (fInitialized) Info("Initialize", "AliTPCCalibViewerGUI new initialized.");
1313 fInitialized = kTRUE;
1314
1315}
1316
1317void AliTPCCalibViewerGUI::Reset(){
1318 //
1319 // reset variables, delete calib viewer
1320 //
1321 if (fViewer) delete fViewer;
1322 fListVariables->RemoveAll();
1323 fListNormalization->RemoveAll();
1324 fInitialized = kFALSE;
1325}
1326
1327void AliTPCCalibViewerGUI::HandleButtonsGeneral(Int_t id) {
1328 //
1329 // handles mutual radio button exclusions
1330 // for general Tab
1331 //
1332 if (id == -1) {
1333 TGButton *btn = (TGButton *) gTQSender;
1334 id = btn->WidgetId();
1335 }
1336
1337 switch (id) {
1338 case 10: // fRadioRaw
1339 fRadioNormalized->SetState(kButtonUp);
1340 fRadioPredefined->SetState(kButtonDown);
1341 fRadioCustom->SetState(kButtonUp);
1342 // fComboMethod->UnmapWindow();
1343 // fListNormalization->UnmapWindow();
1344 break;
1345 case 11: // fRadioNormalized
1346 fRadioRaw->SetState(kButtonUp);
1347 fRadioPredefined->SetState(kButtonDown);
1348 fRadioCustom->SetState(kButtonUp);
1349 break;
1350 case 12: // fRadioCustom
1351 fRadioPredefined->SetState(kButtonUp);
1352 // fComboCustom->SetEnabled(kFALSE);
1353 // fRadioNormalized->SetState(kButtonUp);
1354 break;
1355 case 14: // select Draw options fComboAddDrawOpt
1356 fChkAddDrawOpt->SetState(kButtonDown);
1357 break;
1358 case 13: // fRadioPredefined
1359 fRadioCustom->SetState(kButtonUp);
1360 // fComboCustom->SetEnabled(kTRUE);
1361 //f RadioNormalized->SetState(kButtonUp);
1362 break;
1363 //--------
1364 case 30: // fRadio1D
1365 fRadio2D->SetState(kButtonUp);
1366 fBtnExport->SetEnabled(kFALSE);
1367 fBtnAddNorm->SetEnabled(kFALSE);
1368 break;
1369 case 31: // fRadio2D
1370 fRadio1D->SetState(kButtonUp);
1371 fBtnExport->SetEnabled(kTRUE);
1372 fBtnAddNorm->SetEnabled(kTRUE);
1373 break;
1374 case 42: // fComboCustom
1375 fRadioCustom->SetState(kButtonDown);
1376 fRadioPredefined->SetState(kButtonUp);
1377 break;
1378 }
1379 DoNewSelection();
1380}
1381
1382
1383void AliTPCCalibViewerGUI::HandleButtons1D(Int_t id) {
1384 //
1385 // handles mutual radio button exclusions
1386 // 1D-Tab buttons
1387 //
1388
1389 if (id == -1) {
1390 TGButton *btn = (TGButton *) gTQSender;
1391 id = btn->WidgetId();
1392 }
1393 switch (id) {
1394 case 110: // 1D draw normal
1395 fRadioNorm->SetState(kButtonDown);
1396 fRadioSigma->SetState(kButtonUp);
1397 fRadioCumulative->SetState(kButtonUp);
1398 fRadioIntegrate->SetState(kButtonUp);
1399 break;
1400 case 111: // 1D draw sigma
1401 fRadioNorm->SetState(kButtonUp);
1402 fRadioSigma->SetState(kButtonDown);
1403 fRadioCumulative->SetState(kButtonUp);
1404 fRadioIntegrate->SetState(kButtonUp);
1405 break;
1406 case 112: // 1D draw cumulative
1407 fRadioNorm->SetState(kButtonUp);
1408 fRadioSigma->SetState(kButtonUp);
1409 fRadioCumulative->SetState(kButtonDown);
1410 fRadioIntegrate->SetState(kButtonUp);
1411 break;
1412 case 113: // 1D draw integral
1413 fRadioNorm->SetState(kButtonUp);
1414 fRadioSigma->SetState(kButtonUp);
1415 fRadioCumulative->SetState(kButtonUp);
1416 fRadioIntegrate->SetState(kButtonDown);
1417 break;
1418 }
1419 DoNewSelection();
1420}
1421
1422
1423void AliTPCCalibViewerGUI::HandleButtonsStat(Int_t id) {
1424 //
1425 // handles statistic check boxes
1426 // checks each checkbox if checked
1427 // if the checkbox is checked, appends 'n' for name, 'e' for entries, ...
1428 // to a TString, passes this TString to gStyle->SetOptStat(...)
1429 //
1430 if (id == -1) {
1431 TGButton *btn = (TGButton *) gTQSender;
1432 id = btn->WidgetId();
1433 }
1434 TString statOpt("");
1435 if (fChkStatName->GetState() == kButtonDown) statOpt.Append("n");
1436 if (fChkStatEntries->GetState() == kButtonDown) statOpt.Append("e");
1437 if (fChkStatMean->GetState() == kButtonDown && fChkStatMeanPM->GetState() == kButtonUp) statOpt.Append("m");
1438 if (fChkStatMeanPM->GetState() == kButtonDown) statOpt.Append("M");
1439 if (fChkStatRMS->GetState() == kButtonDown && fChkStatRMSPM->GetState() == kButtonUp) statOpt.Append("r");
1440 if (fChkStatRMSPM->GetState() == kButtonDown) statOpt.Append("R");
1441 if (fChkStatUnderflow->GetState() == kButtonDown) statOpt.Append("u");
1442 if (fChkStatOverflow->GetState() == kButtonDown) statOpt.Append("o");
1443 if (fChkStatIntegral->GetState() == kButtonDown) statOpt.Append("i");
1444 if (fChkStatSkewness->GetState() == kButtonDown && fChkStatSkewnessPM->GetState() == kButtonUp) statOpt.Append("s");
1445 if (fChkStatSkewnessPM->GetState() == kButtonDown) statOpt.Append("S");
1446 if (fChkStatKurtosis->GetState() == kButtonDown && fChkStatKurtosisPM->GetState() == kButtonUp) statOpt.Append("k");
1447 if (fChkStatKurtosisPM->GetState() == kButtonDown) statOpt.Append("K");
1448
1449 gStyle->SetOptStat(statOpt);
1450 DoNewSelection();
1451}
1452
1453
1454void AliTPCCalibViewerGUI::HandleButtonsCuts(Int_t id) {
1455 //
1456 // handles mutual radio button exclusions
1457 // right side buttons
1458 //
1459 if (id == -1) {
1460 TGButton *btn = (TGButton *) gTQSender;
1461 id = btn->WidgetId();
1462 }
1463
1464 switch (id) {
1465 case 20: // fRadioTPC
1466 fRadioSideA->SetState(kButtonUp);
1467 fRadioSideC->SetState(kButtonUp);
1468 fRadioROC->SetState(kButtonUp);
1469 fRadioSector->SetState(kButtonUp);
1470 break;
1471 case 21: // fRadioSideA
1472 fRadioTPC->SetState(kButtonUp);
1473 fRadioSideC->SetState(kButtonUp);
1474 fRadioROC->SetState(kButtonUp);
1475 fRadioSector->SetState(kButtonUp);
1476 break;
1477 case 22: // fRadioSideC
1478 fRadioTPC->SetState(kButtonUp);
1479 fRadioSideA->SetState(kButtonUp);
1480 fRadioROC->SetState(kButtonUp);
1481 fRadioSector->SetState(kButtonUp);
1482 break;
1483 case 23: // fRadioROC
1484 fRadioTPC->SetState(kButtonUp);
1485 fRadioSideA->SetState(kButtonUp);
1486 fRadioSideC->SetState(kButtonUp);
1487 fRadioSector->SetState(kButtonUp);
1488 break;
1489 case 24: // fRadioSector
1490 fRadioTPC->SetState(kButtonUp);
1491 fRadioSideA->SetState(kButtonUp);
1492 fRadioSideC->SetState(kButtonUp);
1493 fRadioROC->SetState(kButtonUp);
1494 break;
1495 case 31: // fComboAddCuts
1496 fChkAddCuts->SetState(kButtonDown);
1497 break;
1498 }
1499 DoNewSelection();
1500}
1501
1502
1503void AliTPCCalibViewerGUI::HandleButtonsNoRedraw(Int_t id) {
1504 //
1505 // handles label & scaling checkboxes
1506 // without redrawing (not necessary, faster like this)
1507 //
1508 if (id == -1) {
1509 TGButton *btn = (TGButton *) gTQSender;
1510 id = btn->WidgetId();
1511 }
1512
1513 switch (id) {
1514 case 40: // fTxtSetMin
1515 fChkSetMin->SetState(kButtonDown);
1516 break;
1517 case 41: // fTxtSetMax
1518 fChkSetMax->SetState(kButtonDown);
1519 break;
1520 case 50: // fTxtLabelTitle
1521 fChkLabelTitle->SetState(kButtonDown);
1522 break;
1523 case 51: // fTxtLabelXaxis
1524 fChkLabelXaxis->SetState(kButtonDown);
1525 break;
1526 case 52: // fTxtLabelXaxis
1527 fChkLabelYaxis->SetState(kButtonDown);
1528 break;
1529 }
1530 SetMinMaxLabel();
1531}
1532
1533void AliTPCCalibViewerGUI::ReplacePlaceHolders(TString &str)
1534{
1535 //
1536 // replace the defined placeholders in the custom draw string and cut string
1537 //
1538 TString drawPlaceHolder("#draw#");
1539 TString normPlaceHolder("#norm#");
1540
1541 //current draw variable
1542 TString desiredData("");
1543 if (fListVariables->GetSelectedEntry()){
1544 desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1545 str.ReplaceAll(drawPlaceHolder,desiredData);
1546 }
1547// desiredData += fViewer->GetAbbreviation();
1548
1549 //current normalisation
1550 TString normalizationData("");
1551 if (fListNormalization->GetSelectedEntry()){
1552 normalizationData += ((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle();
1553 if (! (TString(((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle())).BeginsWith("Fit"))
1554 if ( normalizationData.BeginsWith("_") ) normalizationData = desiredData+normalizationData;
1555 if ( fListVariables->FindEntry(normalizationData.Data()) )
1556 normalizationData+="~";
1557 str.ReplaceAll(normPlaceHolder,normalizationData);
1558 }
1559}
1560
1561void AliTPCCalibViewerGUI::DoNewSelection() {
1562 //
1563 // decides whether to redraw if user makes another selection
1564 //
1565 if (fChkAuto->GetState() == kButtonDown) DoDraw();
1566}
1567
1568
1569TString* AliTPCCalibViewerGUI::GetDrawString() {
1570 //
1571 // create the draw string out of selection
1572 //
1573
1574 // specify data to plot
1575 TString desiredData("");
1576 if (!fListVariables->GetSelectedEntry()) return 0;
1577 desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1578 desiredData += fViewer->GetAbbreviation();
1579
1580 // specify normalization
1581 if (fRadioPredefined->GetState() == kButtonDown && fRadioNormalized->GetState() == kButtonDown) {
1582 TString op("");
1583 switch (fComboMethod->GetSelected()) {
1584 case 0: // subtraction
1585 op += "-";
1586 break;
1587 case 1: // division
1588 op += "/";
1589 break;
1590 }
1591 TString normalizationData("");
1592 if (!fListNormalization->GetSelectedEntry()) return 0;
1593 normalizationData += ((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle();
1594
1595 if ( normalizationData.BeginsWith("Fit")) {
1596 // create fit formula, evaluate it an replace normalizationData-String
1597 // ********** create cut string **********
1598 TString cutStr("");
1599 if (fRadioTPC->GetState() == kButtonDown)
1600 cutStr += ""; // whole TPC is used for fitting
1601 if (fRadioSideA->GetState() == kButtonDown)
1602 cutStr += "(sector/18)%2==0"; // side A
1603 if (fRadioSideC->GetState() == kButtonDown)
1604 cutStr+= "(sector/18)%2==1"; // side C
1605 if (fRadioROC->GetState() == kButtonDown) {
1606 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1607 cutStr += "sector==";
1608 cutStr += sector;
1609 }
1610 if (fRadioSector->GetState() == kButtonDown) {
1611 Int_t sector = ((Int_t)(fNmbSector->GetNumber()))%36;
1612 cutStr += "sector%36==";
1613 cutStr += sector;
1614 }
1615 if (fChkAddCuts->GetState() == kButtonDown && strcmp(fComboAddCuts->GetTextEntry()->GetText(), "") != 0){
1616 if (fRadioTPC->GetState() != kButtonDown) cutStr += " && ";
1617 cutStr += fComboAddCuts->GetTextEntry()->GetText();
1618 }
1619 Double_t chi2 = 0;
1620 TVectorD fitParam(0);
1621 TMatrixD covMatrix(0,0);
1622 TString formulaStr("");
1623 if (normalizationData.CompareTo("FitLinLocal") == 0)
1624 formulaStr = "lx~ ++ ly~";
1625 if (normalizationData.CompareTo("FitLinGlobal") == 0)
1626 formulaStr = "gx~ ++ gy~";
1627 if (normalizationData.CompareTo("FitParLocal") == 0)
1628 formulaStr = "lx~ ++ ly~ ++ lx~^2 ++ ly~^2 ++ lx~*ly~";
1629 if (normalizationData.CompareTo("FitParGlobal") == 0)
1630 formulaStr = "gx~ ++ gy~ ++ gx~^2 ++ gy~^2 ++ gx~*gy~";
1631 formulaStr.ReplaceAll("~", fViewer->GetAbbreviation());
1632 normalizationData = *fViewer->Fit(desiredData.Data(), formulaStr.Data(), cutStr.Data(), chi2, fitParam, covMatrix);
1633 } // if ( normalizationData.BeginsWith("Fit")
1634
1635 desiredData += op;
1636 if (! (TString(((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle())).BeginsWith("Fit"))
1637 if ( normalizationData.BeginsWith("_") ) desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1638 if ( fListVariables->FindEntry(normalizationData.Data()) )
1639 normalizationData+="~";
1640 desiredData += normalizationData;
1641 }
1642 else if (fRadioCustom->GetState() == kButtonDown) {
1643 desiredData = fComboCustom->GetTextEntry()->GetText();
1644 if (desiredData == "") return 0;
1645 ReplacePlaceHolders(desiredData);
1646 }
1647
1648 // try to add forgotten '~'
1649 if (fChkAutoAppend->GetState() == kButtonDown)
1650 desiredData = TString(fViewer->AddAbbreviations((char*)desiredData.Data()));
1651 return new TString(desiredData.Data());
1652}
1653
1654
1655TString* AliTPCCalibViewerGUI::GetSectorString() {
1656 //
1657 // create the sector string out of selection
1658 //
1659
1660 TString sectorStr("");
1661 if (fRadioTPC->GetState() == kButtonDown)
1662 sectorStr += "ALL";
1663 if (fRadioSideA->GetState() == kButtonDown)
1664 sectorStr += "A"; //cuts += "(sector/18)%2==0";
1665 if (fRadioSideC->GetState() == kButtonDown)
1666 sectorStr+= "C"; //cuts += "(sector/18)%2==1";
1667 if (fRadioROC->GetState() == kButtonDown) {
1668 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1669 sectorStr += sector; //cuts += "sector==";
1670 }
1671 if (fRadioSector->GetState() == kButtonDown) {
1672 Int_t sector = ((Int_t)(fNmbSector->GetNumber()))%36;
1673 sectorStr += "S";
1674 sectorStr += sector; //cuts += "sector%36==";
1675 }
1676 return new TString(sectorStr.Data());
1677}
1678
1679
1680 TString* AliTPCCalibViewerGUI::GetCutString() {
1681 //
1682 // create the cut string out of selection
1683 //
1684
1685 TString cutsStr("");
1686 if (fChkCutZero->GetState() == kButtonDown) {
1687 TString cutZerosStr(GetDrawString()->Data());
1688 if (cutZerosStr.Contains(">>")) {
1689 cutZerosStr.Remove(cutZerosStr.First(">>"));
1690 }
1691 if (cutZerosStr.Contains(":")) {
1692 cutZerosStr.Remove(cutZerosStr.First(":"));
1693 }
1694 cutsStr += cutZerosStr.Data();
1695 cutsStr += "!=0";
1696 if (fChkAddCuts->GetState() == kButtonDown) cutsStr += " && ";
1697 }
1698 if (fChkAddCuts->GetState() == kButtonDown){
1699 cutsStr += fComboAddCuts->GetTextEntry()->GetText();
1700 ReplacePlaceHolders(cutsStr);
1701 }
1702
1703
1704 // try to add forgotten '~'
1705 if (fChkAutoAppend->GetState() == kButtonDown)
1706 cutsStr = TString(fViewer->AddAbbreviations((char*)cutsStr.Data()));
1707 return new TString(cutsStr.Data());
1708}
1709
1710
1711void AliTPCCalibViewerGUI::DoDraw() {
1712 //
1713 // main method for drawing according to user selection
1714 //
1715
1716 // specify data to plot:
1717 if (!GetDrawString()) return;
1718 TString desiredData(GetDrawString()->Data());
1719 // specify sector:
1720 TString sectorStr(GetSectorString()->Data());
1721 // specify cuts:
1722 TString cutsStr(GetCutString()->Data());
1723
1724 TString addDrawOpt("");
1725 if (fChkAddDrawOpt->GetState() == kButtonDown)
1726 addDrawOpt += fComboAddDrawOpt->GetTextEntry()->GetText();
1727
1728 // remove last picture
1729 if (!addDrawOpt.Contains("same"))
1730 for (Int_t i = 0; i < fCanvMain->GetCanvas()->GetListOfPrimitives()->GetEntries(); i++) {
1731 if (strcmp(fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->ClassName(), "TFrame") != 0)
1732 fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->Delete();
1733 }
1734 //fCanvMain->GetCanvas()->Clear();
1735 fCanvMain->GetCanvas()->cd();
1736 Int_t entries = -1;
1737 // draw finally
1738 if (fRadio1D->GetState() == kButtonDown){
1739 // 1D-Drawing
1740 TString strSigmaMax(fTxtSigmaMax->GetText()); // get sigmaMax from text enty
1741 Double_t sigmaMax = (strSigmaMax.IsFloat()) ? strSigmaMax.Atof() : 5; // convert to double, if not convertable, set to 5
1742 Bool_t plotMean = fChkMean->GetState() == kButtonDown;
1743 Bool_t plotMedian = fChkMedian->GetState() == kButtonDown;
1744 Bool_t plotLTM = fChkLTM->GetState() == kButtonDown;
1745 if (fRadioNorm->GetState() == kButtonDown) // normal 1D drawing
1746 entries = fViewer->EasyDraw1D(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), addDrawOpt.Data());
1747 if (fRadioSigma->GetState() == kButtonDown) // sigma 1D drawing
1748 entries = fViewer->DrawHisto1D(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), //
1749 fTxtSigmas->GetText(), plotMean, plotMedian, plotLTM);
1750 if (fRadioCumulative->GetState() == kButtonDown) // cumulative 1D drawing
1751 entries = fViewer->SigmaCut(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), //
1752 sigmaMax, plotMean, plotMedian, plotLTM, //
1753 fCheckCumulativePM->GetState() == kButtonDown, fTxtSigmas->GetText(), /* Float_t sigmaStep =*/ -1);
1754 if (fRadioIntegrate->GetState() == kButtonDown) // integral 1D drawing
1755 entries = fViewer->Integrate(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), //
1756 sigmaMax, plotMean, plotMedian, plotLTM, //
1757 fTxtSigmas->GetText(), /* Float_t sigmaStep =*/ -1);
1758 }
1759 else if (fRadio2D->GetState() == kButtonDown) {
1760 // 2D-Drawing
1761 entries = fViewer->EasyDraw(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), addDrawOpt.Data());
1762 }
1763 if (entries == -1) return; // nothing was drawn, there is no histogram to get min and max
1764
1765 SetMinMaxLabel();
1766 fCanvMain->GetCanvas()->Update();
1767}
1768
1769
1770void AliTPCCalibViewerGUI::DoFit() {
1771 //
1772 // main method for fitting
1773 //
1774
1775 Double_t chi2 = 0;
1776 TVectorD fitParam(0);
1777 TMatrixD covMatrix(0,0);
1778 TString cutStr("");
1779 TString formulaStr("");
1780
1781 // specify data to plot:
1782 TString drawStr(GetDrawString()->Data());
1783
1784 // ********** create cut string **********
1785 if (fRadioTPC->GetState() == kButtonDown)
1786 cutStr += ""; // whole TPC is used for fitting
1787 if (fRadioSideA->GetState() == kButtonDown)
1788 cutStr += "(sector/18)%2==0"; // side A
1789 if (fRadioSideC->GetState() == kButtonDown)
1790 cutStr+= "(sector/18)%2==1"; // side C
1791 if (fRadioROC->GetState() == kButtonDown) {
1792 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1793 cutStr += "sector==";
1794 cutStr += sector;
1795 }
1796 if (fRadioSector->GetState() == kButtonDown) {
1797 Int_t sector = (Int_t)(fNmbSector->GetNumber())%36;
1798 cutStr += "sector%36==";
1799 cutStr += sector;
1800 }
1801 if (fChkAddCuts->GetState() == kButtonDown && strcmp(fComboAddCuts->GetTextEntry()->GetText(), "") != 0){
1802 if (fRadioTPC->GetState() != kButtonDown) cutStr += " && ";
1803 cutStr += fComboAddCuts->GetTextEntry()->GetText();
1804 }
1805 // try to add forgotten '~'
1806 if (fChkAutoAppend->GetState() == kButtonDown)
1807 cutStr = TString(fViewer->AddAbbreviations((char*)cutStr.Data()));
1808
1809 // ********** get formula string **********
1810 formulaStr += fComboCustomFit->GetTextEntry()->GetText();
1811 if (fChkAutoAppend->GetState() == kButtonDown)
1812 formulaStr = TString(fViewer->AddAbbreviations((char*)formulaStr.Data()));
1813
1814 // ********** call AliTPCCalibViewer's fit-function
1815 ReplacePlaceHolders(drawStr);
1816 ReplacePlaceHolders(cutStr);
1817 TString *returnStr = fViewer->Fit(drawStr.Data(), formulaStr.Data(), cutStr.Data(), chi2, fitParam, covMatrix);
1818
1819 std::cout << std::endl;
1820 std::cout << "Your fit formula reads as follows:" << std::endl;
1821 std::cout << returnStr->Data() << std::endl;
1822 std::cout << "chi2 = " << chi2 << std::endl;
1823
1824 delete returnStr;
1825}
1826
1827
1828void AliTPCCalibViewerGUI::DoExport() {
1829 //
1830 // function to export a CalPad to Cint
1831 //
1832 if ( fRadio2D->GetState() != kButtonDown){
1833 Error("ExportCalPad", "Export of AliTPCCalPad to CINT works only in 2D mode.");
1834 return;
1835 }
1836 // specify data to plot:
1837 TString desiredData(GetDrawString()->Data());
1838 // specify cuts:
1839 TString cutsStr(GetCutString()->Data());
1840 // get name for the calPad
1841 const char* calPadName = fComboExportName->GetTextEntry()->GetText();
1842 // create calPad according to drawCommand and cuts
1843 AliTPCCalPad *calPad = fViewer->GetCalPad(desiredData.Data(), (char*)cutsStr.Data(), (char*)calPadName);
1844 // finally export calPad to Cint:
1845 gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, (ULong_t)calPad));
1846 fPreprocessor->AddComponent(calPad);
1847 Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
1848}
1849
1850
1851void AliTPCCalibViewerGUI::DoExportNorm() {
1852 //
1853 // function to export a CalPad to Cint
1854 //
1855
1856 if ( fRadio2D->GetState() != kButtonDown){
1857 Error("ExportCalPad", "Adding an AliTPCCalPad to the normalization works only in 2D mode.");
1858 return;
1859 }
1860
1861 Error("DoExportNorm", "Not yet implemented.");
1862/*
1863 return;
1864
1865 // specify data to plot:
1866 TString desiredData(GetDrawString()->Data());
1867 // specify sector:
1868 TString sectorStr(GetSectorString()->Data());
1869 // specify cuts:
1870 TString cutsStr(GetCutString()->Data());
1871
1872 // get name for the calPad
1873 const char* calPadName = fComboExportName->GetTextEntry()->GetText();
1874 // create calPad according to drawCommand and cuts
1875 AliTPCCalPad *calPad = fViewer->GetCalPad(desiredData.Data(), (char*)cutsStr.Data(), (char*)fComboExportName->GetTextEntry()->GetText());
1876 // finally export calPad to Cint:
1877 gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, (ULong_t) calPad));
1878 Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
1879 */
1880}
1881
1882
1883void AliTPCCalibViewerGUI::GetMinMax() {
1884 //
1885 // Read current Min & Max from the plot and set it to fTxtSetMin & fTxtSetMax
1886 //
1887 if (fChkGetMinMaxAuto->GetState() == kButtonUp) return;
1888 TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1889 TObject* ptr = 0;
1890 for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1891 ptr = listOfPrimitives->At(i);
1892 if ( ptr->InheritsFrom("TH1") ) break;
1893 }
1894 if ( !ptr || !ptr->InheritsFrom("TH1") ) return; // if the loop did not find a TH1
1895 TH1 *hist = (TH1*)ptr;
1896
1897// Double_t histMax = hist->GetMaximum();
1898// Double_t histMin = hist->GetMinimum();
1899// fTxtSetMax->SetText(Form("%f",histMax));
1900// fTxtSetMin->SetText(Form("%f",histMin));
1901
1902 if (fRadio2D->GetState() == kButtonDown) {
1903 if (fChkSetMax->GetState() == kButtonUp)
1904 fTxtSetMax->SetText(Form("%f", hist->GetMaximum()));
1905 if (fChkSetMin->GetState() == kButtonUp)
1906 fTxtSetMin->SetText(Form("%f", hist->GetMinimum()));
1907 }
1908 else if (fRadio1D->GetState() == kButtonDown) {
1909 if (fChkSetMax->GetState() == kButtonUp)
1910 fTxtSetMax->SetText( Form("%f", hist->GetXaxis()->GetXmax()) );
1911 if (fChkSetMin->GetState() == kButtonUp)
1912 fTxtSetMin->SetText( Form("%f", hist->GetXaxis()->GetXmin()) );
1913 }
1914}
1915
1916
1917void AliTPCCalibViewerGUI::SetMinMaxLabel() {
1918 //
1919 // Set Minimum, Maximum and labels without redrawing the plot
1920 // (faster)
1921 //
1922
1923 // search for histogram
1924 TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1925 TObject* ptr = 0;
1926 for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1927 ptr = listOfPrimitives->At(i);
1928 if ( ptr->InheritsFrom("TH1") ) break;
1929 }
1930 if ( ptr == 0 || !ptr->InheritsFrom("TH1") ) { // if the loop did not find a TH1
1931 fCanvMain->GetCanvas()->Update();
1932 Warning("SetMinMaxLabel","No Histogram found!");
1933 return;
1934 // unable to find histogram, no min and max wil be read out
1935 }
1936
1937 TH1 *hist = (TH1*)ptr;
1938 TString minTxt(fTxtSetMin->GetText());
1939 TString maxTxt(fTxtSetMax->GetText());
1940
1941 // set min and max according to specified values, if checkbox is checked
1942 if (fRadio2D->GetState() == kButtonDown) {
1943 if (fChkSetMax->GetState() == kButtonDown && fChkSetMax->GetState() == kButtonDown &&(maxTxt.IsDigit() || maxTxt.IsFloat()) )
1944 hist->SetMaximum(maxTxt.Atof());
1945 if (fChkSetMax->GetState() == kButtonUp)
1946 hist->SetMaximum(-1111); // default value, to unzoom
1947 if (fChkSetMin->GetState() == kButtonDown && (minTxt.IsDigit() || minTxt.IsFloat()) )
1948 hist->SetMinimum(minTxt.Atof());
1949 if (fChkSetMin->GetState() == kButtonUp)
1950 hist->SetMinimum(-1111); // default value, to unzoom
1951 }
1952 else if (fRadio2D->GetState() == kButtonDown) {
1953 if (fChkSetMin->GetState() == kButtonDown &&
1954 fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
1955 hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), hist->GetXaxis()->GetXmax());
1956 else if (fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
1957 hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), maxTxt.Atof());
1958 else if (fChkSetMin->GetState() == kButtonDown && hist->GetXaxis())
1959 hist->GetXaxis()->SetRangeUser(minTxt.Atof(), hist->GetXaxis()->GetXmax());
1960 hist->SetTitle(hist->GetTitle()); // trick to update the histogram
1961 }
1962
1963 // get min and max from plot
1964 GetMinMax();
1965
1966 // set labels according to specification, if cehckboxes are checked
1967 if (fChkLabelTitle->GetState() == kButtonDown)
1968 hist->SetTitle(fTxtLabelTitle->GetText());
1969 if (fChkLabelXaxis->GetState() == kButtonDown)
1970 hist->GetXaxis()->SetTitle(fTxtLabelXaxis->GetText());
1971 if (fChkLabelYaxis->GetState() == kButtonDown)
1972 hist->GetYaxis()->SetTitle(fTxtLabelYaxis->GetText());
1973 // get and/or set labels and title
1974 if (fChkLabelGetAuto->GetState() == kButtonDown) {
1975 fTxtLabelTitle->SetText(hist->GetTitle());
1976 fTxtLabelXaxis->SetTitle(hist->GetXaxis()->GetTitle());
1977 fTxtLabelYaxis->SetTitle(hist->GetYaxis()->GetTitle());
1978 }
1979 hist->SetTitle(hist->GetTitle()); // trick to update the histogram
1980 fCanvMain->GetCanvas()->Update();
1981}
1982
1983
1984void AliTPCCalibViewerGUI::ChangeSector(){
1985 //
1986 // function that is called, when the number of the sector is changed
1987 // to change the sector label
1988 //
1989 if ( fRadioROC->GetState()!=kButtonDown && fRadioSector->GetState()!=kButtonDown ){
1990 fLblSector->SetText("not used");
1991 return;
1992 }
1993
1994 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1995 TString secLabel = "";
1996 if ( sector < 36 )
1997 secLabel = "IROC";
1998 else
1999 secLabel = "OROC";
2000
2001 if (fRadioSector->GetState()==kButtonDown)
2002 secLabel="Sector";
2003
2004 if ( sector%36<18 ) //A-Side
2005 secLabel += ", A";
2006 else
2007 secLabel += ", C";
2008
2009 secLabel += Form("%02d",sector%18);
2010
2011 fLblSector->SetText(secLabel);
2012 DoNewSelection();
2013}
2014
2015
2016void AliTPCCalibViewerGUI::AddFitFunction() const {
2017 //
2018 // adds the last fit function to the normalization list
2019 //
2020 std::cout << "Not yet implemented." << std::endl;
2021}
2022
2023
2024void AliTPCCalibViewerGUI::UnchekAllStat() {
2025 //
2026 // Disable all statistical legend entries, no statistical legend.
2027 //
2028 fChkStatName->SetState(kButtonUp);
2029 fChkStatEntries->SetState(kButtonUp);
2030 fChkStatMean->SetState(kButtonUp);
2031 fChkStatMeanPM->SetState(kButtonUp);
2032 fChkStatRMS->SetState(kButtonUp);
2033 fChkStatRMSPM->SetState(kButtonUp);
2034 fChkStatUnderflow->SetState(kButtonUp);
2035 fChkStatOverflow->SetState(kButtonUp);
2036 fChkStatIntegral->SetState(kButtonUp);
2037 fChkStatSkewness->SetState(kButtonUp);
2038 fChkStatSkewnessPM->SetState(kButtonUp);
2039 fChkStatKurtosis->SetState(kButtonUp);
2040 fChkStatKurtosisPM->SetState(kButtonUp);
2041
2042 HandleButtonsStat(0);
2043}
2044
2045
2046void AliTPCCalibViewerGUI::MouseMove(Int_t event, Int_t x, Int_t y, TObject *selectedObject) {
2047 //
2048 // mouse move
2049 // zoom to sector works ONLY in 2D mode, if one side is specified
2050 //
2051 Double_t pi = TMath::Pi();
2052 if (event != kButton1Double )
2053 return;
2054 if (!selectedObject->InheritsFrom("TH2")) return;
2055 // zoom to sector works ONLY in 2D mode, if one side is specified
2056 if (fRadio2D->GetState() == kButtonUp) return;
2057 if (fRadioROC->GetState() == kButtonDown) { // return to full side view
2058 // return to full side view
2059 Int_t sector = (Int_t)(fNmbSector->GetNumber());
2060 if ( (sector >= 0 && sector <= 17) || (sector >= 36 && sector <= 53) ) {
2061 // A-Side
2062 fRadioSideA->Clicked();
2063 fRadioSideA->SetState(kButtonDown);
2064 DoNewSelection();
2065 }
2066 if ( (sector >= 18 && sector <= 35) || (sector >= 54 && sector <= 71) ) {
2067 // C-Side
2068 fRadioSideC->Clicked();
2069 fRadioSideC->SetState(kButtonDown);
2070 DoNewSelection();
2071 }
2072 return;
2073 }
2074 if (!(fRadioSideA->GetState() == kButtonDown || fRadioSideC->GetState() == kButtonDown)) return;
2075
2076 // Int_t px = gPad->GetEventX();
2077 // Int_t py = gPad->GetEventY();
2078 Float_t upy = gPad->AbsPixeltoY(y);
2079 Float_t upx = gPad->AbsPixeltoX(x);
2080 Float_t gy = gPad->PadtoY(upy);
2081 Float_t gx = gPad->PadtoX(upx);
2082 Int_t quadrant = -1;
2083 if (gx >= 0 && gy >= 0) quadrant = 1;
2084 if (gx < 0 && gy >= 0) quadrant = 2;
2085 if (gx < 0 && gy < 0) quadrant = 3;
2086 if (gx >= 0 && gy < 0) quadrant = 4;
2087 gx = TMath::Abs(gx);
2088 gy = TMath::Abs(gy);
2089 Double_t phi = TMath::ATan(gy/gx); // angle phi is in Pi- units
2090 Double_t r = TMath::Sqrt(gx*gx + gy*gy);
2091 if (quadrant == 2) phi = pi - phi;
2092 if (quadrant == 3) phi = pi + phi;
2093 if (quadrant == 4) phi = 2 * pi - phi;
2094 Double_t phiGrad = phi / pi * 180;
2095 Int_t sector = (Int_t) phiGrad / 20; // one sector coresponds to 20�
2096 // IROC starts at 84.5 cm
2097 // IROC ends at 135.5 cm, OROC begins
2098 // OROC ends at 250 cm
2099 if (r < 84.5 || r > 250) return; // outside TPC
2100 if (r < 135.5) { // IROC
2101 if (fRadioSideC->GetState() == kButtonDown) sector += 18;
2102 }
2103 else {// OROC
2104 sector += 36;
2105 if (fRadioSideC->GetState() == kButtonDown) sector += 18;
2106 }
2107 // printf("r: %f, phi: %f, phiGrad: %f, gy/gx: %f, quadrant: %i, sector: %i \n", r, phi, phiGrad, gy/gx, quadrant, sector);
2108 fNmbSector->SetNumber(sector);
2109 fRadioROC->Clicked();
2110 fRadioROC->SetState(kButtonDown);
2111 ChangeSector();
2112}
2113
2114
2115void AliTPCCalibViewerGUI::SavePicture() {
2116 //
2117 // saves the current picture
2118 //
2119 // use the following combination of file type and save options:
2120 // (see also TCanvas::Print)
2121 //
2122 // "ps" - Postscript file is produced (see special cases below)
2123 // "Portrait" - Postscript file is produced (Portrait)
2124 // "Landscape" - Postscript file is produced (Landscape)
2125 // "eps" - an Encapsulated Postscript file is produced
2126 // "Preview" - an Encapsulated Postscript file with preview is produced.
2127 // "pdf" - a PDF file is produced
2128 // "svg" - a SVG file is produced
2129 // "gif" - a GIF file is produced
2130 // "gif+NN" - an animated GIF file is produced, where NN is delay in 10ms units
2131 // "xpm" - a XPM file is produced
2132 // "png" - a PNG file is produced
2133 // "jpg" - a JPEG file is produced
2134 // "tiff" - a TIFF file is produced
2135 // "cxx" - a C++ macro file is produced
2136 // "xml" - a XML file
2137 // "root" - a ROOT binary file
2138
2139 const char *kSaveAsTypes[] = {
2140 "Postscript", "*.ps",
2141 "Encapsulated Postscript", "*.eps",
2142 "PDF", "*.pdf",
2143 "JPEG", "*.jpg",
2144 "PNG", "*.png",
2145 "TIFF", "*.tiff",
2146 "GIF", "*.gif",
2147 "XPM", "*.xpm",
2148 "SVG", "*.svg",
2149 "XML", "*.xml",
2150 "C++ macro", "*.cxx",
2151 "Macro file", "*.C",
2152 "ROOT file", "*.root",
2153 "All file", "*",
2154 0, 0
2155 };
2156 TString addSaveOpt("");
2157 if (fChkAddSaveOpt->GetState() == kButtonDown)
2158 addSaveOpt += fComboAddSaveOpt->GetTextEntry()->GetText();
2159 TString dir(".");
2160 TGFileInfo fi;
2161 fi.fFileTypes = kSaveAsTypes;
2162 // fi.fIniDir = StrDup(dir);
2163 fi.fOverwrite = kFALSE;
2164 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi);
2165 if (fi.fFilename && strlen(fi.fFilename)) {
2166 if (addSaveOpt != "")
2167 fCanvMain->GetCanvas()->Print(fi.fFilename, addSaveOpt.Data());
2168 else
2169 fCanvMain->GetCanvas()->Print(fi.fFilename);
2170 }
2171
2172// TList* fFileNamesList list of selected file names
2173// Int_t fFileTypeIdx selected file type, index in fFileTypes
2174// const char** fFileTypes file types used to filter selectable files
2175// char* fFilename selected file name
2176// char* fIniDir on input: initial directory, on output: new directory
2177// Bool_t fMultipleSelection if true, allow multiple file selection
2178// Bool_t fOverwrite if true overwrite the file with existing name on save
2179
2180}
2181
2182
2183void AliTPCCalibViewerGUI::DoDumpToFile() {
2184 //
2185 // This function is called, when the "Dump to File" button is pressed.
2186 // All the exported CalPads will be written into an new CalibTree,
2187 // a Save File dialog will appear to specify the filename
2188 //
2189 const char *kSaveAsTypes[] = {
2190 "ROOT file", "*.root",
2191 0, 0
2192 };
2193 TString dir(".");
2194 TGFileInfo fi;
2195 fi.fFileTypes = kSaveAsTypes;
2196 // fi.fIniDir = StrDup(dir);
2197 fi.fOverwrite = kFALSE;
2198 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi);
2199 if (fi.fFilename && strlen(fi.fFilename)) {
2200 fPreprocessor->DumpToFile(fi.fFilename);
2201 Info("DumpToFile", Form("New CalibTree has been writen to file '%s'", fi.fFilename));
2202 }
2203}
2204
2205
2206void AliTPCCalibViewerGUI::DoLoadTree() {
2207 // function to load a new calib tree
2208 //
2209 //
2210 const char *kFileTypes[] = {
2211 "ROOT file", "*.root",
2212 0, 0
2213 };
2214 TString dir(".");
2215 TGFileInfo fi;
2216 fi.fFileTypes = kFileTypes;
2217 // fi.fIniDir = StrDup(dir);
2218 fi.fOverwrite = kFALSE;
2219 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDOpen, &fi);
2220 if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonUp) {
2221 Initialize(fi.fFilename);
2222 Reload();
2223 }
2224 else if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonDown) {
2225 fViewer->AddReferenceTree(fi.fFilename, "calPads", fTxtRefName->GetText());
2226 Reload();
2227 }
2228}
2229
2230
2231TObjArray* AliTPCCalibViewerGUI::ShowGUI(const char* fileName) {
2232 //
2233 // Initialize and show GUI for presentation for demonstration purposes
2234 // or for fast standalone use
2235 //
2236 TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
2237 frmMain->SetWindowName("AliTPCCalibViewer GUI");
2238 frmMain->SetCleanup(kDeepCleanup);
2239
2240 TGTab* tabMain = new TGTab(frmMain, 1000, 600);
2241 frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2242
2243 TGCompositeFrame* tabCont1 = tabMain->AddTab("Viewer 1");
2244 TGCompositeFrame* tabCont2 = tabMain->AddTab("Viewer 2");
2245
2246 AliTPCCalibViewerGUI* calibViewer1 = new AliTPCCalibViewerGUI(tabCont1, 1000, 600, (char*)fileName);
2247 tabCont1->AddFrame(calibViewer1, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2248
2249 AliTPCCalibViewerGUI* calibViewer2 = new AliTPCCalibViewerGUI(tabCont2, 1000, 600, (char*)fileName);
2250 tabCont2->AddFrame(calibViewer2, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2251
2252 TObjArray *guiArray = new TObjArray();
2253 guiArray->Add(calibViewer1);
2254 guiArray->Add(calibViewer2);
2255
2256 frmMain->MapSubwindows();
2257 frmMain->Resize();
2258 frmMain->MapWindow();
2259
2260 return guiArray;
2261}
2262