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