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