]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCCalibViewerGUItime.cxx
Add MCNSD flag to trigger mask
[u/mrichter/AliRoot.git] / TPC / AliTPCCalibViewerGUItime.cxx
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
74 ClassImp(AliTPCCalibViewerGUItime)
75
76 AliTPCCalibViewerGUItime::AliTPCCalibViewerGUItime(const TGWindow *p, UInt_t w, UInt_t h) :
77 TGCompositeFrame(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 //______________________________________________________________________________
156 AliTPCCalibViewerGUItime::~AliTPCCalibViewerGUItime(){
157   //
158   // dtor
159   //
160   delete fConfigParser;
161   delete fTrashBox;
162   delete fMapRefTrees;
163 }
164 //______________________________________________________________________________
165 void 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 //______________________________________________________________________________
438 void AliTPCCalibViewerGUItime::SetInitialValues(){
439   //
440   // Set inital selections of the gui
441   //
442   fRadioXrun->SetState(kButtonDown);
443   fRadioXtime->SetState(kButtonUp);
444 }
445
446 //______________________________________________________________________________
447 void 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 //______________________________________________________________________________
468 void 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 //______________________________________________________________________________
480 Bool_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 //______________________________________________________________________________
498 void 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 //______________________________________________________________________________
508 void 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 //______________________________________________________________________________
533 void 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 //______________________________________________________________________________
563 void 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 //______________________________________________________________________________
574 void 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 //______________________________________________________________________________
644 void 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 //______________________________________________________________________________
653 const 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 //______________________________________________________________________________
682 const 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 //______________________________________________________________________________
693 void 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 //______________________________________________________________________________
704 void 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 //______________________________________________________________________________
732 void 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 //______________________________________________________________________________
793 void 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 //______________________________________________________________________________
823 void 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 //______________________________________________________________________________
954 void 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 //______________________________________________________________________________
972 void AliTPCCalibViewerGUItime::DoParLimitChange()
973 {
974   //
975   //
976   //
977   UpdateParName();
978   DoDraw();
979 }
980 //______________________________________________________________________________
981 void 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 //______________________________________________________________________________
991 void 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 //______________________________________________________________________________
1006 void AliTPCCalibViewerGUItime::DoCustomCutsDraw()
1007 {
1008   //
1009   //
1010   //
1011   if (fIsCustomDraw) DoCustomDraw();
1012   else {
1013     fDrawString=GetDrawString();
1014     fIsCustomDraw=kFALSE;
1015     DoDraw();
1016   }
1017 }
1018 //______________________________________________________________________________
1019 void 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 //______________________________________________________________________________
1065 void 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 //______________________________________________________________________________
1082 void 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 //______________________________________________________________________________
1137 void 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 //______________________________________________________________________________
1200 void 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 //______________________________________________________________________________
1255 const 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 //______________________________________________________________________________
1268 void 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 //______________________________________________________________________________
1284 void AliTPCCalibViewerGUItime::DoAddAlias()
1285 {
1286   //
1287   //
1288   //
1289   new AliTPCCalibViewerGUItimeAddAliasFrame(gClient->GetRoot(), fContTopBottom, 400, 200, kVerticalFrame, this);
1290 }
1291 //______________________________________________________________________________
1292 void 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 //______________________________________________________________________________
1308 void 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 //______________________________________________________________________________
1328 TObjArray* 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 //______________________________________________________________________________
1366 TObjArray* 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
1402 ClassImp(AliTPCCalibViewerGUItimeAddAliasFrame)
1403
1404 AliTPCCalibViewerGUItimeAddAliasFrame::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 //______________________________________________________________________________
1492 AliTPCCalibViewerGUItimeAddAliasFrame::~AliTPCCalibViewerGUItimeAddAliasFrame()
1493 {
1494   //
1495   //
1496   //
1497   fMain->DeleteWindow();  // deletes fMain
1498 }
1499 //______________________________________________________________________________
1500 void 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 //______________________________________________________________________________
1517 void AliTPCCalibViewerGUItimeAddAliasFrame::DoCancel()
1518 {
1519   //
1520   //
1521   //
1522   delete this;
1523 }
1524