added slewing correction by data
[u/mrichter/AliRoot.git] / TRD / AliTRDCalibViewerGUI.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 /* $Id: AliTRDCalibViewerGUI.cxx 40390 2010-04-14 09:43:23Z cblume $ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 //  GUI for the AliTRDCalibViewerGUI                                         //
21 //  used for the calibration monitor                                         //
22 //  All functionalities of the AliTRDCalibViewer are here available          //
23 //                                                                           //
24 //  Authors:     Marian Ivanov (Marian.Ivanov@cern.ch)                       //
25 //               Jens Wiechula (Jens.Wiechula@cern.ch)                       //
26 //               Ionut Arsene  (iarsene@cern.ch)                             //
27 //                                                                           //
28 //  Example usage:                                                           //
29 /*
30   aliroot
31   AliTRDCalibViewerGUI::ShowGUI()
32   
33 */
34 //                                                                           //
35 //                                                                           //
36 ///////////////////////////////////////////////////////////////////////////////
37
38
39 #include "AliTRDCalibViewerGUI.h"
40 #include <iostream>
41 #include <string.h>
42
43 #include <TCanvas.h>
44 #include <TPad.h>
45 #include <TVirtualPad.h>
46
47 #include <TROOT.h>
48 #include <TObjArray.h>
49 #include <TObjString.h>
50 #include <TVector.h>
51 #include <TH1.h>
52 #include <TMath.h>
53 #include <TStyle.h>
54 #include <TGFileDialog.h>
55 #include <TGInputDialog.h>
56 #include "AliBaseCalibViewer.h"
57 #include "AliCalibViewerGUItime.h"
58 #include "AliTRDCalibViewer.h"
59 #include "AliCDBManager.h"
60 #include "AliCDBStorage.h"
61
62 ClassImp(AliTRDCalibViewerGUI)
63
64 //________________________________________________________________________________________________
65 AliTRDCalibViewerGUI::AliTRDCalibViewerGUI(const TGWindow *p, UInt_t w, UInt_t h, char* fileName)
66 : AliBaseCalibViewerGUI(p, w, h),
67     fContLayer(0),
68     fContSector(0),
69     fContStack(0),
70     fLblLayer(0),
71     fLblSector(0),
72     fLblStack(0),
73     fNmbLayer(0),
74     fNmbSector(0),
75     fNmbStack(0),
76     fContLoad(0),
77     fContRun(0),
78     fLblRun(0),
79     fNmbRun(0),
80     fContStorage(0),
81     fLblStorage(0),
82     fTxtStorage(0),
83     fContVersion(0),    
84     fLblVersion(0),
85     fNmbVersion(0),
86     fContSubVersion(0), 
87     fLblSubVersion(0),
88     fNmbSubVersion(0),
89     fContChecks(0),
90     fChkCalibs(0),
91     fChkDCS(0),
92     fChkAlign(0),
93     fBtnLoad(0),
94     fContLoadCalibObjects(0),
95     fContCalibInput(0),
96     fLblCalibInputFilename(0),
97     fTxtCalibInputFilename(0),
98     fContCalibOutput(0),
99     fLblCalibOutputFilename(0),
100     fTxtCalibOutputFilename(0),
101     fBtnLoadCalibObjects(0)
102 {
103    //
104    // AliTRDCalibViewerGUI constructor; fileName specifies the ROOT tree used for drawing 
105    //
106    // draw the GUI:
107    DrawGUI(p, w, h);
108    // initialize
109    if (fileName) Initialize(fileName, "TRDcalibDetails");
110    // set default button states:
111    SetInitialValues();
112    // do first drawing: 
113    if (fileName) DoDraw();
114 }
115
116 //________________________________________________________________________________________________
117 AliTRDCalibViewerGUI::AliTRDCalibViewerGUI(const AliTRDCalibViewerGUI &c)
118   :AliBaseCalibViewerGUI(c),
119    fContLayer(0),
120    fContSector(0),
121    fContStack(0),
122    fLblLayer(0),
123    fLblSector(0),
124    fLblStack(0),
125    fNmbLayer(0),
126    fNmbSector(0),
127    fNmbStack(0),
128    fContLoad(0),
129    fContRun(0),
130    fLblRun(0),
131    fNmbRun(0),
132    fContStorage(0),
133    fLblStorage(0),
134    fTxtStorage(0),
135    fContVersion(0),     
136    fLblVersion(0),
137    fNmbVersion(0),
138    fContSubVersion(0),  
139    fLblSubVersion(0),
140    fNmbSubVersion(0),
141    fContChecks(0),
142    fChkCalibs(0),
143    fChkDCS(0),
144    fChkAlign(0),
145    fBtnLoad(0),
146    fContLoadCalibObjects(0),
147    fContCalibInput(0),
148    fLblCalibInputFilename(0),
149    fTxtCalibInputFilename(0),
150    fContCalibOutput(0),
151    fLblCalibOutputFilename(0),
152    fTxtCalibOutputFilename(0),
153    fBtnLoadCalibObjects(0) 
154 {
155   //
156   // dummy AliTPCCalibViewerGUI_new copy constructor
157   //
158 }
159
160 //________________________________________________________________________________________________
161 AliTRDCalibViewerGUI & AliTRDCalibViewerGUI::operator =(const AliTRDCalibViewerGUI & /*param*/) {
162    //
163    // dummy assignment operator
164    //
165    return (*this);
166 }
167
168 //________________________________________________________________________________________________
169 AliTRDCalibViewerGUI::~AliTRDCalibViewerGUI() {
170    // 
171    // Destructor
172    // 
173   /*
174   if (fCanvMain && fCanvMain->GetCanvas()) {
175     for (Int_t i = 0; i < fCanvMain->GetCanvas()->GetListOfPrimitives()->GetEntries(); i++) {
176       if (strcmp(fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->ClassName(), "TFrame") != 0)
177         fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->Delete();
178     }
179   } */
180   Cleanup();
181   if (fViewer) fViewer->Delete();
182 }
183
184 //________________________________________________________________________________________________
185 Bool_t AliTRDCalibViewerGUI::CreateDetailsTree(Int_t run, const Char_t* outFile, const Char_t* /*ocdbStorage*/) {
186   //
187   // Get pad level info from OCDB for a given run and dump it into a tree
188   // 
189   if(!AliCDBManager::Instance()->GetDefaultStorage()){
190     std::cout << "AliTRDCalibViewerGUI::CreateDetailsTree(): Default Storage not set. Cannot create Calibration Tree!" << std::endl;
191     return kFALSE;
192   }
193   TString storage = AliCDBManager::Instance()->GetDefaultStorage()->GetURI();
194   return ((AliTRDCalibViewer*)fViewer)->DumpOCDBtoTreeDetails("", outFile, run, run, storage.Data());
195 }
196
197 //________________________________________________________________________________________________
198 void AliTRDCalibViewerGUI::DrawGUI(const TGWindow *p, UInt_t w, UInt_t h) {
199   // 
200   // draw the GUI
201   // 
202    
203   // draw most of the GUI (all common stuff)
204   AliBaseCalibViewerGUI::DrawGUI(p, w, h);
205   
206   // remove some frames from the virtual class
207   fTabRight1->RemoveFrame(fContExport);
208   fTabRight1->RemoveFrame(fContTree);
209   fTabRight1->RemoveFrame(fContFit);
210
211   // draw and connect slots specific to TRD
212   // **************************** content of tabLeft0 *******************************
213   // layer options container
214   fContLayer = new TGCompositeFrame(fContCuts, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
215   fContCuts->AddFrame(fContLayer, new TGLayoutHints(kLHintsExpandX, 5, 0, 0, 0));
216
217     // layer number label
218     fLblLayer = new TGLabel(fContLayer, "Layer");
219     fLblLayer->SetTextJustify(kTextLeft);
220     fContLayer->AddFrame(fLblLayer, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
221     // layer number entry
222     fNmbLayer = new TGNumberEntry(fContLayer, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, 0, 5);
223     fContLayer->AddFrame(fNmbLayer, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
224     fNmbLayer->SetNumber(0);
225     fNmbLayer->Connect("ValueSet(Long_t)", "AliTRDCalibViewerGUI", this, "DoNewSelection()");
226
227   // sector options container
228   fContSector = new TGCompositeFrame(fContCuts, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
229   fContCuts->AddFrame(fContSector, new TGLayoutHints(kLHintsExpandX, 5, 0, 0, 0));
230
231     // sector number label
232     fLblSector = new TGLabel(fContSector, "SM");
233     fLblSector->SetTextJustify(kTextLeft);
234     fContSector->AddFrame(fLblSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
235     // sector number entry
236     fNmbSector = new TGNumberEntry(fContSector, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -1, 17);
237     fContSector->AddFrame(fNmbSector, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
238     fNmbSector->SetNumber(-1);
239     fNmbSector->Connect("ValueSet(Long_t)", "AliTRDCalibViewerGUI", this, "DoNewSelection()");
240
241   // stack options container
242   fContStack = new TGCompositeFrame(fContCuts, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
243   fContCuts->AddFrame(fContStack, new TGLayoutHints(kLHintsExpandX, 5, 0, 0, 0));
244
245     // stack number label
246     fLblStack = new TGLabel(fContStack, "Stack");
247     fLblStack->SetTextJustify(kTextLeft);
248     fContStack->AddFrame(fLblStack, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 5, 0, 0, 0));
249     // stack number entry
250     fNmbStack = new TGNumberEntry(fContStack, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -1, 4);
251     fContStack->AddFrame(fNmbStack, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
252     fNmbStack->SetNumber(-1);
253     fNmbStack->Connect("ValueSet(Long_t)", "AliTRDCalibViewerGUI", this, "DoNewSelection()");
254     
255   // Load run frame
256   fContLoad = new TGGroupFrame(fTabRight1, "Load run", kVerticalFrame | kFitWidth | kFitHeight);
257   fTabRight1->AddFrame(fContLoad, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
258     // Storage
259     fContStorage = new TGCompositeFrame(fContLoad, 400, 200, kHorizontalFrame | kFitWidth | kFitHeight);
260     fContLoad->AddFrame(fContStorage, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
261       // label
262       fLblStorage = new TGLabel(fContStorage, "OCDB:");
263       fLblStorage->SetTextJustify(kTextLeft);
264       fContStorage->AddFrame(fLblStorage, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
265       // text entry
266       fTxtStorage = new TGTextEntry(fContStorage, "alien://folder=/alice/data/2010/OCDB/", 111);
267       fContStorage->AddFrame(fTxtStorage, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
268 //      fTxtStorage->Connect("ReturnPressed()", "AliBaseCalibViewerGUI", this, "HandleButtons1D(=111)");
269       fTxtStorage->SetToolTipText("Enter the OCDB storage location");
270     // Run entry
271     fContRun = new TGCompositeFrame(fContLoad, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
272     fContLoad->AddFrame(fContRun, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
273       // label
274       fLblRun = new TGLabel(fContRun, "Run:");
275       fLblRun->SetTextJustify(kTextLeft);
276       fContRun->AddFrame(fLblRun, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
277       // run number entry
278       fNmbRun = new TGNumberEntry(fContRun, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELNoLimits);
279       fContRun->AddFrame(fNmbRun, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
280       fNmbRun->SetNumber(-1);
281       //fNmbRun->SetToolTipText("Enter the run number");
282     // Version entry
283     fContVersion = new TGCompositeFrame(fContLoad, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
284     fContLoad->AddFrame(fContVersion, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
285       // label
286       fLblVersion = new TGLabel(fContVersion, "Version:");
287       fLblVersion->SetTextJustify(kTextLeft);
288       fContVersion->AddFrame(fLblVersion, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
289       // run number entry
290       fNmbVersion = new TGNumberEntry(fContVersion, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELNoLimits);
291       fContVersion->AddFrame(fNmbVersion, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
292       fNmbVersion->SetNumber(-1);
293     // SubVersion entry
294     fContSubVersion = new TGCompositeFrame(fContLoad, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
295     fContLoad->AddFrame(fContSubVersion, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
296       // label
297       fLblSubVersion = new TGLabel(fContSubVersion, "SubVersion:");
298       fLblSubVersion->SetTextJustify(kTextLeft);
299       fContSubVersion->AddFrame(fLblSubVersion, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
300       // run number entry
301       fNmbSubVersion = new TGNumberEntry(fContSubVersion, 0, 1, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELNoLimits);
302       fContSubVersion->AddFrame(fNmbSubVersion, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
303       fNmbSubVersion->SetNumber(-1);
304
305     // Calib & DCS & Align check boxes frame
306     fContChecks = new TGCompositeFrame(fContLoad, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
307     fContLoad->AddFrame(fContChecks, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
308       // Calibs check box
309       fChkCalibs = new TGCheckButton(fContChecks, "Calib");
310       fContChecks->AddFrame(fChkCalibs, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
311       fChkCalibs->SetToolTipText("Get calibration info (gain, pedestal, vdrift, T0 and status)");
312       fChkCalibs->SetState(kButtonDown);
313       // DCS check box
314       fChkDCS = new TGCheckButton(fContChecks, "DCS");
315       fContChecks->AddFrame(fChkDCS, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
316       fChkDCS->SetToolTipText("Get DCS info");
317       fChkDCS->SetState(kButtonDown);
318       // Calibs check box
319       fChkAlign = new TGCheckButton(fContChecks, "Align");
320       fContChecks->AddFrame(fChkAlign, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
321       fChkAlign->SetToolTipText("Get alingment info");
322       fChkAlign->SetState(kButtonDown);
323     // Load button
324     fBtnLoad = new TGTextButton(fContLoad, "&Load run");
325     fBtnLoad->SetName("loadOCDB");
326     fContLoad->AddFrame(fBtnLoad, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
327     fBtnLoad->SetToolTipText("Load run from OCDB");
328     fBtnLoad->Connect("Clicked()", "AliTRDCalibViewerGUI", this, "SetTree()");
329
330   // Load a file with AliTRDCalPad objects
331   // main frame
332   fContLoadCalibObjects = new TGGroupFrame(fTabRight1, "Load CalPad from file", kVerticalFrame | kFitWidth | kFitHeight);
333   fTabRight1->AddFrame(fContLoadCalibObjects, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
334     // container for the input file
335     fContCalibInput = new TGCompositeFrame(fContLoadCalibObjects, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
336     fContLoadCalibObjects->AddFrame(fContCalibInput, new TGLayoutHints(kLHintsExpandX, 0, 0, 2, 0));
337       // label
338       fLblCalibInputFilename = new TGLabel(fContCalibInput, "Input:");
339       fLblCalibInputFilename->SetTextJustify(kTextLeft);
340       fContCalibInput->AddFrame(fLblCalibInputFilename, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
341       // text entry
342       fTxtCalibInputFilename = new TGTextEntry(fContCalibInput, "Input file", 200);
343       fContCalibInput->AddFrame(fTxtCalibInputFilename, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
344       fTxtCalibInputFilename->Connect("DoubleClicked()", "AliTRDCalibViewerGUI", this, "HandleFilesystem()");
345     // container for the output file
346     fContCalibOutput = new TGCompositeFrame(fContLoadCalibObjects, 200, 200, kHorizontalFrame | kFitWidth | kFitHeight);
347     fContLoadCalibObjects->AddFrame(fContCalibOutput, new TGLayoutHints(kLHintsExpandX, 0, 0, 2, 0));
348       // label
349       fLblCalibOutputFilename = new TGLabel(fContCalibOutput, "Output:");
350       fLblCalibOutputFilename->SetTextJustify(kTextLeft);
351       fContCalibOutput->AddFrame(fLblCalibOutputFilename, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
352       // text entry
353       fTxtCalibOutputFilename = new TGTextEntry(fContCalibOutput, "/tmp/output.root", 201);
354       fContCalibOutput->AddFrame(fTxtCalibOutputFilename, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0));
355       fTxtCalibOutputFilename->Connect("DoubleClicked()", "AliTRDCalibViewerGUI", this, "HandleFilesystem()");
356     // Load button
357     fBtnLoadCalibObjects = new TGTextButton(fContLoadCalibObjects, "L&oad calib");
358     fBtnLoadCalibObjects->SetName("loadCalPad");
359     fContLoadCalibObjects->AddFrame(fBtnLoadCalibObjects, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
360     fBtnLoadCalibObjects->SetToolTipText("Extract a tree from an array of AliTRDCalPad objects,\nand load it into this application");
361     fBtnLoadCalibObjects->Connect("Clicked()", "AliTRDCalibViewerGUI", this, "SetTree()");
362       
363   SetWindowName("AliTRDCalibViewer GUI");
364   MapSubwindows();
365   Resize(GetDefaultSize());
366   MapWindow();
367 }
368
369 //___________________________________________________________________________________
370 void AliTRDCalibViewerGUI::SetTree() {
371   //
372   //  handles the loading of a new tree and updates the GUI
373   //
374   TString fileName;
375   TGTextButton *button = ((TGTextButton*)gTQSender);
376   TString name=button->GetName();
377   if(name.Contains("OCDB")) {
378     Int_t run = (Int_t)fNmbRun->GetNumber();
379     TString storage(fTxtStorage->GetText());
380     Bool_t getCalibs = (fChkCalibs->GetState()==kButtonDown ? kTRUE : kFALSE);
381     Bool_t getDCS = (fChkDCS->GetState()==kButtonDown ? kTRUE : kFALSE);
382     Bool_t getAlign = (fChkAlign->GetState()==kButtonDown ? kTRUE : kFALSE);
383     Int_t version = (Int_t)fNmbVersion->GetNumber();
384     Int_t subVersion = (Int_t)fNmbSubVersion->GetNumber();
385     
386     fileName = Form("trdOCDBDetails_run%d.root", run);
387     Bool_t load=kTRUE;
388     load=((AliTRDCalibViewer*)fViewer)->DumpOCDBtoTreeDetails("", fileName.Data(), run, run, storage.Data(),
389                                                               version, subVersion, getCalibs, getDCS, getAlign);
390     if(!load) {
391       Reset();
392       return;
393     }
394   }
395   if(name.Contains("CalPad")) {
396     ((AliTRDCalibViewer*)fViewer)->DumpCalibToTree(fTxtCalibInputFilename->GetText(),
397                                                    fTxtCalibOutputFilename->GetText());
398     fileName = fTxtCalibOutputFilename->GetText();
399   }
400   Initialize(fileName.Data(), "TRDcalibDetails");
401   Reload();
402   DoDraw();
403 }
404
405 //________________________________________________________________________________________________
406 void AliTRDCalibViewerGUI::HandleFilesystem() {
407   //
408   //  Slot used by the text buttons to trigger the file system dialog
409   //
410   Int_t id = ((TGTextEntry*)gTQSender)->WidgetId();
411   const char *kTypes[] = {
412       "All files",    "*",
413        0,              0};
414   TString dir(".");
415   TGFileInfo fi;
416   fi.fFileTypes = kTypes;
417   fi.fOverwrite = kFALSE;
418   new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDOpen, &fi);
419   if(fi.fFilename && strlen(fi.fFilename)) {
420     if(id==200)
421       fTxtCalibInputFilename->SetText(fi.fFilename);
422     if(id==201)
423       fTxtCalibOutputFilename->SetText(fi.fFilename);
424   }
425   return;
426 }
427
428 //________________________________________________________________________________________________
429 void AliTRDCalibViewerGUI::Initialize(const char* fileName, const char* treeName) {
430   // 
431   // initialize the GUI with a calibrationTree from fileName
432   // 
433   // create AliTRDCalibViewer object, which will be used for generating all drawings
434   if (fViewer) delete fViewer;
435   fViewer = new AliTRDCalibViewer(fileName, treeName);
436   Initialize(fViewer);   
437 }
438
439 //________________________________________________________________________________________________
440 void AliTRDCalibViewerGUI::Initialize(AliBaseCalibViewer *viewer) {
441   //
442   // initializes the GUI with default settings and opens tree for drawing
443   //
444   fViewer = viewer;
445   TString selectedVariable("");
446   TString selectedNormalization("");
447   Int_t variableId = -1;
448   Int_t normalizationId = -1;
449   if (fInitialized) {
450     // remember the selected entry
451     if (fListVariables->GetSelectedEntry()) selectedVariable = fListVariables->GetSelectedEntry()->GetTitle();
452     if (fListNormalization->GetSelectedEntry()) selectedNormalization = fListNormalization->GetSelectedEntry()->GetTitle();
453   }
454   
455   // fill fListVariables, list of drawable variables:
456   TObjArray* arr = ((AliTRDCalibViewer*)fViewer)->GetListOfVariables(1);
457   if (!arr) {
458     return;
459   }
460   TIterator* iter = arr->MakeIterator();
461   iter->Reset();
462   TObjString* currentStr = 0;
463   Int_t id = 0;
464   fListVariables->RemoveAll();
465   while ((currentStr = (TObjString*)(iter->Next()))) {
466     fListVariables->AddEntry(currentStr->GetString().Data(), id);
467     if (fInitialized && currentStr->GetString() == selectedVariable) variableId = id;
468     id++;
469   }
470   
471   // fill fListNorm, list of normalization variables:
472   TObjArray *arrNorm = ((AliTRDCalibViewer*)fViewer)->GetListOfNormalizationVariables();
473   TIterator *iterNorm = arrNorm->MakeIterator();
474   iterNorm->Reset();
475   currentStr = 0;
476   id = 0;
477   fListNormalization->RemoveAll();
478   while ((currentStr = (TObjString*)(iterNorm->Next()))) {
479     fListNormalization->AddEntry(currentStr->GetString().Data(), id);
480     if (fInitialized && currentStr->GetString() == selectedNormalization) normalizationId = id;
481     id++;
482   }
483   currentStr = 0;
484   iter->Reset();
485   //Add draw variables to the list of normalisation
486   while ((currentStr = (TObjString*)(iter->Next()))) {
487     if (currentStr->GetString().BeginsWith("Map")) continue; //don't add mapping information
488     fListNormalization->AddEntry(currentStr->GetString().Data(), id);
489     if (fInitialized && currentStr->GetString() == selectedNormalization) normalizationId = id;
490     id++;
491   }
492   
493   delete iterNorm;
494   arrNorm->Delete();
495   delete arrNorm;
496   
497   delete iter;
498   arr->Delete();
499   delete arr;
500   
501   // trick do display the entries corectly after reinitialization
502   // otherwise all the entries would appear as one kryptic entry
503   // resizing the listbox somehow fixes the problem...
504   if (fInitialized) fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight());
505   if (fInitialized) fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight());
506   if (fInitialized) fListNormalization->Resize(fListNormalization->GetWidth()-1, fListNormalization->GetHeight());
507   if (fInitialized) fListNormalization->Resize(fListNormalization->GetWidth()+1, fListNormalization->GetHeight());
508   
509   // select the last selected variable and normalization
510   if (fInitialized && variableId != -1)     fListVariables->Select(variableId);
511   if (fInitialized && normalizationId != -1)fListVariables->Select(normalizationId);
512   
513   if (fInitialized) Info("Initialize", "AliTRDCalibViewerGUI new initialized.");
514   fInitialized = kTRUE;
515 }
516
517 //________________________________________________________________________________________________
518 void AliTRDCalibViewerGUI::Reset(){
519   //
520   // reset variables, delete calib viewer
521   //
522   if (fViewer) delete fViewer;
523   fListVariables->RemoveAll();
524   fListNormalization->RemoveAll();
525   fInitialized = kFALSE;
526 }
527
528 //________________________________________________________________________________________________
529 TString* AliTRDCalibViewerGUI::GetDrawString() {
530   // 
531   // create the draw string out of selection
532   // 
533   
534   // specify data to plot
535   TString desiredData("");
536   if (!fListVariables->GetSelectedEntry()) return 0;
537   desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
538   desiredData += fViewer->GetAbbreviation();
539   
540   // specify normalization
541   if (fRadioPredefined->GetState() == kButtonDown && fRadioNormalized->GetState() == kButtonDown) {
542     TString op("");
543     switch (fComboMethod->GetSelected()) {
544     case 0:        // subtraction
545       op += "-";
546       break;
547     case 1:        // division
548       op += "/";
549       break;
550     }
551     TString normalizationData("");
552     if (!fListNormalization->GetSelectedEntry()) return 0;
553     normalizationData += ((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle();
554     
555     desiredData += op;
556     if (! (TString(((TGTextLBEntry*)(fListNormalization->GetSelectedEntry()))->GetTitle())).BeginsWith("Fit"))
557       if ( normalizationData.BeginsWith("_") ) desiredData += ((TGTextLBEntry*)(fListVariables->GetSelectedEntry()))->GetTitle();
558     if ( fListVariables->FindEntry(normalizationData.Data()) )
559       normalizationData+="~";
560     desiredData += normalizationData;
561   }
562   else if (fRadioCustom->GetState() == kButtonDown) {
563     desiredData = fComboCustom->GetTextEntry()->GetText();
564     if (desiredData == "") return 0;
565     ReplacePlaceHolders(desiredData);
566   }
567    
568   // try to add forgotten '~'
569   if (fChkAutoAppend->GetState() == kButtonDown) 
570     desiredData = TString(((AliTRDCalibViewer*)fViewer)->AddAbbreviations((char*)desiredData.Data()));
571   return new TString(desiredData.Data());
572 }
573
574 //________________________________________________________________________________________________
575 TString* AliTRDCalibViewerGUI::GetCutString() {
576    // 
577    // create the cut string out of selection
578    // 
579   
580    TString cutsStr("");
581       
582    // try to add forgotten '~'
583    if(fChkAutoAppend->GetState() == kButtonDown) 
584       cutsStr = TString(((AliTRDCalibViewer*)fViewer)->AddAbbreviations((char*)cutsStr.Data()));
585    return new TString(cutsStr.Data());
586 }
587
588 //________________________________________________________________________________________________
589 TString* AliTRDCalibViewerGUI::GetSectorString() {
590   // 
591   // create the sector string out of selection
592   // 
593
594   Int_t layerNo = (Int_t)(fNmbLayer->GetNumber());
595   Int_t sectorNo = (Int_t)(fNmbSector->GetNumber());
596   Int_t stackNo = (Int_t)(fNmbStack->GetNumber());
597
598   TString sectorStr("");
599   sectorStr = Form("Layer%dSector%dStack%d", layerNo, sectorNo, stackNo);
600
601   return new TString(sectorStr.Data());
602 }   
603
604 //________________________________________________________________________________________________
605 void AliTRDCalibViewerGUI::DoDraw() {
606   //
607   // main method for drawing according to user selection
608   //
609    
610   // specify data to plot:
611   if (!GetDrawString()) return;
612   TString desiredData(GetDrawString()->Data());
613   // specify sector:
614   TString sectorStr(GetSectorString()->Data());
615   // specify cuts:
616   TString cutsStr(GetCutString()->Data());
617
618   TString addDrawOpt("");
619   if (fChkAddDrawOpt->GetState() == kButtonDown)
620     addDrawOpt += fComboAddDrawOpt->GetTextEntry()->GetText();
621    
622   // remove last picture
623   if (!addDrawOpt.Contains("same"))
624     for (Int_t i = 0; i < fCanvMain->GetCanvas()->GetListOfPrimitives()->GetEntries(); i++) {
625       if (strcmp(fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->ClassName(), "TFrame") != 0)
626         fCanvMain->GetCanvas()->GetListOfPrimitives()->At(i)->Delete();
627     }
628   //fCanvMain->GetCanvas()->Clear();
629   fCanvMain->GetCanvas()->cd();
630   Int_t entries = -1;
631   // draw finally
632   if (fRadio1D->GetState() == kButtonDown){
633     // 1D-Drawing
634     TString strSigmaMax(fTxtSigmaMax->GetText());  // get sigmaMax from text enty
635     Double_t sigmaMax = (strSigmaMax.IsFloat()) ? strSigmaMax.Atof() : 5; // convert to double, if not convertable, set to 5
636     Bool_t plotMean   = fChkMean->GetState() == kButtonDown;
637     Bool_t plotMedian = fChkMedian->GetState() == kButtonDown;
638     Bool_t plotLTM    = fChkLTM->GetState() == kButtonDown;
639     if (fRadioNorm->GetState() == kButtonDown)  // normal 1D drawing
640       entries = ((AliTRDCalibViewer*)fViewer)->EasyDraw1D(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), addDrawOpt.Data());
641     if (fRadioSigma->GetState() == kButtonDown) // sigma 1D drawing
642       entries = fViewer->DrawHisto1D(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), // 
643                                      fTxtSigmas->GetText(), plotMean, plotMedian, plotLTM);
644     if (fRadioCumulative->GetState() == kButtonDown)  // cumulative 1D drawing
645       entries = fViewer->SigmaCut(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), //
646                                   sigmaMax, plotMean, plotMedian, plotLTM, // 
647                                   fCheckCumulativePM->GetState() == kButtonDown, fTxtSigmas->GetText(), /* Float_t sigmaStep =*/ -1);
648     if (fRadioIntegrate->GetState() == kButtonDown)  // integral 1D drawing  
649       entries = fViewer->Integrate(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), //
650                                    sigmaMax, plotMean, plotMedian, plotLTM, // 
651                                    fTxtSigmas->GetText(), /* Float_t sigmaStep =*/ -1);            
652   }
653   else if (fRadio2D->GetState() == kButtonDown) {
654     // 2D-Drawing
655     entries = ((AliTRDCalibViewer*)fViewer)->EasyDraw(desiredData.Data(), sectorStr.Data(), cutsStr.Data(), addDrawOpt.Data());
656   }
657   if (entries == -1) return; // nothing was drawn, there is no histogram to get min and max
658    
659   SetMinMaxLabel();
660   fCanvMain->GetCanvas()->Update();
661 }
662
663 //________________________________________________________________________________________________
664 void AliTRDCalibViewerGUI::MouseMove(Int_t event, Int_t x, Int_t y, TObject *selectedObject) { 
665   //
666   // mouse move
667   // zoom to chamber works ONLY in 2D mode
668   // 
669   if(event != kButton1Double )
670     return;
671   if(!selectedObject->InheritsFrom("TH2")) return;
672
673   //Int_t layerNo = (Int_t)(fNmbLayer->GetNumber());
674   Int_t sectorNo = (Int_t)(fNmbSector->GetNumber());
675   Int_t stackNo = (Int_t)(fNmbStack->GetNumber());
676
677   // zoom out to the current layer if a chamber is viewed now
678   if(sectorNo!=-1 && stackNo!=-1) {
679     fNmbSector->SetNumber(-1);
680     fNmbStack->SetNumber(-1);
681     DoNewSelection();
682     return;
683   }
684
685   // check what kind of parameter we visualize
686   TString drawStr(GetDrawString()->Data());
687   Int_t viewedParamClass = -1;     // -1 nothing, 0 calibration, 1 FEE params
688   if(drawStr.Contains("Status") || drawStr.Contains("Gain") || drawStr.Contains("Noise") ||
689      drawStr.Contains("Vdrift") || drawStr.Contains("T0") ||
690      drawStr.Contains("gain") || drawStr.Contains("chiSquare"))
691     viewedParamClass = 0;
692   if(drawStr.Contains("SORandEOR") || 
693      drawStr.Contains("gsmSOR") || drawStr.Contains("gsmDelta") ||
694      drawStr.Contains("nimSOR") || drawStr.Contains("nimDelta") ||
695      drawStr.Contains("nevSOR") || drawStr.Contains("nevDelta") ||
696      drawStr.Contains("nptSOR") || drawStr.Contains("nptDelta")) {
697     viewedParamClass = 1;
698   }
699   if(viewedParamClass==-1) return;
700
701   // some constants refering to the TRD geometry
702   const Int_t gkNRows[ 5] = {16, 16, 12, 16, 16};  // number of pad rows in the chambers from each of the 5 stacks
703   const Int_t gkNCols = 144;    // number of pad cols per chamber
704
705   // get the coordinate of the clicked point in physical coordinates
706   Float_t upy = gPad->AbsPixeltoY(y);
707   Float_t upx = gPad->AbsPixeltoX(x);
708   Float_t gy  = gPad->PadtoY(upy);
709   Float_t gx  = gPad->PadtoX(upx);
710   Int_t selectedStack = -1;
711   Int_t selectedSector = -1;
712
713   // retrieve the double-clicked chamber 
714   if(sectorNo==-1 && stackNo==-1) {
715     // get the selected stack
716     Float_t rowLowBound = -0.5;
717     Float_t rowHighBound = -0.5;
718     for(Int_t i=0; i<5; i++) {
719       if(i>0) rowLowBound += gkNRows[i-1];
720       rowHighBound += gkNRows[i];
721       if(gx>=rowLowBound && gx<=rowHighBound)
722         selectedStack = i;
723     }
724     // get the selected sector
725     if(viewedParamClass==0) {   // calibration params
726       selectedSector = (Int_t)TMath::Floor((gy+0.5)/Float_t(gkNCols));
727     }
728     if(viewedParamClass==1) {   // FEE params
729       selectedSector = (Int_t)TMath::Floor((gy+0.5)/8.0);   // 8 MCMs per chamber in pad cols direction
730     }
731   }
732   if(sectorNo!=-1 && stackNo==-1) {
733     // get the selected stack
734     Float_t rowLowBound = -0.5;
735     Float_t rowHighBound = -0.5;
736     for(Int_t i=0; i<5; i++) {
737       if(i>0) rowLowBound += gkNRows[i-1];
738       rowHighBound += gkNRows[i];
739       if(gx>=rowLowBound && gx<=rowHighBound)
740         selectedStack = i;
741     }
742     // get the selected sector
743     selectedSector = sectorNo;
744   }
745   if(sectorNo==-1 && stackNo!=-1) {
746     // get the selected stack
747     selectedStack = stackNo;
748     // get the selected sector
749     if(viewedParamClass==0) {   // calibration params
750       selectedSector = (Int_t)TMath::Floor((gy+0.5)/144.0);
751     }
752     if(viewedParamClass==1) {   // FEE params
753       selectedSector = (Int_t)TMath::Floor((gy+0.5)/8.0);
754     }
755   }
756
757   fNmbSector->SetNumber(selectedSector);
758   fNmbStack->SetNumber(selectedStack);
759   DoNewSelection();
760   return;
761 }
762
763 //___________________________________________________________________________
764 void AliTRDCalibViewerGUI::ShowGUI() {
765   //
766   //   Draw the graphical user interface
767   //
768   TGMainFrame* mainWindow = new TGMainFrame(gClient->GetRoot(), 1000, 700);
769   mainWindow->SetWindowName("Run OCDB details");
770   mainWindow->SetCleanup(kDeepCleanup);
771   AliTRDCalibViewerGUI *calibViewer = new AliTRDCalibViewerGUI(mainWindow, 1000, 650, 0);
772   mainWindow->AddFrame(calibViewer, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
773   mainWindow->MapSubwindows();
774   mainWindow->Resize();
775   mainWindow->MapWindow();
776 }
777
778 //___________________________________________________________________________
779 void AliTRDCalibViewerGUI::ShowGUI(const Char_t* treeFile, const Char_t* treeName) {
780   //
781   //   Draw the graphical user interface
782   //
783   TGMainFrame* mainWindow = new TGMainFrame(gClient->GetRoot(), 1000, 700);
784   mainWindow->SetWindowName("Run OCDB details");
785   mainWindow->SetCleanup(kDeepCleanup);
786   AliBaseCalibViewerGUI *calibViewer = new AliTRDCalibViewerGUI(mainWindow, 1000, 650, 0);
787   mainWindow->AddFrame(calibViewer, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
788
789   calibViewer->Initialize(treeFile, treeName);
790   calibViewer->Reload();
791   calibViewer->DoDraw();
792
793   mainWindow->MapSubwindows();
794   mainWindow->Resize();
795   mainWindow->MapWindow();
796 }
797
798 //___________________________________________________________________________
799 void AliTRDCalibViewerGUI::ShowGUIwithTrending() {
800   //
801   // Draw a GUI application containing 2 tabs:
802   //    -- tab for time/run trending
803   //    -- tab for run details
804   TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 700);
805   frmMain->SetCleanup(kDeepCleanup);
806   
807   TGTab* tabMain = new TGTab(frmMain, 1000, 700);
808   frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
809   TGCompositeFrame* tabCont1 = tabMain->AddTab("Time");
810   TGCompositeFrame* tabCont2 = tabMain->AddTab("Detail - XXXXX");
811   
812   AliCalibViewerGUItime* calibViewerTime = new AliCalibViewerGUItime(tabCont1, 1000, 650, "TRD");
813   tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
814   
815   AliTRDCalibViewerGUI *calibViewer = new AliTRDCalibViewerGUI(tabCont2, 1000, 700, 0);
816   tabCont2->AddFrame(calibViewer, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0));
817   calibViewerTime->SetCalibViewerGUI(calibViewer);
818   calibViewerTime->SetCalibViewerGUItab(tabMain->GetTabTab(1));
819   
820   frmMain->MapSubwindows();
821   frmMain->Resize();
822   frmMain->MapWindow();
823 }