Replace AliEveEventManager token with Event where it was done by a runaway regexp...
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDLoader.cxx
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveTRDLoader.h"
11 #include "AliEveTRDModuleImp.h"
12
13 #include <TEveManager.h>
14 #include <TEveGValuators.h>
15
16 #include "TSystem.h"
17 #include "TFile.h"
18 #include "TTree.h"
19 #include "TString.h"
20 #include "TObjString.h"
21 #include "TObjArray.h"
22
23 #include <TGLabel.h>
24 #include <TGButton.h>
25 #include <TGTextEntry.h>
26 #include <TGNumberEntry.h>
27 #include <TGFileDialog.h>
28 #include <TGListTree.h>
29 #include <TGToolTip.h>
30
31 #include "AliLog.h"
32 #include "AliCDBManager.h"
33
34 #include "AliTRDv1.h"
35 #include "AliTRDhit.h"
36 #include "AliTRDcluster.h"
37 #include "AliTRDmcmTracklet.h"
38 #include "AliTRDdigitsManager.h"
39 #include "AliTRDgeometry.h"
40
41 #include <algorithm>
42
43 class AliTRDdataArrayI;
44
45 ClassImp(AliEveTRDLoader)
46 ClassImp(AliEveTRDLoaderEditor)
47
48 ///////////////////////////////////////////////////////////
49 /////////////     AliEveTRDLoader     /////////////////////
50 ///////////////////////////////////////////////////////////
51
52
53 //______________________________________________________________________________
54 AliEveTRDLoader::AliEveTRDLoader(const Text_t* n, const Text_t* t) :
55   TEveElementList(n, t),
56   fLoadHits     (kFALSE), fLoadDigits (kFALSE),
57   fLoadClusters (kFALSE), fLoadTracks (kFALSE),
58   fSM           (-1),     fStack      (-1),     fLy(-1),
59   fFilename     (""),     fDir        ("."),
60   fEvent        (-1),
61   fTRD          (0x0),
62   fGeo          (new AliTRDgeometry())
63 {
64   AliCDBManager *fCDBManager=AliCDBManager::Instance();
65   fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
66   fCDBManager->SetRun(0);
67 }
68
69 //______________________________________________________________________________
70 AliEveTRDLoader::~AliEveTRDLoader()
71 {
72   // if(fChambers) {fChambers->clear(); delete fChambers;}
73 }
74
75 //______________________________________________________________________________
76 template<class T>
77 class ID
78 {
79 public:
80   ID( int value ) : id(value) {}
81   bool operator()(const T &t) const {
82     return ((dynamic_cast<AliEveTRDModule*>(t))->GetID() == id);
83   }
84 private:
85   const int id;
86 };
87
88 void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
89 {
90   Int_t ism_start = (sm == -1) ?  0 : sm;
91   Int_t ism_stop  = (sm == -1) ? 18 : sm+1;
92   Int_t istk_start= (stk == -1)?  0 : stk;
93   Int_t istk_stop = (stk == -1)?  5 : stk+1;
94   Int_t ily_start = (ly == -1) ?  0 : ly;
95   Int_t ily_stop  = (ly == -1) ?  6 : ly+1;
96
97   List_i ichmb;
98   ichmb = fChildren.begin();
99   while(ichmb != fChildren.end()){
100     (*ichmb)->SetRnrSelf(kFALSE);
101     ichmb++;
102   }
103
104   AliEveTRDNode *SM=0x0, *STK=0x0;
105   AliEveTRDChamber *CHMB = 0x0;
106   int det;
107   for(int ism=ism_start; ism<ism_stop; ism++){
108     ichmb = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(ism));
109     if(ichmb != fChildren.end()){
110       SM = (AliEveTRDNode*)(*ichmb);
111       SM->SetRnrSelf(kTRUE);
112     }else{
113       gEve->AddElement(SM = new AliEveTRDNode("SM", ism), this);
114       SM->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("Supermodule %2d", ism));
115     }
116     for(int istk=istk_start; istk<istk_stop; istk++){
117       ichmb = find_if(SM->begin(), SM->end(), ID<TEveElement*>(istk));
118       if(ichmb != SM->end()){
119         STK = (AliEveTRDNode*)(*ichmb);
120         STK->SetRnrSelf(kTRUE);
121       }else{
122         gEve->AddElement(STK = new AliEveTRDNode("Stack", istk), SM);
123         STK->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("SM %2d Stack %1d", ism, istk));
124       }
125       for(int ily=ily_start; ily<ily_stop; ily++){
126         det = fGeo->GetDetector(ily, istk, ism);
127         ichmb = find_if(STK->begin(), STK->end(), ID<TEveElement*>(det));
128         if(ichmb != STK->end()) (*ichmb)->SetRnrSelf(kTRUE);
129         else{
130           gEve->AddElement(CHMB = new AliEveTRDChamber(det), STK);
131           CHMB->SetGeometry(fGeo);
132           CHMB->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
133         }
134       }
135     }
136   }
137   gEve->Redraw3D();
138 }
139
140 //______________________________________________________________________________
141 AliEveTRDChamber* AliEveTRDLoader::GetChamber(int d)
142 {
143   List_i ism, istack, ichmb;
144
145   ism = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(fGeo->GetSector(d)));
146   if(ism == fChildren.end()) return 0x0;
147   istack = find_if(((AliEveTRDNode*)(*ism))->begin(), ((AliEveTRDNode*)(*ism))->end(), ID<TEveElement*>(fGeo->GetChamber(d)));
148   if(istack == ((AliEveTRDNode*)(*ism))->end()) return 0x0;
149   ichmb = find_if(((AliEveTRDNode*)(*istack))->begin(), ((AliEveTRDNode*)(*istack))->end(), ID<TEveElement*>(d));
150   if(ichmb == ((AliEveTRDNode*)(*istack))->end()) return 0x0;
151   return dynamic_cast<AliEveTRDChamber*>(*ichmb);
152 }
153
154 //______________________________________________________________________________
155 Bool_t AliEveTRDLoader::GoToEvent(int ev)
156 {
157   if(!fChildren.size()){
158     AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
159     return kFALSE;
160   }
161
162   fEvent = ev;
163
164   Unload();
165
166   TTree *t = 0x0;
167   TFile *f = new TFile(Form("%s/%s", fDir.Data(), fFilename.Data()));
168   if(! f->cd(Form("Event%d", ev))){
169     AliError(Form("Couldn't find event %d in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
170     f->Close(); delete f;
171     return kFALSE;
172   }
173
174   if(fLoadDigits){
175     t = (TTree*)gDirectory->Get("TreeD");
176     if(!t) return kFALSE;
177     if(!LoadDigits(t)) return kFALSE;
178   } else if(fLoadClusters){
179     t = (TTree*)gDirectory->Get("TreeR");
180     if(!t) return kFALSE;
181     if(!LoadClusters(t)) return kFALSE;
182   } else if(fLoadTracks){
183     t = (TTree*)gDirectory->Get("TreeT");
184     if(!t) return kFALSE;
185     if(!LoadTracklets(t)) return kFALSE;
186   } else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
187
188   f->Close(); delete f;
189
190   gEve->Redraw3D();
191
192   return kTRUE;
193 }
194
195
196 //______________________________________________________________________________
197 Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
198 {
199   AliInfo("Loading ...");
200   if(!fChildren.size()) return kTRUE;
201
202   TObjArray *clusters = new TObjArray();
203   tC->SetBranchAddress("TRDcluster", &clusters);
204
205   AliEveTRDChamber *chmb = 0x0;
206   AliTRDcluster *c=0x0;
207   for(int idet=0; idet<540; idet++){
208     tC->GetEntry(idet);
209     if(!clusters->GetEntriesFast()) continue;
210     c = (AliTRDcluster*)clusters->UncheckedAt(0);
211     if(!c) continue;
212     if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
213   }
214   return kTRUE;
215 }
216
217
218 //______________________________________________________________________________
219 Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
220 {
221   AliInfo("Loading ...");
222
223   if(!fChildren.size()) return kTRUE;
224
225   AliEveTRDChamber *chmb;
226   AliTRDdigitsManager dm;
227   dm.ReadDigits(tD);
228   for(int idet=0; idet<540; idet++){
229     if(!(chmb=GetChamber(idet))) continue;
230     //  digits = dm.GetDigits(idet);
231     //  if(!digits) continue;
232     //  chmb->LoadDigits(digits);
233     chmb->LoadDigits(&dm);
234   }
235   return kTRUE;
236 }
237
238
239 //______________________________________________________________________________
240 Bool_t AliEveTRDLoader::LoadTracklets(TTree *tT)
241 {
242   AliInfo("Loading ...");
243   if(!fChildren.size()) return kTRUE;
244
245   TObjArray *tracks = new TObjArray();
246   tT->SetBranchAddress("TRDmcmTracklet",&tracks);
247
248   AliEveTRDChamber *chmb = 0x0;
249   AliTRDmcmTracklet *trk=0x0;
250   for(int idet=0; idet<540; idet++){
251     if(!tT->GetEntry(idet)) continue;
252     if(tracks->GetEntriesFast()) trk = (AliTRDmcmTracklet*)tracks->UncheckedAt(0);
253     if((chmb = GetChamber(trk->GetDetector()))) chmb->LoadTracklets(tracks);
254   }
255
256   return kTRUE;
257 }
258
259
260 //______________________________________________________________________________
261 Bool_t AliEveTRDLoader::Open(const char *filename, const char *dir)
262 {
263   fFilename = filename;
264   fDir = dir;
265   Int_t count = 0;
266   count += fLoadDigits ? 1 : 0;
267   count += fLoadClusters ? 1 : 0;
268   count += fLoadTracks ? 1 : 0;
269
270   TObjArray *so = fFilename.Tokenize(".");
271
272   if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
273     if(!count){
274       AliWarning("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
275       return kFALSE;
276     } else {
277       Warning("Open()", "Filename didn't fulfill naming conventions.");
278       return kTRUE;
279     }
280   }
281   if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
282     if(!fLoadDigits) AliWarning("Data type set to DIGITS according to file name. Previous settings with SetDataType() will be discarded.");
283     fLoadDigits = kTRUE;
284   } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
285     if(!fLoadClusters) AliWarning("Data type set to CLUSTERS according to file name. Previous settings with SetDataType() will be discarded.");
286     fLoadClusters = kTRUE;
287   } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracks") == 0){
288     if(!fLoadTracks) AliWarning("Data type set to TRACKLETS according to file name. Previous settings with SetDataType() will be discarded.");
289     fLoadTracks = kTRUE;
290   } else if(count){
291     AliWarning("Filename didn't fulfill naming conventions.");
292     return kTRUE;
293   } else {
294     AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
295     return kFALSE;
296   }
297
298   return kTRUE;
299 }
300
301
302
303 //______________________________________________________________________________
304 void AliEveTRDLoader::Paint(Option_t *option)
305 {
306   List_i ichmb = fChildren.begin();
307   while(ichmb != fChildren.end()){
308     (dynamic_cast<AliEveTRDModule*>(*ichmb))->Paint(option);
309     ichmb++;
310   }
311 }
312
313 //______________________________________________________________________________
314 void AliEveTRDLoader::SetDataType(TRDDataTypes type)
315 {
316   fLoadHits     = kFALSE;
317   fLoadDigits   = kFALSE;
318   fLoadClusters = kFALSE;
319   fLoadTracks   = kFALSE;
320   switch(type){
321     case kHits:     fLoadHits = kTRUE; break;
322     case kDigits:   fLoadDigits = kTRUE; break;
323     case kClusters: fLoadClusters = kTRUE; break;
324     case kTracks:   fLoadTracks = kTRUE; break;
325     case kRawRoot: break;
326     case kRawData: break;
327   }
328 }
329
330 //______________________________________________________________________________
331 void AliEveTRDLoader::Unload()
332 {
333   List_i ichmb = fChildren.begin();
334   while(ichmb != fChildren.end()){
335     (dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
336     ichmb++;
337   }
338 }
339
340 ///////////////////////////////////////////////////////////
341 /////////////   AliEveTRDLoaderEditor       /////////////////////
342 ///////////////////////////////////////////////////////////
343
344 //______________________________________________________________________________
345 AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height,
346                                              UInt_t options, Pixel_t back) :
347   TGedFrame(p, width, height, options | kVerticalFrame, back),
348   fM(0), fFile(0), fEvent(0),
349   fSMNumber(0), fStackNumber(0), fPlaneNumber(0)
350 {
351   MakeTitle("AliEveTRDLoader");
352
353   Int_t labelW = 42;
354
355   TGHorizontalFrame* f = new TGHorizontalFrame(this);
356   TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
357   TGLabel* l = new TGLabel(g, "File: ");
358   g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
359   f->AddFrame(g);
360   fFile = new TGTextEntry(f);
361   fFile->SetToolTipText("Select TRD data file or galice.root");
362   fFile->SetWidth(140);
363   fFile->Connect("DoubleClicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
364   f->AddFrame(fFile);
365
366   TGTextButton* openFile = new TGTextButton(f, "Browse");
367   f->AddFrame(openFile);
368   openFile->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
369   AddFrame(f);
370
371
372   fEvent = new TEveGValuator(this, "Event:", 110, 0);
373   fEvent->SetShowSlider(kFALSE);
374   fEvent->SetLabelWidth(labelW);
375   fEvent->SetNELength(6);
376   fEvent->Build();
377   fEvent->SetLimits(-1, 1000);
378   fEvent->SetToolTip("Set event number to be monitored");
379   fEvent->Connect("ValueSet(Double_t)",
380                   "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
381   AddFrame(fEvent);
382
383
384   // "Chamber(s) selector" group frame
385   TGGroupFrame *fGroupFrame1974 = new TGGroupFrame(this,"Chamber(s) selector");
386   TGVerticalFrame *fVerticalFrame1974 = new TGVerticalFrame(fGroupFrame1974, 150, 50,kVerticalFrame);
387
388   fSMNumber = new TEveGValuator(fVerticalFrame1974, "SM:", 0, 0);
389   fSMNumber->SetShowSlider(kFALSE);
390   fSMNumber->SetLabelWidth(labelW);
391   fSMNumber->SetNELength(6);
392   fSMNumber->Build();
393   fSMNumber->SetLimits(-1, 17);
394   fSMNumber->SetToolTip("Supermodule id [-1 for all]");
395   fVerticalFrame1974->AddFrame(fSMNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
396
397   fStackNumber = new TEveGValuator(fVerticalFrame1974, "Stack:", 0, 0);
398   fStackNumber->SetShowSlider(kFALSE);
399   fStackNumber->SetLabelWidth(labelW);
400   fStackNumber->SetNELength(6);
401   fStackNumber->Build();
402   fStackNumber->SetLimits(-1, 4);
403   fStackNumber->SetToolTip("Stack id [-1 for all in this SM]");
404   fVerticalFrame1974->AddFrame(fStackNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
405
406   fPlaneNumber = new TEveGValuator(fVerticalFrame1974, "Plane:", 0, 0);
407   fPlaneNumber->SetShowSlider(kFALSE);
408   fPlaneNumber->SetLabelWidth(labelW);
409   fPlaneNumber->SetNELength(6);
410   fPlaneNumber->Build();
411   fPlaneNumber->SetLimits(-1, 5);
412   fPlaneNumber->SetToolTip("Plane id [-1 for all in this stack]");
413
414   fVerticalFrame1974->AddFrame(fPlaneNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
415
416   fGroupFrame1974->AddFrame(fVerticalFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY | kLHintsCenterX,2,2,2,2));
417
418   TGTextButton *fTextButton2037 = new TGTextButton(fGroupFrame1974,"Select");
419   fTextButton2037->SetTextJustify(36);
420   fGroupFrame1974->AddFrame(fTextButton2037, new TGLayoutHints(kLHintsExpandY | kLHintsCenterX,2,2,2,2));
421   fTextButton2037->SetToolTipText("Apply selection", 400);
422   fTextButton2037->Connect("Clicked()",
423                            "AliEveTRDLoaderEditor", this, "AddChambers()");
424
425   fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
426   AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
427
428
429   TGTextButton *fTextButton2004 = new TGTextButton(this,"Load");
430   fTextButton2004->SetTextJustify(36);
431   fTextButton2004->Resize(164,22);
432   AddFrame(fTextButton2004, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
433   fTextButton2004->SetToolTipText("Load data according to selection", 400);
434   fTextButton2004->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Load()");
435 }
436
437 //______________________________________________________________________________
438 AliEveTRDLoaderEditor::~AliEveTRDLoaderEditor()
439 {}
440
441 //______________________________________________________________________________
442 void AliEveTRDLoaderEditor::SetModel(TObject* obj)
443 {
444
445   fM = dynamic_cast<AliEveTRDLoader*>(obj);
446
447   fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
448
449   Bool_t kFile = kTRUE;
450   if(fM->fFilename.CompareTo("") == 0) kFile = kFALSE;
451
452   fEvent->SetEnabled(kFile);
453   fEvent->GetEntry()->SetIntNumber(fM->fEvent);
454
455   fSMNumber->SetEnabled(kFile);
456   fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
457
458
459   fStackNumber->SetEnabled(kFile);
460   fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
461
462
463   fPlaneNumber->SetEnabled(kFile);
464   fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
465 }
466
467 //______________________________________________________________________________
468 void AliEveTRDLoaderEditor::AddChambers()
469 {
470   fM->fSM    = (int)fSMNumber->GetEntry()->GetNumber();
471   fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
472   fM->fLy    = (int)fPlaneNumber->GetEntry()->GetNumber();
473   fM->AddChambers(fM->fSM, fM->fStack, fM->fLy);
474 }
475
476 //______________________________________________________________________________
477 void AliEveTRDLoaderEditor::FileOpen()
478 {
479   TGFileInfo fi;
480   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFilename.Data()));
481   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFilename.Data()));
482   //  fi.fFileTypes = tpcfiletypes;
483
484   new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
485   if (!fi.fFilename) return;
486
487   fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
488   fFile->SetText       (gSystem->BaseName(fi.fFilename));
489
490   fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename));
491
492   this->SetModel(fM);
493 }
494
495 void AliEveTRDLoaderEditor::Load()
496 {
497   fM->GoToEvent(fM->fEvent);
498 }