1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 ///////////////////////////////////////////////////////////////////////////////
19 // GUI for the AliTPCCalibViewer //
20 // used for the calibration monitor //
21 // All functionalities of the AliTPCCalibViewer are here available
26 AliTPCCalibViewerGUI::ShowGUI("CalibTree.root")
31 ///////////////////////////////////////////////////////////////////////////////
34 #include "AliTPCCalibViewerGUI.h"
35 #include "AliTPCCalPad.h"
40 #include <TVirtualPad.h>
44 #include <TObjArray.h>
45 #include <TObjString.h>
50 #include "TGFileDialog.h"
51 #include "TGInputDialog.h"
52 #include "AliTPCCalibViewer.h"
53 #include "AliTPCPreprocessorOnline.h"
55 // #include "TGListBox.h"
56 // #include "TGNumberEntry"
57 // #include "TGSplitter"
60 // #include "TGButtonGroup"
61 // #include "TGComboBox"
62 // #include "TRootEmbeddedCanvas"
63 // #include "TGButton"
64 // #include "TGRadioButton"
65 // #include "GTCheckButton"
66 // #include "TGTextEntry"
71 ClassImp(AliTPCCalibViewerGUI)
73 AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h, char* fileName)
74 : TGCompositeFrame(p, w, h),
90 fContDrawOptSub1D2D(0),
105 fBtnAddFitFunction(0),
123 fListNormalization(0),
136 fChkGetMinMaxAuto(0),
140 fcontDrawOpt1DSubLR(0),
141 fContDrawOpt1DSubNSC(0),
151 fCheckCumulativePM(0),
153 fContDrawOpt1DSubMML(0),
166 fChkStatUnderflow(0),
171 fChkStatSkewnessPM(0),
174 fChkStatKurtosisPM(0),
197 fChkAddAsReference(0),
202 // AliTPCCalibViewerGUI constructor; fileName specifies the ROOT tree used for drawing
206 fPreprocessor = new AliTPCPreprocessorOnline();
208 // initialize the AliTPCCalibViewer:
209 if (fileName) Initialize(fileName);
210 // set default button states:
213 if (fileName) DoDraw();
217 void AliTPCCalibViewerGUI::DrawGUI(const TGWindow *p, UInt_t w, UInt_t h) {
221 // ======================================================================
222 // ************************* Display everything *************************
223 // ======================================================================
225 SetCleanup(kDeepCleanup);
226 p = p; // to avoid compiler warnings
228 // *****************************************************************************
229 // ************************* content of this MainFrame *************************
230 // *****************************************************************************
231 // top level container with horizontal layout
232 fContTopBottom = new TGCompositeFrame(this, w, h, kVerticalFrame | kFixedWidth | kFixedHeight);
233 AddFrame(fContTopBottom, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
235 fContLCR = new TGCompositeFrame(fContTopBottom, w, h, kHorizontalFrame | kFixedWidth | kFixedHeight);
236 fContTopBottom->AddFrame(fContLCR, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
238 // ***********************************************************************
239 // ************************* content of fContLCR *************************
240 // ***********************************************************************
242 fContLeft = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
243 fContLCR->AddFrame(fContLeft, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 5, 3, 3, 3));
245 // left vertical splitter
246 TGVSplitter *splitLeft = new TGVSplitter(fContLCR);
247 splitLeft->SetFrame(fContLeft, kTRUE);
248 fContLCR->AddFrame(splitLeft, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
251 fContRight = new TGCompositeFrame(fContLCR, 150, 200, kVerticalFrame | kFixedWidth | kFitHeight);
252 fContLCR->AddFrame(fContRight, new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandY, 3, 5, 3, 3));
255 fContCenter = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
256 fContLCR->AddFrame(fContCenter, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
258 // right vertical splitter
259 TGVSplitter *splitRight = new TGVSplitter(fContLCR);
260 splitRight->SetFrame(fContRight, kFALSE);
261 fContLCR->AddFrame(splitRight, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
264 // ========================================================================
265 // ************************* content of fContLeft *************************
266 // ========================================================================
267 // --- draw button and tabLeft ---
269 fBtnDraw = new TGTextButton(fContLeft, "&Draw");
270 fContLeft->AddFrame(fBtnDraw, new TGLayoutHints(kLHintsExpandX, 10, 10, 0, 0));
271 //fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoTest(=\"fBtnDraw clicked\")");
272 fBtnDraw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoDraw()");
273 fBtnDraw->SetToolTipText("Press here to draw according to selections.");
275 // tabs on the left side:
276 ftabLeft = new TGTab(fContLeft);
277 fContLeft->AddFrame(ftabLeft, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 8, 0));
278 ftabLeft0 = ftabLeft->AddTab("General");
279 ftabLeft1 = ftabLeft->AddTab("More plot options");
282 // **************************** content of tabLeft0 *******************************
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));
290 // ------------------------- content of fContDrawOpt -------------------------
291 // -- radio1D, radio2D, chkAuto
293 fRadio1D = new TGRadioButton(fContDrawOptSub1D2D, "1D", 30);
294 fContDrawOptSub1D2D->AddFrame(fRadio1D, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
295 fRadio1D->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
296 fRadio1D->SetToolTipText("1D drawing \nSelect this if you want to have the full control for the custom draw.");
299 fRadio2D = new TGRadioButton(fContDrawOptSub1D2D, "2D", 31);
300 fContDrawOptSub1D2D->AddFrame(fRadio2D, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0));
301 fRadio2D->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
302 fRadio2D->SetToolTipText("2D drawing");
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));
308 // content of --- fContAddDrawOpt ---
309 // addition draw options label
310 fChkAddDrawOpt = new TGCheckButton(fContAddDrawOpt, "Draw options:");
311 //fChkAddDrawOpt->SetTextJustify(kTextLeft);
312 fContAddDrawOpt->AddFrame(fChkAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
313 fChkAddDrawOpt->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
314 fChkAddDrawOpt->SetToolTipText("Enter additional draw options like 'prof' or 'colz' here.\nBe careful with the option 'same' for 2D drawings as it will crash (ROOT feature).");
316 // additional draw options combo box
317 fComboAddDrawOpt = new TGComboBox(fContAddDrawOpt);
318 fComboAddDrawOpt->Resize(0, fBtnDraw->GetDefaultHeight());
319 fComboAddDrawOpt->EnableTextInput(kTRUE);
320 fContAddDrawOpt->AddFrame(fComboAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
321 fComboAddDrawOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=14)");
322 fComboAddDrawOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
324 // automatic redraw check button
325 fChkAuto = new TGCheckButton(fContDrawOpt, "Auto redraw");
326 fContDrawOpt->AddFrame(fChkAuto, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
327 fChkAuto->SetToolTipText("Decide if you want an automatic redraw on each new selection.\nNot recommended on a slow machine, during remote connection or if your draw option is 'same'.");
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!");
335 // *** predefined radio button *** " Predefined "
336 fRadioPredefined = new TGRadioButton(ftabLeft0, "Predefined: ", 13);
337 ftabLeft0->AddFrame(fRadioPredefined, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
338 fRadioPredefined->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
339 fRadioPredefined->SetToolTipText("Draw predefined variables according to selection.");
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()");
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));
352 // ------------------------- content of fContPlotOpt -------------------------
354 fRadioRaw = new TGRadioButton(fContPlotOpt, "Raw", 10);
355 fContPlotOpt->AddFrame(fRadioRaw, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
356 fRadioRaw->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
357 fRadioRaw->SetToolTipText("Plot without normalization");
359 // normalized radio button
360 fRadioNormalized = new TGRadioButton(fContPlotOpt, "Normalized", 11);
361 fContPlotOpt->AddFrame(fRadioNormalized, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
362 fRadioNormalized->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
363 fRadioNormalized->SetToolTipText("Normalize data");
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));
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()");
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()");
382 // custom radio button
383 fRadioCustom = new TGRadioButton(ftabLeft0, "Custom: ", 12);
384 ftabLeft0->AddFrame(fRadioCustom, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
385 fRadioCustom->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral()");
386 fRadioCustom->SetToolTipText("Draw data according to user specific text entry in the 'Custom Draw' line. Remember '~' (= '.fElements')!");
387 // custom options container is located further down
389 // **************************** content of tabLeft1 *******************************
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));
395 fcontDrawOpt1DSubLR = new TGCompositeFrame(fContDrawOpt1D, 1, 1, kVerticalFrame | kFitWidth | kFitHeight);
396 fContDrawOpt1D->AddFrame(fcontDrawOpt1DSubLR, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
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));
402 // --------------------------- content of fContDrawOpt1DSubNSC -----------------
403 fRadioNorm = new TGRadioButton(fContDrawOpt1DSubNSC, "Normal", 110);
404 fContDrawOpt1DSubNSC->AddFrame(fRadioNorm, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
405 fRadioNorm->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
406 fRadioNorm->SetToolTipText("Produce a normal 1D plot, a histogram of the selected data.");
408 fRadioSigma = new TGRadioButton(fContDrawOpt1DSubNSC, "Sigma", 111);
409 fContDrawOpt1DSubNSC->AddFrame(fRadioSigma, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
410 fRadioSigma->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
411 fRadioSigma->SetToolTipText("Draw a normal histogram, but also lines that indicate the mean/median/LTM \nand sigmas of the selected data.");
413 fTxtSigmas = new TGTextEntry(fContDrawOpt1DSubNSC, "2; 4; 6", 111);
414 fContDrawOpt1DSubNSC->AddFrame(fTxtSigmas, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 10, 15, 0, 0));
415 fTxtSigmas->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtons1D(=111)");
416 fTxtSigmas->SetToolTipText("Enter sigma intervals you would like to be indicated by lines. \nExample: '2; 4; 6'");
418 fContCumuLR = new TGCompositeFrame(fContDrawOpt1DSubNSC, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
419 fContDrawOpt1DSubNSC->AddFrame(fContCumuLR, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 0));
421 fContCumLeft = new TGCompositeFrame(fContCumuLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
422 fContCumuLR->AddFrame(fContCumLeft, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
424 fRadioCumulative = new TGRadioButton(fContCumLeft, "Cumulative", 112);
425 fContCumLeft->AddFrame(fRadioCumulative, new TGLayoutHints(kLHintsNormal, 0, 10, 0, 0));
426 fRadioCumulative->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
427 fRadioCumulative->SetToolTipText("Draw the cumulative (SigmaCut) of the given selection. \nThe data distribution is integrated, starting from the mean/median/LTM.");
429 fCheckCumulativePM = new TGCheckButton(fContCumLeft, "Plus/Minus");
430 fContCumLeft->AddFrame(fCheckCumulativePM, new TGLayoutHints(kLHintsNormal, 10, 15, 0, 0));
431 fCheckCumulativePM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
432 fCheckCumulativePM->SetToolTipText("Decide whether you want the cumulative integration for each direction (+/-) \nor only for the absolute distance to the mean/median/LTM value.");
434 fRadioIntegrate = new TGRadioButton(fContCumLeft, "Integrate", 113);
435 fContCumLeft->AddFrame(fRadioIntegrate, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
436 fRadioIntegrate->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
437 fRadioIntegrate->SetToolTipText("Draw the integral of the given selection.");
439 fContCumRight = new TGCompositeFrame(fContCumuLR, 200, 23, kVerticalFrame | kFitWidth | kFitHeight);
440 fContCumuLR->AddFrame(fContCumRight, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
442 fLblSigmaMax = new TGLabel(fContCumRight, "SigmaMax:");
443 fLblSigmaMax->SetTextJustify(kTextLeft);
444 fContCumRight->AddFrame(fLblSigmaMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
446 fTxtSigmaMax = new TGTextEntry(fContCumRight, "5", 112);
447 fContCumRight->AddFrame(fTxtSigmaMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 10, 15, 0, 0));
448 fTxtSigmaMax->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtons1D(=112)");
449 fTxtSigmaMax->SetToolTipText("Enter up to which multiple of sigma you want to integrate.");
452 fContDrawOpt1DSubMML = new TGCompositeFrame(fcontDrawOpt1DSubLR, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
453 fcontDrawOpt1DSubLR->AddFrame(fContDrawOpt1DSubMML, new TGLayoutHints(kLHintsExpandX, 0, 0, 5, 0));
455 // -------------- content of fcontDrawOpt1DSubLR
456 fChkMean = new TGCheckButton(fContDrawOpt1DSubMML, "Mean");
457 fContDrawOpt1DSubMML->AddFrame(fChkMean, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
458 fChkMean->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
459 fChkMean->SetToolTipText("Activate Mean for Sigma/Cumulative/Integrate");
461 fChkMedian = new TGCheckButton(fContDrawOpt1DSubMML, "Median");
462 fContDrawOpt1DSubMML->AddFrame(fChkMedian, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
463 fChkMedian->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
464 fChkMedian->SetToolTipText("Activate Median for Sigma/Cumulative/Integrate");
466 fChkLTM = new TGCheckButton(fContDrawOpt1DSubMML, "LTM");
467 fContDrawOpt1DSubMML->AddFrame(fChkLTM, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
468 fChkLTM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtons1D()");
469 fChkLTM->SetToolTipText("Activate LTM for Sigma/Cumulative/Integrate");
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));
476 fChkStatName = new TGCheckButton(fContStatOpt, "Name");
477 fContStatOpt->AddFrame(fChkStatName, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
478 fChkStatName->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
479 fChkStatName->SetToolTipText("Display the name in the statistics legend.");
481 fChkStatEntries = new TGCheckButton(fContStatOpt, "Entries");
482 fContStatOpt->AddFrame(fChkStatEntries, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
483 fChkStatEntries->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
484 fChkStatEntries->SetToolTipText("Display the number of entries in the statistics legend.");
486 fContStatMean = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
487 fContStatOpt->AddFrame(fContStatMean, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
489 fChkStatMean = new TGCheckButton(fContStatMean, "Mean");
490 fContStatMean->AddFrame(fChkStatMean, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
491 fChkStatMean->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
492 fChkStatMean->SetToolTipText("Display the mean value of the data in the statistics legend.");
494 fChkStatMeanPM = new TGCheckButton(fContStatMean, "+- Error");
495 fContStatMean->AddFrame(fChkStatMeanPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
496 fChkStatMeanPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
497 fChkStatMeanPM->SetToolTipText("Display the mean value's error in the statistics legend.");
499 fContStatRMS = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
500 fContStatOpt->AddFrame(fContStatRMS, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
502 fChkStatRMS = new TGCheckButton(fContStatRMS, "RMS");
503 fContStatRMS->AddFrame(fChkStatRMS, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
504 fChkStatRMS->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
505 fChkStatRMS->SetToolTipText("Display the RMS value of the data in the statistics legend.");
507 fChkStatRMSPM = new TGCheckButton(fContStatRMS, "+- Error");
508 fContStatRMS->AddFrame(fChkStatRMSPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
509 fChkStatRMSPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
510 fChkStatRMSPM->SetToolTipText("Display the RMS value's error in the statistics legend.");
512 fChkStatUnderflow = new TGCheckButton(fContStatOpt, "Underflow");
513 fContStatOpt->AddFrame(fChkStatUnderflow, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
514 fChkStatUnderflow->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
515 fChkStatUnderflow->SetToolTipText("Display the number of entries in the underflow bin.");
517 fChkStatOverflow = new TGCheckButton(fContStatOpt, "Overflow");
518 fContStatOpt->AddFrame(fChkStatOverflow, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
519 fChkStatOverflow->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
520 fChkStatOverflow->SetToolTipText("Display the number of entries in the overflow bin.");
522 fChkStatIntegral = new TGCheckButton(fContStatOpt, "Integral");
523 fContStatOpt->AddFrame(fChkStatIntegral, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
524 fChkStatIntegral->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
525 fChkStatIntegral->SetToolTipText("Display the integral of the data in the statistics legend.");
527 fContStatSkew = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
528 fContStatOpt->AddFrame(fContStatSkew, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
530 fChkStatSkewness = new TGCheckButton(fContStatSkew, "Skewness");
531 fContStatSkew->AddFrame(fChkStatSkewness, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
532 fChkStatSkewness->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
533 fChkStatSkewness->SetToolTipText("Display the skewness of the data in the statistics legend. \nBe careful! Sometimes the skewness causes a floating point exception that hangs the GUI!");
535 fChkStatSkewnessPM = new TGCheckButton(fContStatSkew, "+- Error");
536 fContStatSkew->AddFrame(fChkStatSkewnessPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
537 fChkStatSkewnessPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
538 fChkStatSkewnessPM->SetToolTipText("Display the skewness' error in the statistics legend.");
540 fContStatKurt = new TGCompositeFrame(fContStatOpt, 1, 1, kHorizontalFrame | kFitWidth | kFitHeight);
541 fContStatOpt->AddFrame(fContStatKurt, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
543 fChkStatKurtosis = new TGCheckButton(fContStatKurt, "Kurtosis");
544 fContStatKurt->AddFrame(fChkStatKurtosis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
545 fChkStatKurtosis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
546 fChkStatKurtosis->SetToolTipText("Display the kurtosis of the data in the statistics legend.");
548 fChkStatKurtosisPM = new TGCheckButton(fContStatKurt, "+- Error");
549 fContStatKurt->AddFrame(fChkStatKurtosisPM, new TGLayoutHints(kLHintsNormal, 10, 0, 0, 0));
550 fChkStatKurtosisPM->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsStat()");
551 fChkStatKurtosisPM->SetToolTipText("Display the kurtosis' error in the statistics legend.");
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.");
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));
565 // ------------------------- content of fContCustom -------------------------
566 fLblCustomDraw = new TGLabel(fContCustom, "Custom draw: ");
567 fLblCustomDraw->SetTextJustify(kTextLeft);
568 fContCustom->AddFrame(fLblCustomDraw, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
569 // text field for custom draw command
570 fComboCustom = new TGComboBox(fContCustom);
571 fComboCustom->Resize(0, fBtnDraw->GetDefaultHeight());
572 fComboCustom->EnableTextInput(kTRUE);
573 fContCustom->AddFrame(fComboCustom, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
574 fComboCustom->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=42)");
575 fComboCustom->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
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));
582 // ------------------------- content of fContAddCuts -------------------------
583 fLblAddCuts = new TGLabel(fContAddCuts, "Custom cuts: ");
584 fLblAddCuts->SetTextJustify(kTextLeft);
585 fContAddCuts->AddFrame(fLblAddCuts, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
586 // combo text field for additional cuts
587 fComboAddCuts = new TGComboBox(fContAddCuts);
588 fComboAddCuts->Resize(0, fBtnDraw->GetDefaultHeight());
589 fComboAddCuts->EnableTextInput(kTRUE);
590 fContAddCuts->AddFrame(fComboAddCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
591 fComboAddCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts(=31)");
592 fComboAddCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
594 // ==========================================================================
595 // ************************* content of fContCenter *************************
596 // ========================================================================
597 // main drawing canvas
598 fCanvMain = new TRootEmbeddedCanvas("Main_Canvas", fContCenter, 200, 200, kFitWidth | kFitHeight);
599 fContCenter->AddFrame(fCanvMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
600 fCanvMain->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "AliTPCCalibViewerGUI", this, "MouseMove(Int_t, Int_t, Int_t, TObject*)");
601 fCanvMain->GetCanvas()->Connect("RangeAxisChanged()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
602 fCanvMain->GetCanvas()->SetToolTipText("The Main_Canvas, here your plots are displayed.");
605 // =========================================================================
606 // ************************* content of fContRight *************************
607 // ========================================================================
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");
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));
622 // ************************* content of fContCuts *************************
624 fRadioTPC = new TGRadioButton(fContCuts, "Whole TPC", 20);
625 fContCuts->AddFrame(fRadioTPC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
626 fRadioTPC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
627 fRadioTPC->SetToolTipText("No cuts, use the whole TPC. \nIn 2D mode, A side and C side are superimposed!");
629 // side A radio button
630 fRadioSideA = new TGRadioButton(fContCuts, "Side A", 21);
631 fContCuts->AddFrame(fRadioSideA, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
632 fRadioSideA->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
633 fRadioSideA->SetToolTipText("Use only side A.");
635 // side C radio button
636 fRadioSideC = new TGRadioButton(fContCuts, "Side C", 22);
637 fContCuts->AddFrame(fRadioSideC, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
638 fRadioSideC->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
639 fRadioSideC->SetToolTipText("Use only side C.");
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).");
647 // sector radio button
648 fRadioSector = new TGRadioButton(fContCuts, "Sector", 24);
649 fContCuts->AddFrame(fRadioSector, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
650 fRadioSector->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsCuts()");
651 fRadioSector->SetToolTipText("Use only one Sector (0-17 A-Side, 18-35 C-Side).");
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));
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()");
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));
668 // cut zeros check button
669 fChkCutZero = new TGCheckButton(fContCuts, "Cut zeros");
670 fContCuts->AddFrame(fChkCutZero, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
671 fChkCutZero->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
672 fChkCutZero->SetToolTipText("Use only values that are not zero. \nWhen doing a custom draw this cut is composed of the draw string\nup to the first ':' or '>>' and the condition that this should not be zero.");
674 // additional cuts check button
675 fChkAddCuts = new TGCheckButton(fContCuts, "Custom cuts");
676 fContCuts->AddFrame(fChkAddCuts, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
677 fChkAddCuts->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
678 fChkAddCuts->SetToolTipText("Activate the custom cuts on the bottom. Remember '~' (= '.fElements')!");
679 // fContAddCuts' content is locaed further op
682 // Scaling options container
683 fContScaling = new TGGroupFrame(fTabRight0, "Scaling", kVerticalFrame | kFitWidth | kFitHeight);
684 fTabRight0->AddFrame(fContScaling, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
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));
691 // ------------------------- content of fContSetMax -------------------------
692 // SetMaximum - checkbox
693 fChkSetMax = new TGCheckButton(fContSetMax, "Set fixed max.");
694 fContSetMax->AddFrame(fChkSetMax, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
695 fChkSetMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
696 fChkSetMax->SetToolTipText("Set the maximum fixed to the value specified here.");
698 // text field for maximum value
699 fTxtSetMax = new TGTextEntry(fContSetMax, "", 41);
700 fContSetMax->AddFrame(fTxtSetMax, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
701 fTxtSetMax->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
702 fTxtSetMax->SetToolTipText("maximum value for the drawing");
704 // SetMinimum container
705 fContSetMin = new TGCompositeFrame(fContScaling, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
706 fContScaling->AddFrame(fContSetMin, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
708 // ------------------------- content of fContSetMin -------------------------
709 // SetMinimum - checkbox
710 fChkSetMin = new TGCheckButton(fContSetMin, "Set fixed min.");
711 fContSetMin->AddFrame(fChkSetMin, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
712 fChkSetMin->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
713 fChkSetMin->SetToolTipText("Set the minimum fixed to the value specified here.");
715 // text field for minimum value
716 fTxtSetMin = new TGTextEntry(fContSetMin, "", 40);
717 fContSetMin->AddFrame(fTxtSetMin, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
718 fTxtSetMin->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
719 fTxtSetMin->SetToolTipText("minimum value for the drawing");
721 // get Min & Max from Plot - button
722 fBtnGetMinMax = new TGTextButton(fContScaling, "&Get scale from plot");
723 fContScaling->AddFrame(fBtnGetMinMax, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
724 fBtnGetMinMax->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "GetMinMax()");
725 fBtnGetMinMax->SetToolTipText("Get min and max from plot, e.g. after rescaling by dragging the palette. \nObsolete! The button's function will change to 'Unzoom all'.");
727 // GetMinMaxAuto - checkbox
728 fChkGetMinMaxAuto = new TGCheckButton(fContScaling, "Get Min + Max auto.");
729 fContScaling->AddFrame(fChkGetMinMaxAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
730 fChkGetMinMaxAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
731 fChkGetMinMaxAuto->SetToolTipText("Get minimum and maximum automatically from each new plot. \nDeactivate this, if you want to 'save' your specified minimum and maximum.");
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));
737 fChkLabelTitle = new TGCheckButton(fContLabeling, "Set title:");
738 fContLabeling->AddFrame(fChkLabelTitle, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
739 fChkLabelTitle->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
740 fChkLabelTitle->SetToolTipText("Set the plot title.");
742 fTxtLabelTitle = new TGTextEntry(fContLabeling, "Title", 500);
743 fContLabeling->AddFrame(fTxtLabelTitle, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
744 fTxtLabelTitle->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=50)");
745 fTxtLabelTitle->SetToolTipText("plot title");
747 fChkLabelXaxis = new TGCheckButton(fContLabeling, "Set X-axis label:");
748 fContLabeling->AddFrame(fChkLabelXaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
749 fChkLabelXaxis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
750 fChkLabelXaxis->SetToolTipText("Set the X-axis label.");
752 fTxtLabelXaxis = new TGTextEntry(fContLabeling, "XaxisLabel", 500);
753 fContLabeling->AddFrame(fTxtLabelXaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
754 fTxtLabelXaxis->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=51)");
755 fTxtLabelXaxis->SetToolTipText("X-axis label");
757 fChkLabelYaxis = new TGCheckButton(fContLabeling, "Set Y-axis label:");
758 fContLabeling->AddFrame(fChkLabelYaxis, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
759 fChkLabelYaxis->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
760 fChkLabelYaxis->SetToolTipText("Set the Y-axis label.");
762 fTxtLabelYaxis = new TGTextEntry(fContLabeling, "YaxisLabel", 500);
763 fContLabeling->AddFrame(fTxtLabelYaxis, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
764 fTxtLabelYaxis->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw(=52)");
765 fTxtLabelYaxis->SetToolTipText("Y-axis label");
767 fChkLabelGetAuto = new TGCheckButton(fContLabeling, "Get labels auto.");
768 fContLabeling->AddFrame(fChkLabelGetAuto, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
769 fChkLabelGetAuto->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "HandleButtonsNoRedraw()");
770 fChkLabelGetAuto->SetToolTipText("Get labels automatically from each new plot \nDeactivate this, if you want to 'save' your specified labels.");
773 // **************************** content of ftabRight1 *******************************
775 fContSave = new TGGroupFrame(fTabRight1, "Save", kVerticalFrame | kFitWidth | kFitHeight);
776 fTabRight1->AddFrame(fContSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
778 fBtnSave = new TGTextButton(fContSave, "&Save picture");
779 fContSave->AddFrame(fBtnSave, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
780 fBtnSave->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "SavePicture()");
781 fBtnSave->SetToolTipText("Open a 'Save as...' dialog to save the current plot as picture or macro.");
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));
787 // content of --- fContAddSaveOpt ---
788 // addition save options label
789 fChkAddSaveOpt = new TGCheckButton(fContAddSaveOpt, "Save options:");
790 fContAddSaveOpt->AddFrame(fChkAddSaveOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
791 fChkAddSaveOpt->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
792 fChkAddSaveOpt->SetToolTipText("Additional save options (see documentation for TPad::Print()).");
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()");
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));
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));
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()");
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.");
826 // add to normalisation button
827 fBtnAddNorm = new TGTextButton(fContExport, "&Add to normalization");
828 fContExport->AddFrame(fBtnAddNorm, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
829 fBtnAddNorm->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoExportNorm()");
830 fBtnAddNorm->SetToolTipText("Use the current 2D view as normalization variable, use the specified name. \nNot yet working!");
833 fContTree = new TGGroupFrame(fTabRight1, "Tree", kVerticalFrame | kFitWidth | kFitHeight);
834 fTabRight1->AddFrame(fContTree, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
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");
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. ");
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.");
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");
859 // Fit options container
860 fContFit = new TGGroupFrame(fTabRight1, "Custom fit", kVerticalFrame | kFitWidth | kFitHeight);
861 fTabRight1->AddFrame(fContFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
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));
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()");
878 fBtnFit = new TGTextButton(fContAddFit, "&Fit");
879 fContAddFit->AddFrame(fBtnFit, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
880 fBtnFit->Connect("Clicked()", "AliTPCCalibViewerGUI", this, "DoFit()");
881 fBtnFit->SetToolTipText("Fit a whole TPC side, e.g. with gx~ ++ gy~, the result is printed to the console \nNot yet final status.");
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()");
888 SetWindowName("AliTPCCalibViewer GUI");
890 Resize(GetDefaultSize());
895 void AliTPCCalibViewerGUI::SetInitialValues() {
897 // Set the default button states
899 fChkAuto->SetState(kButtonUp);
900 fRadioPredefined->SetState(kButtonDown);
901 fRadioRaw->SetState(kButtonDown);
902 fRadioTPC->SetState(kButtonDown);
903 fRadio1D->SetState(kButtonDown);
904 fChkAddCuts->SetState(kButtonUp);
905 fChkGetMinMaxAuto->SetState(kButtonDown);
906 fChkSetMin->SetState(kButtonUp);
907 fChkSetMax->SetState(kButtonUp);
908 fRadioNorm->SetState(kButtonDown);
909 fRadioSigma->SetState(kButtonUp);
910 fRadioCumulative->SetState(kButtonUp);
911 fChkMean->SetState(kButtonDown);
912 fCheckCumulativePM->SetState(kButtonUp);
914 fChkLabelGetAuto->SetState(kButtonDown);
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)
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;
942 if (statOpt / 100000000 >= 1) {
943 fChkStatKurtosis->SetState(kButtonDown);
944 statOpt -= 100000000;
946 if (statOpt / 20000000 >= 1) {
947 fChkStatSkewness->SetState(kButtonDown);
948 fChkStatSkewnessPM->SetState(kButtonDown);
951 if (statOpt / 10000000 >= 1) {
952 fChkStatSkewness->SetState(kButtonDown);
955 if (statOpt / 1000000 >= 1) {
956 fChkStatIntegral->SetState(kButtonDown);
959 if (statOpt / 100000 >= 1) {
960 fChkStatOverflow->SetState(kButtonDown);
963 if (statOpt / 10000 >= 1) {
964 fChkStatUnderflow->SetState(kButtonDown);
967 if (statOpt / 2000 >= 1) {
968 fChkStatRMS->SetState(kButtonDown);
969 fChkStatRMSPM->SetState(kButtonDown);
972 if (statOpt / 1000 >= 1) {
973 fChkStatRMS->SetState(kButtonDown);
976 if (statOpt / 200 >= 1) {
977 fChkStatMean->SetState(kButtonDown);
978 fChkStatMeanPM->SetState(kButtonDown);
981 if (statOpt / 100 >= 1) {
982 fChkStatMean->SetState(kButtonDown);
985 if (statOpt / 10 >= 1) {
986 fChkStatEntries->SetState(kButtonDown);
989 if (statOpt / 1 >= 1) {
990 fChkStatName->SetState(kButtonDown);
995 fChkStatName->SetState(kButtonDown);
996 fChkStatEntries->SetState(kButtonDown);
997 fChkStatMean->SetState(kButtonDown);
998 fChkStatRMS->SetState(kButtonDown);
1000 // fChkStatMeanPM->SetState(kButtonUp);
1001 // fChkStatRMSPM->SetState(kButtonUp);
1002 // fChkStatUnderflow->SetState(kButtonUp);
1003 // fChkStatOverflow->SetState(kButtonUp);
1004 // fChkStatIntegral->SetState(kButtonUp);
1005 // fChkStatSkewness->SetState(kButtonUp);
1006 // fChkStatSkewnessPM->SetState(kButtonUp);
1007 // fChkStatKurtosis->SetState(kButtonDown);
1008 // fChkStatKurtosisPM->SetState(kButtonDown);
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);
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);
1035 // fill fComboMethod
1036 fComboMethod->AddEntry("subtract", 0);
1037 fComboMethod->AddEntry("divide by", 1);
1039 // fill fComboExportName
1040 // fComboExportName->AddEntry("calPad", 0);
1041 // fComboExportName->AddEntry("calPad2", 1);
1042 fBtnExport->SetEnabled(kFALSE);
1043 fBtnAddNorm->SetEnabled(kFALSE);
1045 // select initial variables
1046 fListVariables->Select(0);
1047 fListNormalization->Select(0);
1048 fComboMethod->Select(0);
1049 // fComboExportName->Select(0);
1050 // fComboExportName->EnableTextInput(kTRUE);
1052 //fCanvMain->GetCanvas()->ToggleEventStatus(); // klappt nicht
1053 //fCanvMain->GetCanvas()->GetCanvasImp()->ShowStatusBar(kTRUE); // klappt auch nicht
1054 fListVariables->IntegralHeight(kFALSE); // naja
1055 fListNormalization->IntegralHeight(kFALSE); // naja
1056 fChkAuto->SetState(kButtonDown);
1058 // Make first drawing:
1063 AliTPCCalibViewerGUI::AliTPCCalibViewerGUI(const AliTPCCalibViewerGUI &c)
1064 : TGCompositeFrame(c.fParent, c.fWidth, c.fHeight),
1080 fContDrawOptSub1D2D(0),
1095 fBtnAddFitFunction(0),
1099 fRadioNormalized(0),
1100 fRadioPredefined(0),
1109 fComboAddDrawOpt(0),
1113 fListNormalization(0),
1126 fChkGetMinMaxAuto(0),
1130 fcontDrawOpt1DSubLR(0),
1131 fContDrawOpt1DSubNSC(0),
1140 fRadioCumulative(0),
1141 fCheckCumulativePM(0),
1143 fContDrawOpt1DSubMML(0),
1156 fChkStatUnderflow(0),
1157 fChkStatOverflow(0),
1158 fChkStatIntegral(0),
1160 fChkStatSkewness(0),
1161 fChkStatSkewnessPM(0),
1163 fChkStatKurtosis(0),
1164 fChkStatKurtosisPM(0),
1173 fChkLabelGetAuto(0),
1178 fComboAddSaveOpt(0),
1181 fComboExportName(0),
1187 fChkAddAsReference(0),
1192 // dummy AliTPCCalibViewerGUI copy constructor
1197 AliTPCCalibViewerGUI & AliTPCCalibViewerGUI::operator =(const AliTPCCalibViewerGUI & /*param*/) {
1199 // dummy assignment operator
1205 AliTPCCalibViewerGUI::~AliTPCCalibViewerGUI() {
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();
1216 if (fViewer) fViewer->Delete();
1217 delete fPreprocessor;
1222 void AliTPCCalibViewerGUI::CloseWindow() {
1228 void AliTPCCalibViewerGUI::Initialize(const char* fileName, const char* treeName) {
1230 // initialize the GUI with a calibrationTree from fileName
1233 // create AliTPCCalibViewer object, which will be used for generating all drawings
1234 if (fViewer) delete fViewer;
1235 fViewer = new AliTPCCalibViewer(fileName, treeName);
1236 Initialize(fViewer);
1240 void AliTPCCalibViewerGUI::Initialize(AliTPCCalibViewer *viewer) {
1242 // initializes the GUI with default settings and opens tree for drawing
1246 TString selectedVariable("");
1247 TString selectedNormalization("");
1248 Int_t variableId = -1;
1249 Int_t normalizationId = -1;
1251 // remember the selected entry
1252 if (fListVariables->GetSelectedEntry()) selectedVariable = fListVariables->GetSelectedEntry()->GetTitle();
1253 if (fListNormalization->GetSelectedEntry()) selectedNormalization = fListNormalization->GetSelectedEntry()->GetTitle();
1256 // fill fListVariables, list of drawable variables:
1257 TObjArray* arr = fViewer->GetListOfVariables();
1259 TIterator* iter = arr->MakeIterator();
1261 TObjString* currentStr = 0;
1263 fListVariables->RemoveAll();
1264 while ((currentStr = (TObjString*)(iter->Next()))) {
1265 fListVariables->AddEntry(currentStr->GetString().Data(), id);
1266 if (fInitialized && currentStr->GetString() == selectedVariable) variableId = id;
1270 // fill fListNorm, list of normalization variables:
1271 TObjArray *arrNorm = fViewer->GetListOfNormalizationVariables();
1272 TIterator *iterNorm = arrNorm->MakeIterator();
1276 fListNormalization->RemoveAll();
1277 while ((currentStr = (TObjString*)(iterNorm->Next()))) {
1278 fListNormalization->AddEntry(currentStr->GetString().Data(), id);
1279 if (fInitialized && currentStr->GetString() == selectedNormalization) normalizationId = id;
1284 //Add draw variables to the list of normalisation
1285 while ((currentStr = (TObjString*)(iter->Next()))) {
1286 if (currentStr->GetString().BeginsWith("Map")) continue; //don't add mapping information
1287 fListNormalization->AddEntry(currentStr->GetString().Data(), id);
1288 if (fInitialized && currentStr->GetString() == selectedNormalization) normalizationId = id;
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());
1308 // select the last selected variable and normalization
1309 if (fInitialized && variableId != -1) fListVariables->Select(variableId);
1310 if (fInitialized && normalizationId != -1)fListVariables->Select(normalizationId);
1312 if (fInitialized) Info("Initialize", "AliTPCCalibViewerGUI new initialized.");
1313 fInitialized = kTRUE;
1317 void AliTPCCalibViewerGUI::Reset(){
1319 // reset variables, delete calib viewer
1321 if (fViewer) delete fViewer;
1322 fListVariables->RemoveAll();
1323 fListNormalization->RemoveAll();
1324 fInitialized = kFALSE;
1327 void AliTPCCalibViewerGUI::HandleButtonsGeneral(Int_t id) {
1329 // handles mutual radio button exclusions
1333 TGButton *btn = (TGButton *) gTQSender;
1334 id = btn->WidgetId();
1338 case 10: // fRadioRaw
1339 fRadioNormalized->SetState(kButtonUp);
1340 fRadioPredefined->SetState(kButtonDown);
1341 fRadioCustom->SetState(kButtonUp);
1342 // fComboMethod->UnmapWindow();
1343 // fListNormalization->UnmapWindow();
1345 case 11: // fRadioNormalized
1346 fRadioRaw->SetState(kButtonUp);
1347 fRadioPredefined->SetState(kButtonDown);
1348 fRadioCustom->SetState(kButtonUp);
1350 case 12: // fRadioCustom
1351 fRadioPredefined->SetState(kButtonUp);
1352 // fComboCustom->SetEnabled(kFALSE);
1353 // fRadioNormalized->SetState(kButtonUp);
1355 case 14: // select Draw options fComboAddDrawOpt
1356 fChkAddDrawOpt->SetState(kButtonDown);
1358 case 13: // fRadioPredefined
1359 fRadioCustom->SetState(kButtonUp);
1360 // fComboCustom->SetEnabled(kTRUE);
1361 //f RadioNormalized->SetState(kButtonUp);
1364 case 30: // fRadio1D
1365 fRadio2D->SetState(kButtonUp);
1366 fBtnExport->SetEnabled(kFALSE);
1367 fBtnAddNorm->SetEnabled(kFALSE);
1369 case 31: // fRadio2D
1370 fRadio1D->SetState(kButtonUp);
1371 fBtnExport->SetEnabled(kTRUE);
1372 fBtnAddNorm->SetEnabled(kTRUE);
1374 case 42: // fComboCustom
1375 fRadioCustom->SetState(kButtonDown);
1376 fRadioPredefined->SetState(kButtonUp);
1383 void AliTPCCalibViewerGUI::HandleButtons1D(Int_t id) {
1385 // handles mutual radio button exclusions
1390 TGButton *btn = (TGButton *) gTQSender;
1391 id = btn->WidgetId();
1394 case 110: // 1D draw normal
1395 fRadioNorm->SetState(kButtonDown);
1396 fRadioSigma->SetState(kButtonUp);
1397 fRadioCumulative->SetState(kButtonUp);
1398 fRadioIntegrate->SetState(kButtonUp);
1400 case 111: // 1D draw sigma
1401 fRadioNorm->SetState(kButtonUp);
1402 fRadioSigma->SetState(kButtonDown);
1403 fRadioCumulative->SetState(kButtonUp);
1404 fRadioIntegrate->SetState(kButtonUp);
1406 case 112: // 1D draw cumulative
1407 fRadioNorm->SetState(kButtonUp);
1408 fRadioSigma->SetState(kButtonUp);
1409 fRadioCumulative->SetState(kButtonDown);
1410 fRadioIntegrate->SetState(kButtonUp);
1412 case 113: // 1D draw integral
1413 fRadioNorm->SetState(kButtonUp);
1414 fRadioSigma->SetState(kButtonUp);
1415 fRadioCumulative->SetState(kButtonUp);
1416 fRadioIntegrate->SetState(kButtonDown);
1423 void AliTPCCalibViewerGUI::HandleButtonsStat(Int_t id) {
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(...)
1431 TGButton *btn = (TGButton *) gTQSender;
1432 id = btn->WidgetId();
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");
1449 gStyle->SetOptStat(statOpt);
1454 void AliTPCCalibViewerGUI::HandleButtonsCuts(Int_t id) {
1456 // handles mutual radio button exclusions
1457 // right side buttons
1460 TGButton *btn = (TGButton *) gTQSender;
1461 id = btn->WidgetId();
1465 case 20: // fRadioTPC
1466 fRadioSideA->SetState(kButtonUp);
1467 fRadioSideC->SetState(kButtonUp);
1468 fRadioROC->SetState(kButtonUp);
1469 fRadioSector->SetState(kButtonUp);
1471 case 21: // fRadioSideA
1472 fRadioTPC->SetState(kButtonUp);
1473 fRadioSideC->SetState(kButtonUp);
1474 fRadioROC->SetState(kButtonUp);
1475 fRadioSector->SetState(kButtonUp);
1477 case 22: // fRadioSideC
1478 fRadioTPC->SetState(kButtonUp);
1479 fRadioSideA->SetState(kButtonUp);
1480 fRadioROC->SetState(kButtonUp);
1481 fRadioSector->SetState(kButtonUp);
1483 case 23: // fRadioROC
1484 fRadioTPC->SetState(kButtonUp);
1485 fRadioSideA->SetState(kButtonUp);
1486 fRadioSideC->SetState(kButtonUp);
1487 fRadioSector->SetState(kButtonUp);
1489 case 24: // fRadioSector
1490 fRadioTPC->SetState(kButtonUp);
1491 fRadioSideA->SetState(kButtonUp);
1492 fRadioSideC->SetState(kButtonUp);
1493 fRadioROC->SetState(kButtonUp);
1495 case 31: // fComboAddCuts
1496 fChkAddCuts->SetState(kButtonDown);
1503 void AliTPCCalibViewerGUI::HandleButtonsNoRedraw(Int_t id) {
1505 // handles label & scaling checkboxes
1506 // without redrawing (not necessary, faster like this)
1509 TGButton *btn = (TGButton *) gTQSender;
1510 id = btn->WidgetId();
1514 case 40: // fTxtSetMin
1515 fChkSetMin->SetState(kButtonDown);
1517 case 41: // fTxtSetMax
1518 fChkSetMax->SetState(kButtonDown);
1520 case 50: // fTxtLabelTitle
1521 fChkLabelTitle->SetState(kButtonDown);
1523 case 51: // fTxtLabelXaxis
1524 fChkLabelXaxis->SetState(kButtonDown);
1526 case 52: // fTxtLabelXaxis
1527 fChkLabelYaxis->SetState(kButtonDown);
1533 void AliTPCCalibViewerGUI::ReplacePlaceHolders(TString &str)
1536 // replace the defined placeholders in the custom draw string and cut string
1538 TString drawPlaceHolder("#draw#");
1539 TString normPlaceHolder("#norm#");
1541 //current draw variable
1542 TString desiredData("");
1543 if (fListVariables->GetSelectedEntry()){
1544 desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1545 str.ReplaceAll(drawPlaceHolder,desiredData);
1547 // desiredData += fViewer->GetAbbreviation();
1549 //current normalisation
1550 TString normalizationData("");
1551 if (fListNormalization->GetSelectedEntry()){
1552 normalizationData += ((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle();
1553 if (! (TString(((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle())).BeginsWith("Fit"))
1554 if ( normalizationData.BeginsWith("_") ) normalizationData = desiredData+normalizationData;
1555 if ( fListVariables->FindEntry(normalizationData.Data()) )
1556 normalizationData+="~";
1557 str.ReplaceAll(normPlaceHolder,normalizationData);
1561 void AliTPCCalibViewerGUI::DoNewSelection() {
1563 // decides whether to redraw if user makes another selection
1565 if (fChkAuto->GetState() == kButtonDown) DoDraw();
1569 TString* AliTPCCalibViewerGUI::GetDrawString() {
1571 // create the draw string out of selection
1574 // specify data to plot
1575 TString desiredData("");
1576 if (!fListVariables->GetSelectedEntry()) return 0;
1577 desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1578 desiredData += fViewer->GetAbbreviation();
1580 // specify normalization
1581 if (fRadioPredefined->GetState() == kButtonDown && fRadioNormalized->GetState() == kButtonDown) {
1583 switch (fComboMethod->GetSelected()) {
1584 case 0: // subtraction
1591 TString normalizationData("");
1592 if (!fListNormalization->GetSelectedEntry()) return 0;
1593 normalizationData += ((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle();
1595 if ( normalizationData.BeginsWith("Fit")) {
1596 // create fit formula, evaluate it an replace normalizationData-String
1597 // ********** create cut string **********
1599 if (fRadioTPC->GetState() == kButtonDown)
1600 cutStr += ""; // whole TPC is used for fitting
1601 if (fRadioSideA->GetState() == kButtonDown)
1602 cutStr += "(sector/18)%2==0"; // side A
1603 if (fRadioSideC->GetState() == kButtonDown)
1604 cutStr+= "(sector/18)%2==1"; // side C
1605 if (fRadioROC->GetState() == kButtonDown) {
1606 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1607 cutStr += "sector==";
1610 if (fRadioSector->GetState() == kButtonDown) {
1611 Int_t sector = ((Int_t)(fNmbSector->GetNumber()))%36;
1612 cutStr += "sector%36==";
1615 if (fChkAddCuts->GetState() == kButtonDown && strcmp(fComboAddCuts->GetTextEntry()->GetText(), "") != 0){
1616 if (fRadioTPC->GetState() != kButtonDown) cutStr += " && ";
1617 cutStr += fComboAddCuts->GetTextEntry()->GetText();
1620 TVectorD fitParam(0);
1621 TMatrixD covMatrix(0,0);
1622 TString formulaStr("");
1623 if (normalizationData.CompareTo("FitLinLocal") == 0)
1624 formulaStr = "lx~ ++ ly~";
1625 if (normalizationData.CompareTo("FitLinGlobal") == 0)
1626 formulaStr = "gx~ ++ gy~";
1627 if (normalizationData.CompareTo("FitParLocal") == 0)
1628 formulaStr = "lx~ ++ ly~ ++ lx~^2 ++ ly~^2 ++ lx~*ly~";
1629 if (normalizationData.CompareTo("FitParGlobal") == 0)
1630 formulaStr = "gx~ ++ gy~ ++ gx~^2 ++ gy~^2 ++ gx~*gy~";
1631 formulaStr.ReplaceAll("~", fViewer->GetAbbreviation());
1632 normalizationData = *fViewer->Fit(desiredData.Data(), formulaStr.Data(), cutStr.Data(), chi2, fitParam, covMatrix);
1633 } // if ( normalizationData.BeginsWith("Fit")
1636 if (! (TString(((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle())).BeginsWith("Fit"))
1637 if ( normalizationData.BeginsWith("_") ) desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
1638 if ( fListVariables->FindEntry(normalizationData.Data()) )
1639 normalizationData+="~";
1640 desiredData += normalizationData;
1642 else if (fRadioCustom->GetState() == kButtonDown) {
1643 desiredData = fComboCustom->GetTextEntry()->GetText();
1644 if (desiredData == "") return 0;
1645 ReplacePlaceHolders(desiredData);
1648 // try to add forgotten '~'
1649 if (fChkAutoAppend->GetState() == kButtonDown)
1650 desiredData = TString(fViewer->AddAbbreviations((char*)desiredData.Data()));
1651 return new TString(desiredData.Data());
1655 TString* AliTPCCalibViewerGUI::GetSectorString() {
1657 // create the sector string out of selection
1660 TString sectorStr("");
1661 if (fRadioTPC->GetState() == kButtonDown)
1663 if (fRadioSideA->GetState() == kButtonDown)
1664 sectorStr += "A"; //cuts += "(sector/18)%2==0";
1665 if (fRadioSideC->GetState() == kButtonDown)
1666 sectorStr+= "C"; //cuts += "(sector/18)%2==1";
1667 if (fRadioROC->GetState() == kButtonDown) {
1668 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1669 sectorStr += sector; //cuts += "sector==";
1671 if (fRadioSector->GetState() == kButtonDown) {
1672 Int_t sector = ((Int_t)(fNmbSector->GetNumber()))%36;
1674 sectorStr += sector; //cuts += "sector%36==";
1676 return new TString(sectorStr.Data());
1680 TString* AliTPCCalibViewerGUI::GetCutString() {
1682 // create the cut string out of selection
1685 TString cutsStr("");
1686 if (fChkCutZero->GetState() == kButtonDown) {
1687 TString cutZerosStr(GetDrawString()->Data());
1688 if (cutZerosStr.Contains(">>")) {
1689 cutZerosStr.Remove(cutZerosStr.First(">>"));
1691 if (cutZerosStr.Contains(":")) {
1692 cutZerosStr.Remove(cutZerosStr.First(":"));
1694 cutsStr += cutZerosStr.Data();
1696 if (fChkAddCuts->GetState() == kButtonDown) cutsStr += " && ";
1698 if (fChkAddCuts->GetState() == kButtonDown){
1699 cutsStr += fComboAddCuts->GetTextEntry()->GetText();
1700 ReplacePlaceHolders(cutsStr);
1704 // try to add forgotten '~'
1705 if (fChkAutoAppend->GetState() == kButtonDown)
1706 cutsStr = TString(fViewer->AddAbbreviations((char*)cutsStr.Data()));
1707 return new TString(cutsStr.Data());
1711 void AliTPCCalibViewerGUI::DoDraw() {
1713 // main method for drawing according to user selection
1716 // specify data to plot:
1717 if (!GetDrawString()) return;
1718 TString desiredData(GetDrawString()->Data());
1720 TString sectorStr(GetSectorString()->Data());
1722 TString cutsStr(GetCutString()->Data());
1724 TString addDrawOpt("");
1725 if (fChkAddDrawOpt->GetState() == kButtonDown)
1726 addDrawOpt += fComboAddDrawOpt->GetTextEntry()->GetText();
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();
1734 //fCanvMain->GetCanvas()->Clear();
1735 fCanvMain->GetCanvas()->cd();
1738 if (fRadio1D->GetState() == kButtonDown){
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);
1759 else if (fRadio2D->GetState() == kButtonDown) {
1761 entries = fViewer->EasyDraw(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), addDrawOpt.Data());
1763 if (entries == -1) return; // nothing was drawn, there is no histogram to get min and max
1766 fCanvMain->GetCanvas()->Update();
1770 void AliTPCCalibViewerGUI::DoFit() {
1772 // main method for fitting
1776 TVectorD fitParam(0);
1777 TMatrixD covMatrix(0,0);
1779 TString formulaStr("");
1780 TString *returnStr = new TString("");
1782 // specify data to plot:
1783 TString drawStr(GetDrawString()->Data());
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
1792 if (fRadioROC->GetState() == kButtonDown) {
1793 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1794 cutStr += "sector==";
1797 if (fRadioSector->GetState() == kButtonDown) {
1798 Int_t sector = (Int_t)(fNmbSector->GetNumber())%36;
1799 cutStr += "sector%36==";
1802 if (fChkAddCuts->GetState() == kButtonDown && strcmp(fComboAddCuts->GetTextEntry()->GetText(), "") != 0){
1803 if (fRadioTPC->GetState() != kButtonDown) cutStr += " && ";
1804 cutStr += fComboAddCuts->GetTextEntry()->GetText();
1806 // try to add forgotten '~'
1807 if (fChkAutoAppend->GetState() == kButtonDown)
1808 cutStr = TString(fViewer->AddAbbreviations((char*)cutStr.Data()));
1810 // ********** get formula string **********
1811 formulaStr += fComboCustomFit->GetTextEntry()->GetText();
1812 if (fChkAutoAppend->GetState() == kButtonDown)
1813 formulaStr = TString(fViewer->AddAbbreviations((char*)formulaStr.Data()));
1815 // ********** call AliTPCCalibViewer's fit-function
1816 ReplacePlaceHolders(drawStr);
1817 ReplacePlaceHolders(cutStr);
1818 returnStr = fViewer->Fit(drawStr.Data(), formulaStr.Data(), cutStr.Data(), chi2, fitParam, covMatrix);
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;
1827 void AliTPCCalibViewerGUI::DoExport() {
1829 // function to export a CalPad to Cint
1831 if ( fRadio2D->GetState() != kButtonDown){
1832 Error("ExportCalPad", "Export of AliTPCCalPad to CINT works only in 2D mode.");
1835 // specify data to plot:
1836 TString desiredData(GetDrawString()->Data());
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:
1844 gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, calPad));
1845 fPreprocessor->AddComponent(calPad);
1846 Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
1850 void AliTPCCalibViewerGUI::DoExportNorm() {
1852 // function to export a CalPad to Cint
1855 if ( fRadio2D->GetState() != kButtonDown){
1856 Error("ExportCalPad", "Adding an AliTPCCalPad to the normalization works only in 2D mode.");
1860 Error("DoExportNorm", "Not yet implemented.");
1863 // specify data to plot:
1864 TString desiredData(GetDrawString()->Data());
1866 TString sectorStr(GetSectorString()->Data());
1868 TString cutsStr(GetCutString()->Data());
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:
1875 gROOT->ProcessLine(Form("AliTPCCalPad* %s = (AliTPCCalPad*)0x%lx;", calPadName, calPad));
1876 Info("ExportCalPad", "Current 2D view has been exported to an AliTPCCalPad* with name '%s'", calPadName);
1880 void AliTPCCalibViewerGUI::GetMinMax() {
1882 // Read current Min & Max from the plot and set it to fTxtSetMin & fTxtSetMax
1884 if (fChkGetMinMaxAuto->GetState() == kButtonUp) return;
1885 TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1887 for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1888 ptr = listOfPrimitives->At(i);
1889 if ( ptr->InheritsFrom("TH1") ) break;
1891 if ( ptr != 0 && !ptr->InheritsFrom("TH1") ) return; // if the loop did not find a TH1
1892 TH1 *hist = (TH1*)ptr;
1894 // Double_t histMax = hist->GetMaximum();
1895 // Double_t histMin = hist->GetMinimum();
1896 // fTxtSetMax->SetText(Form("%f",histMax));
1897 // fTxtSetMin->SetText(Form("%f",histMin));
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()));
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()) );
1914 void AliTPCCalibViewerGUI::SetMinMaxLabel() {
1916 // Set Minimum, Maximum and labels without redrawing the plot
1920 // search for histogram
1921 TList* listOfPrimitives = fCanvMain->GetCanvas()->GetListOfPrimitives();
1923 for (Int_t i = 0; i < listOfPrimitives->GetEntries(); i++) {
1924 ptr = listOfPrimitives->At(i);
1925 if ( ptr->InheritsFrom("TH1") ) break;
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!");
1931 // unable to find histogram, no min and max wil be read out
1934 TH1 *hist = (TH1*)ptr;
1935 TString minTxt(fTxtSetMin->GetText());
1936 TString maxTxt(fTxtSetMax->GetText());
1938 // set min and max according to specified values, if checkbox is checked
1939 if (fRadio2D->GetState() == kButtonDown) {
1940 if (fChkSetMax->GetState() == kButtonDown && fChkSetMax->GetState() == kButtonDown &&(maxTxt.IsDigit() || maxTxt.IsFloat()) )
1941 hist->SetMaximum(maxTxt.Atof());
1942 if (fChkSetMax->GetState() == kButtonUp)
1943 hist->SetMaximum(-1111); // default value, to unzoom
1944 if (fChkSetMin->GetState() == kButtonDown && (minTxt.IsDigit() || minTxt.IsFloat()) )
1945 hist->SetMinimum(minTxt.Atof());
1946 if (fChkSetMin->GetState() == kButtonUp)
1947 hist->SetMinimum(-1111); // default value, to unzoom
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
1960 // get min and max from plot
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());
1976 hist->SetTitle(hist->GetTitle()); // trick to update the histogram
1977 fCanvMain->GetCanvas()->Update();
1981 void AliTPCCalibViewerGUI::ChangeSector(){
1983 // function that is called, when the number of the sector is changed
1984 // to change the sector label
1986 if ( fRadioROC->GetState()!=kButtonDown && fRadioSector->GetState()!=kButtonDown ){
1987 fLblSector->SetText("not used");
1991 Int_t sector = (Int_t)(fNmbSector->GetNumber());
1992 TString secLabel = "";
1998 if (fRadioSector->GetState()==kButtonDown)
2001 if ( sector%36<18 ) //A-Side
2006 secLabel += Form("%02d",sector%18);
2008 fLblSector->SetText(secLabel);
2013 void AliTPCCalibViewerGUI::AddFitFunction() const {
2015 // adds the last fit function to the normalization list
2017 std::cout << "Not yet implemented." << std::endl;
2021 void AliTPCCalibViewerGUI::UnchekAllStat() {
2023 // Disable all statistical legend entries, no statistical legend.
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);
2039 HandleButtonsStat(0);
2043 void AliTPCCalibViewerGUI::MouseMove(Int_t event, Int_t x, Int_t y, TObject *selectedObject) {
2046 // zoom to sector works ONLY in 2D mode, if one side is specified
2048 Double_t pi = TMath::Pi();
2049 if (event != kButton1Double )
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;
2054 if (fRadioROC->GetState() == kButtonDown) { // return to full side view
2055 // return to full side view
2056 Int_t sector = (Int_t)(fNmbSector->GetNumber());
2057 if ( (sector >= 0 && sector <= 17) || (sector >= 36 && sector <= 53) ) {
2059 fRadioSideA->Clicked();
2060 fRadioSideA->SetState(kButtonDown);
2063 if ( (sector >= 18 && sector <= 35) || (sector >= 54 && sector <= 71) ) {
2065 fRadioSideC->Clicked();
2066 fRadioSideC->SetState(kButtonDown);
2071 if (!(fRadioSideA->GetState() == kButtonDown || fRadioSideC->GetState() == kButtonDown)) return;
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;
2092 Int_t sector = (Int_t) phiGrad / 20; // one sector coresponds to 20�
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;
2102 if (fRadioSideC->GetState() == kButtonDown) sector += 18;
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);
2106 fRadioROC->Clicked();
2107 fRadioROC->SetState(kButtonDown);
2112 void AliTPCCalibViewerGUI::SavePicture() {
2114 // saves the current picture
2116 // use the following combination of file type and save options:
2117 // (see also TCanvas::Print)
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
2136 const char *kSaveAsTypes[] = {
2137 "Postscript", "*.ps",
2138 "Encapsulated Postscript", "*.eps",
2147 "C++ macro", "*.cxx",
2148 "Macro file", "*.C",
2149 "ROOT file", "*.root",
2153 TString addSaveOpt("");
2154 if (fChkAddSaveOpt->GetState() == kButtonDown)
2155 addSaveOpt += fComboAddSaveOpt->GetTextEntry()->GetText();
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)) {
2163 if (addSaveOpt != "")
2164 fCanvMain->GetCanvas()->Print(fi.fFilename, addSaveOpt.Data());
2166 fCanvMain->GetCanvas()->Print(fi.fFilename);
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
2180 void AliTPCCalibViewerGUI::DoDumpToFile() {
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
2186 const char *kSaveAsTypes[] = {
2187 "ROOT file", "*.root",
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));
2203 void AliTPCCalibViewerGUI::DoLoadTree() {
2204 // function to load a new calib tree
2207 const char *kFileTypes[] = {
2208 "ROOT file", "*.root",
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);
2221 else if (fi.fFilename && strlen(fi.fFilename) && fChkAddAsReference->GetState() == kButtonDown) {
2222 fViewer->AddReferenceTree(fi.fFilename, "calPads", fTxtRefName->GetText());
2228 TObjArray* AliTPCCalibViewerGUI::ShowGUI(const char* fileName) {
2230 // Initialize and show GUI for presentation for demonstration purposes
2231 // or for fast standalone use
2233 TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
2234 frmMain->SetWindowName("AliTPCCalibViewer GUI");
2235 frmMain->SetCleanup(kDeepCleanup);
2237 TGTab* tabMain = new TGTab(frmMain, 1000, 600);
2238 frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2240 TGCompositeFrame* tabCont1 = tabMain->AddTab("Viewer 1");
2241 TGCompositeFrame* tabCont2 = tabMain->AddTab("Viewer 2");
2243 AliTPCCalibViewerGUI* calibViewer1 = new AliTPCCalibViewerGUI(tabCont1, 1000, 600, (char*)fileName);
2244 tabCont1->AddFrame(calibViewer1, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2246 AliTPCCalibViewerGUI* calibViewer2 = new AliTPCCalibViewerGUI(tabCont2, 1000, 600, (char*)fileName);
2247 tabCont2->AddFrame(calibViewer2, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
2249 TObjArray *guiArray = new TObjArray();
2250 guiArray->Add(calibViewer1);
2251 guiArray->Add(calibViewer2);
2253 frmMain->MapSubwindows();
2255 frmMain->MapWindow();