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