Merge changes from branches/dev/EVE. This branch was following development in ROOT...
[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   // Constructor.
65
66   AliCDBManager *fCDBManager=AliCDBManager::Instance();
67   fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
68   fCDBManager->SetRun(0);
69 }
70
71 //______________________________________________________________________________
72 namespace
73 {
74 template<class T>
75 class ID
76 {
77 public:
78   ID(int value) : fkId(value) {}
79   bool operator()(const T &t) const {
80     return ((dynamic_cast<AliEveTRDModule*>(t))->GetID() == fkId);
81   }
82 private:
83   const int fkId;
84 };
85 }
86
87 void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
88 {
89   // Add specified chambers.
90
91   Int_t ismStart = (sm == -1) ?  0 : sm;
92   Int_t ismStop  = (sm == -1) ? 18 : sm+1;
93   Int_t istkStart= (stk == -1)?  0 : stk;
94   Int_t istkStop = (stk == -1)?  5 : stk+1;
95   Int_t ilyStart = (ly == -1) ?  0 : ly;
96   Int_t ilyStop  = (ly == -1) ?  6 : ly+1;
97
98   List_i ichmb;
99   ichmb = fChildren.begin();
100   while(ichmb != fChildren.end()){
101     (*ichmb)->SetRnrSelf(kFALSE);
102     ichmb++;
103   }
104
105   AliEveTRDNode *lSM=0x0, *lSTK=0x0;
106   AliEveTRDChamber *lCHMB = 0x0;
107   int det;
108   for (int ism=ismStart; ism<ismStop; ism++){
109     ichmb = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(ism));
110     if (ichmb != fChildren.end()) {
111       lSM = (AliEveTRDNode*)(*ichmb);
112       lSM->SetRnrSelf(kTRUE);
113     } else {
114       AddElement(lSM = new AliEveTRDNode("SM", ism));
115       lSM->SetElementTitle(Form("Supermodule %2d", ism));
116     }
117     for (int istk=istkStart; istk<istkStop; istk++) {
118       ichmb = find_if(lSM->begin(), lSM->end(), ID<TEveElement*>(istk));
119       if (ichmb != lSM->end()) {
120         lSTK = (AliEveTRDNode*)(*ichmb);
121         lSTK->SetRnrSelf(kTRUE);
122       } else {
123         lSM->AddElement(lSTK = new AliEveTRDNode("Stack", istk));
124         lSTK->SetElementTitle(Form("SM %2d Stack %1d", ism, istk));
125       }
126       for (int ily=ilyStart; ily<ilyStop; ily++) {
127         det = fGeo->GetDetector(ily, istk, ism);
128         ichmb = find_if(lSTK->begin(), lSTK->end(), ID<TEveElement*>(det));
129         if(ichmb != lSTK->end()) {
130           (*ichmb)->SetRnrSelf(kTRUE);
131         } else {
132           lSTK->AddElement(lCHMB = new AliEveTRDChamber(det));
133           lCHMB->SetGeometry(fGeo);
134           lCHMB->SetElementTitle(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
135         }
136       }
137     }
138   }
139   gEve->Redraw3D();
140 }
141
142 //______________________________________________________________________________
143 AliEveTRDChamber* AliEveTRDLoader::GetChamber(int d)
144 {
145   // Get given chamber.
146
147   List_i ism, istack, ichmb;
148
149   ism = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(fGeo->GetSector(d)));
150   if(ism == fChildren.end()) return 0x0;
151   istack = find_if(((AliEveTRDNode*)(*ism))->begin(), ((AliEveTRDNode*)(*ism))->end(), ID<TEveElement*>(fGeo->GetChamber(d)));
152   if(istack == ((AliEveTRDNode*)(*ism))->end()) return 0x0;
153   ichmb = find_if(((AliEveTRDNode*)(*istack))->begin(), ((AliEveTRDNode*)(*istack))->end(), ID<TEveElement*>(d));
154   if(ichmb == ((AliEveTRDNode*)(*istack))->end()) return 0x0;
155   return dynamic_cast<AliEveTRDChamber*>(*ichmb);
156 }
157
158 //______________________________________________________________________________
159 Bool_t AliEveTRDLoader::GoToEvent(int ev)
160 {
161   // Go to given event.
162
163   if(!fChildren.size()){
164     AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
165     return kFALSE;
166   }
167
168   fEvent = ev;
169
170   Unload();
171
172   TTree *t = 0x0;
173   TFile *f = new TFile(Form("%s/%s", fDir.Data(), fFilename.Data()));
174   if(! f->cd(Form("Event%d", ev))){
175     AliError(Form("Couldn't find event %d in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
176     f->Close(); delete f;
177     return kFALSE;
178   }
179
180   if(fLoadDigits){
181     t = (TTree*)gDirectory->Get("TreeD");
182     if(!t) return kFALSE;
183     if(!LoadDigits(t)) return kFALSE;
184   } else if(fLoadClusters){
185     t = (TTree*)gDirectory->Get("TreeR");
186     if(!t) return kFALSE;
187     if(!LoadClusters(t)) return kFALSE;
188   } else if(fLoadTracks){
189     t = (TTree*)gDirectory->Get("TreeT");
190     if(!t) return kFALSE;
191     if(!LoadTracklets(t)) return kFALSE;
192   } else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
193
194   f->Close(); delete f;
195
196   gEve->Redraw3D();
197
198   return kTRUE;
199 }
200
201
202 //______________________________________________________________________________
203 Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
204 {
205   // Load clusters.
206
207   AliInfo("Loading ...");
208   if(!fChildren.size()) return kTRUE;
209
210   TObjArray *clusters = new TObjArray();
211   tC->SetBranchAddress("TRDcluster", &clusters);
212
213   AliEveTRDChamber *chmb = 0x0;
214   AliTRDcluster *c=0x0;
215   for(int idet=0; idet<540; idet++){
216     tC->GetEntry(idet);
217     if(!clusters->GetEntriesFast()) continue;
218     c = (AliTRDcluster*)clusters->UncheckedAt(0);
219     if(!c) continue;
220     if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
221   }
222   return kTRUE;
223 }
224
225
226 //______________________________________________________________________________
227 Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
228 {
229   // Load digits.
230
231   AliInfo("Loading ...");
232
233   if(!fChildren.size()) return kTRUE;
234
235   AliEveTRDChamber *chmb;
236   AliTRDdigitsManager dm;
237   dm.ReadDigits(tD);
238   for(int idet=0; idet<540; idet++){
239     if(!(chmb=GetChamber(idet))) continue;
240     //  digits = dm.GetDigits(idet);
241     //  if(!digits) continue;
242     //  chmb->LoadDigits(digits);
243     chmb->LoadDigits(&dm);
244   }
245   return kTRUE;
246 }
247
248
249 //______________________________________________________________________________
250 Bool_t AliEveTRDLoader::LoadTracklets(TTree *tT)
251 {
252   // Load tracklets.
253
254   AliInfo("Loading ...");
255   if(!fChildren.size()) return kTRUE;
256
257   TObjArray *tracks = new TObjArray();
258   tT->SetBranchAddress("TRDmcmTracklet",&tracks);
259
260   AliEveTRDChamber *chmb = 0x0;
261   AliTRDmcmTracklet *trk=0x0;
262   for(int idet=0; idet<540; idet++){
263     if(!tT->GetEntry(idet)) continue;
264     if(tracks->GetEntriesFast()) trk = (AliTRDmcmTracklet*)tracks->UncheckedAt(0);
265     if((chmb = GetChamber(trk->GetDetector()))) chmb->LoadTracklets(tracks);
266   }
267
268   return kTRUE;
269 }
270
271
272 //______________________________________________________________________________
273 Bool_t AliEveTRDLoader::Open(const char *filename, const char *dir)
274 {
275   // Open given file in given directory.
276
277   fFilename = filename;
278   fDir = dir;
279   Int_t count = 0;
280   count += fLoadDigits ? 1 : 0;
281   count += fLoadClusters ? 1 : 0;
282   count += fLoadTracks ? 1 : 0;
283
284   TObjArray *so = fFilename.Tokenize(".");
285
286   if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
287     if(!count){
288       AliWarning("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
289       return kFALSE;
290     } else {
291       Warning("Open()", "Filename didn't fulfill naming conventions.");
292       return kTRUE;
293     }
294   }
295   if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
296     if(!fLoadDigits) AliWarning("Data type set to DIGITS according to file name. Previous settings with SetDataType() will be discarded.");
297     fLoadDigits = kTRUE;
298   } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
299     if(!fLoadClusters) AliWarning("Data type set to CLUSTERS according to file name. Previous settings with SetDataType() will be discarded.");
300     fLoadClusters = kTRUE;
301   } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracks") == 0){
302     if(!fLoadTracks) AliWarning("Data type set to TRACKLETS according to file name. Previous settings with SetDataType() will be discarded.");
303     fLoadTracks = kTRUE;
304   } else if(count){
305     AliWarning("Filename didn't fulfill naming conventions.");
306     return kTRUE;
307   } else {
308     AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
309     return kFALSE;
310   }
311
312   return kTRUE;
313 }
314
315 //______________________________________________________________________________
316 void AliEveTRDLoader::Paint(Option_t *option)
317 {
318   // Paint object.
319
320   List_i ichmb = fChildren.begin();
321   while(ichmb != fChildren.end()){
322     (dynamic_cast<AliEveTRDModule*>(*ichmb))->Paint(option);
323     ichmb++;
324   }
325 }
326
327 //______________________________________________________________________________
328 void AliEveTRDLoader::SetDataType(TRDDataTypes type)
329 {
330   // Set type of data.
331
332   fLoadHits     = kFALSE;
333   fLoadDigits   = kFALSE;
334   fLoadClusters = kFALSE;
335   fLoadTracks   = kFALSE;
336   switch(type){
337     case kHits:     fLoadHits = kTRUE; break;
338     case kDigits:   fLoadDigits = kTRUE; break;
339     case kClusters: fLoadClusters = kTRUE; break;
340     case kTracks:   fLoadTracks = kTRUE; break;
341     case kRawRoot: break;
342     case kRawData: break;
343   }
344 }
345
346 //______________________________________________________________________________
347 void AliEveTRDLoader::Unload()
348 {
349   // Unload module data.
350
351   List_i ichmb = fChildren.begin();
352   while(ichmb != fChildren.end()){
353     (dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
354     ichmb++;
355   }
356 }
357
358 ///////////////////////////////////////////////////////////
359 /////////////   AliEveTRDLoaderEditor       /////////////////////
360 ///////////////////////////////////////////////////////////
361
362 //______________________________________________________________________________
363 AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height,
364                                              UInt_t options, Pixel_t back) :
365   TGedFrame(p, width, height, options | kVerticalFrame, back),
366   fM(0), fFile(0), fEvent(0),
367   fSMNumber(0), fStackNumber(0), fPlaneNumber(0)
368 {
369   // Constructor.
370
371   MakeTitle("AliEveTRDLoader");
372
373   Int_t labelW = 42;
374
375   TGHorizontalFrame* f = new TGHorizontalFrame(this);
376   TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
377   TGLabel* l = new TGLabel(g, "File: ");
378   g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
379   f->AddFrame(g);
380   fFile = new TGTextEntry(f);
381   fFile->SetToolTipText("Select TRD data file or galice.root");
382   fFile->SetWidth(140);
383   fFile->Connect("DoubleClicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
384   f->AddFrame(fFile);
385
386   TGTextButton* openFile = new TGTextButton(f, "Browse");
387   f->AddFrame(openFile);
388   openFile->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
389   AddFrame(f);
390
391
392   fEvent = new TEveGValuator(this, "Event:", 110, 0);
393   fEvent->SetShowSlider(kFALSE);
394   fEvent->SetLabelWidth(labelW);
395   fEvent->SetNELength(6);
396   fEvent->Build();
397   fEvent->SetLimits(-1, 1000);
398   fEvent->SetToolTip("Set event number to be monitored");
399   fEvent->Connect("ValueSet(Double_t)",
400                   "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
401   AddFrame(fEvent);
402
403
404   // "Chamber(s) selector" group frame
405   TGGroupFrame *fGroupFrame1974 = new TGGroupFrame(this,"Chamber(s) selector");
406   TGVerticalFrame *fVerticalFrame1974 = new TGVerticalFrame(fGroupFrame1974, 150, 50,kVerticalFrame);
407
408   fSMNumber = new TEveGValuator(fVerticalFrame1974, "SM:", 0, 0);
409   fSMNumber->SetShowSlider(kFALSE);
410   fSMNumber->SetLabelWidth(labelW);
411   fSMNumber->SetNELength(6);
412   fSMNumber->Build();
413   fSMNumber->SetLimits(-1, 17);
414   fSMNumber->SetToolTip("Supermodule id [-1 for all]");
415   fVerticalFrame1974->AddFrame(fSMNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
416
417   fStackNumber = new TEveGValuator(fVerticalFrame1974, "Stack:", 0, 0);
418   fStackNumber->SetShowSlider(kFALSE);
419   fStackNumber->SetLabelWidth(labelW);
420   fStackNumber->SetNELength(6);
421   fStackNumber->Build();
422   fStackNumber->SetLimits(-1, 4);
423   fStackNumber->SetToolTip("Stack id [-1 for all in this SM]");
424   fVerticalFrame1974->AddFrame(fStackNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
425
426   fPlaneNumber = new TEveGValuator(fVerticalFrame1974, "Plane:", 0, 0);
427   fPlaneNumber->SetShowSlider(kFALSE);
428   fPlaneNumber->SetLabelWidth(labelW);
429   fPlaneNumber->SetNELength(6);
430   fPlaneNumber->Build();
431   fPlaneNumber->SetLimits(-1, 5);
432   fPlaneNumber->SetToolTip("Plane id [-1 for all in this stack]");
433
434   fVerticalFrame1974->AddFrame(fPlaneNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
435
436   fGroupFrame1974->AddFrame(fVerticalFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY | kLHintsCenterX,2,2,2,2));
437
438   TGTextButton *fTextButton2037 = new TGTextButton(fGroupFrame1974,"Select");
439   fTextButton2037->SetTextJustify(36);
440   fGroupFrame1974->AddFrame(fTextButton2037, new TGLayoutHints(kLHintsExpandY | kLHintsCenterX,2,2,2,2));
441   fTextButton2037->SetToolTipText("Apply selection", 400);
442   fTextButton2037->Connect("Clicked()",
443                            "AliEveTRDLoaderEditor", this, "AddChambers()");
444
445   fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
446   AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
447
448
449   TGTextButton *fTextButton2004 = new TGTextButton(this,"Load");
450   fTextButton2004->SetTextJustify(36);
451   fTextButton2004->Resize(164,22);
452   AddFrame(fTextButton2004, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
453   fTextButton2004->SetToolTipText("Load data according to selection", 400);
454   fTextButton2004->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Load()");
455 }
456
457 //______________________________________________________________________________
458 void AliEveTRDLoaderEditor::SetModel(TObject* obj)
459 {
460   // Set model object.
461
462   fM = dynamic_cast<AliEveTRDLoader*>(obj);
463
464   fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
465
466   Bool_t kFile = kTRUE;
467   if(fM->fFilename.CompareTo("") == 0) kFile = kFALSE;
468
469   fEvent->SetEnabled(kFile);
470   fEvent->GetEntry()->SetIntNumber(fM->fEvent);
471
472   fSMNumber->SetEnabled(kFile);
473   fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
474
475
476   fStackNumber->SetEnabled(kFile);
477   fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
478
479
480   fPlaneNumber->SetEnabled(kFile);
481   fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
482 }
483
484 //______________________________________________________________________________
485 void AliEveTRDLoaderEditor::AddChambers()
486 {
487   // Slot to add chambers.
488
489   fM->fSM    = (int)fSMNumber->GetEntry()->GetNumber();
490   fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
491   fM->fLy    = (int)fPlaneNumber->GetEntry()->GetNumber();
492   fM->AddChambers(fM->fSM, fM->fStack, fM->fLy);
493 }
494
495 //______________________________________________________________________________
496 void AliEveTRDLoaderEditor::FileOpen()
497 {
498   // Slot for opening of file.
499
500   TGFileInfo fi;
501   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFilename.Data()));
502   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFilename.Data()));
503   //  fi.fFileTypes = tpcfiletypes;
504
505   new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
506   if (!fi.fFilename) return;
507
508   fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
509   fFile->SetText       (gSystem->BaseName(fi.fFilename));
510
511   fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename));
512
513   this->SetModel(fM);
514 }
515
516 void AliEveTRDLoaderEditor::Load()
517 {
518   // Slot for loading of event.
519
520   fM->GoToEvent(fM->fEvent);
521 }