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