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