2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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 **************************************************************************/
10 #include "AliEveTRDModuleImp.h"
11 #include "AliEveTRDData.h"
12 #include "EveBase/AliEveEventManager.h"
15 #include "TGListTree.h"
16 #include "TClonesArray.h"
17 #include "TGeoManager.h"
18 #include "TGeoMatrix.h"
20 #include "TEveManager.h"
21 #include "TEveTrack.h"
22 #include "TEveGeoNode.h"
23 #include "TEveTrans.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"
36 ClassImp(AliEveTRDChamber)
37 ClassImp(AliEveTRDNode)
39 //______________________________________________________________________________
40 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
41 TEveElement(), AliEveTRDModule(typ, det)
46 //______________________________________________________________________________
47 void AliEveTRDNode::Paint(Option_t* option)
51 List_i iter = fChildren.begin();
52 while(iter != fChildren.end()){
53 (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
58 //______________________________________________________________________________
59 void AliEveTRDNode::Reset()
63 List_i iter = fChildren.begin();
64 while(iter != fChildren.end()){
65 (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
70 //______________________________________________________________________________
71 void AliEveTRDNode::Collapse()
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));
85 //______________________________________________________________________________
86 void AliEveTRDNode::Expand()
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));
100 //______________________________________________________________________________
101 void AliEveTRDNode::EnableListElements()
103 // Enable list elements.
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();
114 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
120 //______________________________________________________________________________
121 void AliEveTRDNode::DisableListElements()
123 // Disable list elements.
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();
134 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
140 //______________________________________________________________________________
141 void AliEveTRDNode::UpdateLeaves()
145 AliEveTRDModule *module;
146 List_i iter = fChildren.begin();
147 while(iter != fChildren.end()){
148 module = dynamic_cast<AliEveTRDModule*>(*iter);
149 if(!module) continue;
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;
162 AliEveTRDNode *node = 0x0;
163 iter = fChildren.begin();
164 while(iter != fChildren.end()){
165 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
171 //______________________________________________________________________________
172 void AliEveTRDNode::UpdateNode()
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();
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;
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;
200 score[7] += (module->fLoadRecPoints) ? 1 : 0;
201 score[8] += (module->fRnrRecPoints) ? 1 : 0;
203 score[9] += (module->fLoadTracklets) ? 1 : 0;
204 score[10] += (module->fRnrTracklets) ? 1 : 0;
208 Int_t size = fChildren.size();
209 fLoadHits = (score[0] > 0) ? kTRUE : kFALSE;
210 fRnrHits = (score[1] == size) ? kTRUE : kFALSE;
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;
218 fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
219 fRnrRecPoints = (score[8] == size) ? kTRUE : kFALSE;
221 fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
222 fRnrTracklets = (score[10] == size) ? kTRUE : kFALSE;
226 ///////////////////////////////////////////////////////////
227 //////////// AliEveTRDChamber ////////////////////
228 ///////////////////////////////////////////////////////////
230 //______________________________________________________________________________
231 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
233 ,AliEveTRDModule("Chmb", det)
250 //______________________________________________________________________________
251 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
258 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
263 AddElement(fRecPoints = new AliEveTRDClusters());
264 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
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);
276 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
277 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
279 fRecPoints->StampObjProps();
280 fLoadRecPoints = kTRUE;
284 //______________________________________________________________________________
285 void AliEveTRDChamber::LoadClusters(AliTRDtrackingChamber *tc)
288 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
293 AddElement(fRecPoints = new AliEveTRDClusters());
294 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
298 Float_t g[3]; //global coordinates
299 const AliTRDchamberTimeBin *tb = 0x0;
300 for(int itb=0; itb<AliTRDseedV1::kNtb; itb++){
302 if(!(Int_t(*tb))) continue;
303 const AliTRDcluster *c= 0x0; Int_t ic = 0;
304 while((c=tb->GetCluster(ic))){
306 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
307 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
311 fRecPoints->StampObjProps();
312 fLoadRecPoints = kTRUE;
316 //______________________________________________________________________________
317 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
323 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
327 if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
330 fDigits->SetData(digits);
331 fDigits->StampObjProps();
332 fDigitsNeedRecompute = kTRUE;
336 //______________________________________________________________________________
337 void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
344 AddElement(fHits = new AliEveTRDHits());
345 fHits->SetTitle(Form("Hits for Det %d", GetID()));
348 Int_t nhits = hits->GetEntriesFast();
350 AliTRDhit *hit = 0x0;
352 hit = (AliTRDhit*)hits->UncheckedAt(idx);
353 if(hit->GetDetector() != fDet) return;
355 Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
356 fHits->SetPointId(id, new AliTRDhit(*hit));
357 fHits->StampObjProps();
363 //______________________________________________________________________________
364 void AliEveTRDChamber::LoadTracklets(TTree *trklTree)
371 Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
376 fTracklets = new TClonesArray("AliEveTRDTrackletOnline",100);
378 fTracklets->Delete();
379 TEveElementList *trklChild = (TEveElementList*) FindChild("Tracklets");
381 trklChild->Destroy();
385 TBranch *mcmBranch = trklTree->GetBranch("mcmtrklbranch");
389 AliTRDtrackletMCM *trkl = 0x0;
390 mcmBranch->SetAddress(&trkl);
392 TEveElementList* listOfTracklets = new TEveElementList("Tracklets");
393 gEve->AddElement(listOfTracklets, this);
395 for(Int_t iTrkl = 0; iTrkl < mcmBranch->GetEntries(); iTrkl++){
396 mcmBranch->GetEntry(iTrkl);
397 if (trkl->GetDetector() == GetID()) {
398 new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliEveTRDTrackletOnline(trkl);
399 gEve->AddElement(new AliEveTRDTrackletOnline(trkl), listOfTracklets);
402 fLoadTracklets = kTRUE;
405 //____________________________________________________
406 void AliEveTRDChamber::Paint(Option_t* option)
410 if(!fRnrSelf) return;
411 if(fDigits && fRnrDigits){
412 if(fDigitsNeedRecompute){
413 fDigits->ComputeRepresentation();
414 fDigitsNeedRecompute = kFALSE;
416 fDigits->Paint(option);
419 if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
421 if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
423 if(fTracklets && fRnrTracklets){
424 // for (Int_t iTrkl = 0; iTrkl < fTracklets->GetEntriesFast(); iTrkl++)
425 // ((AliEveTRDTrackletOnline*) (*fTracklets)[iTrkl])->Paint();
429 //______________________________________________________________________________
430 void AliEveTRDChamber::Reset()
440 fLoadDigits = kFALSE;
441 fDigitsNeedRecompute = kTRUE;
445 fLoadRecPoints = kFALSE;
448 fTracklets->Delete();
449 fLoadTracklets = kFALSE;
453 //______________________________________________________________________________
454 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
460 Int_t ism = geo->GetSector(fDet);
461 Int_t istk = geo->GetStack(fDet);
462 Int_t ilyr = geo->GetLayer(fDet);
463 Int_t icha = istk*6+ilyr;
465 // define pad plane size in pads
466 AliTRDpadPlane *pp = fGeo->GetPadPlane(ilyr, istk);
467 fNrows = pp->GetNrows();
468 fNcols = pp->GetNcols();
470 // this version for setting the rendarable object is not working very nice
471 // Int_t shape_offset = TEveGeoShape::Class()->GetDataMemberOffset("fShape");
472 // TEveGeoShape* eg_shape = new TEveGeoShape("geometry");
473 // eg_shape->RefMainTrans().SetFrom(* gGeoManager->GetCurrentMatrix());
474 // * (TGeoShape**) (((char*)eg_shape) + shape_offset) = gGeoManager->GetCurrentVolume()->GetShape();
476 // eg_shape->StampColorSelection();
478 AliCDBManager *fCDBManager=AliCDBManager::Instance();
479 fCDBManager->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
480 fCDBManager->SetRun(0);
481 AliEveEventManager::AssertGeometry();
484 // define rendarable volumes
485 gGeoManager->cd(Form("/B077_1/BSEGMO%d_1/BTRD%d_1/UTR1_1/UTS1_1/UTI1_1/UT%02d_1", ism, ism, icha));
486 fShape = new TEveGeoTopNode(gGeoManager, gGeoManager->GetCurrentNode());
487 fShape->RefMainTrans().SetFrom(*gGeoManager->GetCurrentMatrix());
488 fShape->DisableListElements();
489 fShape->SetRnrSelf(kFALSE);
490 // try to set the properties but it is crashing !!
491 // TEveGeoNode *node = 0x0;
492 // if((node = (TEveGeoNode*)fShape->FindChild(Form("UA%02d_1", icha)))) node->SetRnrState(kTRUE);
493 // else AliWarning(Form("Can not retrieve geo node UA%02d_1", icha));