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