Switch to 24 time bins as default
[u/mrichter/AliRoot.git] / TPC / AliTPCCalibViewerGUItime.cxx
CommitLineData
5312f439 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// //
20///////////////////////////////////////////////////////////////////////////////
21
6e7d7dc4 22
5312f439 23#include <iostream>
24//Root includes
25#include <TROOT.h>
26#include <TDirectory.h>
27#include <TStyle.h>
28#include <TCanvas.h>
29#include <TPad.h>
30#include <TVirtualPad.h>
31#include <TObject.h>
32#include <TObjArray.h>
33#include <TObjString.h>
6fb51ca4 34#include <TSystem.h>
5312f439 35#include <TVector.h>
36#include <TH1.h>
37#include <TCut.h>
38#include <TFile.h>
39#include <TTree.h>
e6970ab5 40#include <TChain.h>
5312f439 41#include <TBranch.h>
42#include <TIterator.h>
43#include <TGraph.h>
44#include <TAxis.h>
45#include <TTimeStamp.h>
46#include <TMath.h>
7390f655 47#include <TMap.h>
5312f439 48//
49#include <TGFileDialog.h>
50#include <TGInputDialog.h>
51//
52#include <TGButton.h>
53#include <TGListBox.h>
54#include <TGComboBox.h>
55#include <TGNumberEntry.h>
56#include <TGLayout.h>
57#include <TRootEmbeddedCanvas.h>
58#include <TGSplitter.h>
59#include <TGButtonGroup.h>
60#include <TGLabel.h>
61#include <TGTab.h>
62#include <TGString.h>
63
64//AliRoot includes
6fb51ca4 65#include <AliLog.h>
5312f439 66#include "AliTPCCalibViewerGUI.h"
7390f655 67#include "AliTPCCalibViewer.h"
5312f439 68#include "AliTPCcalibDB.h"
949d8707 69#include "AliTPCcalibDButil.h"
6fb51ca4 70#include "AliTPCConfigParser.h"
5312f439 71
72#include "AliTPCCalibViewerGUItime.h"
73
74ClassImp(AliTPCCalibViewerGUItime)
75
76AliTPCCalibViewerGUItime::AliTPCCalibViewerGUItime(const TGWindow *p, UInt_t w, UInt_t h) :
77TGCompositeFrame(p,w,h),
78 fFile(0x0),
79 fTree(0x0),
80 fCalibViewerGUI(0x0),
81 fCalibViewerGUItab(0x0),
82 fCurrentHist(0x0),
83 fCurrentGraph(0x0),
84 fCurrentRunDetails(-1),
85 fOutputCacheDir("/tmp"),
86 fDrawString(""),
6e7d7dc4 87 fConfigFile(""),
88 fConfigParser(new AliTPCConfigParser),
5312f439 89 fIsCustomDraw(kFALSE),
90 fRunNumbers(10),
91 fTimeStamps(10),
92 fValuesX(10),
93 fValuesY(10),
6e7d7dc4 94 fNoGraph(kFALSE),
95 fGraphLimitEntries(10000),
7390f655 96 fMapRefTrees(new TMap),
5312f439 97 //GUI elements
98 //main canvas Top part, bottom part
99 fContTopBottom(0x0),
100 //top left, centre, right
101 fContLCR(0x0),
102 //content left
103 fContLeft(0x0),
6e7d7dc4 104 fContDrawOpt(0x0),
105 fChkDrawOptSame(0x0),
106 fComboAddDrawOpt(0x0),
5312f439 107 fContDrawSel(0x0),
108 fContDrawSelSubRunTime(0x0),
109 fRadioXhist(0x0),
110 fRadioXrun(0x0),
111 fRadioXtime(0x0),
112 fListVariables(0x0),
113 fComboRunType(0x0),
114 fLblRunType(0x0),
115 fNmbPar(0x0),
116 fLblPar(0x0),
6fb51ca4 117 fListCalibType(0x0),
118 fContCalibType(0x0),
5312f439 119 //content centre
120 fContCenter(0x0),
121 fCanvMain(0x0),
122 //content right
123 fContRight(0x0),
124 fContValues(0x0),
125 fLblRunNumber(0x0),
126 fLblRunTime(0x0),
127 fLblValueX(0x0),
128 fLblValueY(0x0),
129 fLblRunNumberVal(0x0),
130 fLblRunTimeVal(0x0),
131 fLblValueXVal(0x0),
132 fLblValueYVal(0x0),
133 fBtnDumpRuns(0x0),
514fcaf7 134 fContAliases(0x0),
135 fListAliases(0x0),
5312f439 136 //content bottom
137 fContCustom(0x0),
138 fContCustomCuts(0x0),
139 fLblCustomDraw(0x0),
140 fLblCustomCuts(0x0),
141 fComboCustomDraw(0x0),
6e7d7dc4 142 fComboCustomCuts(0x0),
143 fTrashBox(new TObjArray)
5312f439 144{
145 //
146 // ctor
147 //
7390f655 148 fMapRefTrees->SetOwnerKeyValue();
149 fTrashBox->SetOwner();
5312f439 150 DrawGUI(p,w,h);
6e7d7dc4 151 gStyle->SetMarkerStyle(20);
152 gStyle->SetMarkerSize(0.5);
5312f439 153 SetInitialValues();
154}
155//______________________________________________________________________________
156AliTPCCalibViewerGUItime::~AliTPCCalibViewerGUItime(){
157 //
158 // dtor
159 //
6e7d7dc4 160 delete fConfigParser;
161 delete fTrashBox;
7390f655 162 delete fMapRefTrees;
5312f439 163}
164//______________________________________________________________________________
6fb51ca4 165void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h) {
5312f439 166 //
167 // draw the GUI
168 //
169 // ======================================================================
170 // ************************* Display everything *************************
171 // ======================================================================
172
173 SetCleanup(kDeepCleanup);
5312f439 174
175 // *****************************************************************************
176 // ************************* content of this MainFrame *************************
177 // *****************************************************************************
178 // top level container with horizontal layout
179 fContTopBottom = new TGCompositeFrame(this, w, h, kVerticalFrame | kFixedWidth | kFixedHeight);
180 AddFrame(fContTopBottom, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
181
182 fContLCR = new TGCompositeFrame(fContTopBottom, w, h, kHorizontalFrame | kFixedWidth | kFixedHeight);
183 fContTopBottom->AddFrame(fContLCR, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
184
185 // ***********************************************************************
186 // ************************* content of fContLCR *************************
187 // ***********************************************************************
188 // left container
189 fContLeft = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
190 fContLCR->AddFrame(fContLeft, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 5, 3, 3, 3));
191
192 // left vertical splitter
193 TGVSplitter *splitLeft = new TGVSplitter(fContLCR);
194 splitLeft->SetFrame(fContLeft, kTRUE);
195 fContLCR->AddFrame(splitLeft, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
196
197 // right container
198 fContRight = new TGCompositeFrame(fContLCR, 150, 200, kVerticalFrame | kFixedWidth | kFitHeight);
199 fContLCR->AddFrame(fContRight, new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandY, 3, 5, 3, 3));
200
201 // center container
202 fContCenter = new TGCompositeFrame(fContLCR, 200, 200, kVerticalFrame | kFixedWidth | kFitHeight);
203 fContLCR->AddFrame(fContCenter, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
204
205 // right vertical splitter
206 TGVSplitter *splitRight = new TGVSplitter(fContLCR);
207 splitRight->SetFrame(fContRight, kFALSE);
208 fContLCR->AddFrame(splitRight, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 0, 0, 0, 0));
209
210
211 // ========================================================================
212 // ************************* content of fContLeft *************************
213 // ========================================================================
214 // --- draw button and tabLeft ---
6e7d7dc4 215 // draw options
216 fContDrawOpt = new TGGroupFrame(fContLeft, "Draw options", kVerticalFrame | kFitWidth | kFitHeight);
217 fContLeft->AddFrame(fContDrawOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
218 fChkDrawOptSame = new TGCheckButton(fContDrawOpt, "Same");
219 fContDrawOpt->AddFrame(fChkDrawOptSame, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
220 fChkDrawOptSame->SetToolTipText("Add draw option 'same'");
221 // additional draw options combo box
222 fComboAddDrawOpt = new TGComboBox(fContDrawOpt);
223 fComboAddDrawOpt->Resize(0, 22);
224 fComboAddDrawOpt->EnableTextInput(kTRUE);
225 fContDrawOpt->AddFrame(fComboAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
226// fComboAddDrawOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=14)");
227// fComboAddDrawOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()");
228
5312f439 229 // draw selection group
230 fContDrawSel = new TGGroupFrame(fContLeft, "Draw selection", kVerticalFrame | kFitWidth | kFitHeight);
231 fContLeft->AddFrame(fContDrawSel, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 10, 0));
232 //x-axis variables selection, Run of Time
233 fContDrawSelSubRunTime = new TGCompositeFrame(fContDrawSel, 200, 23, kHorizontalFrame | kFitWidth | kFixedHeight);
234 fContDrawSel->AddFrame(fContDrawSelSubRunTime, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX , 0, 0, 0, 0));
235
236 // ------------------------- content of fContDrawOpt -------------------------
237 //
238 // Run radio button
239 // Time radio button
240 fRadioXhist = new TGRadioButton(fContDrawSelSubRunTime, "hist", kRadioXhist);
241 fContDrawSelSubRunTime->AddFrame(fRadioXhist, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0));
242 fRadioXhist->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "HandleButtonsDrawSel()");
243 fRadioXhist->SetToolTipText("Draw the distribution of the variable");
244
245 fRadioXrun = new TGRadioButton(fContDrawSelSubRunTime, ":Run", kRadioXrun);
246 fContDrawSelSubRunTime->AddFrame(fRadioXrun, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0));
247 fRadioXrun->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "HandleButtonsDrawSel()");
248 fRadioXrun->SetToolTipText("Use run number as x-value");
249
250 // Time radio button
251 fRadioXtime = new TGRadioButton(fContDrawSelSubRunTime, ":Time", kRadioXtime);
252 fContDrawSelSubRunTime->AddFrame(fRadioXtime, new TGLayoutHints(kLHintsNormal, 2, 2, 0, 0));
253 fRadioXtime->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "HandleButtonsDrawSel()");
254 fRadioXtime->SetToolTipText("Use time stamp number as x-value");
255
256
257 // list of variables
258 fListVariables = new TGListBox(fContDrawSel);
259 fContDrawSel->AddFrame(fListVariables, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
260 fListVariables->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoNewSelection()");
261
6fb51ca4 262
263//-------------------- run type selection ------------------------
5312f439 264 // Parameter label
265 fLblRunType = new TGLabel(fContDrawSel, "Run Type:");
266 fLblRunType->SetTextJustify(kTextLeft);
267 fContDrawSel->AddFrame(fLblRunType, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
268
269 fComboRunType = new TGComboBox(fContDrawSel);
270 fComboRunType->EnableTextInput(kFALSE);
271 fContDrawSel->AddFrame(fComboRunType, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
272 fComboRunType->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoDraw()");
273// fComboRunType->SetEnabled(kFALSE);
274 fComboRunType->Resize(0, 22);
275
276 //-------------------- parameter selection ------------------------
277 // Parameter label
278 fLblPar = new TGLabel(fContDrawSel, "Parameter:");
279 fLblPar->SetTextJustify(kTextLeft);
280 fContDrawSel->AddFrame(fLblPar, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
281
282 fNmbPar = new TGNumberEntry(fContDrawSel, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, 71);
283 fContDrawSel->AddFrame(fNmbPar, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
284 fNmbPar->Connect("ValueSet(Long_t)", "AliTPCCalibViewerGUItime", this, "DoParLimitChange()");
285 fNmbPar->SetState(kFALSE);
286
6fb51ca4 287 //-------------------- calibration type selection ------------------------
288 // label
289 // draw selection group
290 fContCalibType = new TGGroupFrame(fContLeft, "Calib type selection", kVerticalFrame | kFitWidth | kFitHeight);
291 fContLeft->AddFrame(fContCalibType, new TGLayoutHints(kLHintsExpandX , 0, 0, 10, 0));
292
293 // list of variables
294 fListCalibType = new TGListBox(fContCalibType);
295 fContCalibType->AddFrame(fListCalibType, new TGLayoutHints(kLHintsNormal | kLHintsExpandX , 0, 0, 0, 0));
296 fListCalibType->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoChangeSelectionList()");
297 fListCalibType->Resize(0,88);
298 fListCalibType->SetMultipleSelections();
299
5312f439 300
301 // ==========================================================================
302 // ************************* content of fContCenter *************************
303 // ========================================================================
304 // main drawing canvas
305 fCanvMain = new TRootEmbeddedCanvas("GUItime_Canvas", fContCenter, 200, 200, kFitWidth | kFitHeight);
306 fContCenter->AddFrame(fCanvMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
307 fCanvMain->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "AliTPCCalibViewerGUItime", this, "MouseMove(Int_t, Int_t, Int_t, TObject*)");
308// fCanvMain->GetCanvas()->Connect("RangeAxisChanged()", "AliTPCCalibViewerGUItime", this, "GetMinMax()");
309 fCanvMain->GetCanvas()->SetToolTipText("The Main_Canvas, here your plots are displayed.");
6fb51ca4 310 fCanvMain->GetCanvas()->SetRightMargin(0.062);
311 fCanvMain->GetCanvas()->SetLeftMargin(0.15);
5312f439 312
313 // =========================================================================
314 // ************************* content of fContRight *************************
315 // ========================================================================
316 //group frame for value information
317 fContValues = new TGGroupFrame(fContRight, "Data point info", kVerticalFrame | kFitWidth | kFitHeight);
318 fContRight->AddFrame(fContValues, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
319 //set layout manager
320 fContValues->SetLayoutManager(new TGMatrixLayout(fContValues, 0, 2, 5));
321 //value information labels
322
323 //run number label
324 fLblRunNumber = new TGLabel(fContValues, "Run:");
325 fLblRunNumber->SetTextJustify(kTextLeft);
326 fContValues->AddFrame(fLblRunNumber, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
327 //run number
909c8c99 328 fLblRunNumberVal = new TGLabel(fContValues, "000000");
5312f439 329 fLblRunNumberVal->SetTextJustify(kTextLeft);
330 fContValues->AddFrame(fLblRunNumberVal, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
331 //time stamp label
332 fLblRunTime = new TGLabel(fContValues, "Time:");
333 fLblRunTime->SetTextJustify(kTextLeft);
334 fContValues->AddFrame(fLblRunTime, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
335 //run number
336 fLblRunTimeVal = new TGLabel(fContValues, "00.00.0000\n00:00:00");
337 fLblRunTimeVal->SetTextJustify(kTextLeft);
338 fContValues->AddFrame(fLblRunTimeVal, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
339 //value label x
340 fLblValueX = new TGLabel(fContValues, "x-Value:");
341 fLblValueX->SetTextJustify(kTextLeft);
342 fContValues->AddFrame(fLblValueX, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
343 //value x
892226be 344 fLblValueXVal = new TGLabel(fContValues, "00.000e+00");
5312f439 345 fLblValueXVal->SetTextJustify(kTextRight);
346 fContValues->AddFrame(fLblValueXVal, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
347 //value label y
348 fLblValueY = new TGLabel(fContValues, "y-Value:");
349 fLblValueY->SetTextJustify(kTextLeft);
350 fContValues->AddFrame(fLblValueY, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
351 //value y
892226be 352 fLblValueYVal = new TGLabel(fContValues, "00.000e+00");
5312f439 353 fLblValueYVal->SetTextJustify(kTextRight);
354 fContValues->AddFrame(fLblValueYVal, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
355 // draw button
356 fBtnDumpRuns = new TGTextButton(fContRight, "&Dump runs");
6fb51ca4 357 fContRight->AddFrame(fBtnDumpRuns, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
5312f439 358 fBtnDumpRuns->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDumpRuns()");
359 fBtnDumpRuns->SetToolTipText("Press to dump the run numbers of the current selection.");
514fcaf7 360 //group frame for value information
361 fContAliases = new TGGroupFrame(fContRight, "Aliases", kVerticalFrame | kFitWidth | kFitHeight);
362 fContRight->AddFrame(fContAliases, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 10, 0));
363 // list of aliases
364 fListAliases = new TGListBox(fContAliases);
365 fContAliases->AddFrame(fListAliases, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
366 fListAliases->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoNewSelectionAliases()");
367// fListAliases->Resize(0,88);
368 //buttons
369 TGCompositeFrame *frame1 = new TGCompositeFrame(fContAliases, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight);
370 fContAliases->AddFrame(frame1, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX , 0, 0, 0, 0));
371 // add button
372 TGTextButton *btnAdd = new TGTextButton(frame1, "&Add");
373 frame1->AddFrame(btnAdd, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
374 btnAdd->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoAddAlias()");
375 btnAdd->SetToolTipText("Press to add an alias.");
376 btnAdd->Resize(0,22);
377 // del button
378 TGTextButton *btnDel = new TGTextButton(frame1, "&Del");
379 frame1->AddFrame(btnDel, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
380 btnDel->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDelAlias()");
381 btnDel->SetToolTipText("Press to delete the selected alias.");
382 btnDel->Resize(0,22);
383 // update button
384 TGTextButton *btnUp = new TGTextButton(frame1, "&Upd");
385 frame1->AddFrame(btnUp, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
386 btnUp->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "UpdateAliasList()");
387 btnUp->SetToolTipText("Press to update the alias list.");
388 btnUp->Resize(0,22);
389
390
5312f439 391
392 // =========================================================================
393 // ****************** bottom content of fContTopBottom *********************
394 // =========================================================================
395
396 // custom options container
397 // --- fComboCustom --- the custom draw line on the very low
398 fContCustom = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
399 fContTopBottom->AddFrame(fContCustom, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
400
401 // ------------------------- content of fContCustom -------------------------
402 fLblCustomDraw = new TGLabel(fContCustom, "Custom draw: ");
403 fLblCustomDraw->SetTextJustify(kTextLeft);
404 fContCustom->AddFrame(fLblCustomDraw, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
405 // text field for custom draw command
406 fComboCustomDraw = new TGComboBox(fContCustom);
407// fComboCustomDraw->Resize(0, fLblValueY->GetDefaultHeight());
408 fComboCustomDraw->Resize(0, 22);
409 fComboCustomDraw->EnableTextInput(kTRUE);
410 fContCustom->AddFrame(fComboCustomDraw, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
411 fComboCustomDraw->Connect("ReturnPressed()", "AliTPCCalibViewerGUItime", this, "DoCustomDraw()");
412 fComboCustomDraw->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoCustomDraw()");
413
414
415 // additional cuts container
416 fContCustomCuts = new TGCompositeFrame(fContTopBottom, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
417 fContTopBottom->AddFrame(fContCustomCuts, new TGLayoutHints(kLHintsExpandX, 10, 0, 0, 0));
418
419 // ------------------------- content of fContCustomCuts -------------------------
420 fLblCustomCuts = new TGLabel(fContCustomCuts, "Custom cuts: ");
421 fLblCustomCuts->SetTextJustify(kTextLeft);
422 fContCustomCuts->AddFrame(fLblCustomCuts, new TGLayoutHints(kLHintsNormal, 5, 0, 0, 0));
423 // combo text field for additional cuts
424 fComboCustomCuts = new TGComboBox(fContCustomCuts);
425// fComboCustomCuts->Resize(0, fLblValueY->GetDefaultHeight());
426 fComboCustomCuts->Resize(0, 22);
427 fComboCustomCuts->EnableTextInput(kTRUE);
428 fContCustomCuts->AddFrame(fComboCustomCuts, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
6fb51ca4 429 fComboCustomCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUItime", this, "DoCustomCutsDraw()");
430 fComboCustomCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoCustomCutsDraw()");
5312f439 431
432 SetWindowName("AliTPCCalibViewer GUI - Time");
433 MapSubwindows();
434 Resize(GetDefaultSize());
435 MapWindow();
436}
437//______________________________________________________________________________
438void AliTPCCalibViewerGUItime::SetInitialValues(){
439 //
440 // Set inital selections of the gui
441 //
442 fRadioXrun->SetState(kButtonDown);
443 fRadioXtime->SetState(kButtonUp);
444}
445
446//______________________________________________________________________________
6e7d7dc4 447void AliTPCCalibViewerGUItime::UseFile(const char* fileName, const char* treeName) {
5312f439 448 //
449 // retrieve tree from file
450 //
6e7d7dc4 451 TString s=gSystem->GetFromPipe(Form("ls %s",fileName));
452// TString s(fileName);
e6970ab5 453 TObjArray *arr=s.Tokenize("\n");
454 TIter next(arr);
455 TObject *o=0;
456 if (fTree) delete fTree;
6e7d7dc4 457 fTree=new TChain(treeName);
e6970ab5 458 while ( (o=next()) ){
459 fTree->AddFile(o->GetName());
460 }
461 delete arr;
6e7d7dc4 462 if (!CheckChain()) return;
463 UseConfigFile(fConfigFile.Data());
464 Reload();
465
466}
467//______________________________________________________________________________
798017c7 468void AliTPCCalibViewerGUItime::UseChain(TChain *const chain = 0)
6e7d7dc4 469{
470 //
471 //
472 //
473 fTree=chain;
474 if (!CheckChain()) return;
475 //set configuration file
476 UseConfigFile(fConfigFile.Data());
477 Reload();
478}
479//______________________________________________________________________________
480Bool_t AliTPCCalibViewerGUItime::CheckChain()
481{
482 //
483 // check whether cahin has entries
484 // decide whether to draw graphs in 2D
485 //
486 if (!fTree) return kFALSE;
e6970ab5 487 fTree->Lookup();
6e7d7dc4 488 Long64_t entries=fTree->GetEntries();
489 if (entries==0){
e6970ab5 490 AliError("No entries found in chain");
6e7d7dc4 491 return kFALSE;
6fb51ca4 492 }
6e7d7dc4 493 //check whether to draw graphs
494 CheckDrawGraph();
495 return kTRUE;
496}
497//______________________________________________________________________________
498void AliTPCCalibViewerGUItime::UseConfigFile(const char* file)
499{
500 //
501 // Use 'file' as configuration file
502 //
503 fConfigFile=file;
504 fConfigParser->ParseConfigFileTxt(fConfigFile.Data());
505 FillCalibTypes();
5312f439 506}
507//______________________________________________________________________________
6fb51ca4 508void AliTPCCalibViewerGUItime::FillRunTypes()
509{
5312f439 510 //
6fb51ca4 511 //Loop over the tree entries and fill the run types
5312f439 512 //
6fb51ca4 513 if (!fTree) return;
5312f439 514 Int_t id=0;
5312f439 515 fComboRunType->RemoveAll();
516 fComboRunType->AddEntry("ALL",id++);
517 fComboRunType->Select(0,kFALSE);
6e7d7dc4 518 if (!fTree->GetBranch("runType.")) return;
5312f439 519 TObjString *runType=0x0;
520 Int_t nevets=fTree->GetEntries();
5312f439 521 fTree->SetBranchStatus("*",0);
522 fTree->SetBranchStatus("runType.*",1);
e6970ab5 523 fTree->SetBranchAddress("runType.",&runType);
5312f439 524 for (Int_t iev=0;iev<nevets;++iev){
525 fTree->GetEntry(iev);
526 TString type=runType->String();
527 if (!type.IsNull()&&!fComboRunType->FindEntry(type)) fComboRunType->AddEntry(type,id++);
528 }
e6970ab5 529 fTree->ResetBranchAddresses();
5312f439 530 fTree->SetBranchStatus("*",1);
531}
532//______________________________________________________________________________
6fb51ca4 533void AliTPCCalibViewerGUItime::FillCalibTypes()
534{
535 //
536 // loop over configuration and fill calibration types
537 //
6fb51ca4 538 Int_t id=0;
539 fListCalibType->RemoveAll();
540 TObject *o=0x0;
541 fConfigParser->ResetIter();
542 TString type;
543 while ( (o=fConfigParser->NextKey()) ){
544 type=fConfigParser->GetData(o,kCalibType);
545 //remove whitespcaces
546 type.Remove(TString::kBoth,' ');
547 type.Remove(TString::kBoth,'\t');
548 if (type.IsNull()) type="UNSPECIFIED";
549// printf("CalibType: '%s'\n",type.Data());
550 if (!fListCalibType->FindEntry(type.Data())) {
551 fListCalibType->AddEntry(type,id);
552 fListCalibType->Select(id++);
553 }
554 }
555 //add type for unspecified calibration type
556 type="UNSPECIFIED";
557 if (!fListCalibType->FindEntry(type.Data())) {
558 fListCalibType->AddEntry(SubstituteUnderscores(type.Data()),id);
559 fListCalibType->Select(id++);
560 }
561}
562//______________________________________________________________________________
6e7d7dc4 563void AliTPCCalibViewerGUItime::CheckDrawGraph()
564{
565 //
566 // Check whether to draw graphs in 2D mode based on the number of entries in the chain
567 // GetEstimate() returns the maximum size of the arrays stored in GetV1()...
568 //
569 if (!fTree) return;
570 fNoGraph=kTRUE;
571 if (fTree->GetEntries()<fTree->GetEstimate()) fNoGraph=kFALSE;
572}
573//______________________________________________________________________________
574void AliTPCCalibViewerGUItime::Reload(Int_t first)
575{
6fb51ca4 576 //
577 // reload the gui contents, this is needed after the input tree has changed
578 //
579
580 if ( !fTree ) return;
581 //in case of the first call create run type and calibration type entries
582 if (first){
583 FillRunTypes();
584 FillCalibTypes();
585 }
586 //activate all branches
587 fTree->SetBranchStatus("*",1);
588 //reset variables list
589 fListVariables->RemoveAll();
590 //get selected calibration types
591 TList calibTypes;
592 fListCalibType->GetSelectedEntries(&calibTypes);
593
594 TObjArray *branchList = fTree->GetListOfBranches();
595 if ( !branchList ) return;
596 TIter nextBranch(branchList);
597 Int_t idCount=0,id=0;
598 TObject *objBranch=0;
599 while ( (objBranch=nextBranch()) ){
600 TString branchName(objBranch->GetName());
601 TString branchTitle(objBranch->GetName());
602 if (branchName == "run" || branchName == "time" || branchName == "runType.") continue;
603 Bool_t active=kTRUE;
604 TString calibType="UNSPECIFIED";
605 if (fConfigParser){
606 const TObject *key=(*fConfigParser)(branchName.Data());
607 if (key){
608 //test if branch is active
609 active=fConfigParser->GetValue(branchName.Data(),kBranchOnOff);
610 id=(*fConfigParser)()->IndexOf(key);
892226be 611// branchTitle=fConfigParser->GetData(key,kBranchTitle);
6fb51ca4 612 calibType=fConfigParser->GetData(key,kCalibType);
613 }
614 else{
615 id=1000+idCount;
616 }
617 } else {
618 id=idCount;
619 }
e6970ab5 620 if (calibType.IsNull()) calibType="UNSPECIFIED";
6fb51ca4 621 //check if branch is in selected calibration types
622 //if not, don't show it in the list and deactivate the branch.
623 Bool_t calibActive=kFALSE;
624 TIter nextCalib(&calibTypes);
625 TObject *objCalib=0;
e6970ab5 626 while ( (objCalib=nextCalib()) )
6fb51ca4 627 if (calibType==objCalib->GetTitle()) calibActive=kTRUE;
628 active&=calibActive;
629 if (!active){
630 TString s=branchName;
631 if (branchName.EndsWith(".")) s+="*";
949d8707 632// fTree->SetBranchStatus(s.Data(),0);
6fb51ca4 633 continue;
634 }
1d32f273 635// fListVariables->AddEntry(SubstituteUnderscores(branchTitle.Data()),id);
636 fListVariables->AddEntry(branchTitle.Data(),id);
6fb51ca4 637 ++idCount;
638 }
639 //trick to display modifications
1d32f273 640 fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight());
641 fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight());
6fb51ca4 642}
643//______________________________________________________________________________
7390f655 644void AliTPCCalibViewerGUItime::AddReferenceTree(const char* treeFileName, const char* refName)
645{
646 //
647 // map of reference trees that should always be attached to the CalibViewerGUI
648 //
649 fMapRefTrees->Add(new TObjString(refName), new TObjString(treeFileName));
650
651}
652//______________________________________________________________________________
5312f439 653const char* AliTPCCalibViewerGUItime::GetDrawString(){
654 //
655 // create draw string for ttree by combining the user requestsa
656 //
657
658 TString selectedVariable="";
6fb51ca4 659 Int_t id=-1;
660 if (!fListVariables->GetSelectedEntry()) return "";
661 selectedVariable = fListVariables->GetSelectedEntry()->GetTitle();
662 id=fListVariables->GetSelectedEntry()->EntryId();
663// printf("id: %d\n",id);
664 TString branchName=selectedVariable;
a3b590cf 665 if (fConfigParser){
666 const TObject *key=(*fConfigParser)(id);
667 if (key) branchName=(*fConfigParser)(id)->GetName();
668 }
5312f439 669 //treat case of TVector
6fb51ca4 670 if (branchName.EndsWith(".")){
5312f439 671 Int_t par = (Int_t)(fNmbPar->GetNumber());
6fb51ca4 672 branchName.Append(Form("fElements[%d]",par));
5312f439 673 }
674// if (fRadioXrun->GetState()==kButtonDown)
675// selectedVariable.Append(":run");
676// if (fRadioXtime->GetState()==kButtonDown)
677// selectedVariable.Append(":time");
678
6fb51ca4 679 return branchName.Data();
5312f439 680}
681//______________________________________________________________________________
514fcaf7 682const char* AliTPCCalibViewerGUItime::GetDrawOptionString(){
6e7d7dc4 683 //
684 // get user selected draw options
685 //
686 TString drawOpt;
687 if (fComboAddDrawOpt->GetSelectedEntry()) drawOpt=fComboAddDrawOpt->GetSelectedEntry()->GetTitle();
688 if (fChkDrawOptSame->GetState()==kButtonDown && !drawOpt.Contains("same",TString::kIgnoreCase))
689 drawOpt+="same";
690 return drawOpt.Data();
691}
692//______________________________________________________________________________
693void AliTPCCalibViewerGUItime::GetCutString(TString &cutStr){
5312f439 694 //
695 // create cut string
696 //
697 TCut cuts(fComboCustomCuts->GetTextEntry()->GetText());
698 TString runType="";
699 if (fComboRunType->GetSelectedEntry()) runType=fComboRunType->GetSelectedEntry()->GetTitle();
700 if (runType!="ALL"&&!runType.IsNull()) cuts+=Form("runType.String().Data()==\"%s\"",runType.Data());
6e7d7dc4 701 cutStr=cuts.GetTitle();
702}
703//______________________________________________________________________________
93425263 704void AliTPCCalibViewerGUItime::UpdateValueArrays(Bool_t withGraph, const Double_t *xArr)
6e7d7dc4 705{
706 //
707 //
708 //
709 if (!withGraph){
710 fValuesX.ResizeTo(1);
711 fValuesY.ResizeTo(1);
712 fRunNumbers.ResizeTo(1);
713 fTimeStamps.ResizeTo(1);
714 } else {
93425263 715 const Long64_t nrows=fTree->GetSelectedRows();
716 fValuesX.ResizeTo(nrows);
717 fValuesY.ResizeTo(nrows);
718 fRunNumbers.ResizeTo(nrows);
719 fTimeStamps.ResizeTo(nrows);
720 long long *index=new long long[nrows];
721 TMath::Sort(nrows,fTree->GetV2(),index,kFALSE);
722 for (Long64_t i=0; i<nrows; ++i){
723 fValuesX.GetMatrixArray()[i]=xArr[index[i]];
724 fValuesY.GetMatrixArray()[i]=fTree->GetV3()[index[i]];
725 fRunNumbers.GetMatrixArray()[i]=fTree->GetV1()[index[i]];
726 fTimeStamps.GetMatrixArray()[i]=fTree->GetV2()[index[i]];
727 }
728 delete [] index;
6e7d7dc4 729 }
730}
731//______________________________________________________________________________
732void AliTPCCalibViewerGUItime::GetHistogramTitle(TString &title)
733{
734 //
735 // Create string for histogram title
736 //
737
738 title=fDrawString;
739 Int_t pos=title.First(">>");
740 if (pos>0) title=title(0,pos);
1d32f273 741// if (!fIsCustomDraw){
6e7d7dc4 742 if (fRadioXrun->GetState()==kButtonDown){
743 title+=":Run";
744 } else if (fRadioXtime->GetState()==kButtonDown){
745 title+=":Date";
746 }
1d32f273 747// }
6e7d7dc4 748 TString cuts;
749 GetCutString(cuts);
750 TObjArray *arr=title.Tokenize(":");
751 TObject *o=0x0;
752 title+=" {";
753 title+=cuts;
754 title+="}";
755 TIter next(arr,kIterBackward);
756 while ( (o=next()) ){
757 TString varName=o->GetName();
758 title+=";";
759 //substitue variable names with names in configuration file if available
760 if ((*fConfigParser)()->GetEntries()){
761 TString branchName=varName;
762 Int_t par=0;
763 if (branchName.Contains('.')) branchName=branchName(0,branchName.First('.')+1);
764 //chek if a configuration for that branch is available
765 const TObject *oBranch=(*fConfigParser)(branchName.Data());
766 if (oBranch){
767 TString branchTitle=fConfigParser->GetData(oBranch,kBranchTitle);
768 if (!branchTitle.IsNull()){
769 //check for TVectorT type branch
770 //add parameter name if available
771 if (varName.Contains("fElements")){
772 TString parStr=varName(varName.First('[')+1,varName.Length()-varName.First('[')-2);
773 par=parStr.Atoi();
774 branchTitle+=": ";
775 TString yparname=fConfigParser->GetData(oBranch,par+kParamNames);
776 if (!yparname.IsNull()){
777 branchTitle+=yparname;
778 } else {
779 branchTitle+="[";
780 branchTitle+=par;
781 branchTitle+="]";
782 }
783 }
784 }
785 varName=SubstituteUnderscores(branchTitle.Data());
786 }
787 }
788 title+=varName;
789 }
790 delete arr;
5312f439 791}
792//______________________________________________________________________________
7390f655 793void AliTPCCalibViewerGUItime::AdjustYRange()
794{
795 //
796 //
797 //
798 TIter nextGraphicObject(fTrashBox);
799 TObject *o=0x0;
800 Float_t min=0,max=0;
801 while ( (o=nextGraphicObject()) ){
802 if (o->IsA()==TGraph::Class()){
803 TGraph *gr=(TGraph*)o;
804 if (min==max) {
805 min=TMath::MinElement(gr->GetN(),gr->GetY());
806 max=TMath::MaxElement(gr->GetN(),gr->GetY());
807 } else {
808 Float_t currmin=TMath::MinElement(gr->GetN(),gr->GetY());
809 Float_t currmax=TMath::MaxElement(gr->GetN(),gr->GetY());
810 if (currmax>max) max=currmax;
811 if (currmin<min) min=currmin;
812 }
813 }
814 }
815 if (min!=max){
816 if (min!=0) min=min-(max-min)/10;
817 if (max!=0) max=max+(max-min)/10;
818 fCurrentHist->SetMinimum(min);
819 fCurrentHist->SetMaximum(max);
820 }
821}
822//______________________________________________________________________________
5312f439 823void AliTPCCalibViewerGUItime::DoDraw() {
7390f655 824 //
825 // Draw graphics
826 //
5312f439 827 TString drawString=fDrawString;
6e7d7dc4 828 TString cutString;
829 GetCutString(cutString);
514fcaf7 830 TString optString = GetDrawOptionString();
6e7d7dc4 831 Bool_t graphOutput=!fNoGraph; //ttree buffer for V1, V2... too small
832 graphOutput&=(drawString.First(">>")<0); //histogram output in custom draw
833 graphOutput&=fRadioXhist->GetState()!=kButtonDown; //histogram drawing selected
514fcaf7 834// graphOutput&=!(fIsCustomDraw&&!fDrawString.Contains(":")); //custom draw 1D
835// graphOutput&=fDrawString.CountChar(':')<2; //custom draw 1D
836 if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist);
1d32f273 837 if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist);
6e7d7dc4 838 Bool_t drawSame=optString.Contains("same",TString::kIgnoreCase);
839// optString+="goff";
840 if (graphOutput) {
841 drawString.Prepend("run:time:");
842 optString="goff";
843 }else{
1d32f273 844// if (!fIsCustomDraw){
6e7d7dc4 845 if (fRadioXrun->GetState()==kButtonDown){
846 drawString+=":run";
847 } else if (fRadioXtime->GetState()==kButtonDown){
848 drawString+=":time";
849 }
1d32f273 850// }
6e7d7dc4 851 }
5312f439 852 TVirtualPad *padsave=gPad;
853 fCanvMain->GetCanvas()->cd();
6e7d7dc4 854 //delete old histograms and graphs
855 if (!drawSame){
856 fTrashBox->Delete();
5312f439 857 fCurrentGraph=0x0;
5312f439 858 fCurrentHist=0x0;
859 }
5312f439 860 //select data
861 fTree->Draw(drawString.Data(),cutString.Data(),optString.Data());
862 if (fTree->GetSelectedRows()==-1) return;
93425263 863
6e7d7dc4 864 TString title;
865 GetHistogramTitle(title);
5312f439 866 Bool_t drawGraph=kFALSE;
93425263 867 Double_t *xArr=0;
6e7d7dc4 868 if (graphOutput){
514fcaf7 869 drawGraph=kTRUE;
870 if (fIsCustomDraw&&fDrawString.Contains(":")){
93425263 871// fValuesX.SetElements(fTree->GetV4());
872 xArr=fTree->GetV4();
6e7d7dc4 873 }else{
6e7d7dc4 874 if (fRadioXrun->GetState()==kButtonDown){
93425263 875// fValuesX.SetElements(fTree->GetV1());
876 xArr=fTree->GetV1();
6e7d7dc4 877 } else if (fRadioXtime->GetState()==kButtonDown){
93425263 878// fValuesX.SetElements(fTree->GetV2());
879 xArr=fTree->GetV2();
6e7d7dc4 880 } else {
881 drawGraph=kFALSE;
6fb51ca4 882 }
883 }
514fcaf7 884 }
a3b590cf 885 if (xArr) UpdateValueArrays(graphOutput, xArr);
514fcaf7 886// if (graphOutput){
887// if (fIsCustomDraw){
888// if (fDrawString.Contains(":")){
889// fValuesX.SetElements(fTree->GetV4());
890// drawGraph=kTRUE;
891// } else {
892// drawGraph=kFALSE;
893// }
894// }else{
895// drawGraph=kTRUE;
896// if (fRadioXrun->GetState()==kButtonDown){
897// fValuesX.SetElements(fTree->GetV1());
898// } else if (fRadioXtime->GetState()==kButtonDown){
899// fValuesX.SetElements(fTree->GetV2());
900// } else {
901// drawGraph=kFALSE;
902// }
903// }
904// }
905//create graph according to selection
5312f439 906 if (drawGraph){
6e7d7dc4 907 TGraph *graph=new TGraph(fValuesX,fValuesY);
908 TString grDraw="p";
909 if (!drawSame) grDraw+="a";
910 if (!fIsCustomDraw) grDraw+="l";
911 graph->Draw(grDraw.Data());
912 graph->SetEditable(kFALSE);
913 TH1 *hist=graph->GetHistogram();
914 hist->SetTitle(title.Data());
915 fTrashBox->Add(graph);
916 graph->SetLineColor(fTrashBox->GetEntries());
917 graph->SetMarkerColor(fTrashBox->GetEntries());
918 if (!drawSame) {
919 fCurrentGraph=graph;
920 fCurrentHist=hist;
921 }
5312f439 922 } else {
6e7d7dc4 923 TH1 *hist=fTree->GetHistogram();
924 hist->SetTitle(title.Data());
925// hist->Draw(optString.Data());
926 fTrashBox->Add(hist);
927 hist->SetLineColor(fTrashBox->GetEntries());
928 hist->SetMarkerColor(fTrashBox->GetEntries());
929 if (!drawSame) fCurrentHist=hist;
5312f439 930 }
931
5312f439 932 //Set time axis if choosen as x-variables
1d32f273 933// if (fRadioXtime->GetState()==kButtonDown&&!fIsCustomDraw&&!drawSame){
934 if (fRadioXtime->GetState()==kButtonDown&&!drawSame){
5312f439 935 TAxis *xaxis=fCurrentHist->GetXaxis();
936 xaxis->SetTimeFormat("#splitline{%d.%m}{%H:%M}");
937 xaxis->SetTimeDisplay(1);
938 xaxis->SetLabelOffset(xaxis->GetLabelOffset()*3);
939 xaxis->SetLabelSize(xaxis->GetLabelSize()/1.3);
940 }
7390f655 941 if (!drawSame) {
6fb51ca4 942 //Set title offset
7390f655 943 fCurrentHist->GetYaxis()->SetTitleOffset(1.5);
944 } else {
945 //adjust y-range
946 AdjustYRange();
947 }
5312f439 948 gPad->Modified();
949 gPad->Update();
950 padsave->cd();
951}
952
953//______________________________________________________________________________
954void AliTPCCalibViewerGUItime::DoDumpRuns()
955{
956 //
957 // Dump the current run numbers to stdout
958 //
6fb51ca4 959 Int_t npoints=fRunNumbers.GetNrows();
960 Int_t *sortIndex = new Int_t[npoints];
961 TMath::Sort(npoints,fRunNumbers.GetMatrixArray(),sortIndex,kFALSE);
962 Int_t run=0, prevRun=-1;
963
964 for (Int_t irun=0;irun<npoints;++irun){
965 run=(Int_t)fRunNumbers.GetMatrixArray()[sortIndex[irun]];
966 if (run!=prevRun) std::cout << Form("%d",run) << std::endl;
967 prevRun=run;
5312f439 968 }
4ce766eb 969 delete [] sortIndex;
5312f439 970}
971//______________________________________________________________________________
972void AliTPCCalibViewerGUItime::DoParLimitChange()
973{
974 //
975 //
976 //
6fb51ca4 977 UpdateParName();
5312f439 978 DoDraw();
979}
980//______________________________________________________________________________
981void AliTPCCalibViewerGUItime::DoNewSelection() {
982 //
983 // decides whether to redraw if user makes another selection
984 //
985 UpdateParLimits();
986 fDrawString=GetDrawString();
987 fIsCustomDraw=kFALSE;
988 DoDraw();
989}
990//______________________________________________________________________________
991void AliTPCCalibViewerGUItime::DoCustomDraw()
992{
993 //
994 //
995 //
996 fDrawString=fComboCustomDraw->GetTextEntry()->GetText();
6e7d7dc4 997// if (fDrawString.Contains(">>")){
998// Warning("DoCustomDraw","Currently no user defined histograms allowed!");
999// return;
1000// }
1001 fNmbPar->SetState(kFALSE);
5312f439 1002 fIsCustomDraw=kTRUE;
1003 DoDraw();
1004}
1005//______________________________________________________________________________
1006void AliTPCCalibViewerGUItime::DoCustomCutsDraw()
1007{
1008 //
1009 //
1010 //
1011 if (fIsCustomDraw) DoCustomDraw();
1012 else {
1013 fDrawString=GetDrawString();
1014 fIsCustomDraw=kFALSE;
1015 DoDraw();
1016 }
1017}
1018//______________________________________________________________________________
1019void AliTPCCalibViewerGUItime::HandleButtonsDrawSel(Int_t id)
1020{
1021 //
1022 // Draw selection button handling (x-variable)
1023 //
1024
1025 if (id == -1) {
1026 TGButton *btn = (TGButton *) gTQSender;
1027 id = btn->WidgetId();
1028 }
1029
1030 Bool_t doDraw=kFALSE;
1d32f273 1031 Bool_t noDraw=kFALSE;
1032 if (id<-1){
1033 noDraw=kTRUE;
1034 id=TMath::Abs(id);
1035 }
5312f439 1036 switch (id) {
1037 case (kRadioXhist):
1038 doDraw=(fRadioXtime->GetState()==kButtonDown||fRadioXrun->GetState()==kButtonDown);
1039 if (doDraw){
1040 fRadioXrun->SetState(kButtonUp);
1041 fRadioXtime->SetState(kButtonUp);
1d32f273 1042 fRadioXhist->SetState(kButtonDown);
5312f439 1043 }
1044 break;
1045 case (kRadioXrun):
1046 doDraw=(fRadioXtime->GetState()==kButtonDown||fRadioXhist->GetState()==kButtonDown);
1047 if (doDraw){
1048 fRadioXhist->SetState(kButtonUp);
1049 fRadioXtime->SetState(kButtonUp);
1d32f273 1050 fRadioXrun->SetState(kButtonDown);
5312f439 1051 }
1052 break;
1053 case (kRadioXtime):
1054 doDraw=(fRadioXhist->GetState()==kButtonDown||fRadioXrun->GetState()==kButtonDown);
1055 if (doDraw){
1056 fRadioXrun->SetState(kButtonUp);
1057 fRadioXhist->SetState(kButtonUp);
1d32f273 1058 fRadioXtime->SetState(kButtonDown);
5312f439 1059 }
1060 break;
1061 }
1d32f273 1062 if (doDraw&&!noDraw) DoCustomCutsDraw();
5312f439 1063}
1064//______________________________________________________________________________
6fb51ca4 1065void AliTPCCalibViewerGUItime::UpdateParName()
1066{
1067 //
1068 // change parameter name
1069 //
1070
1071 Int_t par = (Int_t)(fNmbPar->GetNumber());
7390f655 1072 TString parName="";
6fb51ca4 1073 Int_t id=fListVariables->GetSelectedEntry()->EntryId();
1074 if (fConfigParser && (*fConfigParser)(id)) parName=fConfigParser->GetData((*fConfigParser)(id),par+kParamNames);
7390f655 1075 if (parName=="") parName.Form("%d",par);
6fb51ca4 1076 fLblPar->SetText(Form("Parameter: %s",parName.Data()));
1077 fDrawString=GetDrawString();
1078 fIsCustomDraw=kFALSE;
1079}
1080
1081//______________________________________________________________________________
5312f439 1082void AliTPCCalibViewerGUItime::UpdateParLimits()
1083{
1084 //
1085 // Adjust limits for TVectorT based variables
1086 //
1087 if (!fTree) return;
6fb51ca4 1088 TString selectedVariableTitle="";
1089 Int_t id=-1;
1090 if (!fListVariables->GetSelectedEntry()) return;
1091 selectedVariableTitle = fListVariables->GetSelectedEntry()->GetTitle();
1092 id=fListVariables->GetSelectedEntry()->EntryId();
1093// printf("id: %d\n",id);
1094 TString selectedVariable=selectedVariableTitle;
1095 const TObject *key=(*fConfigParser)(id);
1096 if (key) selectedVariable=(*fConfigParser)(id)->GetName();
1097
5312f439 1098 if (selectedVariable.IsNull()||!selectedVariable.EndsWith(".")) {
1099 fNmbPar->SetState(kFALSE);
6fb51ca4 1100 fLblPar->SetText("Parameter: none");
5312f439 1101 return;
1102 }
1103 TVectorD *vD=0x0;
1104 TVectorF *vF=0x0;
1105 Int_t maxPar=0;
e6970ab5 1106 fTree->GetEntry(1);
1107 TBranch *branch=fTree->GetTree()->GetBranch(selectedVariable.Data());
5312f439 1108 TString branchClass=branch->GetClassName();
e6970ab5 1109 Int_t event=0;
5312f439 1110 if (branchClass=="TVectorT<double>"){
e6970ab5 1111// branch->SetAddress(&vD);
1112 fTree->SetBranchAddress(selectedVariable.Data(),&vD);
1113 while (maxPar<2&&event<fTree->GetEntries()){
1114 fTree->GetEntry(event++);
1115 maxPar=vD->GetNrows();
1116 }
5312f439 1117 } else if (branchClass=="TVectorT<float>"){
e6970ab5 1118// branch->SetAddress(&vF);
1119 fTree->SetBranchAddress(selectedVariable.Data(),&vF);
1120 while (maxPar<2&&event<fTree->GetEntries()){
1121 fTree->GetEntry(event++);
1122 maxPar=vF->GetNrows();
1123 }
5312f439 1124 } else {
1125 //class not known
1126 fNmbPar->SetState(kFALSE);
1127 return;
1128 }
e6970ab5 1129// branch->ResetAddress();
6e7d7dc4 1130 fTree->SetBranchAddress(selectedVariable.Data(),0x0);
7390f655 1131 if (fNmbPar->GetNumMax()!=maxPar-1) fNmbPar->SetNumber(0);
5312f439 1132 fNmbPar->SetLimitValues(0,maxPar-1);
1133 fNmbPar->SetState(kTRUE);
6fb51ca4 1134 UpdateParName();
5312f439 1135}
1136//______________________________________________________________________________
6fb51ca4 1137void AliTPCCalibViewerGUItime::MouseMove(Int_t event, Int_t x, Int_t y, TObject */*selected*/)
5312f439 1138{
1139 //
1140 // handle mouse events in the draw canvas
1141 //
5312f439 1142 UInt_t dd=0,mm=0,yy=0,HH=0,MM=0,SS=0,run=0;
1143 Double_t valx=0.,valy=0.;
1144 if (!fCurrentGraph) {
909c8c99 1145 fLblRunNumberVal->SetText(Form("%06u",run));
e6970ab5 1146 fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u:%02u:%02u",dd,mm,yy,HH,MM,SS));
892226be 1147 fLblValueXVal->SetText(Form("%.3e", valx));
1148 fLblValueYVal->SetText(Form("%.3e", valy));
5312f439 1149 return;
1150 }
1151 TVirtualPad *padsave=gPad;
1152 fCanvMain->GetCanvas()->cd();
1153 Int_t n=fValuesY.GetNrows();
1154 Double_t *arr=0x0;
1155 arr=fValuesX.GetMatrixArray();
1156
1157 Int_t minDist=1000000;
1158 Int_t minPoint=-1;
1159 for (Int_t i=0;i<n;++i){
1160 Int_t pxp = gPad->XtoAbsPixel(gPad->XtoPad(arr[i]));
1161 Int_t pyp = gPad->YtoAbsPixel(gPad->YtoPad(fValuesY[i]));
e6970ab5 1162 Int_t d = TMath::Nint(TMath::Sqrt(TMath::Abs(pxp-x) + TMath::Abs(pyp-y)));
5312f439 1163 if (d < minDist) {
1164 minDist = d;
1165 minPoint = i;
1166 }
1167 }
1168 if (minDist<2){
1169 TTimeStamp t((Int_t)fTimeStamps[minPoint]);
1170 t.GetDate(kTRUE,0,&yy,&mm,&dd);
1171 t.GetTime(kTRUE,0,&HH,&MM,&SS);
1172 run=(UInt_t)fRunNumbers[minPoint];
1173 valx=fValuesX[minPoint];
1174 valy=fValuesY[minPoint];
1175 } else {
1176 dd=0;mm=0;yy=0;HH=0;MM=0;SS=0;run=0;
1177 valx=0.;
1178 valy=0.;
1179 }
909c8c99 1180 fLblRunNumberVal->SetText(Form("%06u",run));
5312f439 1181 fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u.%02u.%02u",dd,mm,yy,HH,MM,SS));
1182 if (fIsCustomDraw){
892226be 1183 fLblValueXVal->SetText(Form("%.3e", valx));
5312f439 1184 }else{
1185 if (fRadioXrun->GetState()==kButtonDown){
1186 fLblValueXVal->SetText("Run");
1187 } else if (fRadioXtime->GetState()==kButtonDown){
1188 fLblValueXVal->SetText("Time");
1189 }
1190 }
892226be 1191 fLblValueYVal->SetText(Form("%.3e", valy));
5312f439 1192 padsave->cd();
1193 if (run==0) return;
1194 if (event == kButton1Double ){
1195 SetGuiTree(run);
1196 }
1197 //find closes point of current selection
1198}
1199//______________________________________________________________________________
1200void AliTPCCalibViewerGUItime::SetGuiTree(Int_t run)
1201{
1202 //
1203 // create the AliTPCCalibViewerGUI tree for run
1204 // cache tree in directory fOutputCacheDir
1205 // retrieve file from this directory if it already exists
1206 //
1207
949d8707 1208 //
1209 //Create and set GUI tree
1210 //
5312f439 1211 //try to find file for run in fOutputCacheDir
1212 TString fileName=fOutputCacheDir;
1213 if (!fileName.EndsWith("/")) fileName+="/";
1214 fileName+=Form("guiTreeRun_%d.root",run);
7390f655 1215 Bool_t load=kTRUE;
949d8707 1216 if (gSystem->AccessPathName(fileName.Data())){
7390f655 1217 load=AliTPCcalibDB::CreateGUITree(run,fileName.Data());
1218 if (!load){
1219 fCalibViewerGUI->Reset();
1220 if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - XXXXX")));
1221 return;
1222 }
5312f439 1223 }
7390f655 1224 fCalibViewerGUI->Initialize(fileName.Data());
1225 if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - %05d",run)));
949d8707 1226
1227 //
1228 //Create and set Reference GUI tree
1229 //
1230 AliTPCcalibDButil util;
1231 util.SetReferenceRun(run);
1232 fileName=fOutputCacheDir;
1233 if (!fileName.EndsWith("/")) fileName+="/";
1234 fileName+=util.GetGUIRefTreeDefaultName();
1235 //only update if file does not exist
1236 if (gSystem->AccessPathName(fileName.Data())){
1237 util.UpdateRefDataFromOCDB();
1238 util.CreateGUIRefTree(fileName.Data());
1239 }
1240
1241 fCalibViewerGUI->GetViewer()->AddReferenceTree(fileName.Data(),"calPads","Ref");
1242
1243 //
1244 // Process additional reference trees
1245 //
7390f655 1246 TIter nextRefTree(fMapRefTrees);
1247 TObject *o=0x0;
949d8707 1248 //Set static reference data
7390f655 1249 while ( (o=nextRefTree()) ){
1250 fCalibViewerGUI->GetViewer()->AddReferenceTree(fMapRefTrees->GetValue(o)->GetName(),"calPads",o->GetName());
5312f439 1251 }
7390f655 1252 fCalibViewerGUI->Reload();
5312f439 1253}
1254//______________________________________________________________________________
6fb51ca4 1255const char* AliTPCCalibViewerGUItime::SubstituteUnderscores(const char* in)
1256{
1257 //
1258 //
1259 //
1260 TString s(in);
1261 s.ReplaceAll("_{","|{");
1262 s.ReplaceAll("_"," ");
1263 s.ReplaceAll("|{","_{");
1264 return s.Data();
1265}
514fcaf7 1266
1267//______________________________________________________________________________
1268void AliTPCCalibViewerGUItime::DoNewSelectionAliases()
1269{
1270 //
1271 //
1272 //
1273 if (!fTree) return;
1274 TList *l=fTree->GetListOfAliases();
1275 if (!l) return;
1276 TString selectedVariable="";
1277 if (!fListAliases->GetSelectedEntry()) return;
1278 selectedVariable = fListAliases->GetSelectedEntry()->GetTitle();
1279 fDrawString=selectedVariable;
1280 fIsCustomDraw=kFALSE;
1281 DoDraw();
1282}
1283//______________________________________________________________________________
1284void AliTPCCalibViewerGUItime::DoAddAlias()
1285{
1286 //
1287 //
1288 //
1289 new AliTPCCalibViewerGUItimeAddAliasFrame(gClient->GetRoot(), fContTopBottom, 400, 200, kVerticalFrame, this);
1290}
1291//______________________________________________________________________________
1292void AliTPCCalibViewerGUItime::DoDelAlias()
1293{
1294 //
1295 //
1296 //
1297 if (!fTree) return;
1298 TList *l=fTree->GetListOfAliases();
1299 if (!l) return;
1300 TString selectedVariable="";
1301 if (!fListAliases->GetSelectedEntry()) return;
1302 selectedVariable = fListAliases->GetSelectedEntry()->GetTitle();
1303 l->Remove(l->FindObject(selectedVariable.Data()));
1304 UpdateAliasList();
1305}
1306
1307//______________________________________________________________________________
1308void AliTPCCalibViewerGUItime::UpdateAliasList()
1309{
1310 //
1311 //
1312 //
1313 printf("UpdateAliasList\n");
1314 if (!fTree) return;
1315 TList *l=fTree->GetListOfAliases();
1316 if (!l) return;
1317 TIter nextAlias(l);
1318 TObject *o;
1319 fListAliases->RemoveAll();
1320 Int_t id=0;
1321 while( (o=nextAlias()) ){
1322 fListAliases->AddEntry(o->GetName(),id++);
1323 }
1324 fListAliases->Resize(fListAliases->GetWidth()-1, fListAliases->GetHeight());
1325 fListAliases->Resize(fListAliases->GetWidth()+1, fListAliases->GetHeight());
1326}
6fb51ca4 1327//______________________________________________________________________________
6e7d7dc4 1328TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName, const char* treeName) {
5312f439 1329 //
1330 // Initialize and show GUI for presentation for demonstration purposes
1331 // or for fast standalone use
1332 //
1333 TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
1334 frmMain->SetWindowName("AliTPCCalibViewer GUItime");
1335 frmMain->SetCleanup(kDeepCleanup);
1336
1337 TGTab* tabMain = new TGTab(frmMain, 1000, 600);
1338 frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
1339
1340 TGCompositeFrame* tabCont1 = tabMain->AddTab("Time");
1341 TGCompositeFrame* tabCont2 = tabMain->AddTab("Detail - XXXXX");
1342
1343 AliTPCCalibViewerGUItime* calibViewerTime = new AliTPCCalibViewerGUItime(tabCont1, 1000, 600);
1344 tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
6e7d7dc4 1345 calibViewerTime->SetConfigFileName("$ALICE_ROOT/TPC/CalibMacros/calibVarDescription.txt");
1346 calibViewerTime->UseFile(fileName, treeName);
5312f439 1347
1348 AliTPCCalibViewerGUI* calibViewer = new AliTPCCalibViewerGUI(tabCont2, 1000, 600, 0);
1349 tabCont2->AddFrame(calibViewer, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
1350 calibViewerTime->SetCalibViewerGUI(calibViewer);
1351 calibViewerTime->SetCalibViewerGUItab(tabMain->GetTabTab(1));
1352
1353
1354 TObjArray *guiArray = new TObjArray();
1355 guiArray->Add(calibViewerTime);
1356 guiArray->Add(calibViewer);
1357
1358 frmMain->MapSubwindows();
1359 frmMain->Resize();
1360 frmMain->MapWindow();
1361
1362 return guiArray;
1363}
1364
6e7d7dc4 1365//______________________________________________________________________________
1366TObjArray* AliTPCCalibViewerGUItime::ShowGUI(TChain *chain) {
1367 //
1368 // Initialize and show GUI for presentation for demonstration purposes
1369 // or for fast standalone use
1370 //
1371 TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
1372 frmMain->SetWindowName("AliTPCCalibViewer GUItime");
1373 frmMain->SetCleanup(kDeepCleanup);
1374
1375 TGTab* tabMain = new TGTab(frmMain, 1000, 600);
1376 frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
1377
1378 TGCompositeFrame* tabCont1 = tabMain->AddTab("Time");
1379
1380 AliTPCCalibViewerGUItime* calibViewerTime = new AliTPCCalibViewerGUItime(tabCont1, 1000, 600);
1381 tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
1382 calibViewerTime->UseChain(chain);
1383
1384 TObjArray *guiArray = new TObjArray();
1385 guiArray->Add(calibViewerTime);
1386
1387 frmMain->MapSubwindows();
1388 frmMain->Resize();
1389 frmMain->MapWindow();
1390
1391 return guiArray;
1392}
514fcaf7 1393
1394
1395////////////////////////////////////////////////////////////////////////
1396//
1397// GUI Alias frame
1398//
1399////////////////////////////////////////////////////////////////////////
1400
1401
1402ClassImp(AliTPCCalibViewerGUItimeAddAliasFrame)
1403
1404AliTPCCalibViewerGUItimeAddAliasFrame::AliTPCCalibViewerGUItimeAddAliasFrame(const TGWindow *p, const TGWindow *main,
1405 UInt_t w, UInt_t h, UInt_t options,
1406 AliTPCCalibViewerGUItime *gui, TString strAlias) :
1407 fMain(0x0),
1408 fTxt1(0x0),
1409 fTxt2(0x0),
1410 fGUI(0x0)
1411{
1412 fMain = new TGTransientFrame(p, main, w, h, options);
1413 fMain->Connect("CloseWindow()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoCancel()");
1414 fMain->DontCallClose(); // to avoid double deletions.
1415
1416 // use hierarchical cleaning
1417 fMain->SetCleanup(kDeepCleanup);
1418
1419 //layout
1420 TGLayoutHints *l1 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2);
1421 TGLayoutHints *l2 = new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandX, 2, 2, 0, 5);
1422// TGLayoutHints *l3 = new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 5, 5, 5);
1423
1424 //input fields
1425 TGCompositeFrame *f1 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame);
1426 fMain->AddFrame(f1, l1);
1427 TGCompositeFrame *frameName = new TGCompositeFrame(f1);
1428 TGCompositeFrame *frameFormula = new TGCompositeFrame(f1);
1429 f1->AddFrame(frameName,l2);
1430 f1->AddFrame(frameFormula,l2);
1431 TGLabel *lblTxt1 = new TGLabel(frameName, "Name:");
1432 TGLabel *lblTxt2 = new TGLabel(frameFormula, "Formula:");
1433 fTxt1 = new TGTextEntry(frameName, new TGTextBuffer(1000));
1434 fTxt2 = new TGTextEntry(frameFormula, new TGTextBuffer(1000));
1435
1436 frameName->AddFrame(lblTxt1, l2);
1437 frameName->AddFrame(fTxt1, l2);
1438 frameFormula->AddFrame(lblTxt2, l2);
1439 frameFormula->AddFrame(fTxt2, l2);
1440
1441 fTxt1->Resize(350, fTxt1->GetDefaultHeight());
1442 fTxt2->Resize(350, fTxt2->GetDefaultHeight());
1443
1444 //ok and cancel buttons
1445 TGHorizontalFrame *frame = new TGHorizontalFrame(fMain, 60, 20, kFixedWidth);
1446
1447 TGTextButton *okButton = new TGTextButton(frame, "&Ok", 1);
1448 okButton->Connect("Clicked()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoOK()");
1449 TGTextButton *cancelButton = new TGTextButton(frame, "&Cancel", 2);
1450 cancelButton->Connect("Clicked()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoCancel()");
1451
1452
1453 frame->AddFrame(okButton, l1);
1454 frame->AddFrame(cancelButton, l1);
1455
1456 frame->Resize(150, okButton->GetDefaultHeight());
1457
1458 fMain->AddFrame(frame, new TGLayoutHints(kLHintsBottom | kLHintsRight, 2, 2, 5, 1));
1459
1460 fGUI=gui;
1461 TString aliasName, alias;
1462 if (!strAlias.IsNull()){
1463 TChain *c=fGUI->GetChain();
1464 if (c){
1465 TList *l=c->GetListOfAliases();
1466 if (l){
1467 TNamed *d=(TNamed*)l->FindObject(strAlias);
1468 if (d){
1469 aliasName=d->GetName();
1470 alias=d->GetTitle();
1471 }
1472 }
1473 }
1474 }else{
1475 alias=fGUI->GetCustomDrawString();
1476 }
1477 fTxt1->SetText(aliasName.Data(),kFALSE);
1478 fTxt2->SetText(alias.Data(),kFALSE);
1479
1480 fMain->MapSubwindows();
1481 fMain->Resize();
1482
1483 // position relative to the parent's window
1484 fMain->CenterOnParent();
1485
1486 fMain->SetWindowName("Alias Editor");
1487
1488 fMain->MapWindow();
1489
1490}
1491//______________________________________________________________________________
1492AliTPCCalibViewerGUItimeAddAliasFrame::~AliTPCCalibViewerGUItimeAddAliasFrame()
1493{
1494 //
1495 //
1496 //
1497 fMain->DeleteWindow(); // deletes fMain
1498}
1499//______________________________________________________________________________
1500void AliTPCCalibViewerGUItimeAddAliasFrame::DoOK()
1501{
1502 //
1503 //
1504 //
1505 TString aliasName=fTxt1->GetText();
1506 TString alias=fTxt2->GetText();
1507 if (!aliasName.IsNull()&&!alias.IsNull()){
1508 TChain *c=fGUI->GetChain();
1509 if (c){
1510 c->SetAlias(aliasName.Data(),alias.Data());
1511 }
1512 }
1513 fGUI->UpdateAliasList();
1514 delete this;
1515}
1516//______________________________________________________________________________
1517void AliTPCCalibViewerGUItimeAddAliasFrame::DoCancel()
1518{
1519 //
1520 //
1521 //
1522 delete this;
1523}
1524