replacing fabs with TMath::Abs
[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("");
1780 TString *returnStr = new TString("");
1781
832bb12c 1782 // specify data to plot:
1783 TString drawStr(GetDrawString()->Data());
8192627b 1784
a6d2bd0c 1785 // ********** create cut string **********
1786 if (fRadioTPC->GetState() == kButtonDown)
1787 cutStr += ""; // whole TPC is used for fitting
1788 if (fRadioSideA->GetState() == kButtonDown)
1789 cutStr += "(sector/18)%2==0"; // side A
1790 if (fRadioSideC->GetState() == kButtonDown)
1791 cutStr+= "(sector/18)%2==1"; // side C
c4607f01 1792 if (fRadioROC->GetState() == kButtonDown) {
a6d2bd0c 1793 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1794 cutStr += "sector==";
1795 cutStr += sector;
1796 }
c4607f01 1797 if (fRadioSector->GetState() == kButtonDown) {
1798 Int_t sector = (Int_t)(fNmbSector->GetNumber())%36;
1799 cutStr += "sector%36==";
1800 cutStr += sector;
1801 }
a6d2bd0c 1802 if (fChkAddCuts->GetState() == kButtonDown && strcmp(fComboAddCuts->GetTextEntry()->GetText(), "") != 0){
1803 if (fRadioTPC->GetState() != kButtonDown) cutStr += " && ";
1804 cutStr += fComboAddCuts->GetTextEntry()->GetText();
1805 }
8192627b 1806 // try to add forgotten '~'
1807 if (fChkAutoAppend->GetState() == kButtonDown)
1808 cutStr = TString(fViewer->AddAbbreviations((char*)cutStr.Data()));
a6d2bd0c 1809
1810 // ********** get formula string **********
1811 formulaStr += fComboCustomFit->GetTextEntry()->GetText();
8192627b 1812 if (fChkAutoAppend->GetState() == kButtonDown)
1813 formulaStr = TString(fViewer->AddAbbreviations((char*)formulaStr.Data()));
a6d2bd0c 1814
1815 // ********** call AliTPCCalibViewer's fit-function
7390f655 1816 ReplacePlaceHolders(drawStr);
1817 ReplacePlaceHolders(cutStr);
1818 returnStr = fViewer->Fit(drawStr.Data(), formulaStr.Data(), cutStr.Data(), chi2, fitParam, covMatrix);
a6d2bd0c 1819
1820 std::cout << std::endl;
1821 std::cout << "Your fit formula reads as follows:" << std::endl;
1822 std::cout << returnStr->Data() << std::endl;
1823 std::cout << "chi2 = " << chi2 << std::endl;
1824}
1825
832bb12c 1826
1827void AliTPCCalibViewerGUI::DoExport() {
1828 //
1829 // function to export a CalPad to Cint
1830 //
1831 if ( fRadio2D->GetState() != kButtonDown){
1832 Error("ExportCalPad", "Export of AliTPCCalPad to CINT works only in 2D mode.");
1833 return;
1834 }
1835 // specify data to plot:
1836 TString desiredData(GetDrawString()->Data());
1837 // specify cuts:
1838 TString cutsStr(GetCutString()->Data());
1839 // get name for the calPad
1840 const char* calPadName = fComboExportName->GetTextEntry()->GetText();
1841 // create calPad according to drawCommand and cuts
1842 AliTPCCalPad *calPad = fViewer->GetCalPad(desiredData.Data(), (char*)cutsStr.Data(), (char*)calPadName);
1843 // finally export calPad to Cint:
60721370 1844 gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, (ULong_t)calPad));
8192627b 1845 fPreprocessor->AddComponent(calPad);
832bb12c 1846 Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
1847}
1848
1849
1850void AliTPCCalibViewerGUI::DoExportNorm() {
1851 //
1852 // function to export a CalPad to Cint
1853 //
1854
1855 if ( fRadio2D->GetState() != kButtonDown){
1856 Error("ExportCalPad", "Adding an AliTPCCalPad to the normalization works only in 2D mode.");
1857 return;
1858 }
1859
1860 Error("DoExportNorm", "Not yet implemented.");
1861 return;
1862
1863 // specify data to plot:
1864 TString desiredData(GetDrawString()->Data());
1865 // specify sector:
1866 TString sectorStr(GetSectorString()->Data());
1867 // specify cuts:
1868 TString cutsStr(GetCutString()->Data());
1869
1870 // get name for the calPad
1871 const char* calPadName = fComboExportName->GetTextEntry()->GetText();
1872 // create calPad according to drawCommand and cuts
1873 AliTPCCalPad *calPad = fViewer->GetCalPad(desiredData.Data(), (char*)cutsStr.Data(), (char*)fComboExportName->GetTextEntry()->GetText());
1874 // finally export calPad to Cint:
60721370 1875 gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, (ULong_t) calPad));
832bb12c 1876 Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
1877}
1878
1879
a6d2bd0c 1880void AliTPCCalibViewerGUI::GetMinMax() {
1881 //
1882 // Read current Min & Max from the plot and set it to fTxtSetMin & fTxtSetMax
1883 //
832bb12c 1884 if (fChkGetMinMaxAuto->GetState() == kButtonUp) return;
a6d2bd0c 1885 TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1886 TObject* ptr = 0;
1887 for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1888 ptr = listOfPrimitives->At(i);
1889 if ( ptr->InheritsFrom("TH1") ) break;
1890 }
1891 if ( ptr != 0 && !ptr->InheritsFrom("TH1") ) return; // if the loop did not find a TH1
1892 TH1 *hist = (TH1*)ptr;
8192627b 1893
1894// Double_t histMax = hist->GetMaximum();
1895// Double_t histMin = hist->GetMinimum();
1896// fTxtSetMax->SetText(Form("%f",histMax));
1897// fTxtSetMin->SetText(Form("%f",histMin));
1898
1899 if (fRadio2D->GetState() == kButtonDown) {
1900 if (fChkSetMax->GetState() == kButtonUp)
1901 fTxtSetMax->SetText(Form("%f", hist->GetMaximum()));
1902 if (fChkSetMin->GetState() == kButtonUp)
1903 fTxtSetMin->SetText(Form("%f", hist->GetMinimum()));
1904 }
1905 else if (fRadio1D->GetState() == kButtonDown) {
1906 if (fChkSetMax->GetState() == kButtonUp)
1907 fTxtSetMax->SetText( Form("%f", hist->GetXaxis()->GetXmax()) );
1908 if (fChkSetMin->GetState() == kButtonUp)
1909 fTxtSetMin->SetText( Form("%f", hist->GetXaxis()->GetXmin()) );
1910 }
a6d2bd0c 1911}
1912
832bb12c 1913
1914void AliTPCCalibViewerGUI::SetMinMaxLabel() {
1915 //
1916 // Set Minimum, Maximum and labels without redrawing the plot
1917 // (faster)
1918 //
1919
1920 // search for histogram
1921 TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1922 TObject* ptr = 0;
1923 for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1924 ptr = listOfPrimitives->At(i);
1925 if ( ptr->InheritsFrom("TH1") ) break;
1926 }
1927 if ( ptr == 0 || !ptr->InheritsFrom("TH1") ) { // if the loop did not find a TH1
1928 fCanvMain->GetCanvas()->Update();
1929 Warning("SetMinMaxLabel","No Histogram found!");
1930 return;
1931 // unable to find histogram, no min and max wil be read out
1932 }
1933
1934 TH1 *hist = (TH1*)ptr;
1935 TString minTxt(fTxtSetMin->GetText());
1936 TString maxTxt(fTxtSetMax->GetText());
8192627b 1937
832bb12c 1938 // set min and max according to specified values, if checkbox is checked
8192627b 1939 if (fRadio2D->GetState() == kButtonDown) {
1940 if (fChkSetMax->GetState() == kButtonDown && fChkSetMax->GetState() == kButtonDown &&(maxTxt.IsDigit() || maxTxt.IsFloat()) )
1941 hist->SetMaximum(maxTxt.Atof());
832bb12c 1942 if (fChkSetMax->GetState() == kButtonUp)
8192627b 1943 hist->SetMaximum(-1111); // default value, to unzoom
1944 if (fChkSetMin->GetState() == kButtonDown && (minTxt.IsDigit() || minTxt.IsFloat()) )
1945 hist->SetMinimum(minTxt.Atof());
832bb12c 1946 if (fChkSetMin->GetState() == kButtonUp)
8192627b 1947 hist->SetMinimum(-1111); // default value, to unzoom
1948 }
1949 else if (fRadio2D->GetState() == kButtonDown) {
1950 if (fChkSetMin->GetState() == kButtonDown &&
1951 fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
1952 hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), hist->GetXaxis()->GetXmax());
1953 else if (fChkSetMax->GetState() == kButtonDown && hist->GetXaxis())
1954 hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(), maxTxt.Atof());
1955 else if (fChkSetMin->GetState() == kButtonDown && hist->GetXaxis())
1956 hist->GetXaxis()->SetRangeUser(minTxt.Atof(), hist->GetXaxis()->GetXmax());
1957 hist->SetTitle(hist->GetTitle()); // trick to update the histogram
832bb12c 1958 }
1959
8192627b 1960 // get min and max from plot
1961 GetMinMax();
1962
832bb12c 1963 // set labels according to specification, if cehckboxes are checked
1964 if (fChkLabelTitle->GetState() == kButtonDown)
1965 hist->SetTitle(fTxtLabelTitle->GetText());
1966 if (fChkLabelXaxis->GetState() == kButtonDown)
1967 hist->GetXaxis()->SetTitle(fTxtLabelXaxis->GetText());
1968 if (fChkLabelYaxis->GetState() == kButtonDown)
1969 hist->GetYaxis()->SetTitle(fTxtLabelYaxis->GetText());
1970 // get and/or set labels and title
1971 if (fChkLabelGetAuto->GetState() == kButtonDown) {
1972 fTxtLabelTitle->SetText(hist->GetTitle());
1973 fTxtLabelXaxis->SetTitle(hist->GetXaxis()->GetTitle());
1974 fTxtLabelYaxis->SetTitle(hist->GetYaxis()->GetTitle());
1975 }
1976 hist->SetTitle(hist->GetTitle()); // trick to update the histogram
1977 fCanvMain->GetCanvas()->Update();
1978}
1979
1980
a6d2bd0c 1981void AliTPCCalibViewerGUI::ChangeSector(){
1982 //
1983 // function that is called, when the number of the sector is changed
1984 // to change the sector label
5312f439 1985 //
1986 if ( fRadioROC->GetState()!=kButtonDown && fRadioSector->GetState()!=kButtonDown ){
1987 fLblSector->SetText("not used");
1988 return;
1989 }
1990
a6d2bd0c 1991 Int_t sector = (Int_t)(fNmbSector->GetNumber());
c4607f01 1992 TString secLabel = "";
1993 if ( sector < 36 )
1994 secLabel = "IROC";
1995 else
1996 secLabel = "OROC";
1997
1998 if (fRadioSector->GetState()==kButtonDown)
1999 secLabel="Sector";
2000
2001 if ( sector%36<18 ) //A-Side
2002 secLabel += ", A";
2003 else
2004 secLabel += ", C";
2005
2006 secLabel += Form("%02d",sector%18);
2007
a6d2bd0c 2008 fLblSector->SetText(secLabel);
2009 DoNewSelection();
2010}
2011
832bb12c 2012
72d0ab7e 2013void AliTPCCalibViewerGUI::AddFitFunction() const {
a6d2bd0c 2014 //
2015 // adds the last fit function to the normalization list
2016 //
2017 std::cout << "Not yet implemented." << std::endl;
2018}
4f3934a1 2019
832bb12c 2020
2021void AliTPCCalibViewerGUI::UnchekAllStat() {
2022 //
2023 // Disable all statistical legend entries, no statistical legend.
2024 //
2025 fChkStatName->SetState(kButtonUp);
2026 fChkStatEntries->SetState(kButtonUp);
2027 fChkStatMean->SetState(kButtonUp);
2028 fChkStatMeanPM->SetState(kButtonUp);
2029 fChkStatRMS->SetState(kButtonUp);
2030 fChkStatRMSPM->SetState(kButtonUp);
2031 fChkStatUnderflow->SetState(kButtonUp);
2032 fChkStatOverflow->SetState(kButtonUp);
2033 fChkStatIntegral->SetState(kButtonUp);
2034 fChkStatSkewness->SetState(kButtonUp);
2035 fChkStatSkewnessPM->SetState(kButtonUp);
2036 fChkStatKurtosis->SetState(kButtonUp);
2037 fChkStatKurtosisPM->SetState(kButtonUp);
2038
2039 HandleButtonsStat(0);
2040}
2041
2042
2043void AliTPCCalibViewerGUI::MouseMove(Int_t event, Int_t x, Int_t y, TObject *selectedObject) {
2044 //
2045 // mouse move
2046 // zoom to sector works ONLY in 2D mode, if one side is specified
2047 //
2048 Double_t pi = TMath::Pi();
2049 if (event != kButton1Double )
2050 return;
2051 if (!selectedObject->InheritsFrom("TH2")) return;
2052 // zoom to sector works ONLY in 2D mode, if one side is specified
2053 if (fRadio2D->GetState() == kButtonUp) return;
c4607f01 2054 if (fRadioROC->GetState() == kButtonDown) { // return to full side view
832bb12c 2055 // return to full side view
2056 Int_t sector = (Int_t)(fNmbSector->GetNumber());
2057 if ( (sector >= 0 && sector <= 17) || (sector >= 36 && sector <= 53) ) {
2058 // A-Side
2059 fRadioSideA->Clicked();
2060 fRadioSideA->SetState(kButtonDown);
2061 DoNewSelection();
2062 }
2063 if ( (sector >= 18 && sector <= 35) || (sector >= 54 && sector <= 71) ) {
2064 // C-Side
2065 fRadioSideC->Clicked();
2066 fRadioSideC->SetState(kButtonDown);
2067 DoNewSelection();
2068 }
2069 return;
2070 }
2071 if (!(fRadioSideA->GetState() == kButtonDown || fRadioSideC->GetState() == kButtonDown)) return;
2072
2073 // Int_t px = gPad->GetEventX();
2074 // Int_t py = gPad->GetEventY();
2075 Float_t upy = gPad->AbsPixeltoY(y);
2076 Float_t upx = gPad->AbsPixeltoX(x);
2077 Float_t gy = gPad->PadtoY(upy);
2078 Float_t gx = gPad->PadtoX(upx);
2079 Int_t quadrant = -1;
2080 if (gx >= 0 && gy >= 0) quadrant = 1;
2081 if (gx < 0 && gy >= 0) quadrant = 2;
2082 if (gx < 0 && gy < 0) quadrant = 3;
2083 if (gx >= 0 && gy < 0) quadrant = 4;
2084 gx = TMath::Abs(gx);
2085 gy = TMath::Abs(gy);
2086 Double_t phi = TMath::ATan(gy/gx); // angle phi is in Pi- units
2087 Double_t r = TMath::Sqrt(gx*gx + gy*gy);
2088 if (quadrant == 2) phi = pi - phi;
2089 if (quadrant == 3) phi = pi + phi;
2090 if (quadrant == 4) phi = 2 * pi - phi;
2091 Double_t phiGrad = phi / pi * 180;
5312f439 2092 Int_t sector = (Int_t) phiGrad / 20; // one sector coresponds to 20�
832bb12c 2093 // IROC starts at 84.5 cm
2094 // IROC ends at 135.5 cm, OROC begins
2095 // OROC ends at 250 cm
2096 if (r < 84.5 || r > 250) return; // outside TPC
2097 if (r < 135.5) { // IROC
2098 if (fRadioSideC->GetState() == kButtonDown) sector += 18;
2099 }
2100 else {// OROC
2101 sector += 36;
2102 if (fRadioSideC->GetState() == kButtonDown) sector += 18;
2103 }
2104 // printf("r: %f, phi: %f, phiGrad: %f, gy/gx: %f, quadrant: %i, sector: %i \n", r, phi, phiGrad, gy/gx, quadrant, sector);
2105 fNmbSector->SetNumber(sector);
c4607f01 2106 fRadioROC->Clicked();
2107 fRadioROC->SetState(kButtonDown);
832bb12c 2108 ChangeSector();
2109}
2110
2111
4f3934a1 2112void AliTPCCalibViewerGUI::SavePicture() {
2113 //
2114 // saves the current picture
2115 //
2116 // use the following combination of file type and save options:
2117 // (see also TCanvas::Print)
2118 //
2119 // "ps" - Postscript file is produced (see special cases below)
2120 // "Portrait" - Postscript file is produced (Portrait)
2121 // "Landscape" - Postscript file is produced (Landscape)
2122 // "eps" - an Encapsulated Postscript file is produced
2123 // "Preview" - an Encapsulated Postscript file with preview is produced.
2124 // "pdf" - a PDF file is produced
2125 // "svg" - a SVG file is produced
2126 // "gif" - a GIF file is produced
2127 // "gif+NN" - an animated GIF file is produced, where NN is delay in 10ms units
2128 // "xpm" - a XPM file is produced
2129 // "png" - a PNG file is produced
2130 // "jpg" - a JPEG file is produced
2131 // "tiff" - a TIFF file is produced
2132 // "cxx" - a C++ macro file is produced
2133 // "xml" - a XML file
2134 // "root" - a ROOT binary file
2135
4f3934a1 2136 const char *kSaveAsTypes[] = {
2137 "Postscript", "*.ps",
2138 "Encapsulated Postscript", "*.eps",
2139 "PDF", "*.pdf",
2140 "JPEG", "*.jpg",
2141 "PNG", "*.png",
2142 "TIFF", "*.tiff",
2143 "GIF", "*.gif",
2144 "XPM", "*.xpm",
2145 "SVG", "*.svg",
2146 "XML", "*.xml",
2147 "C++ macro", "*.cxx",
2148 "Macro file", "*.C",
2149 "ROOT file", "*.root",
2150 "All file", "*",
2151 0, 0
2152 };
2153 TString addSaveOpt("");
2154 if (fChkAddSaveOpt->GetState() == kButtonDown)
2155 addSaveOpt += fComboAddSaveOpt->GetTextEntry()->GetText();
2156 TString dir(".");
2157 TGFileInfo fi;
2158 fi.fFileTypes = kSaveAsTypes;
2159 // fi.fIniDir = StrDup(dir);
2160 fi.fOverwrite = kFALSE;
2161 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi);
2162 if (fi.fFilename && strlen(fi.fFilename)) {
832bb12c 2163 if (addSaveOpt != "")
2164 fCanvMain->GetCanvas()->Print(fi.fFilename, addSaveOpt.Data());
2165 else
2166 fCanvMain->GetCanvas()->Print(fi.fFilename);
4f3934a1 2167 }
2168
2169// TList* fFileNamesList list of selected file names
2170// Int_t fFileTypeIdx selected file type, index in fFileTypes
2171// const char** fFileTypes file types used to filter selectable files
2172// char* fFilename selected file name
2173// char* fIniDir on input: initial directory, on output: new directory
2174// Bool_t fMultipleSelection if true, allow multiple file selection
2175// Bool_t fOverwrite if true overwrite the file with existing name on save
2176
2177}
a6d2bd0c 2178
2179
8192627b 2180void AliTPCCalibViewerGUI::DoDumpToFile() {
2181 //
2182 // This function is called, when the "Dump to File" button is pressed.
2183 // All the exported CalPads will be written into an new CalibTree,
2184 // a Save File dialog will appear to specify the filename
2185 //
2186 const char *kSaveAsTypes[] = {
2187 "ROOT file", "*.root",
2188 0, 0
2189 };
2190 TString dir(".");
2191 TGFileInfo fi;
2192 fi.fFileTypes = kSaveAsTypes;
2193 // fi.fIniDir = StrDup(dir);
2194 fi.fOverwrite = kFALSE;
2195 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi);
2196 if (fi.fFilename && strlen(fi.fFilename)) {
2197 fPreprocessor->DumpToFile(fi.fFilename);
2198 Info("DumpToFile", Form("New CalibTree has been writen to file '%s'", fi.fFilename));
2199 }
2200}
2201
2202
2203void AliTPCCalibViewerGUI::DoLoadTree() {
2204 // function to load a new calib tree
2205 //
2206 //
2207 const char *kFileTypes[] = {
2208 "ROOT file", "*.root",
2209 0, 0
2210 };
2211 TString dir(".");
2212 TGFileInfo fi;
2213 fi.fFileTypes = kFileTypes;
2214 // fi.fIniDir = StrDup(dir);
2215 fi.fOverwrite = kFALSE;
2216 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDOpen, &fi);
2217 if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonUp) {
2218 Initialize(fi.fFilename);
2219 Reload();
2220 }
2221 else if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonDown) {
2222 fViewer->AddReferenceTree(fi.fFilename, "calPads", fTxtRefName->GetText());
2223 Reload();
2224 }
2225}
2226
2227
832bb12c 2228TObjArray* AliTPCCalibViewerGUI::ShowGUI(const char* fileName) {
a6d2bd0c 2229 //
832bb12c 2230 // Initialize and show GUI for presentation for demonstration purposes
2231 // or for fast standalone use
a6d2bd0c 2232 //
2233 TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
2234 frmMain->SetWindowName("AliTPCCalibViewer GUI");
2235 frmMain->SetCleanup(kDeepCleanup);
2236
2237 TGTab* tabMain = new TGTab(frmMain, 1000, 600);
2238 frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2239
2240 TGCompositeFrame* tabCont1 = tabMain->AddTab("Viewer 1");
2241 TGCompositeFrame* tabCont2 = tabMain->AddTab("Viewer 2");
2242
2243 AliTPCCalibViewerGUI* calibViewer1 = new AliTPCCalibViewerGUI(tabCont1, 1000, 600, (char*)fileName);
2244 tabCont1->AddFrame(calibViewer1, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2245
2246 AliTPCCalibViewerGUI* calibViewer2 = new AliTPCCalibViewerGUI(tabCont2, 1000, 600, (char*)fileName);
2247 tabCont2->AddFrame(calibViewer2, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2248
832bb12c 2249 TObjArray *guiArray = new TObjArray();
2250 guiArray->Add(calibViewer1);
2251 guiArray->Add(calibViewer2);
2252
a6d2bd0c 2253 frmMain->MapSubwindows();
2254 frmMain->Resize();
2255 frmMain->MapWindow();
832bb12c 2256
2257 return guiArray;
a6d2bd0c 2258}
2259