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 AliEveTRDModule *module(NULL);
52 List_i iter = fChildren.begin();
53 while(iter != fChildren.end()){
54 if((module = dynamic_cast<AliEveTRDModule*>(*iter))) module->Paint(option);
59 //______________________________________________________________________________
60 void AliEveTRDNode::Reset()
64 List_i iter = fChildren.begin();
65 while(iter != fChildren.end()){
66 //(dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
71 //______________________________________________________________________________
72 void AliEveTRDNode::Collapse()
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));
86 //______________________________________________________________________________
87 void AliEveTRDNode::Expand()
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));
101 //______________________________________________________________________________
102 void AliEveTRDNode::EnableListElements(Bool_t rnr_self, Bool_t rnr_children)
104 // Enable list elements.
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);
115 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->EnableListElements(rnr_children, rnr_children);
121 //______________________________________________________________________________
122 void AliEveTRDNode::DisableListElements(Bool_t rnr_self, Bool_t rnr_children)
124 // Disable list elements.
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);
135 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->DisableListElements(rnr_children, rnr_children);
141 //______________________________________________________________________________
142 void AliEveTRDNode::UpdateLeaves()
146 AliEveTRDModule *module;
147 List_i iter = fChildren.begin();
148 while(iter != fChildren.end()){
149 module = dynamic_cast<AliEveTRDModule*>(*iter);
150 if(!module) continue;
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;
163 AliEveTRDNode *node = 0x0;
164 iter = fChildren.begin();
165 while(iter != fChildren.end()){
166 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
172 //______________________________________________________________________________
173 void AliEveTRDNode::UpdateNode()
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();
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;
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;
201 score[7] += (module->fLoadRecPoints) ? 1 : 0;
202 score[8] += (module->fRnrRecPoints) ? 1 : 0;
204 score[9] += (module->fLoadTracklets) ? 1 : 0;
205 score[10] += (module->fRnrTracklets) ? 1 : 0;
209 Int_t size = fChildren.size();
210 fLoadHits = (score[0] > 0) ? kTRUE : kFALSE;
211 fRnrHits = (score[1] == size) ? kTRUE : kFALSE;
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;
219 fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
220 fRnrRecPoints = (score[8] == size) ? kTRUE : kFALSE;
222 fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
223 fRnrTracklets = (score[10] == size) ? kTRUE : kFALSE;
227 ///////////////////////////////////////////////////////////
228 //////////// AliEveTRDChamber ////////////////////
229 ///////////////////////////////////////////////////////////
231 //______________________________________________________________________________
232 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
234 ,AliEveTRDModule("Chmb", det)
251 //______________________________________________________________________________
252 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
259 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
264 AddElement(fRecPoints = new AliEveTRDClusters());
265 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
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));
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;
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;
286 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
287 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
289 fRecPoints->StampObjProps();
290 fLoadRecPoints = kTRUE;
294 //______________________________________________________________________________
295 void AliEveTRDChamber::LoadClusters(AliTRDtrackingChamber *tc)
298 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
303 AddElement(fRecPoints = new AliEveTRDClusters());
304 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
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++){
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;
325 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
326 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
330 fRecPoints->StampObjProps();
331 fLoadRecPoints = kTRUE;
335 //______________________________________________________________________________
336 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
342 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
346 if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
349 fDigits->SetData(digits);
350 fDigits->StampObjProps();
351 fDigitsNeedRecompute = kTRUE;
355 //______________________________________________________________________________
356 void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
363 AddElement(fHits = new AliEveTRDHits());
364 fHits->SetTitle(Form("Hits for Det %d", GetID()));
367 Int_t nhits = hits->GetEntriesFast();
369 AliTRDhit *hit = 0x0;
371 hit = (AliTRDhit*)hits->UncheckedAt(idx);
372 if(hit->GetDetector() != fDet) return;
374 Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
375 fHits->SetPointId(id, new AliTRDhit(*hit));
376 fHits->StampObjProps();
382 //______________________________________________________________________________
383 void AliEveTRDChamber::LoadTracklets(TTree *trklTree)
390 Error("LoadTracklets()", "Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet);
395 fTracklets = new TClonesArray("AliEveTRDTrackletOnline",100);
397 fTracklets->Delete();
398 TEveElementList *trklChild = (TEveElementList*) FindChild("Tracklets");
400 trklChild->Destroy();
404 TBranch *mcmBranch = trklTree->GetBranch("mcmtrklbranch");
408 AliTRDtrackletMCM *trkl = 0x0;
409 mcmBranch->SetAddress(&trkl);
411 TEveElementList* listOfTracklets = new TEveElementList("Tracklets");
412 gEve->AddElement(listOfTracklets, this);
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);
421 fLoadTracklets = kTRUE;
425 //______________________________________________________________________________
426 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
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;
437 if(ism>12&&ism<16) idx=3;
438 else if(ism==11||ism==12) idx=2;
440 // define pad plane size in pads
441 AliTRDpadPlane *pp = fGeo->GetPadPlane(ilyr, istk);
442 fNrows = pp->GetNrows();
443 fNcols = pp->GetNcols();
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();
451 // eg_shape->StampColorSelection();
453 AliEveEventManager::AssertGeometry();
455 AliError("Geo manager not available.");
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;
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));