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