da05223cf7d9a236de55474452a22bffd896b784
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDModuleImp.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 "AliEveTRDModuleImp.h"
11 #include "AliEveTRDData.h"
12 #include "EveBase/AliEveEventManager.h"
13
14 #include "TTree.h"
15 #include "TGListTree.h"
16 #include "TClonesArray.h"
17 #include "TGeoManager.h"
18 #include "TGeoMatrix.h"
19
20 #include "TEveManager.h"
21 #include "TEveTrack.h"
22 #include "TEveGeoNode.h"
23 #include "TEveTrans.h"
24
25
26 #include "AliLog.h"
27 #include "AliCDBManager.h"
28 #include "AliTRDgeometry.h"
29 #include "AliTRDCommonParam.h"
30 #include "AliTRDpadPlane.h"
31 #include "AliTRDhit.h"
32 #include "AliTRDcluster.h"
33 #include "AliTRDtrackingChamber.h"
34 #include "AliTRDtrackletMCM.h"
35
36 ClassImp(AliEveTRDChamber)
37 ClassImp(AliEveTRDNode)
38
39 //______________________________________________________________________________
40 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
41   TEveElement(), AliEveTRDModule(typ, det)
42 {
43   // Xonstructor.
44 }
45
46 //______________________________________________________________________________
47 void AliEveTRDNode::Paint(Option_t* option)
48 {
49   // Paint object.
50
51   List_i iter = fChildren.begin();
52   while(iter != fChildren.end()){
53     (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
54     iter++;
55   }
56 }
57
58 //______________________________________________________________________________
59 void AliEveTRDNode::Reset()
60 {
61   // Reset.
62
63   List_i iter = fChildren.begin();
64   while(iter != fChildren.end()){
65     (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
66     iter++;
67   }
68 }
69
70 //______________________________________________________________________________
71 void AliEveTRDNode::Collapse()
72 {
73   // Collapse.
74
75   TGListTree *list = gEve->GetListTree();
76   AliEveTRDNode *node = 0x0;
77   List_i iter = fChildren.begin();
78   while(iter != fChildren.end()){
79     if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse();
80     list->CloseItem(FindListTreeItem(list));
81     iter++;
82   }
83 }
84
85 //______________________________________________________________________________
86 void AliEveTRDNode::Expand()
87 {
88   // Expand.
89
90   TGListTree *list = gEve->GetListTree();
91   AliEveTRDNode *node = 0x0;
92   List_i iter = fChildren.begin();
93   while(iter != fChildren.end()){
94     if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
95     list->OpenItem(FindListTreeItem(list));
96     iter++;
97   }
98 }
99
100 //______________________________________________________________________________
101 void AliEveTRDNode::EnableListElements()
102 {
103   // Enable list elements.
104
105   SetRnrSelf(kTRUE);
106   AliEveTRDNode *node = 0x0;
107   AliEveTRDChamber *chmb = 0x0;
108   List_i iter = fChildren.begin();
109   while(iter != fChildren.end()){
110     if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
111       node->SetRnrSelf(kTRUE);
112       node->EnableListElements();
113     }
114     if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
115     iter++;
116   }
117   gEve->Redraw3D();
118 }
119
120 //______________________________________________________________________________
121 void AliEveTRDNode::DisableListElements()
122 {
123   // Disable list elements.
124
125   SetRnrSelf(kFALSE);
126   AliEveTRDNode *node = 0x0;
127   AliEveTRDChamber *chmb = 0x0;
128   List_i iter = fChildren.begin();
129   while(iter != fChildren.end()){
130     if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
131       node->SetRnrSelf(kFALSE);
132       node->DisableListElements();
133     }
134     if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
135     iter++;
136   }
137   gEve->Redraw3D();
138 }
139
140 //______________________________________________________________________________
141 void AliEveTRDNode::UpdateLeaves()
142 {
143   // Update leaves.
144
145   AliEveTRDModule *module;
146   List_i iter = fChildren.begin();
147   while(iter != fChildren.end()){
148     module = dynamic_cast<AliEveTRDModule*>(*iter);
149     if(!module) continue;
150
151     module->fRnrHits = fRnrHits;
152     module->fRnrDigits = fRnrDigits;
153     module->fDigitsLog = fDigitsLog;
154     module->fDigitsBox = fDigitsBox;
155     module->fDigitsThreshold = fDigitsThreshold;
156     module->fDigitsNeedRecompute = fDigitsNeedRecompute;
157     module->fRnrRecPoints = fRnrRecPoints;
158     module->fRnrTracklets = fRnrTracklets;
159     iter++;
160   }
161
162   AliEveTRDNode *node = 0x0;
163   iter = fChildren.begin();
164   while(iter != fChildren.end()){
165     if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
166     iter++;
167   }
168 }
169
170
171 //______________________________________________________________________________
172 void AliEveTRDNode::UpdateNode()
173 {
174   // Update node.
175
176   // Info("UpdateNode()", Form("%s", GetName()));
177   AliEveTRDNode *node = 0x0;
178   List_i iter = fChildren.begin();
179   while(iter != fChildren.end()){
180     if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
181     iter++;
182   }
183
184   Int_t score[11];
185   for(int i=0; i<11; i++) score[i] = 0;
186   AliEveTRDModule *module;
187   iter = fChildren.begin();
188   while(iter != fChildren.end()){
189     module = dynamic_cast<AliEveTRDModule*>(*iter);
190     if(!module) continue;
191     score[0] += (module->fLoadHits) ? 1 : 0;
192     score[1] += (module->fRnrHits) ? 1 : 0;
193
194     score[2] += (module->fLoadDigits) ? 1 : 0;
195     score[3] += (module->fRnrDigits) ? 1 : 0;
196     score[4] += (module->fDigitsLog) ? 1 : 0;
197     score[5] += (module->fDigitsBox) ? 1 : 0;
198     score[6] += (module->fDigitsNeedRecompute) ? 1 : 0;
199
200     score[7] += (module->fLoadRecPoints) ? 1 : 0;
201     score[8] += (module->fRnrRecPoints) ? 1 : 0;
202
203     score[9] += (module->fLoadTracklets) ? 1 : 0;
204     score[10] += (module->fRnrTracklets) ? 1 : 0;
205     iter++;
206   }
207
208   Int_t size = fChildren.size();
209   fLoadHits      = (score[0] > 0) ? kTRUE : kFALSE;
210   fRnrHits       = (score[1] == size) ? kTRUE : kFALSE;
211
212   fLoadDigits    = (score[2] > 0) ? kTRUE : kFALSE;
213   fRnrDigits     = (score[3] == size) ? kTRUE : kFALSE;
214   fDigitsLog     = (score[4] == size) ? kTRUE : kFALSE;
215   fDigitsBox     = (score[5] == size) ? kTRUE : kFALSE;
216   fDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
217
218   fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
219   fRnrRecPoints  = (score[8] == size) ? kTRUE : kFALSE;
220
221   fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
222   fRnrTracklets  = (score[10] == size) ? kTRUE : kFALSE;
223 }
224
225
226 ///////////////////////////////////////////////////////////
227 ////////////      AliEveTRDChamber     ////////////////////
228 ///////////////////////////////////////////////////////////
229
230 //______________________________________________________________________________
231 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
232   TEveElement()
233   ,AliEveTRDModule("Chmb", det)
234   ,fDigits(0x0)
235   ,fHits(0x0)
236   ,fRecPoints(0x0)
237   ,fTracklets(0x0)
238   ,fGeo(0x0)
239   ,fShape(0x0)
240   ,fNrows(-1)
241   ,fNcols(-1)
242   ,fNtime(22)
243 {
244   //
245   // Constructor
246   //
247 }
248
249
250 //______________________________________________________________________________
251 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
252 {
253   //
254   // Draw clusters
255   //
256
257   if(!fGeo){
258     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
259     return;
260   }
261
262   if(!fRecPoints){ 
263     AddElement(fRecPoints = new AliEveTRDClusters());
264     fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
265   }
266   fRecPoints->Reset();
267
268   Float_t q;
269   Float_t g[3]; //global coordinates
270   AliTRDcluster *c=0x0;
271   Int_t nc = clusters->GetEntriesFast();
272   for(int iclus=0; iclus<nc; iclus++){
273     c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
274     c->GetGlobalXYZ(g); 
275     q = c->GetQ();
276     Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);    
277     fRecPoints->SetPointId(id, new AliTRDcluster(*c));
278   }
279   fRecPoints->StampObjProps();
280   fLoadRecPoints = kTRUE;
281 }
282
283
284 //______________________________________________________________________________
285 void AliEveTRDChamber::LoadClusters(AliTRDtrackingChamber *tc)
286 {
287   if(!fGeo){
288     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
289     return;
290   }
291
292   if(!fRecPoints){ 
293     AddElement(fRecPoints = new AliEveTRDClusters());
294     fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
295   }
296   fRecPoints->Reset();
297
298   Float_t g[3]; //global coordinates
299   const AliTRDchamberTimeBin *tb = 0x0;
300   for(int itb=0; itb<AliTRDseedV1::kNtb; itb++){
301     tb = tc->GetTB(itb);
302     if(!(Int_t(*tb))) continue;
303     const AliTRDcluster *c= 0x0; Int_t ic = 0;
304     while((c=tb->GetCluster(ic))){
305       c->GetGlobalXYZ(g); 
306       Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);    
307       fRecPoints->SetPointId(id, new AliTRDcluster(*c));
308       ic++;
309     }
310   }
311   fRecPoints->StampObjProps();
312   fLoadRecPoints = kTRUE;
313 }
314
315
316 //______________________________________________________________________________
317 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
318 {
319   //
320   // Draw digits
321   //
322   if(!fGeo){
323     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
324     return;
325   }
326
327   if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
328
329   fDigits->Reset();
330   fDigits->SetData(digits);
331   fDigits->StampObjProps();
332   fDigitsNeedRecompute = kTRUE;  
333   fLoadDigits = kTRUE;
334 }
335
336 //______________________________________________________________________________
337 void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
338 {
339   //
340   // Draw hits
341   //
342
343   if(!fHits){ 
344     AddElement(fHits = new AliEveTRDHits());
345     fHits->SetTitle(Form("Hits for Det %d", GetID()));
346   }
347   fLoadHits = kTRUE;
348   Int_t nhits = hits->GetEntriesFast();
349
350   AliTRDhit *hit = 0x0;
351   while(idx<nhits){
352     hit = (AliTRDhit*)hits->UncheckedAt(idx);
353     if(hit->GetDetector() != fDet) return;
354
355     Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
356     fHits->SetPointId(id, new AliTRDhit(*hit));
357     fHits->StampObjProps();
358     idx++;
359   }
360   return;
361 }
362
363 //______________________________________________________________________________
364 void AliEveTRDChamber::LoadTracklets(TTree *trklTree)
365 {
366   //
367   // Draw tracks
368   //
369
370   if(!fGeo){
371     Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
372     return;
373   }
374
375   if(!fTracklets){
376     fTracklets = new TClonesArray("AliEveTRDTrackletOnline",100);
377   } else {
378     fTracklets->Delete();
379     TEveElementList *trklChild = (TEveElementList*) FindChild("Tracklets");
380     trklChild->Destroy();
381   }
382
383
384   TBranch *mcmBranch = trklTree->GetBranch("mcmtrklbranch");
385   if (!mcmBranch)
386     return;
387
388   AliTRDtrackletMCM *trkl = 0x0;
389   mcmBranch->SetAddress(&trkl);
390
391   TEveElementList* listOfTracklets = new TEveElementList("Tracklets");
392   gEve->AddElement(listOfTracklets, this);
393
394   for(Int_t iTrkl = 0; iTrkl < mcmBranch->GetEntries(); iTrkl++){
395     mcmBranch->GetEntry(iTrkl);
396     if (trkl->GetDetector() == GetID()) {
397       new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliEveTRDTrackletOnline(trkl);
398       gEve->AddElement(new AliEveTRDTrackletOnline(trkl), listOfTracklets);
399     }
400   }
401   fLoadTracklets = kTRUE;
402 }
403
404 //____________________________________________________
405 void AliEveTRDChamber::Paint(Option_t* option)
406 {
407   // Paint object.
408
409   if(!fRnrSelf) return;
410   if(fDigits && fRnrDigits){
411     if(fDigitsNeedRecompute){
412       fDigits->ComputeRepresentation();
413       fDigitsNeedRecompute = kFALSE;
414     }
415     fDigits->Paint(option);
416   }
417
418   if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
419
420   if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
421
422   if(fTracklets && fRnrTracklets){
423 //    for (Int_t iTrkl = 0; iTrkl < fTracklets->GetEntriesFast(); iTrkl++) 
424 //      ((AliEveTRDTrackletOnline*) (*fTracklets)[iTrkl])->Paint();
425   }
426 }
427
428 //______________________________________________________________________________
429 void AliEveTRDChamber::Reset()
430 {
431   // Reset.
432
433   if(fHits){
434     fHits->Reset();
435     fLoadHits = kFALSE;
436   }
437   if(fDigits){
438     fDigits->Reset();
439     fLoadDigits = kFALSE;
440     fDigitsNeedRecompute = kTRUE;
441   }
442   if(fRecPoints){
443     fRecPoints->Reset();
444     fLoadRecPoints = kFALSE;
445   }
446   if(fTracklets){
447     fTracklets->Delete();
448     fLoadTracklets = kFALSE;
449   }
450 }
451
452 //______________________________________________________________________________
453 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
454 {
455   // Set geometry.
456
457   fGeo = geo;
458
459   Int_t  ism  = geo->GetSector(fDet);
460   Int_t  istk = geo->GetStack(fDet);
461   Int_t  ilyr = geo->GetLayer(fDet);
462   Int_t  icha = istk*6+ilyr;
463
464   // define pad plane size in pads
465   AliTRDpadPlane *pp = fGeo->GetPadPlane(ilyr, istk);
466   fNrows   = pp->GetNrows();
467   fNcols   = pp->GetNcols();
468
469 // this version for setting the rendarable object is not working very nice
470 // Int_t shape_offset = TEveGeoShape::Class()->GetDataMemberOffset("fShape");
471 // TEveGeoShape* eg_shape = new TEveGeoShape("geometry");
472 // eg_shape->RefMainTrans().SetFrom(* gGeoManager->GetCurrentMatrix());
473 // * (TGeoShape**) (((char*)eg_shape) + shape_offset) = gGeoManager->GetCurrentVolume()->GetShape();
474 // 
475 // eg_shape->StampColorSelection();
476   if(!(gGeoManager)){ 
477     AliCDBManager *fCDBManager=AliCDBManager::Instance();
478     fCDBManager->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
479     fCDBManager->SetRun(0);
480     AliEveEventManager::AssertGeometry();
481   }
482
483   // define rendarable volumes
484   gGeoManager->cd(Form("/B077_1/BSEGMO%d_1/BTRD%d_1/UTR1_1/UTS1_1/UTI1_1/UT%02d_1", ism, ism, icha));
485   fShape = new TEveGeoTopNode(gGeoManager, gGeoManager->GetCurrentNode());
486   fShape->RefMainTrans().SetFrom(*gGeoManager->GetCurrentMatrix());
487   fShape->DisableListElements();
488   fShape->SetRnrSelf(kFALSE);
489 // try to set the properties but it is crashing !!
490 //   TEveGeoNode *node = 0x0; 
491 //   if((node = (TEveGeoNode*)fShape->FindChild(Form("UA%02d_1", icha)))) node->SetRnrState(kTRUE);
492 //   else AliWarning(Form("Can not retrieve geo node UA%02d_1", icha));
493
494   AddElement(fShape);
495 }
496