]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Alieve/TRDLoader.cxx
Minor changes in the local case based on the v4-04-Rev-14
[u/mrichter/AliRoot.git] / EVE / Alieve / TRDLoader.cxx
1 #include "TRDLoader.h"
2 #include "TRDModuleImp.h"
3
4 #include <Reve/RGTopFrame.h>
5 #include <Reve/RGValuators.h>
6
7 #include "TSystem.h"
8 #include "TFile.h"
9 #include "TTree.h"
10 #include "TString.h"
11 #include "TObjString.h"
12 #include "TObjArray.h"
13
14 #include <TGLabel.h>
15 #include <TGButton.h>
16 #include <TGTextEntry.h>
17 #include <TGNumberEntry.h>
18 #include <TGFileDialog.h>
19 #include <TGListTree.h>
20 #include <TGToolTip.h>
21
22 #include "AliLog.h"
23 #include "AliCDBManager.h"
24
25 #include "AliTRDv1.h"
26 #include "AliTRDhit.h"
27 #include "AliTRDcluster.h"
28 #include "AliTRDmcmTracklet.h"
29 #include "AliTRDdigitsManager.h"
30 #include "AliTRDgeometry.h"
31
32
33 #include <algorithm>
34
35 using namespace Reve;
36 using namespace Alieve;
37 using namespace std;
38 class AliTRDdataArrayI;
39
40 ClassImp(Alieve::TRDLoader)
41 ClassImp(Alieve::TRDLoaderEditor)
42
43 ///////////////////////////////////////////////////////////
44 /////////////         TRDLoader       /////////////////////
45 ///////////////////////////////////////////////////////////
46
47
48 //________________________________________________________
49 TRDLoader::TRDLoader(const Text_t* n, const Text_t* t) : Reve::RenderElementList(n, t), fSM(-1), fStack(-1), fLy(-1), fEvent(0)
50 {       
51         kLoadHits = kFALSE;
52         kLoadDigits = kFALSE;
53         kLoadClusters = kFALSE;
54         kLoadTracks = kFALSE;
55         fFilename = "";
56         fDir = ".";
57         fEvent  = -1;
58
59         fTRD           = 0x0;   
60         fGeo = new AliTRDgeometry();
61         
62         AliCDBManager *fCDBManager=AliCDBManager::Instance();
63         fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
64         fCDBManager->SetRun(0);
65 }
66
67 //________________________________________________________
68 TRDLoader::~TRDLoader()
69 {
70 //      if(fChambers) {fChambers->clear(); delete fChambers;}
71 }
72
73 //________________________________________________________
74 template<class T>
75 class ID
76 {
77 public:
78         ID( int value ) : id(value) {}
79         bool operator()(const T &t) const {
80                 return ((dynamic_cast<TRDModule*>(t))->GetID() == id);
81         }
82 private:
83         const int id;
84 };
85 void    TRDLoader::AddChambers(int sm, int stk, int ly)
86 {
87         Int_t ism_start = (sm == -1) ?  0 : sm;
88         Int_t ism_stop  = (sm == -1) ? 18 : sm+1;
89         Int_t istk_start= (stk == -1)?  0 : stk;
90         Int_t istk_stop = (stk == -1)?  5 : stk+1;
91         Int_t ily_start = (ly == -1) ?  0 : ly;
92         Int_t ily_stop  = (ly == -1) ?  6 : ly+1;
93
94         List_i ichmb;
95         ichmb = fChildren.begin();
96         while(ichmb != fChildren.end()){
97                 (*ichmb)->SetRnrSelf(kFALSE);
98                 ichmb++;
99         }
100
101         TRDNode *SM=0x0, *STK=0x0;
102         TRDChamber *CHMB = 0x0;
103         int det;
104         for(int ism=ism_start; ism<ism_stop; ism++){
105                 ichmb = find_if(fChildren.begin(), fChildren.end(), ID<RenderElement*>(ism));
106                 if(ichmb != fChildren.end()){
107                         SM = (TRDNode*)(*ichmb);
108                         SM->SetRnrSelf(kTRUE);
109                 }else{
110                         gReve->AddRenderElement(this, SM = new TRDNode("SM", ism));
111                         SM->FindListTreeItem(gReve->GetListTree())->SetTipText(Form("Supermodule %2d", ism));
112                 }
113                 for(int istk=istk_start; istk<istk_stop; istk++){
114                         ichmb = find_if(SM->begin(), SM->end(), ID<RenderElement*>(istk));
115                         if(ichmb != SM->end()){
116                                 STK = (TRDNode*)(*ichmb);
117                                 STK->SetRnrSelf(kTRUE);
118                         }else{
119                                 gReve->AddRenderElement(SM, STK = new TRDNode("Stack", istk));
120                                 STK->FindListTreeItem(gReve->GetListTree())->SetTipText(Form("SM %2d Stack %1d", ism, istk));
121                         }
122                         for(int ily=ily_start; ily<ily_stop; ily++){
123                                 det = fGeo->GetDetector(ily, istk, ism);
124                                 ichmb = find_if(STK->begin(), STK->end(), ID<RenderElement*>(det));
125                                 if(ichmb != STK->end()) (*ichmb)->SetRnrSelf(kTRUE);
126                                 else{
127                                         gReve->AddRenderElement(STK, CHMB = new TRDChamber(det));
128                                         CHMB->SetGeometry(fGeo);
129                                         CHMB->FindListTreeItem(gReve->GetListTree())->SetTipText(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
130                                 }
131                         }
132                 }
133         }
134         gReve->Redraw3D();
135 }
136
137 //________________________________________________________
138 TRDChamber*     TRDLoader::GetChamber(int d)
139 {
140         List_i ism, istack, ichmb;
141         
142         ism = find_if(fChildren.begin(), fChildren.end(), ID<RenderElement*>(fGeo->GetSector(d)));
143         if(ism == fChildren.end()) return 0x0;
144         istack = find_if(((TRDNode*)(*ism))->begin(), ((TRDNode*)(*ism))->end(), ID<RenderElement*>(fGeo->GetChamber(d)));
145         if(istack == ((TRDNode*)(*ism))->end()) return 0x0;
146         ichmb = find_if(((TRDNode*)(*istack))->begin(), ((TRDNode*)(*istack))->end(), ID<RenderElement*>(d));
147         if(ichmb == ((TRDNode*)(*istack))->end()) return 0x0;
148         return dynamic_cast<TRDChamber*>(*ichmb);
149 }
150
151 //________________________________________________________
152 Bool_t  TRDLoader::GoToEvent(int ev)
153 {
154         if(!fChildren.size()){
155                 AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
156                 return kFALSE;
157         }
158
159         fEvent = ev;
160
161         Unload();
162         
163         TTree *t = 0x0;
164         TFile *f = new TFile(Form("%s/%s", fDir.Data(), fFilename.Data()));
165         if(! f->cd(Form("Event%d", ev))){
166                 AliError(Form("Couldn't find event %d in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
167                 f->Close(); delete f;
168                 return kFALSE;
169         }
170         
171         if(kLoadDigits){
172                 t = (TTree*)gDirectory->Get("TreeD");
173                 if(!t) return kFALSE;
174                 if(!LoadDigits(t)) return kFALSE;
175         } else if(kLoadClusters){
176                 t = (TTree*)gDirectory->Get("TreeR");
177                 if(!t) return kFALSE;
178                 if(!LoadClusters(t)) return kFALSE;
179         } else if(kLoadTracks){
180                 t = (TTree*)gDirectory->Get("TreeT");
181                 if(!t) return kFALSE;
182                 if(!LoadTracklets(t)) return kFALSE;
183         } else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
184
185         f->Close(); delete f;
186         
187         gReve->Redraw3D();
188         
189         return kTRUE;
190 }
191
192
193 //________________________________________________________
194 Bool_t  TRDLoader::LoadClusters(TTree *tC)
195 {
196         AliInfo("Loading ...");
197         if(!fChildren.size()) return kTRUE;
198
199         TObjArray *clusters = new TObjArray();
200         tC->SetBranchAddress("TRDcluster", &clusters);
201
202         TRDChamber *chmb = 0x0; 
203         AliTRDcluster *c=0x0;
204         for(int idet=0; idet<540; idet++){
205                 tC->GetEntry(idet);
206                 if(!clusters->GetEntriesFast()) continue;
207                 c = (AliTRDcluster*)clusters->UncheckedAt(0);
208                 if(!c) continue;
209                 if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
210         }
211         return kTRUE;
212 }
213
214
215 //________________________________________________________
216 Bool_t  TRDLoader::LoadDigits(TTree *tD)
217 {
218         AliInfo("Loading ...");
219         
220         if(!fChildren.size()) return kTRUE;
221         
222         TRDChamber *chmb;
223         AliTRDdigitsManager dm;
224         dm.ReadDigits(tD);
225         for(int idet=0; idet<540; idet++){
226                 if(!(chmb=GetChamber(idet))) continue;
227 //              digits = dm.GetDigits(idet);
228 //              if(!digits) continue;
229 //              chmb->LoadDigits(digits);
230                 chmb->LoadDigits(&dm);
231         }
232         return kTRUE;
233 }
234
235
236 //________________________________________________________
237 Bool_t  TRDLoader::LoadTracklets(TTree *tT)
238 {
239         AliInfo("Loading ...");
240         if(!fChildren.size()) return kTRUE;
241
242         TObjArray *tracks = new TObjArray();
243         tT->SetBranchAddress("TRDmcmTracklet",&tracks);
244         
245         TRDChamber *chmb = 0x0;
246         AliTRDmcmTracklet *trk=0x0;
247         for(int idet=0; idet<540; idet++){
248                 if(!tT->GetEntry(idet)) continue;
249                 if(tracks->GetEntriesFast()) trk = (AliTRDmcmTracklet*)tracks->UncheckedAt(0);
250                 if((chmb = GetChamber(trk->GetDetector()))) chmb->LoadTracklets(tracks);
251         }
252         
253         return kTRUE;
254 }
255         
256
257 //________________________________________________________
258 Bool_t  TRDLoader::Open(const char *filename, const char *dir)
259 {
260         fFilename = filename;
261         fDir = dir;
262         Int_t count = 0;
263         count += kLoadDigits ? 1 : 0;
264         count += kLoadClusters ? 1 : 0;
265         count += kLoadTracks ? 1 : 0;
266         
267         TObjArray *so = fFilename.Tokenize(".");
268
269         if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
270                 if(!count){
271                         AliWarning("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
272                         return kFALSE;
273                 } else {
274                         Warning("Open()", "Filename didn't fulfill naming conventions.");
275                         return kTRUE;
276                 }
277         }
278         if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
279                 if(!kLoadDigits) AliWarning("Data type set to DIGITS according to file name. Previous settings with SetDataType() will be discarded.");
280                 kLoadDigits = kTRUE;
281         } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
282                 if(!kLoadClusters) AliWarning("Data type set to CLUSTERS according to file name. Previous settings with SetDataType() will be discarded.");
283                 kLoadClusters = kTRUE;
284         } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracks") == 0){
285                 if(!kLoadTracks) AliWarning("Data type set to TRACKLETS according to file name. Previous settings with SetDataType() will be discarded.");
286                 kLoadTracks = kTRUE;
287         } else if(count){
288                 AliWarning("Filename didn't fulfill naming conventions.");
289                 return kTRUE;
290         } else {
291                 AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
292                 return kFALSE;
293         }
294         
295         return kTRUE;
296 }
297
298
299
300 //________________________________________________________
301 void TRDLoader::Paint(Option_t *option)
302 {
303         List_i ichmb = fChildren.begin();
304         while(ichmb != fChildren.end()){
305                 (dynamic_cast<TRDModule*>(*ichmb))->Paint(option);
306                 ichmb++;
307         }
308 }
309
310 //________________________________________________________
311 void    TRDLoader::SetDataType(TRDDataTypes type)
312 {
313         kLoadHits     = kFALSE;
314         kLoadDigits   = kFALSE;
315         kLoadClusters = kFALSE;
316         kLoadTracks   = kFALSE;
317         switch(type){
318         case kHits: kLoadHits = kTRUE; break;
319         case kDigits: kLoadDigits = kTRUE; break;
320         case kClusters: kLoadClusters = kTRUE; break;
321         case kTracks: kLoadTracks = kTRUE; break;
322         case kRawRoot: break;
323         case kRawData: break;
324         }
325 }
326
327 //________________________________________________________
328 void TRDLoader::Unload()
329 {
330         List_i ichmb = fChildren.begin();
331         while(ichmb != fChildren.end()){
332                 (dynamic_cast<TRDModule*>(*ichmb))->Reset();
333                 ichmb++;
334         }
335 }
336
337 ///////////////////////////////////////////////////////////
338 /////////////   TRDLoaderEditor       /////////////////////
339 ///////////////////////////////////////////////////////////
340
341 //________________________________________________________
342 TRDLoaderEditor::TRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height, UInt_t options, Pixel_t back) : TGedFrame(p, width, height, options | kVerticalFrame, back)
343 {
344         MakeTitle("TRDLoader");
345         
346   fFile = 0x0;
347         TGTextButton *fOpenFile = 0x0;
348         Int_t labelW = 42;
349  
350         TGHorizontalFrame* f = new TGHorizontalFrame(this);
351         TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
352         TGLabel* l = new TGLabel(g, "File: ");
353         g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
354         f->AddFrame(g);
355         fFile = new TGTextEntry(f);
356         fFile->SetToolTipText("Select TRD data file or galice.root");
357         fFile->SetWidth(140);
358         fFile->Connect("DoubleClicked()", "Alieve::TRDLoaderEditor", this, "FileOpen()");
359         f->AddFrame(fFile);
360         
361         fOpenFile = new TGTextButton(f, "Browse");
362         f->AddFrame(fOpenFile);
363         fOpenFile->Connect("Clicked()", "Alieve::TRDLoaderEditor", this, "FileOpen()");
364         AddFrame(f);
365
366                 
367   fEvent = new RGValuator(this, "Event:", 110, 0);
368   fEvent->SetShowSlider(kFALSE);
369   fEvent->SetLabelWidth(labelW);
370   fEvent->SetNELength(6);
371   fEvent->Build();
372   fEvent->SetLimits(-1, 1000);
373   fEvent->SetToolTip("Set event number to be monitored");
374         fEvent->Connect("ValueSet(Double_t)",
375                   "Alieve::TRDLoaderEditor", this, "SetEvent(Double_t)");
376         AddFrame(fEvent);
377
378
379         // "Chamber(s) selector" group frame
380         TGGroupFrame *fGroupFrame1974 = new TGGroupFrame(this,"Chamber(s) selector");
381         TGVerticalFrame *fVerticalFrame1974 = new TGVerticalFrame(fGroupFrame1974, 150, 50,kVerticalFrame);
382   
383         fSMNumber = new RGValuator(fVerticalFrame1974, "SM:", 0, 0);
384   fSMNumber->SetShowSlider(kFALSE);
385   fSMNumber->SetLabelWidth(labelW);
386   fSMNumber->SetNELength(6);
387   fSMNumber->Build();
388   fSMNumber->SetLimits(-1, 17);
389   fSMNumber->SetToolTip("Supermodule id [-1 for all]");
390         fVerticalFrame1974->AddFrame(fSMNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
391
392         fStackNumber = new RGValuator(fVerticalFrame1974, "Stack:", 0, 0);
393   fStackNumber->SetShowSlider(kFALSE);
394   fStackNumber->SetLabelWidth(labelW);
395   fStackNumber->SetNELength(6);
396   fStackNumber->Build();
397   fStackNumber->SetLimits(-1, 4);
398   fStackNumber->SetToolTip("Stack id [-1 for all in this SM]");
399         fVerticalFrame1974->AddFrame(fStackNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
400
401         fPlaneNumber = new RGValuator(fVerticalFrame1974, "Plane:", 0, 0);
402   fPlaneNumber->SetShowSlider(kFALSE);
403   fPlaneNumber->SetLabelWidth(labelW);
404   fPlaneNumber->SetNELength(6);
405   fPlaneNumber->Build();
406   fPlaneNumber->SetLimits(-1, 5);
407   fPlaneNumber->SetToolTip("Plane id [-1 for all in this stack]");
408
409         fVerticalFrame1974->AddFrame(fPlaneNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
410         
411         fGroupFrame1974->AddFrame(fVerticalFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY | kLHintsCenterX,2,2,2,2));
412
413         TGTextButton *fTextButton2037 = new TGTextButton(fGroupFrame1974,"Select");
414         fTextButton2037->SetTextJustify(36);
415         fGroupFrame1974->AddFrame(fTextButton2037, new TGLayoutHints(kLHintsExpandY | kLHintsCenterX,2,2,2,2));
416   fTextButton2037->SetToolTipText("Apply selection", 400);
417         fTextButton2037->Connect("Clicked()",
418                                         "Alieve::TRDLoaderEditor", this, "AddChambers()");
419
420         fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
421         AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
422
423
424         TGTextButton *fTextButton2004 = new TGTextButton(this,"Load");
425         fTextButton2004->SetTextJustify(36);
426         fTextButton2004->Resize(164,22);
427         AddFrame(fTextButton2004, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
428         fTextButton2004->SetToolTipText("Load data according to selection", 400);
429         fTextButton2004->Connect("Clicked()", "Alieve::TRDLoaderEditor", this, "Load()");
430 }
431
432 //________________________________________________________
433 TRDLoaderEditor::~TRDLoaderEditor()
434 {}
435
436 //_________________________________________________________
437 void TRDLoaderEditor::SetModel(TObject* obj)
438 {
439
440         fM = dynamic_cast<TRDLoader*>(obj);
441
442         fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
443
444         Bool_t kFile = kTRUE;
445         if(fM->fFilename.CompareTo("") == 0) kFile = kFALSE;
446
447         fEvent->SetEnabled(kFile);
448         fEvent->GetEntry()->SetIntNumber(fM->fEvent);
449         
450         fSMNumber->SetEnabled(kFile);
451         fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
452
453
454         fStackNumber->SetEnabled(kFile);
455         fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
456
457
458         fPlaneNumber->SetEnabled(kFile);
459         fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
460 }
461
462 //________________________________________________________
463 void TRDLoaderEditor::AddChambers()
464 {
465         fM->fSM    = (int)fSMNumber->GetEntry()->GetNumber();
466         fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
467         fM->fLy    = (int)fPlaneNumber->GetEntry()->GetNumber();
468         fM->AddChambers(fM->fSM, fM->fStack, fM->fLy);
469 }
470
471 //________________________________________________________
472 void TRDLoaderEditor::FileOpen()
473 {
474   TGFileInfo fi;
475   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFilename.Data()));
476   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFilename.Data()));
477 //  fi.fFileTypes = tpcfiletypes;
478
479   new TGFileDialog(fClient->GetRoot(), gReve, kFDOpen, &fi);
480   if (!fi.fFilename) return;
481
482   fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
483   fFile->SetText       (gSystem->BaseName(fi.fFilename));
484
485         fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename));
486
487         this->SetModel(fM);
488 }
489
490 void TRDLoaderEditor::Load()
491 {
492         fM->GoToEvent(fM->fEvent);
493 }