]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - TPC/AliTPCCalibViewerGUItime.cxx
Coverity fix:
[u/mrichter/AliRoot.git] / TPC / AliTPCCalibViewerGUItime.cxx
... / ...
CommitLineData
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
22
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>
34#include <TSystem.h>
35#include <TVector.h>
36#include <TH1.h>
37#include <TCut.h>
38#include <TFile.h>
39#include <TTree.h>
40#include <TChain.h>
41#include <TBranch.h>
42#include <TIterator.h>
43#include <TGraph.h>
44#include <TAxis.h>
45#include <TTimeStamp.h>
46#include <TMath.h>
47#include <TMap.h>
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
65#include <AliLog.h>
66#include "AliTPCCalibViewerGUI.h"
67#include "AliTPCCalibViewer.h"
68#include "AliTPCcalibDB.h"
69#include "AliTPCcalibDButil.h"
70#include "AliTPCConfigParser.h"
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(""),
87 fConfigFile(""),
88 fConfigParser(new AliTPCConfigParser),
89 fIsCustomDraw(kFALSE),
90 fRunNumbers(10),
91 fTimeStamps(10),
92 fValuesX(10),
93 fValuesY(10),
94 fNoGraph(kFALSE),
95 fGraphLimitEntries(10000),
96 fMapRefTrees(new TMap),
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),
104 fContDrawOpt(0x0),
105 fChkDrawOptSame(0x0),
106 fComboAddDrawOpt(0x0),
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),
117 fListCalibType(0x0),
118 fContCalibType(0x0),
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),
134 fContAliases(0x0),
135 fListAliases(0x0),
136 //content bottom
137 fContCustom(0x0),
138 fContCustomCuts(0x0),
139 fLblCustomDraw(0x0),
140 fLblCustomCuts(0x0),
141 fComboCustomDraw(0x0),
142 fComboCustomCuts(0x0),
143 fTrashBox(new TObjArray)
144{
145 //
146 // ctor
147 //
148 fMapRefTrees->SetOwnerKeyValue();
149 fTrashBox->SetOwner();
150 DrawGUI(p,w,h);
151 gStyle->SetMarkerStyle(20);
152 gStyle->SetMarkerSize(0.5);
153 SetInitialValues();
154}
155//______________________________________________________________________________
156AliTPCCalibViewerGUItime::~AliTPCCalibViewerGUItime(){
157 //
158 // dtor
159 //
160 delete fConfigParser;
161 delete fTrashBox;
162 delete fMapRefTrees;
163}
164//______________________________________________________________________________
165void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h) {
166 //
167 // draw the GUI
168 //
169 // ======================================================================
170 // ************************* Display everything *************************
171 // ======================================================================
172
173 SetCleanup(kDeepCleanup);
174
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 ---
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
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
262
263//-------------------- run type selection ------------------------
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
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
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.");
310 fCanvMain->GetCanvas()->SetRightMargin(0.062);
311 fCanvMain->GetCanvas()->SetLeftMargin(0.15);
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
328 fLblRunNumberVal = new TGLabel(fContValues, "000000");
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
344 fLblValueXVal = new TGLabel(fContValues, "00.000e+00");
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
352 fLblValueYVal = new TGLabel(fContValues, "00.000e+00");
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");
357 fContRight->AddFrame(fBtnDumpRuns, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
358 fBtnDumpRuns->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDumpRuns()");
359 fBtnDumpRuns->SetToolTipText("Press to dump the run numbers of the current selection.");
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
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));
429 fComboCustomCuts->Connect("ReturnPressed()", "AliTPCCalibViewerGUItime", this, "DoCustomCutsDraw()");
430 fComboCustomCuts->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoCustomCutsDraw()");
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//______________________________________________________________________________
447void AliTPCCalibViewerGUItime::UseFile(const char* fileName, const char* treeName) {
448 //
449 // retrieve tree from file
450 //
451 TString s=gSystem->GetFromPipe(Form("ls %s",fileName));
452// TString s(fileName);
453 TObjArray *arr=s.Tokenize("\n");
454 TIter next(arr);
455 TObject *o=0;
456 if (fTree) delete fTree;
457 fTree=new TChain(treeName);
458 while ( (o=next()) ){
459 fTree->AddFile(o->GetName());
460 }
461 delete arr;
462 if (!CheckChain()) return;
463 UseConfigFile(fConfigFile.Data());
464 Reload();
465
466}
467//______________________________________________________________________________
468void AliTPCCalibViewerGUItime::UseChain(TChain *const chain = 0)
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;
487 fTree->Lookup();
488 Long64_t entries=fTree->GetEntries();
489 if (entries==0){
490 AliError("No entries found in chain");
491 return kFALSE;
492 }
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();
506}
507//______________________________________________________________________________
508void AliTPCCalibViewerGUItime::FillRunTypes()
509{
510 //
511 //Loop over the tree entries and fill the run types
512 //
513 if (!fTree) return;
514 Int_t id=0;
515 fComboRunType->RemoveAll();
516 fComboRunType->AddEntry("ALL",id++);
517 fComboRunType->Select(0,kFALSE);
518 if (!fTree->GetBranch("runType.")) return;
519 TObjString *runType=0x0;
520 Int_t nevets=fTree->GetEntries();
521 fTree->SetBranchStatus("*",0);
522 fTree->SetBranchStatus("runType.*",1);
523 fTree->SetBranchAddress("runType.",&runType);
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 }
529 fTree->ResetBranchAddresses();
530 fTree->SetBranchStatus("*",1);
531}
532//______________________________________________________________________________
533void AliTPCCalibViewerGUItime::FillCalibTypes()
534{
535 //
536 // loop over configuration and fill calibration types
537 //
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//______________________________________________________________________________
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{
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);
611// branchTitle=fConfigParser->GetData(key,kBranchTitle);
612 calibType=fConfigParser->GetData(key,kCalibType);
613 }
614 else{
615 id=1000+idCount;
616 }
617 } else {
618 id=idCount;
619 }
620 if (calibType.IsNull()) calibType="UNSPECIFIED";
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;
626 while ( (objCalib=nextCalib()) )
627 if (calibType==objCalib->GetTitle()) calibActive=kTRUE;
628 active&=calibActive;
629 if (!active){
630 TString s=branchName;
631 if (branchName.EndsWith(".")) s+="*";
632// fTree->SetBranchStatus(s.Data(),0);
633 continue;
634 }
635// fListVariables->AddEntry(SubstituteUnderscores(branchTitle.Data()),id);
636 fListVariables->AddEntry(branchTitle.Data(),id);
637 ++idCount;
638 }
639 //trick to display modifications
640 fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight());
641 fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight());
642}
643//______________________________________________________________________________
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//______________________________________________________________________________
653const char* AliTPCCalibViewerGUItime::GetDrawString(){
654 //
655 // create draw string for ttree by combining the user requestsa
656 //
657
658 TString selectedVariable="";
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;
665 if (fConfigParser){
666 const TObject *key=(*fConfigParser)(id);
667 if (key) branchName=(*fConfigParser)(id)->GetName();
668 }
669 //treat case of TVector
670 if (branchName.EndsWith(".")){
671 Int_t par = (Int_t)(fNmbPar->GetNumber());
672 branchName.Append(Form("fElements[%d]",par));
673 }
674// if (fRadioXrun->GetState()==kButtonDown)
675// selectedVariable.Append(":run");
676// if (fRadioXtime->GetState()==kButtonDown)
677// selectedVariable.Append(":time");
678
679 return branchName.Data();
680}
681//______________________________________________________________________________
682const char* AliTPCCalibViewerGUItime::GetDrawOptionString(){
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){
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());
701 cutStr=cuts.GetTitle();
702}
703//______________________________________________________________________________
704void AliTPCCalibViewerGUItime::UpdateValueArrays(Bool_t withGraph, const Double_t *xArr)
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 {
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;
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);
741// if (!fIsCustomDraw){
742 if (fRadioXrun->GetState()==kButtonDown){
743 title+=":Run";
744 } else if (fRadioXtime->GetState()==kButtonDown){
745 title+=":Date";
746 }
747// }
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;
791}
792//______________________________________________________________________________
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//______________________________________________________________________________
823void AliTPCCalibViewerGUItime::DoDraw() {
824 //
825 // Draw graphics
826 //
827 TString drawString=fDrawString;
828 TString cutString;
829 GetCutString(cutString);
830 TString optString = GetDrawOptionString();
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
834// graphOutput&=!(fIsCustomDraw&&!fDrawString.Contains(":")); //custom draw 1D
835// graphOutput&=fDrawString.CountChar(':')<2; //custom draw 1D
836 if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist);
837 if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist);
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{
844// if (!fIsCustomDraw){
845 if (fRadioXrun->GetState()==kButtonDown){
846 drawString+=":run";
847 } else if (fRadioXtime->GetState()==kButtonDown){
848 drawString+=":time";
849 }
850// }
851 }
852 TVirtualPad *padsave=gPad;
853 fCanvMain->GetCanvas()->cd();
854 //delete old histograms and graphs
855 if (!drawSame){
856 fTrashBox->Delete();
857 fCurrentGraph=0x0;
858 fCurrentHist=0x0;
859 }
860 //select data
861 fTree->Draw(drawString.Data(),cutString.Data(),optString.Data());
862 if (fTree->GetSelectedRows()==-1) return;
863
864 TString title;
865 GetHistogramTitle(title);
866 Bool_t drawGraph=kFALSE;
867 Double_t *xArr=0;
868 if (graphOutput){
869 drawGraph=kTRUE;
870 if (fIsCustomDraw&&fDrawString.Contains(":")){
871// fValuesX.SetElements(fTree->GetV4());
872 xArr=fTree->GetV4();
873 }else{
874 if (fRadioXrun->GetState()==kButtonDown){
875// fValuesX.SetElements(fTree->GetV1());
876 xArr=fTree->GetV1();
877 } else if (fRadioXtime->GetState()==kButtonDown){
878// fValuesX.SetElements(fTree->GetV2());
879 xArr=fTree->GetV2();
880 } else {
881 drawGraph=kFALSE;
882 }
883 }
884 }
885 if (xArr) UpdateValueArrays(graphOutput, xArr);
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
906 if (drawGraph){
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 }
922 } else {
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;
930 }
931
932 //Set time axis if choosen as x-variables
933// if (fRadioXtime->GetState()==kButtonDown&&!fIsCustomDraw&&!drawSame){
934 if (fRadioXtime->GetState()==kButtonDown&&!drawSame){
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 }
941 if (!drawSame) {
942 //Set title offset
943 fCurrentHist->GetYaxis()->SetTitleOffset(1.5);
944 } else {
945 //adjust y-range
946 AdjustYRange();
947 }
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 //
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;
968 }
969 delete [] sortIndex;
970}
971//______________________________________________________________________________
972void AliTPCCalibViewerGUItime::DoParLimitChange()
973{
974 //
975 //
976 //
977 UpdateParName();
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();
997// if (fDrawString.Contains(">>")){
998// Warning("DoCustomDraw","Currently no user defined histograms allowed!");
999// return;
1000// }
1001 fNmbPar->SetState(kFALSE);
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;
1031 Bool_t noDraw=kFALSE;
1032 if (id<-1){
1033 noDraw=kTRUE;
1034 id=TMath::Abs(id);
1035 }
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);
1042 fRadioXhist->SetState(kButtonDown);
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);
1050 fRadioXrun->SetState(kButtonDown);
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);
1058 fRadioXtime->SetState(kButtonDown);
1059 }
1060 break;
1061 }
1062 if (doDraw&&!noDraw) DoCustomCutsDraw();
1063}
1064//______________________________________________________________________________
1065void AliTPCCalibViewerGUItime::UpdateParName()
1066{
1067 //
1068 // change parameter name
1069 //
1070
1071 Int_t par = (Int_t)(fNmbPar->GetNumber());
1072 TString parName="";
1073 Int_t id=fListVariables->GetSelectedEntry()->EntryId();
1074 if (fConfigParser && (*fConfigParser)(id)) parName=fConfigParser->GetData((*fConfigParser)(id),par+kParamNames);
1075 if (parName=="") parName.Form("%d",par);
1076 fLblPar->SetText(Form("Parameter: %s",parName.Data()));
1077 fDrawString=GetDrawString();
1078 fIsCustomDraw=kFALSE;
1079}
1080
1081//______________________________________________________________________________
1082void AliTPCCalibViewerGUItime::UpdateParLimits()
1083{
1084 //
1085 // Adjust limits for TVectorT based variables
1086 //
1087 if (!fTree) return;
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
1098 if (selectedVariable.IsNull()||!selectedVariable.EndsWith(".")) {
1099 fNmbPar->SetState(kFALSE);
1100 fLblPar->SetText("Parameter: none");
1101 return;
1102 }
1103 TVectorD *vD=0x0;
1104 TVectorF *vF=0x0;
1105 Int_t maxPar=0;
1106 fTree->GetEntry(1);
1107 TBranch *branch=fTree->GetTree()->GetBranch(selectedVariable.Data());
1108 TString branchClass=branch->GetClassName();
1109 Int_t event=0;
1110 if (branchClass=="TVectorT<double>"){
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 }
1117 } else if (branchClass=="TVectorT<float>"){
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 }
1124 } else {
1125 //class not known
1126 fNmbPar->SetState(kFALSE);
1127 return;
1128 }
1129// branch->ResetAddress();
1130 fTree->SetBranchAddress(selectedVariable.Data(),0x0);
1131 if (fNmbPar->GetNumMax()!=maxPar-1) fNmbPar->SetNumber(0);
1132 fNmbPar->SetLimitValues(0,maxPar-1);
1133 fNmbPar->SetState(kTRUE);
1134 UpdateParName();
1135}
1136//______________________________________________________________________________
1137void AliTPCCalibViewerGUItime::MouseMove(Int_t event, Int_t x, Int_t y, TObject */*selected*/)
1138{
1139 //
1140 // handle mouse events in the draw canvas
1141 //
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) {
1145 fLblRunNumberVal->SetText(Form("%06u",run));
1146 fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u:%02u:%02u",dd,mm,yy,HH,MM,SS));
1147 fLblValueXVal->SetText(Form("%.3e", valx));
1148 fLblValueYVal->SetText(Form("%.3e", valy));
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]));
1162 Int_t d = TMath::Nint(TMath::Sqrt(TMath::Abs(pxp-x) + TMath::Abs(pyp-y)));
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 }
1180 fLblRunNumberVal->SetText(Form("%06u",run));
1181 fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u.%02u.%02u",dd,mm,yy,HH,MM,SS));
1182 if (fIsCustomDraw){
1183 fLblValueXVal->SetText(Form("%.3e", valx));
1184 }else{
1185 if (fRadioXrun->GetState()==kButtonDown){
1186 fLblValueXVal->SetText("Run");
1187 } else if (fRadioXtime->GetState()==kButtonDown){
1188 fLblValueXVal->SetText("Time");
1189 }
1190 }
1191 fLblValueYVal->SetText(Form("%.3e", valy));
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
1208 //
1209 //Create and set GUI tree
1210 //
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);
1215 Bool_t load=kTRUE;
1216 if (gSystem->AccessPathName(fileName.Data())){
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 }
1223 }
1224 fCalibViewerGUI->Initialize(fileName.Data());
1225 if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - %05d",run)));
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 //
1246 TIter nextRefTree(fMapRefTrees);
1247 TObject *o=0x0;
1248 //Set static reference data
1249 while ( (o=nextRefTree()) ){
1250 fCalibViewerGUI->GetViewer()->AddReferenceTree(fMapRefTrees->GetValue(o)->GetName(),"calPads",o->GetName());
1251 }
1252 fCalibViewerGUI->Reload();
1253}
1254//______________________________________________________________________________
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}
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}
1327//______________________________________________________________________________
1328TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName, const char* treeName) {
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));
1345 calibViewerTime->SetConfigFileName("$ALICE_ROOT/TPC/CalibMacros/calibVarDescription.txt");
1346 calibViewerTime->UseFile(fileName, treeName);
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
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}
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