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