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