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