]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/CDB/AliBaseCalibViewerGUI.cxx
Fixes for coverity.
[u/mrichter/AliRoot.git] / STEER / CDB / AliBaseCalibViewerGUI.cxx
1 ///////////////////////////////////////////////////////////////////////////////
2 //                                                                           //
3 //  Base class for the AliTPCCalibViewer and AliTRDCalibViewer               //
4 //  used for the calibration monitor                                         //
5 //                                                                           //
6 //  Authors:     Marian Ivanov (Marian.Ivanov@cern.ch)                       //
7 //               Jens Wiechula (Jens.Wiechula@cern.ch)                       //
8 //               Ionut Arsene  (iarsene@cern.ch)                             //
9 //                                                                           //
10 ///////////////////////////////////////////////////////////////////////////////
11
12 #include <TCanvas.h>
13 #include <TPad.h>
14 #include <TVirtualPad.h>
15 #include <TROOT.h>
16 #include <TObjArray.h>
17 #include <TObjString.h>
18 #include <TVector.h>
19 #include <string.h>
20 #include <TH1.h>
21 #include <TStyle.h>
22 #include <TGFileDialog.h>
23 #include <TGInputDialog.h>
24 #include <TGWidget.h>
25 #include <TGFrame.h>
26 #include <TGButton.h>
27 #include <TGListBox.h>
28 #include <TGComboBox.h>
29 #include <TGNumberEntry.h>
30 #include <TRootEmbeddedCanvas.h>
31 #include <TGSplitter.h>
32 #include <TGButtonGroup.h>
33 #include <TGLabel.h>
34 #include <TGTab.h>
35 #include <TString.h>
36
37 #include "AliBaseCalibViewerGUI.h"
38
39 ClassImp(AliBaseCalibViewerGUI)
40
41 //________________________________________________________________________________________
42 AliBaseCalibViewerGUI::AliBaseCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h)
43   : TGCompositeFrame(p, w, h),
44   fViewer(0),
45   fContTopBottom(0),
46   fContLCR(0),
47   fContLeft(0),
48   ftabLeft(0),
49   ftabLeft0(0),
50   ftabLeft1(0),
51   ftabRight(0),
52   fTabRight0(0),
53   fTabRight1(0),
54   fContRight(0),
55   fContCenter(0),
56   fContPlotOpt(0),
57   fContDrawOpt(0),
58   fContDrawOptSub1D2D(0),
59   fContNormalized(0),
60   fContCustom(0),
61   fContCuts(0),
62   fContAddCuts(0),
63   fContFit(0),
64   fContAddFit(0),
65   fContScaling(0),
66   fContSetMax(0),
67   fContSetMin(0),
68   fContAddDrawOpt(0),
69   fListVariables(0),
70   fBtnDraw(0),
71   fBtnFit(0),
72   fBtnAddFitFunction(0),
73   fBtnGetMinMax(0),
74   fCanvMain(0),
75   fRadioRaw(0),
76   fRadioNormalized(0),
77   fRadioPredefined(0),
78   fRadioCustom(0),
79   fRadio1D(0),
80   fRadio2D(0),
81   fComboAddDrawOpt(0),
82   fChkAuto(0),
83   fChkAutoAppend(0),
84   fComboMethod(0),
85   fListNormalization(0),
86   fComboCustom(0),
87   fLblCustomDraw(0),
88   fChkAddDrawOpt(0),
89   fLblAddCuts(0),
90   fComboAddCuts(0), 
91   fComboCustomFit(0),
92   fChkSetMax(0),
93   fChkSetMin(0),
94   fChkGetMinMaxAuto(0),
95   fTxtSetMax(0),
96   fTxtSetMin(0) ,
97   fContDrawOpt1D(0), 
98   fcontDrawOpt1DSubLR(0),
99   fContDrawOpt1DSubNSC(0), 
100   fRadioNorm(0),
101   fRadioSigma(0),
102   fTxtSigmas(0),
103   fContCumuLR(0),
104   fContCumLeft(0),
105   fContCumRight(0),
106   fLblSigmaMax(0),
107   fTxtSigmaMax(0),
108   fRadioCumulative(0),
109   fCheckCumulativePM(0),
110   fRadioIntegrate(0),
111   fContDrawOpt1DSubMML(0),
112   fChkMean(0),
113   fChkMedian(0),
114   fChkLTM(0),
115   fContStatOpt(0),
116   fChkStatName(0),
117   fChkStatEntries(0),
118   fContStatMean(0),
119   fChkStatMean(0),
120   fChkStatMeanPM(0),
121   fContStatRMS(0),
122   fChkStatRMS(0),
123   fChkStatRMSPM(0),
124   fChkStatUnderflow(0),
125   fChkStatOverflow(0),
126   fChkStatIntegral(0),
127   fContStatSkew(0),
128   fChkStatSkewness(0),
129   fChkStatSkewnessPM(0),
130   fContStatKurt(0),
131   fChkStatKurtosis(0),
132   fChkStatKurtosisPM(0),
133   fBtnUnchekAll(0),
134   fContLabeling(0),
135   fChkLabelTitle(0),
136   fTxtLabelTitle(0),
137   fChkLabelXaxis(0),
138   fTxtLabelXaxis(0),
139   fChkLabelYaxis(0),
140   fTxtLabelYaxis(0),
141   fChkLabelGetAuto(0),
142   fContSave(0),
143   fBtnSave(0),
144   fContAddSaveOpt(0),
145   fChkAddSaveOpt(0),
146   fComboAddSaveOpt(0),
147   fContExport(0),
148   fContAddExport(0),
149   fComboExportName(0),
150   fBtnExport(0),
151   fBtnAddNorm(0), 
152   fContTree(0),
153   fBtnDumpToFile(0),
154   fBtnLoadTree(0),
155   fChkAddAsReference(0),
156   fTxtRefName(0), 
157   fInitialized(0)
158 {
159   //
160   // AliBaseCalibViewerGUI constructor; fileName specifies the ROOT tree used for drawing 
161   //
162 }
163
164 //________________________________________________________________________________________
165 void AliBaseCalibViewerGUI::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h) {
166   // 
167   // draw the GUI
168   // 
169   // ======================================================================   
170   // ************************* Display everything *************************
171   // ======================================================================
172
173   SetCleanup(kDeepCleanup);
174
175   // *****************************************************************************
176   // ************************* content of this MainFrame *************************
177   // *****************************************************************************
178   // top level container with horizontal layout
179   fContTopBottom = new TGCompositeFrame(this, w, h, kVerticalFrame | kFixedWidth | kFixedHeight);
180   AddFrame(fContTopBottom, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
181
182   fContLCR = new TGCompositeFrame(fContTopBottom, w, h, kHorizontalFrame | kFixedWidth | kFixedHeight);
183   fContTopBottom->AddFrame(fContLCR, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
184
185   // ***********************************************************************
186   // ************************* content of fContLCR *************************
187   // ***********************************************************************
188   // left container
189   fContLeft = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
190   fContLCR->AddFrame(fContLeft, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 5, 3, 3, 3));
191
192   // left vertical splitter
193   TGVSplitter *splitLeft = new TGVSplitter(fContLCR);
194   splitLeft->SetFrame(fContLeft, kTRUE);
195   fContLCR->AddFrame(splitLeft, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
196
197   // right container
198   fContRight = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
199   fContLCR->AddFrame(fContRight, new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandY, 3, 5, 3, 3));
200
201   // center container
202   fContCenter = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
203   fContLCR->AddFrame(fContCenter, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
204
205   // right vertical splitter
206   TGVSplitter *splitRight = new TGVSplitter(fContLCR);
207   splitRight->SetFrame(fContRight, kFALSE);
208   fContLCR->AddFrame(splitRight, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
209
210
211   // ========================================================================
212   // ************************* content of fContLeft *************************
213   // ========================================================================
214   // --- draw button and tabLeft ---
215   // draw button
216   fBtnDraw = new TGTextButton(fContLeft, "&Draw");
217   fContLeft->AddFrame(fBtnDraw, new TGLayoutHints(kLHintsExpandX, 10, 10, 0, 0));
218   //fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoTest(=\"fBtnDraw clicked\")");
219   fBtnDraw->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "DoDraw()");
220   fBtnDraw->SetToolTipText("Press here to draw according to selections.");
221
222   // tabs on the left side:
223   ftabLeft = new TGTab(fContLeft);
224   fContLeft->AddFrame(ftabLeft, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
225   ftabLeft0 = ftabLeft->AddTab("General");
226   ftabLeft1 = ftabLeft->AddTab("More plot options");
227
228
229   // **************************** content of tabLeft0 *******************************
230
231   // draw options container *** fcontDrawOpt ***  " Plot options "
232   fContDrawOpt = new TGGroupFrame(ftabLeft0, "Plot options", kVerticalFrame | kFitWidth | kFitHeight);
233   ftabLeft0->AddFrame(fContDrawOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
234   fContDrawOptSub1D2D = new TGCompositeFrame(fContDrawOpt, 200, 23, kHorizontalFrame | kFitWidth | kFixedHeight);
235   fContDrawOpt->AddFrame(fContDrawOptSub1D2D, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
236
237   // ------------------------- content of fContDrawOpt -------------------------
238   // -- radio1D, radio2D, chkAuto
239   // 1D radio button
240   fRadio1D = new TGRadioButton(fContDrawOptSub1D2D, "1D", 30);
241   fContDrawOptSub1D2D->AddFrame(fRadio1D, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
242   fRadio1D->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral()");
243   fRadio1D->SetToolTipText("1D drawing \nSelect this if you want to have the full control for the custom draw.");
244
245   // 2D radio button
246   fRadio2D = new TGRadioButton(fContDrawOptSub1D2D, "2D", 31);
247   fContDrawOptSub1D2D->AddFrame(fRadio2D, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0));
248   fRadio2D->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral()");
249   fRadio2D->SetToolTipText("2D drawing");
250
251   // additional draw options container
252   fContAddDrawOpt = new TGCompositeFrame(fContDrawOpt, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
253   fContDrawOpt->AddFrame(fContAddDrawOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
254
255   //  content of --- fContAddDrawOpt ---
256   // addition draw options label
257   fChkAddDrawOpt = new TGCheckButton(fContAddDrawOpt, "Draw options:");
258   //fChkAddDrawOpt->SetTextJustify(kTextLeft);
259   fContAddDrawOpt->AddFrame(fChkAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
260   fChkAddDrawOpt->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
261   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).");
262
263   // additional draw options combo box
264   fComboAddDrawOpt = new TGComboBox(fContAddDrawOpt);
265   fComboAddDrawOpt->Resize(0, fBtnDraw->GetDefaultHeight());
266   fComboAddDrawOpt->EnableTextInput(kTRUE);
267   fContAddDrawOpt->AddFrame(fComboAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
268   fComboAddDrawOpt->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral(=14)");
269   fComboAddDrawOpt->Connect("Selected(Int_t)", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
270
271   // automatic redraw check button
272   fChkAuto = new TGCheckButton(fContDrawOpt, "Auto redraw");
273   fContDrawOpt->AddFrame(fChkAuto, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
274   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'.");
275
276   // automatic append ending check button
277   fChkAutoAppend = new TGCheckButton(fContDrawOpt, "Auto add appending");
278   fContDrawOpt->AddFrame(fChkAutoAppend, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
279   fChkAutoAppend->SetToolTipText("Tries to repair your custom draw string or custom cut string, if you forgot '~' or '.fElements' \nThis function may be buggy!");
280
281
282   // *** predefined radio button ***  " Predefined "
283   fRadioPredefined = new TGRadioButton(ftabLeft0, "Predefined: ", 13);
284   ftabLeft0->AddFrame(fRadioPredefined, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
285   fRadioPredefined->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral()");
286   fRadioPredefined->SetToolTipText("Draw predefined variables according to selection.");
287
288   // list of variables
289   fListVariables = new TGListBox(ftabLeft0);
290   ftabLeft0->AddFrame(fListVariables, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 10, 0, 0, 0));
291   fListVariables->Connect("Selected(Int_t)", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
292
293
294   // normalization options container *** fContPlotOpt ***
295   //fContPlotOpt = new TGCompositeFrame(fContLeft, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
296   fContPlotOpt = new TGGroupFrame(ftabLeft0, "Normalization options", kVerticalFrame | kFitWidth | kFitHeight);
297   ftabLeft0->AddFrame(fContPlotOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 0, 0, 0));
298
299   // ------------------------- content of fContPlotOpt -------------------------
300   // raw radio button
301   fRadioRaw = new TGRadioButton(fContPlotOpt, "Raw", 10);
302   fContPlotOpt->AddFrame(fRadioRaw, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
303   fRadioRaw->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral()");
304   fRadioRaw->SetToolTipText("Plot without normalization");
305
306   // normalized radio button
307   fRadioNormalized = new TGRadioButton(fContPlotOpt, "Normalized", 11);
308   fContPlotOpt->AddFrame(fRadioNormalized, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
309   fRadioNormalized->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral()");
310   fRadioNormalized->SetToolTipText("Normalize data");
311
312   // normalized options container *** fContNormalized ***
313   fContNormalized = new TGCompositeFrame(fContPlotOpt, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
314   fContPlotOpt->AddFrame(fContNormalized, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 15, 0, 0, 0));
315
316   // --- content of fContNormalized ---
317   // --- combo box to select 'subtract' or 'divide', list of normalization variables
318   // method drop down combo box
319   fComboMethod = new TGComboBox(fContNormalized);
320   fComboMethod->Resize(0, fBtnDraw->GetDefaultHeight());
321   fContNormalized->AddFrame(fComboMethod, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
322   fComboMethod->Connect("Selected(Int_t)", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
323
324   // list of normalization variables
325   fListNormalization = new TGListBox(fContNormalized);
326   fContNormalized->AddFrame(fListNormalization, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
327   fListNormalization->Connect("Selected(Int_t)", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
328
329   // custom radio button
330   fRadioCustom = new TGRadioButton(ftabLeft0, "Custom: ", 12);
331   ftabLeft0->AddFrame(fRadioCustom, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
332   fRadioCustom->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral()");
333   fRadioCustom->SetToolTipText("Draw data according to user specific text entry in the 'Custom Draw' line. Remember '~' (= '.fElements')!");
334   // custom options container is located further down
335
336   // **************************** content of tabLeft1 *******************************
337
338   // draw options container *** fcontDrawOpt1D ***  " Plot options "
339   fContDrawOpt1D = new TGGroupFrame(ftabLeft1, "1D Plot options", kVerticalFrame | kFitWidth | kFitHeight);
340   ftabLeft1->AddFrame(fContDrawOpt1D, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
341
342   fcontDrawOpt1DSubLR = new TGCompositeFrame(fContDrawOpt1D, 1, 1, kVerticalFrame | kFitWidth | kFitHeight);
343   fContDrawOpt1D->AddFrame(fcontDrawOpt1DSubLR, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
344
345   // ***** content of fContDrawOpt1DSubLR *****
346   fContDrawOpt1DSubNSC = new TGCompositeFrame(fcontDrawOpt1DSubLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
347   fcontDrawOpt1DSubLR->AddFrame(fContDrawOpt1DSubNSC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
348
349   // --------------------------- content of fContDrawOpt1DSubNSC -----------------
350   fRadioNorm = new TGRadioButton(fContDrawOpt1DSubNSC, "Normal", 110);
351   fContDrawOpt1DSubNSC->AddFrame(fRadioNorm, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
352   fRadioNorm->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
353   fRadioNorm->SetToolTipText("Produce a normal 1D plot, a histogram of the selected data.");
354
355   fRadioSigma = new TGRadioButton(fContDrawOpt1DSubNSC, "Sigma", 111);
356   fContDrawOpt1DSubNSC->AddFrame(fRadioSigma, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
357   fRadioSigma->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
358   fRadioSigma->SetToolTipText("Draw a normal histogram, but also lines that indicate the mean/median/LTM \nand sigmas of the selected data.");
359
360   fTxtSigmas = new TGTextEntry(fContDrawOpt1DSubNSC, "2; 4; 6", 111);
361   fContDrawOpt1DSubNSC->AddFrame(fTxtSigmas, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 10, 15, 0, 0));
362   fTxtSigmas->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtons1D(=111)");
363   fTxtSigmas->SetToolTipText("Enter sigma intervals you would like to be indicated by lines. \nExample: '2; 4; 6'");
364
365   fContCumuLR = new TGCompositeFrame(fContDrawOpt1DSubNSC, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
366   fContDrawOpt1DSubNSC->AddFrame(fContCumuLR, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 0));
367
368   fContCumLeft = new TGCompositeFrame(fContCumuLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
369   fContCumuLR->AddFrame(fContCumLeft, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
370
371   fRadioCumulative = new TGRadioButton(fContCumLeft, "Cumulative", 112);
372   fContCumLeft->AddFrame(fRadioCumulative, new TGLayoutHints(kLHintsNormal, 0, 10, 0, 0));
373   fRadioCumulative->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
374   fRadioCumulative->SetToolTipText("Draw the cumulative (SigmaCut) of the given selection. \nThe data distribution is integrated, starting from the mean/median/LTM.");
375
376   fCheckCumulativePM = new TGCheckButton(fContCumLeft, "Plus/Minus");
377   fContCumLeft->AddFrame(fCheckCumulativePM, new TGLayoutHints(kLHintsNormal, 10, 15, 0, 0));
378   fCheckCumulativePM->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
379   fCheckCumulativePM->SetToolTipText("Decide whether you want the cumulative integration for each direction (+/-) \nor only for the absolute distance to the mean/median/LTM value.");
380
381   fRadioIntegrate = new TGRadioButton(fContCumLeft, "Integrate", 113);
382   fContCumLeft->AddFrame(fRadioIntegrate, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
383   fRadioIntegrate->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
384   fRadioIntegrate->SetToolTipText("Draw the integral of the given selection.");
385
386   fContCumRight = new TGCompositeFrame(fContCumuLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
387   fContCumuLR->AddFrame(fContCumRight, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
388
389   fLblSigmaMax = new TGLabel(fContCumRight, "SigmaMax:");
390   fLblSigmaMax->SetTextJustify(kTextLeft);
391   fContCumRight->AddFrame(fLblSigmaMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
392
393   fTxtSigmaMax = new TGTextEntry(fContCumRight, "5", 112);
394   fContCumRight->AddFrame(fTxtSigmaMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 10, 15, 0, 0));
395   fTxtSigmaMax->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtons1D(=112)");
396   fTxtSigmaMax->SetToolTipText("Enter up to which multiple of sigma you want to integrate.");
397
398
399   fContDrawOpt1DSubMML = new TGCompositeFrame(fcontDrawOpt1DSubLR, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
400   fcontDrawOpt1DSubLR->AddFrame(fContDrawOpt1DSubMML, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 0));
401
402   // -------------- content of fcontDrawOpt1DSubLR
403   fChkMean = new TGCheckButton(fContDrawOpt1DSubMML, "Mean");
404   fContDrawOpt1DSubMML->AddFrame(fChkMean, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
405   fChkMean->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
406   fChkMean->SetToolTipText("Activate Mean for Sigma/Cumulative/Integrate");
407
408   fChkMedian = new TGCheckButton(fContDrawOpt1DSubMML, "Median");
409   fContDrawOpt1DSubMML->AddFrame(fChkMedian, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
410   fChkMedian->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
411   fChkMedian->SetToolTipText("Activate Median for Sigma/Cumulative/Integrate");
412
413   fChkLTM = new TGCheckButton(fContDrawOpt1DSubMML, "LTM");
414   fContDrawOpt1DSubMML->AddFrame(fChkLTM, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
415   fChkLTM->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtons1D()");
416   fChkLTM->SetToolTipText("Activate LTM for Sigma/Cumulative/Integrate");
417
418
419   // statistic options container *** fcontStatOpt1D ***  " Statistic options "      
420   fContStatOpt = new TGGroupFrame(ftabLeft1, "Statistic options", kVerticalFrame | kFitWidth | kFitHeight);
421   ftabLeft1->AddFrame(fContStatOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
422
423   fChkStatName = new TGCheckButton(fContStatOpt, "Name");
424   fContStatOpt->AddFrame(fChkStatName, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
425   fChkStatName->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
426   fChkStatName->SetToolTipText("Display the name in the statistics legend.");
427
428   fChkStatEntries = new TGCheckButton(fContStatOpt, "Entries");
429   fContStatOpt->AddFrame(fChkStatEntries, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
430   fChkStatEntries->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
431   fChkStatEntries->SetToolTipText("Display the number of entries in the statistics legend.");
432
433   fContStatMean = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
434   fContStatOpt->AddFrame(fContStatMean, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
435
436   fChkStatMean = new TGCheckButton(fContStatMean, "Mean");
437   fContStatMean->AddFrame(fChkStatMean, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
438   fChkStatMean->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
439   fChkStatMean->SetToolTipText("Display the mean value of the data in the statistics legend.");
440
441   fChkStatMeanPM = new TGCheckButton(fContStatMean, "+- Error");
442   fContStatMean->AddFrame(fChkStatMeanPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
443   fChkStatMeanPM->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
444   fChkStatMeanPM->SetToolTipText("Display the mean value's error in the statistics legend.");
445
446   fContStatRMS = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
447   fContStatOpt->AddFrame(fContStatRMS, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
448
449   fChkStatRMS = new TGCheckButton(fContStatRMS, "RMS");
450   fContStatRMS->AddFrame(fChkStatRMS, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
451   fChkStatRMS->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
452   fChkStatRMS->SetToolTipText("Display the RMS value of the data in the statistics legend.");
453
454   fChkStatRMSPM = new TGCheckButton(fContStatRMS, "+- Error");
455   fContStatRMS->AddFrame(fChkStatRMSPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
456   fChkStatRMSPM->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
457   fChkStatRMSPM->SetToolTipText("Display the RMS value's error in the statistics legend.");
458
459   fChkStatUnderflow = new TGCheckButton(fContStatOpt, "Underflow");
460   fContStatOpt->AddFrame(fChkStatUnderflow, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
461   fChkStatUnderflow->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
462   fChkStatUnderflow->SetToolTipText("Display the number of entries in the underflow bin.");
463
464   fChkStatOverflow = new TGCheckButton(fContStatOpt, "Overflow");
465   fContStatOpt->AddFrame(fChkStatOverflow, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
466   fChkStatOverflow->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
467   fChkStatOverflow->SetToolTipText("Display the number of entries in the overflow bin.");
468
469   fChkStatIntegral = new TGCheckButton(fContStatOpt, "Integral");
470   fContStatOpt->AddFrame(fChkStatIntegral, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
471   fChkStatIntegral->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
472   fChkStatIntegral->SetToolTipText("Display the integral of the data in the statistics legend.");
473
474   fContStatSkew = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
475   fContStatOpt->AddFrame(fContStatSkew, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
476
477   fChkStatSkewness = new TGCheckButton(fContStatSkew, "Skewness");
478   fContStatSkew->AddFrame(fChkStatSkewness, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
479   fChkStatSkewness->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
480   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!");
481
482   fChkStatSkewnessPM = new TGCheckButton(fContStatSkew, "+- Error");
483   fContStatSkew->AddFrame(fChkStatSkewnessPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
484   fChkStatSkewnessPM->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
485   fChkStatSkewnessPM->SetToolTipText("Display the skewness' error in the statistics legend.");
486
487   fContStatKurt = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
488   fContStatOpt->AddFrame(fContStatKurt, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
489
490   fChkStatKurtosis = new TGCheckButton(fContStatKurt, "Kurtosis");
491   fContStatKurt->AddFrame(fChkStatKurtosis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
492   fChkStatKurtosis->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
493   fChkStatKurtosis->SetToolTipText("Display the kurtosis of the data in the statistics legend.");
494
495   fChkStatKurtosisPM = new TGCheckButton(fContStatKurt, "+- Error");
496   fContStatKurt->AddFrame(fChkStatKurtosisPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
497   fChkStatKurtosisPM->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsStat()");
498   fChkStatKurtosisPM->SetToolTipText("Display the kurtosis' error in the statistics legend.");
499
500   fBtnUnchekAll = new TGTextButton(fContStatOpt, "&Uncheck all");
501   fContStatOpt->AddFrame(fBtnUnchekAll, new TGLayoutHints(kLHintsExpandX, 10, 10, 0, 0));
502   fBtnUnchekAll->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "UnchekAllStat()");
503   fBtnUnchekAll->SetToolTipText("Disable all statistics legend entries, \nno statistics legend.");
504
505
506   // custom options container
507   // --- fComboCustom --- the custom draw line on the very low
508   fContCustom = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
509   fContTopBottom->AddFrame(fContCustom, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
510
511   // ------------------------- content of fContCustom -------------------------
512   fLblCustomDraw = new TGLabel(fContCustom, "Custom draw: ");
513   fLblCustomDraw->SetTextJustify(kTextLeft);
514   fContCustom->AddFrame(fLblCustomDraw, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
515   // text field for custom draw command
516   fComboCustom = new TGComboBox(fContCustom);
517   fComboCustom->Resize(0, fBtnDraw->GetDefaultHeight());
518   fComboCustom->EnableTextInput(kTRUE);
519   fContCustom->AddFrame(fComboCustom, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
520   fComboCustom->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsGeneral(=42)");
521   fComboCustom->Connect("Selected(Int_t)", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
522
523
524   // additional cuts container
525   fContAddCuts = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
526   fContTopBottom->AddFrame(fContAddCuts, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
527
528   // ------------------------- content of fContAddCuts -------------------------
529   fLblAddCuts = new TGLabel(fContAddCuts, "Custom cuts:  ");
530   fLblAddCuts->SetTextJustify(kTextLeft);
531   fContAddCuts->AddFrame(fLblAddCuts, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
532   // combo text field for additional cuts
533   fComboAddCuts = new TGComboBox(fContAddCuts);
534   fComboAddCuts->Resize(0, fBtnDraw->GetDefaultHeight());
535   fComboAddCuts->EnableTextInput(kTRUE);
536   fContAddCuts->AddFrame(fComboAddCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
537   fComboAddCuts->Connect("Selected(Int_t)", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
538
539   // ==========================================================================
540   // ************************* content of fContCenter *************************
541   // ========================================================================
542   // main drawing canvas
543   fCanvMain = new TRootEmbeddedCanvas("Main_Canvas", fContCenter, 200, 200, kFitWidth | kFitHeight);
544   fContCenter->AddFrame(fCanvMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
545
546   fCanvMain->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "AliBaseCalibViewerGUI", this, "MouseMove(Int_t, Int_t, Int_t, TObject*)");
547
548   fCanvMain->GetCanvas()->Connect("RangeAxisChanged()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
549   fCanvMain->GetCanvas()->SetToolTipText("The Main_Canvas, here your plots are displayed.");
550
551
552   // =========================================================================   
553   // ************************* content of fContRight *************************
554   // ========================================================================
555
556   // tabs on the right side:
557   ftabRight = new TGTab(fContRight);
558   fContRight->AddFrame(ftabRight, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
559   fTabRight0 = ftabRight->AddTab("Basic");
560   fTabRight1 = ftabRight->AddTab("Advanced");
561
562
563   // **************************** content of tabLeft0 *******************************
564   // cut options container
565
566   fContCuts = new TGGroupFrame(fTabRight0, "Cuts", kVerticalFrame | kFitWidth | kFitHeight);
567   fTabRight0->AddFrame(fContCuts, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
568
569   // Scaling options container
570   fContScaling = new TGGroupFrame(fTabRight0, "Scaling", kVerticalFrame | kFitWidth | kFitHeight);
571   fTabRight0->AddFrame(fContScaling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
572
573   // ************************* content of fContScaling *************************
574   // SetMaximum container
575   fContSetMax = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
576   fContScaling->AddFrame(fContSetMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
577
578   // ------------------------- content of fContSetMax -------------------------
579   // SetMaximum - checkbox
580   fChkSetMax = new TGCheckButton(fContSetMax, "Set fixed max.");
581   fContSetMax->AddFrame(fChkSetMax, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
582   fChkSetMax->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
583   fChkSetMax->SetToolTipText("Set the maximum fixed to the value specified here.");
584
585   // text field for maximum value
586   fTxtSetMax = new TGTextEntry(fContSetMax, "", 41);
587   fContSetMax->AddFrame(fTxtSetMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
588   fTxtSetMax->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
589   fTxtSetMax->SetToolTipText("maximum value for the drawing");
590
591   // SetMinimum container
592   fContSetMin = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
593   fContScaling->AddFrame(fContSetMin, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
594
595   // ------------------------- content of fContSetMin -------------------------
596   // SetMinimum - checkbox
597   fChkSetMin = new TGCheckButton(fContSetMin, "Set fixed min.");
598   fContSetMin->AddFrame(fChkSetMin, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
599   fChkSetMin->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
600   fChkSetMin->SetToolTipText("Set the minimum fixed to the value specified here.");
601
602   // text field for minimum value
603   fTxtSetMin = new TGTextEntry(fContSetMin, "", 40);
604   fContSetMin->AddFrame(fTxtSetMin, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
605   fTxtSetMin->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
606   fTxtSetMin->SetToolTipText("minimum value for the drawing");
607
608   // get Min & Max from Plot - button
609   fBtnGetMinMax = new TGTextButton(fContScaling, "&Get scale from plot");
610   fContScaling->AddFrame(fBtnGetMinMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
611   fBtnGetMinMax->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "GetMinMax()");
612   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'.");
613
614   // GetMinMaxAuto - checkbox
615   fChkGetMinMaxAuto = new TGCheckButton(fContScaling, "Get Min + Max auto.");
616   fContScaling->AddFrame(fChkGetMinMaxAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
617   fChkGetMinMaxAuto->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
618   fChkGetMinMaxAuto->SetToolTipText("Get minimum and maximum automatically from each new plot. \nDeactivate this, if you want to 'save' your specified minimum and maximum.");
619
620   // labeling container *** fContLabeling ***  " Labeling "      
621   fContLabeling = new TGGroupFrame(fTabRight0, "Labeling", kVerticalFrame | kFitWidth | kFitHeight);
622   fTabRight0->AddFrame(fContLabeling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
623
624   fChkLabelTitle = new TGCheckButton(fContLabeling, "Set title:");
625   fContLabeling->AddFrame(fChkLabelTitle, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
626   fChkLabelTitle->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
627   fChkLabelTitle->SetToolTipText("Set the plot title.");
628
629   fTxtLabelTitle = new TGTextEntry(fContLabeling, "Title", 500);
630   fContLabeling->AddFrame(fTxtLabelTitle, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
631   fTxtLabelTitle->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw(=50)");
632   fTxtLabelTitle->SetToolTipText("plot title");
633
634   fChkLabelXaxis = new TGCheckButton(fContLabeling, "Set X-axis label:");
635   fContLabeling->AddFrame(fChkLabelXaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
636   fChkLabelXaxis->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
637   fChkLabelXaxis->SetToolTipText("Set the X-axis label.");
638
639   fTxtLabelXaxis = new TGTextEntry(fContLabeling, "XaxisLabel", 500);
640   fContLabeling->AddFrame(fTxtLabelXaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
641   fTxtLabelXaxis->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw(=51)");
642   fTxtLabelXaxis->SetToolTipText("X-axis label");
643
644   fChkLabelYaxis = new TGCheckButton(fContLabeling, "Set Y-axis label:");
645   fContLabeling->AddFrame(fChkLabelYaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
646   fChkLabelYaxis->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
647   fChkLabelYaxis->SetToolTipText("Set the Y-axis label.");
648
649   fTxtLabelYaxis = new TGTextEntry(fContLabeling, "YaxisLabel", 500);
650   fContLabeling->AddFrame(fTxtLabelYaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
651   fTxtLabelYaxis->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw(=52)");
652   fTxtLabelYaxis->SetToolTipText("Y-axis label");
653
654   fChkLabelGetAuto = new TGCheckButton(fContLabeling, "Get labels auto.");
655   fContLabeling->AddFrame(fChkLabelGetAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
656   fChkLabelGetAuto->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "HandleButtonsNoRedraw()");
657   fChkLabelGetAuto->SetToolTipText("Get labels automatically from each new plot \nDeactivate this, if you want to 'save' your specified labels.");
658
659
660   // **************************** content of ftabRight1 *******************************
661   // Save container
662   fContSave = new TGGroupFrame(fTabRight1, "Save", kVerticalFrame | kFitWidth | kFitHeight);
663   fTabRight1->AddFrame(fContSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
664   // save button
665   fBtnSave = new TGTextButton(fContSave, "&Save picture");
666   fContSave->AddFrame(fBtnSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
667   fBtnSave->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "SavePicture()");
668   fBtnSave->SetToolTipText("Open a 'Save as...' dialog to save the current plot as picture or macro.");
669
670   // additional save options container
671   fContAddSaveOpt = new TGCompositeFrame(fContSave, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
672   fContSave->AddFrame(fContAddSaveOpt, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
673
674   //  content of --- fContAddSaveOpt ---
675   // addition save options label
676   fChkAddSaveOpt = new TGCheckButton(fContAddSaveOpt, "Save options:");
677   fContAddSaveOpt->AddFrame(fChkAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
678   fChkAddSaveOpt->Connect("Clicked()", "AliBaseCalibViewerGUI", this, "DoNewSelection()");
679   fChkAddSaveOpt->SetToolTipText("Additional save options (see documentation for TPad::Print()).");
680
681   // additional save options combo box
682   fComboAddSaveOpt = new TGComboBox(fContAddSaveOpt);
683   fContAddSaveOpt->AddFrame(fComboAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
684   fComboAddSaveOpt->Resize(0, fBtnDraw->GetDefaultHeight());
685   fComboAddSaveOpt->EnableTextInput(kTRUE);
686   fComboAddSaveOpt->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "SavePicture()");
687
688   // calPad export container        
689   fContExport = new TGGroupFrame(fTabRight1, "Export AliTPCCalPad", kVerticalFrame | kFitWidth | kFitHeight);
690   fTabRight1->AddFrame(fContExport, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
691   // ------------------------- content of fContExport -------------------------
692   // container for export name
693
694   fContAddExport = new TGCompositeFrame(fContExport, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
695   fContExport->AddFrame(fContAddExport, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
696
697   fComboExportName = new TGComboBox(fContAddExport);
698   fComboExportName->Resize(0, fBtnDraw->GetDefaultHeight());
699   fContAddExport->AddFrame(fComboExportName, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
700   fComboExportName->AddEntry("calPad",  0);  // first default value
701   fComboExportName->Select(0);               // select default value before connecting
702   fComboExportName->EnableTextInput(kTRUE);
703
704   // export button
705   fBtnExport = new TGTextButton(fContExport, "&Export to CINT");
706   fContExport->AddFrame(fBtnExport, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
707   fBtnExport->SetToolTipText("Lifeless button :(");
708
709   // add to normalisation button
710   fBtnAddNorm = new TGTextButton(fContExport, "&Add to normalization");
711   fContExport->AddFrame(fBtnAddNorm, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
712   fBtnAddNorm->SetToolTipText("Lifeless button :(");
713
714   // Tree container
715   fContTree = new TGGroupFrame(fTabRight1, "Tree", kVerticalFrame | kFitWidth | kFitHeight);
716   fTabRight1->AddFrame(fContTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
717
718   // dump tree to file button
719   fBtnDumpToFile = new TGTextButton(fContTree, "&Dump to File");
720   fContTree->AddFrame(fBtnDumpToFile, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
721   fBtnDumpToFile->SetToolTipText("Lifeless button :(");
722
723   // dump tree to file button
724   fBtnLoadTree = new TGTextButton(fContTree, "&Load Tree");
725   fContTree->AddFrame(fBtnLoadTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
726   fBtnLoadTree->SetToolTipText("Lifeless button :(");
727
728   fChkAddAsReference = new TGCheckButton(fContTree, "as reference:");
729   fContTree->AddFrame(fChkAddAsReference, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
730   fChkAddAsReference->SetToolTipText("Lifeless button :(");            
731
732   fTxtRefName = new TGTextEntry(fContTree, "R", 500);
733   fContTree->AddFrame(fTxtRefName, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 15, 0, 0, 0));
734   fTxtRefName->SetToolTipText("Reference Name");
735
736   // Fit options container
737   fContFit = new TGGroupFrame(fTabRight1, "Custom fit", kVerticalFrame | kFitWidth | kFitHeight);
738   fTabRight1->AddFrame(fContFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
739
740   // ------------------------- content of fContFit -------------------------
741   // container for additional fits
742   fContAddFit = new TGCompositeFrame(fContFit, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
743   fContFit->AddFrame(fContAddFit, new TGLayoutHints(kLHintsExpandX, -5, -5, 0, 0));
744
745   // --- content of fContAddFit ---
746   // text field for custom fit
747   fComboCustomFit = new TGComboBox(fContAddFit);
748   fComboCustomFit->Resize(0, fBtnDraw->GetDefaultHeight());
749   fComboCustomFit->EnableTextInput(kTRUE);
750   fContAddFit->AddFrame(fComboCustomFit, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
751
752   // fit button
753   fBtnFit = new TGTextButton(fContAddFit, "&Fit");
754   fContAddFit->AddFrame(fBtnFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
755   fBtnFit->SetToolTipText("Lifeless button :(");
756 }
757
758 //________________________________________________________________________________________
759   AliBaseCalibViewerGUI::AliBaseCalibViewerGUI(const AliBaseCalibViewerGUI &c)
760 : TGCompositeFrame(c.fParent, c.fWidth, c.fHeight),
761   fViewer(0),
762   fContTopBottom(0),
763   fContLCR(0),
764   fContLeft(0),
765   ftabLeft(0),
766   ftabLeft0(0),
767   ftabLeft1(0),
768   ftabRight(0),
769   fTabRight0(0),
770   fTabRight1(0),
771   fContRight(0),
772   fContCenter(0),
773   fContPlotOpt(0),
774   fContDrawOpt(0),
775   fContDrawOptSub1D2D(0),
776   fContNormalized(0),
777   fContCustom(0),
778   fContCuts(0),
779   fContAddCuts(0),
780   fContFit(0),
781   fContAddFit(0),
782   fContScaling(0),
783   fContSetMax(0),
784   fContSetMin(0),
785   fContAddDrawOpt(0),
786   fListVariables(0),
787   fBtnDraw(0),
788   fBtnFit(0),
789   fBtnAddFitFunction(0),
790   fBtnGetMinMax(0),
791   fCanvMain(0),
792   fRadioRaw(0),
793   fRadioNormalized(0),
794   fRadioPredefined(0),
795   fRadioCustom(0),
796   fRadio1D(0),
797   fRadio2D(0),
798   fComboAddDrawOpt(0),
799   fChkAuto(0),
800   fChkAutoAppend(0),
801   fComboMethod(0),
802   fListNormalization(0),
803   fComboCustom(0),
804   fLblCustomDraw(0),
805   fChkAddDrawOpt(0),
806   fLblAddCuts(0),
807   fComboAddCuts(0), 
808   fComboCustomFit(0),
809   fChkSetMax(0),
810   fChkSetMin(0),
811   fChkGetMinMaxAuto(0),
812   fTxtSetMax(0),
813   fTxtSetMin(0), 
814   fContDrawOpt1D(0),
815   fcontDrawOpt1DSubLR(0),
816   fContDrawOpt1DSubNSC(0), 
817   fRadioNorm(0),
818   fRadioSigma(0),
819   fTxtSigmas(0),
820   fContCumuLR(0),
821   fContCumLeft(0),
822   fContCumRight(0),
823   fLblSigmaMax(0),
824   fTxtSigmaMax(0),
825   fRadioCumulative(0),
826   fCheckCumulativePM(0),
827   fRadioIntegrate(0),
828   fContDrawOpt1DSubMML(0),
829   fChkMean(0),
830   fChkMedian(0),
831   fChkLTM(0), 
832   fContStatOpt(0),
833   fChkStatName(0),
834   fChkStatEntries(0),
835   fContStatMean(0),
836   fChkStatMean(0),
837   fChkStatMeanPM(0),
838   fContStatRMS(0),
839   fChkStatRMS(0),
840   fChkStatRMSPM(0),
841   fChkStatUnderflow(0),
842   fChkStatOverflow(0),
843   fChkStatIntegral(0),
844   fContStatSkew(0),
845   fChkStatSkewness(0),
846   fChkStatSkewnessPM(0),
847   fContStatKurt(0),
848   fChkStatKurtosis(0),
849   fChkStatKurtosisPM(0),
850   fBtnUnchekAll(0),
851   fContLabeling(0),
852   fChkLabelTitle(0),
853   fTxtLabelTitle(0),
854   fChkLabelXaxis(0),
855   fTxtLabelXaxis(0),
856   fChkLabelYaxis(0),
857   fTxtLabelYaxis(0),
858   fChkLabelGetAuto(0),
859   fContSave(0),
860   fBtnSave(0),
861   fContAddSaveOpt(0),
862   fChkAddSaveOpt(0),
863   fComboAddSaveOpt(0),
864   fContExport(0),
865   fContAddExport(0),
866   fComboExportName(0),
867   fBtnExport(0),
868   fBtnAddNorm(0), 
869   fContTree(0),
870   fBtnDumpToFile(0),
871   fBtnLoadTree(0),
872   fChkAddAsReference(0),
873   fTxtRefName(0),
874   fInitialized(0)
875 {
876   //
877   // dummy AliBaseCalibViewerGUI copy constructor
878   //
879 }
880
881 //________________________________________________________________________________________
882 AliBaseCalibViewerGUI & AliBaseCalibViewerGUI::operator =(const AliBaseCalibViewerGUI & /*param*/) {
883   //
884   // dummy assignment operator
885   //
886   return (*this);
887 }
888
889 //________________________________________________________________________________________
890 AliBaseCalibViewerGUI::~AliBaseCalibViewerGUI() {
891   // 
892   // Destructor
893   // 
894   /*
895      if (fCanvMain && fCanvMain->GetCanvas()) {
896      for (Int_t i = 0; i < fCanvMain->GetCanvas()->GetListOfPrimitives()->GetEntries(); i++) {
897      if (strcmp(fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->ClassName(), "TFrame") != 0)
898      fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->Delete();
899      }
900      } 
901      */
902   //   Cleanup();
903 }
904
905 //________________________________________________________________________________________
906 void AliBaseCalibViewerGUI::SetInitialValues() {
907   // 
908   // Set the default button states
909   // 
910   fChkAuto->SetState(kButtonUp);
911   fRadioPredefined->SetState(kButtonDown);
912   fRadioRaw->SetState(kButtonDown);
913   fRadio1D->SetState(kButtonDown);
914   fChkGetMinMaxAuto->SetState(kButtonDown);
915   fChkSetMin->SetState(kButtonUp);
916   fChkSetMax->SetState(kButtonUp);
917   fRadioNorm->SetState(kButtonDown);
918   fRadioSigma->SetState(kButtonUp);
919   fRadioCumulative->SetState(kButtonUp);
920   fChkMean->SetState(kButtonDown);
921   fCheckCumulativePM->SetState(kButtonUp);
922
923   fChkLabelGetAuto->SetState(kButtonDown);
924
925   Int_t statOpt = gStyle->GetOptStat();
926   if (statOpt == 1) statOpt = 1111;
927   if (statOpt / 200000000 >= 1) {
928     fChkStatKurtosis->SetState(kButtonDown);
929     fChkStatKurtosisPM->SetState(kButtonDown);
930     statOpt -= 200000000;
931   }
932   if (statOpt / 100000000 >= 1) {
933     fChkStatKurtosis->SetState(kButtonDown);
934     statOpt -= 100000000;
935   }
936   if (statOpt / 20000000 >= 1) {
937     fChkStatSkewness->SetState(kButtonDown);
938     fChkStatSkewnessPM->SetState(kButtonDown);
939     statOpt -= 20000000;
940   }
941   if (statOpt / 10000000 >= 1) {
942     fChkStatSkewness->SetState(kButtonDown);
943     statOpt -= 10000000;
944   }
945   if (statOpt / 1000000 >= 1) {
946     fChkStatIntegral->SetState(kButtonDown);
947     statOpt -= 1000000;
948   }
949   if (statOpt / 100000 >= 1) {
950     fChkStatOverflow->SetState(kButtonDown);
951     statOpt -= 100000;
952   }
953   if (statOpt / 10000 >= 1) {
954     fChkStatUnderflow->SetState(kButtonDown);
955     statOpt -= 10000;
956   }
957   if (statOpt / 2000 >= 1) {
958     fChkStatRMS->SetState(kButtonDown);
959     fChkStatRMSPM->SetState(kButtonDown);
960     statOpt -= 2000;
961   }
962   if (statOpt / 1000 >= 1) {
963     fChkStatRMS->SetState(kButtonDown);
964     statOpt -= 1000;
965   }
966   if (statOpt / 200 >= 1) {
967     fChkStatMean->SetState(kButtonDown);
968     fChkStatMeanPM->SetState(kButtonDown);
969     statOpt -= 200;
970   }
971   if (statOpt / 100 >= 1) {
972     fChkStatMean->SetState(kButtonDown);
973     statOpt -= 100;
974   }
975   if (statOpt / 10 >= 1) {
976     fChkStatEntries->SetState(kButtonDown);
977     statOpt -= 10;
978   }
979   if (statOpt / 1 >= 1) {
980     fChkStatName->SetState(kButtonDown);
981     statOpt -= 1;
982   }
983
984   // fill fComboAddDrawOpt with some additional drawing options
985   fComboAddDrawOpt->AddEntry("same",      0);
986   fComboAddDrawOpt->AddEntry("profbox",   1);
987   fComboAddDrawOpt->AddEntry("profcolz",  2);
988   fComboAddDrawOpt->AddEntry("profcont0", 3);
989   fComboAddDrawOpt->AddEntry("proflego",  4);
990   fComboAddDrawOpt->AddEntry("proflego2", 5);
991   fComboAddDrawOpt->AddEntry("profsurf",  6);
992   fComboAddDrawOpt->AddEntry("profsurf1", 7);
993   fComboAddDrawOpt->AddEntry("profsurf2", 8);
994   fComboAddDrawOpt->AddEntry("box",    9);
995   fComboAddDrawOpt->AddEntry("colz",  10);
996   fComboAddDrawOpt->AddEntry("cont0", 11);
997   fComboAddDrawOpt->AddEntry("lego",  12);
998   fComboAddDrawOpt->AddEntry("lego2", 13);
999   fComboAddDrawOpt->AddEntry("surf",  14);
1000   fComboAddDrawOpt->AddEntry("surf1", 15);
1001   fComboAddDrawOpt->AddEntry("surf2", 16);
1002
1003   // fill fComboAddSaveOpt with some additional drawing options
1004   fComboAddSaveOpt->AddEntry("Portrait",  0);
1005   fComboAddSaveOpt->AddEntry("Landscape", 1);
1006   fComboAddSaveOpt->AddEntry("Preview",   2);
1007   fComboAddSaveOpt->AddEntry("+50",       3);
1008
1009   // fill fComboMethod
1010   fComboMethod->AddEntry("subtract",  0);
1011   fComboMethod->AddEntry("divide by", 1);
1012
1013   // fill fComboExportName
1014   fBtnExport->SetEnabled(kFALSE);
1015   fBtnAddNorm->SetEnabled(kFALSE);
1016
1017   // select initial variables
1018   fListVariables->Select(0);
1019   fListNormalization->Select(0);
1020   fComboMethod->Select(0);
1021
1022   fListVariables->IntegralHeight(kFALSE);         // naja
1023   fListNormalization->IntegralHeight(kFALSE);     // naja
1024   fChkAuto->SetState(kButtonDown);
1025 }
1026
1027 //________________________________________________________________________________________
1028 void AliBaseCalibViewerGUI::HandleButtonsGeneral(Int_t id) {
1029   //
1030   // handles mutual radio button exclusions
1031   // for general Tab
1032   //
1033   if (id == -1) {
1034     TGButton *btn = (TGButton *) gTQSender;
1035     id = btn->WidgetId();
1036   }
1037
1038   switch (id) {
1039     case 10:             // fRadioRaw
1040       fRadioNormalized->SetState(kButtonUp);
1041       fRadioPredefined->SetState(kButtonDown);
1042       fRadioCustom->SetState(kButtonUp);
1043       break;
1044     case 11:             // fRadioNormalized
1045       fRadioRaw->SetState(kButtonUp);
1046       fRadioPredefined->SetState(kButtonDown);
1047       fRadioCustom->SetState(kButtonUp);
1048       break;
1049     case 12:             // fRadioCustom
1050       fRadioPredefined->SetState(kButtonUp);
1051       break;
1052     case 14:             // select Draw options fComboAddDrawOpt
1053       fChkAddDrawOpt->SetState(kButtonDown);
1054       break;
1055     case 13:             // fRadioPredefined
1056       fRadioCustom->SetState(kButtonUp);
1057       break;
1058       //--------
1059     case 30:             // fRadio1D
1060       fRadio2D->SetState(kButtonUp);
1061       fBtnExport->SetEnabled(kFALSE);
1062       fBtnAddNorm->SetEnabled(kFALSE);
1063       break;
1064     case 31:             // fRadio2D
1065       fRadio1D->SetState(kButtonUp);
1066       fBtnExport->SetEnabled(kTRUE);
1067       fBtnAddNorm->SetEnabled(kTRUE);
1068       break;
1069     case 42:             // fComboCustom
1070       fRadioCustom->SetState(kButtonDown);
1071       fRadioPredefined->SetState(kButtonUp);
1072       break;
1073   }
1074   DoNewSelection();
1075 }
1076
1077 //________________________________________________________________________________________
1078 void AliBaseCalibViewerGUI::HandleButtons1D(Int_t id) {
1079   //
1080   // handles mutual radio button exclusions
1081   // 1D-Tab buttons
1082   //
1083
1084   if (id == -1) {
1085     TGButton *btn = (TGButton *) gTQSender;
1086     id = btn->WidgetId();
1087   }
1088   switch (id) {
1089     case 110:            // 1D draw normal
1090       fRadioNorm->SetState(kButtonDown);
1091       fRadioSigma->SetState(kButtonUp);
1092       fRadioCumulative->SetState(kButtonUp);
1093       fRadioIntegrate->SetState(kButtonUp);
1094       break;
1095     case 111:            // 1D draw sigma
1096       fRadioNorm->SetState(kButtonUp);
1097       fRadioSigma->SetState(kButtonDown);
1098       fRadioCumulative->SetState(kButtonUp);
1099       fRadioIntegrate->SetState(kButtonUp);
1100       break;
1101     case 112:            // 1D draw cumulative
1102       fRadioNorm->SetState(kButtonUp);
1103       fRadioSigma->SetState(kButtonUp);
1104       fRadioCumulative->SetState(kButtonDown);
1105       fRadioIntegrate->SetState(kButtonUp);
1106       break;
1107     case 113:            // 1D draw integral
1108       fRadioNorm->SetState(kButtonUp);
1109       fRadioSigma->SetState(kButtonUp);
1110       fRadioCumulative->SetState(kButtonUp);
1111       fRadioIntegrate->SetState(kButtonDown);
1112       break;
1113   }
1114   DoNewSelection();
1115 }
1116
1117 //________________________________________________________________________________________
1118 void AliBaseCalibViewerGUI::HandleButtonsStat(Int_t id) {
1119   // 
1120   // handles statistic check boxes 
1121   // checks each checkbox if checked
1122   // if the checkbox is checked, appends 'n' for name, 'e' for entries, ...
1123   // to a TString, passes this TString to gStyle->SetOptStat(...)
1124   // 
1125   if (id == -1) {
1126     TGButton *btn = (TGButton *) gTQSender;
1127     id = btn->WidgetId();
1128   }
1129   TString statOpt("");
1130   if (fChkStatName->GetState() == kButtonDown) statOpt.Append("n");
1131   if (fChkStatEntries->GetState() == kButtonDown) statOpt.Append("e");
1132   if (fChkStatMean->GetState() == kButtonDown && fChkStatMeanPM->GetState() == kButtonUp) statOpt.Append("m");
1133   if (fChkStatMeanPM->GetState() == kButtonDown) statOpt.Append("M");
1134   if (fChkStatRMS->GetState() == kButtonDown && fChkStatRMSPM->GetState() == kButtonUp) statOpt.Append("r");
1135   if (fChkStatRMSPM->GetState() == kButtonDown) statOpt.Append("R");
1136   if (fChkStatUnderflow->GetState() == kButtonDown) statOpt.Append("u");
1137   if (fChkStatOverflow->GetState() == kButtonDown) statOpt.Append("o");
1138   if (fChkStatIntegral->GetState() == kButtonDown) statOpt.Append("i");
1139   if (fChkStatSkewness->GetState() == kButtonDown && fChkStatSkewnessPM->GetState() == kButtonUp) statOpt.Append("s");
1140   if (fChkStatSkewnessPM->GetState() == kButtonDown) statOpt.Append("S");
1141   if (fChkStatKurtosis->GetState() == kButtonDown && fChkStatKurtosisPM->GetState() == kButtonUp) statOpt.Append("k");
1142   if (fChkStatKurtosisPM->GetState() == kButtonDown) statOpt.Append("K");
1143
1144   gStyle->SetOptStat(statOpt);
1145   DoNewSelection();
1146 }
1147
1148 //________________________________________________________________________________________
1149 void AliBaseCalibViewerGUI::HandleButtonsNoRedraw(Int_t id) {
1150   //
1151   // handles label & scaling checkboxes 
1152   // without redrawing (not necessary, faster like this)
1153   //
1154   if (id == -1) {
1155     TGButton *btn = (TGButton *) gTQSender;
1156     id = btn->WidgetId();
1157   }
1158
1159   switch (id) {
1160     case 40:             // fTxtSetMin
1161       fChkSetMin->SetState(kButtonDown);
1162       break;
1163     case 41:             // fTxtSetMax
1164       fChkSetMax->SetState(kButtonDown);
1165       break;
1166     case 50:             // fTxtLabelTitle
1167       fChkLabelTitle->SetState(kButtonDown);
1168       break;
1169     case 51:             // fTxtLabelXaxis
1170       fChkLabelXaxis->SetState(kButtonDown);
1171       break;
1172     case 52:             // fTxtLabelXaxis
1173       fChkLabelYaxis->SetState(kButtonDown);
1174       break;
1175   }
1176   SetMinMaxLabel();
1177 }
1178
1179 //________________________________________________________________________________________
1180 void AliBaseCalibViewerGUI::ReplacePlaceHolders(TString &str)
1181 {
1182   //
1183   // replace the defined placeholders in the custom draw string and cut string
1184   //
1185   TString drawPlaceHolder("#draw#");
1186   TString normPlaceHolder("#norm#");
1187
1188   //current draw variable
1189   TString desiredData("");
1190   if (fListVariables->GetSelectedEntry()){
1191     desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1192     str.ReplaceAll(drawPlaceHolder,desiredData);
1193   }
1194
1195   //current normalisation
1196   TString normalizationData("");
1197   if (fListNormalization->GetSelectedEntry()){
1198     normalizationData += ((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle();
1199     if (! (TString(((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle())).BeginsWith("Fit"))
1200       if ( normalizationData.BeginsWith("_") ) normalizationData = desiredData+normalizationData;
1201     if ( fListVariables->FindEntry(normalizationData.Data()) )
1202       normalizationData+="~";
1203     str.ReplaceAll(normPlaceHolder,normalizationData);
1204   }
1205 }
1206
1207 //________________________________________________________________________________________
1208 void AliBaseCalibViewerGUI::DoNewSelection() {
1209   //
1210   // decides whether to redraw if user makes another selection
1211   //
1212   if (fChkAuto->GetState() == kButtonDown) DoDraw();
1213 }
1214
1215 //________________________________________________________________________________________
1216 void AliBaseCalibViewerGUI::SavePicture() {
1217   // 
1218   // saves the current picture
1219   // 
1220   // use the following combination of file type and save options:
1221   // (see also TCanvas::Print)
1222   // 
1223   //       "ps"  - Postscript file is produced (see special cases below)
1224   //    "Portrait" - Postscript file is produced (Portrait)
1225   // "Landscape" - Postscript file is produced (Landscape)
1226   //       "eps" - an Encapsulated Postscript file is produced
1227   //    "Preview" - an Encapsulated Postscript file with preview is produced.
1228   //       "pdf" - a PDF file is produced
1229   //       "svg" - a SVG file is produced
1230   //       "gif" - a GIF file is produced
1231   //       "gif+NN" - an animated GIF file is produced, where NN is delay in 10ms units
1232   //       "xpm" - a XPM file is produced
1233   //       "png" - a PNG file is produced
1234   //       "jpg" - a JPEG file is produced
1235   //       "tiff" - a TIFF file is produced
1236   //       "cxx" - a C++ macro file is produced
1237   //       "xml" - a XML file
1238   //       "root" - a ROOT binary file
1239
1240   const char *kSaveAsTypes[] = {
1241     "Postscript",  "*.ps",
1242     "Encapsulated Postscript",   "*.eps",
1243     "PDF",   "*.pdf",
1244     "JPEG",   "*.jpg",
1245     "PNG",   "*.png",
1246     "TIFF",   "*.tiff",
1247     "GIF",   "*.gif",
1248     "XPM",   "*.xpm",
1249     "SVG",   "*.svg",
1250     "XML",   "*.xml",
1251     "C++ macro",   "*.cxx",
1252     "Macro file",  "*.C",
1253     "ROOT file",   "*.root",
1254     "All file",    "*",
1255     0,              0
1256   };
1257   TString addSaveOpt("");
1258   if (fChkAddSaveOpt->GetState() == kButtonDown)
1259     addSaveOpt += fComboAddSaveOpt->GetTextEntry()->GetText();
1260   TString dir(".");
1261   TGFileInfo fi;
1262   fi.fFileTypes = kSaveAsTypes;
1263   fi.fOverwrite = kFALSE;
1264   new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi);
1265   if (fi.fFilename && strlen(fi.fFilename)) {
1266     if (addSaveOpt != "")
1267       fCanvMain->GetCanvas()->Print(fi.fFilename, addSaveOpt.Data());
1268     else 
1269       fCanvMain->GetCanvas()->Print(fi.fFilename);
1270   }
1271 }
1272
1273 //________________________________________________________________________________________
1274 void AliBaseCalibViewerGUI::GetMinMax() {
1275   //
1276   // Read current Min & Max from the plot and set it to fTxtSetMin & fTxtSetMax
1277   //
1278   if (fChkGetMinMaxAuto->GetState() == kButtonUp) return;
1279   TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1280   TObject* ptr = 0;
1281   for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1282     ptr = listOfPrimitives->At(i);
1283     if ( ptr->InheritsFrom("TH1") ) break;
1284   }
1285   if ( !ptr || !ptr->InheritsFrom("TH1") ) return;      // if the loop did not find a TH1
1286   TH1 *hist = (TH1*)ptr;
1287
1288   if (fRadio2D->GetState() == kButtonDown) {
1289     if (fChkSetMax->GetState() == kButtonUp)
1290       fTxtSetMax->SetText(Form("%f", hist->GetMaximum()));
1291     if (fChkSetMin->GetState() == kButtonUp)
1292       fTxtSetMin->SetText(Form("%f", hist->GetMinimum()));
1293   }
1294   else if (fRadio1D->GetState() == kButtonDown) {
1295     if (fChkSetMax->GetState() == kButtonUp)
1296       fTxtSetMax->SetText( Form("%f", hist->GetXaxis()->GetXmax()) );
1297     if (fChkSetMin->GetState() == kButtonUp)
1298       fTxtSetMin->SetText( Form("%f", hist->GetXaxis()->GetXmin()) );
1299   }
1300 }
1301
1302 //________________________________________________________________________________________
1303 void AliBaseCalibViewerGUI::SetMinMaxLabel() {
1304   // 
1305   // Set Minimum, Maximum and labels without redrawing the plot
1306   // (faster)
1307   // 
1308
1309   // search for histogram
1310   TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1311   TObject* ptr = 0;
1312   for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1313     ptr = listOfPrimitives->At(i);
1314     if ( ptr->InheritsFrom("TH1") ) break;
1315   }
1316   if ( ptr == 0 || !ptr->InheritsFrom("TH1") ) {  // if the loop did not find a TH1
1317     fCanvMain->GetCanvas()->Update();
1318     Warning("SetMinMaxLabel","No Histogram found!");
1319     return;
1320     // unable to find histogram, no min and max wil be read out
1321   }
1322
1323   TH1 *hist = (TH1*)ptr; 
1324   TString minTxt(fTxtSetMin->GetText());
1325   TString maxTxt(fTxtSetMax->GetText());
1326
1327   // set min and max according to specified values, if checkbox is checked
1328   if (fRadio2D->GetState() == kButtonDown) {
1329     if (fChkSetMax->GetState() == kButtonDown && fChkSetMax->GetState() == kButtonDown &&(maxTxt.IsDigit() || maxTxt.IsFloat()) )
1330       hist->SetMaximum(maxTxt.Atof());
1331     if (fChkSetMax->GetState() == kButtonUp)
1332       hist->SetMaximum(-1111);  // default value, to unzoom
1333     if (fChkSetMin->GetState() == kButtonDown && (minTxt.IsDigit() || minTxt.IsFloat()) )
1334       hist->SetMinimum(minTxt.Atof());
1335     if (fChkSetMin->GetState() == kButtonUp)
1336       hist->SetMinimum(-1111);  // default value, to unzoom
1337   }
1338   else if (fRadio2D->GetState() == kButtonDown) {
1339     if (fChkSetMin->GetState() == kButtonDown && 
1340         fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
1341       hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), hist->GetXaxis()->GetXmax());
1342     else if (fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
1343       hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), maxTxt.Atof());
1344     else if (fChkSetMin->GetState() == kButtonDown && hist->GetXaxis())
1345       hist->GetXaxis()->SetRangeUser(minTxt.Atof(), hist->GetXaxis()->GetXmax());
1346     hist->SetTitle(hist->GetTitle());  // trick to update the histogram
1347   }
1348
1349   // get min and max from plot       
1350   GetMinMax();
1351
1352   // set labels according to specification, if cehckboxes are checked
1353   if (fChkLabelTitle->GetState() == kButtonDown) 
1354     hist->SetTitle(fTxtLabelTitle->GetText());
1355   if (fChkLabelXaxis->GetState() == kButtonDown)
1356     hist->GetXaxis()->SetTitle(fTxtLabelXaxis->GetText());
1357   if (fChkLabelYaxis->GetState() == kButtonDown)
1358     hist->GetYaxis()->SetTitle(fTxtLabelYaxis->GetText());
1359   // get and/or set labels and title
1360   if (fChkLabelGetAuto->GetState() == kButtonDown) {
1361     fTxtLabelTitle->SetText(hist->GetTitle());
1362     fTxtLabelXaxis->SetTitle(hist->GetXaxis()->GetTitle());
1363     fTxtLabelYaxis->SetTitle(hist->GetYaxis()->GetTitle());
1364   }
1365   hist->SetTitle(hist->GetTitle());  // trick to update the histogram
1366   fCanvMain->GetCanvas()->Update();
1367 }
1368
1369 //________________________________________________________________________________________
1370 void AliBaseCalibViewerGUI::UnchekAllStat() {
1371   // 
1372   // Disable all statistical legend entries, no statistical legend.
1373   // 
1374   fChkStatName->SetState(kButtonUp);
1375   fChkStatEntries->SetState(kButtonUp);
1376   fChkStatMean->SetState(kButtonUp);
1377   fChkStatMeanPM->SetState(kButtonUp);
1378   fChkStatRMS->SetState(kButtonUp);
1379   fChkStatRMSPM->SetState(kButtonUp);
1380   fChkStatUnderflow->SetState(kButtonUp);
1381   fChkStatOverflow->SetState(kButtonUp);
1382   fChkStatIntegral->SetState(kButtonUp);
1383   fChkStatSkewness->SetState(kButtonUp);
1384   fChkStatSkewnessPM->SetState(kButtonUp);
1385   fChkStatKurtosis->SetState(kButtonUp);
1386   fChkStatKurtosisPM->SetState(kButtonUp);
1387
1388   HandleButtonsStat(0);
1389 }