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