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"
14 #include "TGListTree.h"
15 #include "TClonesArray.h"
16 #include "TGeoManager.h"
17 #include "TGeoMatrix.h"
19 #include "TEveManager.h"
20 #include "TEveTrack.h"
21 #include "TEveGeoNode.h"
22 #include "TEveTrans.h"
26 #include "AliCDBManager.h"
27 #include "AliTRDgeometry.h"
28 #include "AliTRDCommonParam.h"
29 #include "AliTRDpadPlane.h"
30 #include "AliTRDhit.h"
31 #include "AliTRDcluster.h"
32 #include "AliTRDtrackingChamber.h"
33 #include "AliTRDmcmTracklet.h"
35 ClassImp(AliEveTRDChamber)
36 ClassImp(AliEveTRDNode)
38 //______________________________________________________________________________
39 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
40 TEveElement(), AliEveTRDModule(typ, det)
45 //______________________________________________________________________________
46 void AliEveTRDNode::Paint(Option_t* option)
50 List_i iter = fChildren.begin();
51 while(iter != fChildren.end()){
52 (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
57 //______________________________________________________________________________
58 void AliEveTRDNode::Reset()
62 List_i iter = fChildren.begin();
63 while(iter != fChildren.end()){
64 (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
69 //______________________________________________________________________________
70 void AliEveTRDNode::Collapse()
74 TGListTree *list = gEve->GetListTree();
75 AliEveTRDNode *node = 0x0;
76 List_i iter = fChildren.begin();
77 while(iter != fChildren.end()){
78 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse();
79 list->CloseItem(FindListTreeItem(list));
84 //______________________________________________________________________________
85 void AliEveTRDNode::Expand()
89 TGListTree *list = gEve->GetListTree();
90 AliEveTRDNode *node = 0x0;
91 List_i iter = fChildren.begin();
92 while(iter != fChildren.end()){
93 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
94 list->OpenItem(FindListTreeItem(list));
99 //______________________________________________________________________________
100 void AliEveTRDNode::EnableListElements()
102 // Enable list elements.
105 AliEveTRDNode *node = 0x0;
106 AliEveTRDChamber *chmb = 0x0;
107 List_i iter = fChildren.begin();
108 while(iter != fChildren.end()){
109 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
110 node->SetRnrSelf(kTRUE);
111 node->EnableListElements();
113 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
119 //______________________________________________________________________________
120 void AliEveTRDNode::DisableListElements()
122 // Disable list elements.
125 AliEveTRDNode *node = 0x0;
126 AliEveTRDChamber *chmb = 0x0;
127 List_i iter = fChildren.begin();
128 while(iter != fChildren.end()){
129 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
130 node->SetRnrSelf(kFALSE);
131 node->DisableListElements();
133 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
139 //______________________________________________________________________________
140 void AliEveTRDNode::UpdateLeaves()
144 AliEveTRDModule *module;
145 List_i iter = fChildren.begin();
146 while(iter != fChildren.end()){
147 module = dynamic_cast<AliEveTRDModule*>(*iter);
148 if(!module) continue;
150 module->fRnrHits = fRnrHits;
151 module->fRnrDigits = fRnrDigits;
152 module->fDigitsLog = fDigitsLog;
153 module->fDigitsBox = fDigitsBox;
154 module->fDigitsThreshold = fDigitsThreshold;
155 module->fDigitsNeedRecompute = fDigitsNeedRecompute;
156 module->fRnrRecPoints = fRnrRecPoints;
157 module->fRnrTracklets = fRnrTracklets;
161 AliEveTRDNode *node = 0x0;
162 iter = fChildren.begin();
163 while(iter != fChildren.end()){
164 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
170 //______________________________________________________________________________
171 void AliEveTRDNode::UpdateNode()
175 // Info("UpdateNode()", Form("%s", GetName()));
176 AliEveTRDNode *node = 0x0;
177 List_i iter = fChildren.begin();
178 while(iter != fChildren.end()){
179 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
184 for(int i=0; i<11; i++) score[i] = 0;
185 AliEveTRDModule *module;
186 iter = fChildren.begin();
187 while(iter != fChildren.end()){
188 module = dynamic_cast<AliEveTRDModule*>(*iter);
189 if(!module) continue;
190 score[0] += (module->fLoadHits) ? 1 : 0;
191 score[1] += (module->fRnrHits) ? 1 : 0;
193 score[2] += (module->fLoadDigits) ? 1 : 0;
194 score[3] += (module->fRnrDigits) ? 1 : 0;
195 score[4] += (module->fDigitsLog) ? 1 : 0;
196 score[5] += (module->fDigitsBox) ? 1 : 0;
197 score[6] += (module->fDigitsNeedRecompute) ? 1 : 0;
199 score[7] += (module->fLoadRecPoints) ? 1 : 0;
200 score[8] += (module->fRnrRecPoints) ? 1 : 0;
202 score[9] += (module->fLoadTracklets) ? 1 : 0;
203 score[10] += (module->fRnrTracklets) ? 1 : 0;
207 Int_t size = fChildren.size();
208 fLoadHits = (score[0] > 0) ? kTRUE : kFALSE;
209 fRnrHits = (score[1] == size) ? kTRUE : kFALSE;
211 fLoadDigits = (score[2] > 0) ? kTRUE : kFALSE;
212 fRnrDigits = (score[3] == size) ? kTRUE : kFALSE;
213 fDigitsLog = (score[4] == size) ? kTRUE : kFALSE;
214 fDigitsBox = (score[5] == size) ? kTRUE : kFALSE;
215 fDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
217 fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
218 fRnrRecPoints = (score[8] == size) ? kTRUE : kFALSE;
220 fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
221 fRnrTracklets = (score[10] == size) ? kTRUE : kFALSE;
225 ///////////////////////////////////////////////////////////
226 //////////// AliEveTRDChamber ////////////////////
227 ///////////////////////////////////////////////////////////
229 //______________________________________________________________________________
230 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
232 ,AliEveTRDModule("Chmb", det)
249 //______________________________________________________________________________
250 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
257 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
262 AddElement(fRecPoints = new AliEveTRDClusters());
263 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
268 Float_t g[3]; //global coordinates
269 AliTRDcluster *c=0x0;
270 Int_t nc = clusters->GetEntriesFast();
271 for(int iclus=0; iclus<nc; iclus++){
272 c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
275 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
276 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
278 fRecPoints->StampObjProps();
279 fLoadRecPoints = kTRUE;
283 //______________________________________________________________________________
284 void AliEveTRDChamber::LoadClusters(AliTRDtrackingChamber *tc)
287 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
292 AddElement(fRecPoints = new AliEveTRDClusters());
293 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
297 Float_t g[3]; //global coordinates
298 const AliTRDchamberTimeBin *tb = 0x0;
299 for(int itb=0; itb<AliTRDseedV1::kNtb; itb++){
301 if(!(Int_t(*tb))) continue;
302 const AliTRDcluster *c= 0x0; Int_t ic = 0;
303 while((c=tb->GetCluster(ic))){
305 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
306 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
310 fRecPoints->StampObjProps();
311 fLoadRecPoints = kTRUE;
315 //______________________________________________________________________________
316 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
322 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
326 if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
329 fDigits->SetData(digits);
330 fDigits->StampObjProps();
331 fDigitsNeedRecompute = kTRUE;
335 //______________________________________________________________________________
336 void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
343 AddElement(fHits = new AliEveTRDHits());
344 fHits->SetTitle(Form("Hits for Det %d", GetID()));
347 Int_t nhits = hits->GetEntriesFast();
349 AliTRDhit *hit = 0x0;
351 hit = (AliTRDhit*)hits->UncheckedAt(idx);
352 if(hit->GetDetector() != fDet) return;
354 Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
355 fHits->SetPointId(id, new AliTRDhit(*hit));
356 fHits->StampObjProps();
362 //______________________________________________________________________________
363 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
369 Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
374 fTracklets = new std::vector<TEveTrack*>;
375 } else fTracklets->clear();
378 AliTRDmcmTracklet *trk = 0x0;
379 Double_t cloc[3], cglo[3];
380 for(int itrk=0; itrk<tracks->GetEntries();itrk++){
381 trk = (AliTRDmcmTracklet*)tracks->At(itrk);
382 trk->MakeTrackletGraph(fGeo,.5);
383 fTracklets->push_back(new TEveTrack());
384 fTracklets->back()->SetLineColor(4);
386 cloc[0] = trk->GetTime0(); // x0
387 cloc[1] = trk->GetOffset(); // y0
388 cloc[2] = trk->GetRowz(); // z
389 fGeo->RotateBack(fDet,cloc,cglo);
390 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
392 cloc[0] += 3.7; // x1
393 cloc[1] += TMath::Tan(trk->GetSlope()*TMath::Pi()/180.) * 3.7; // y1
394 fGeo->RotateBack(fDet,cloc,cglo);
395 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
397 fLoadTracklets = kTRUE;
400 //____________________________________________________
401 void AliEveTRDChamber::Paint(Option_t* option)
405 if(!fRnrSelf) return;
406 if(fDigits && fRnrDigits){
407 if(fDigitsNeedRecompute){
408 fDigits->ComputeRepresentation();
409 fDigitsNeedRecompute = kFALSE;
411 fDigits->Paint(option);
414 if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
416 if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
418 if(fTracklets && fRnrTracklets){
419 for(std::vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
423 //______________________________________________________________________________
424 void AliEveTRDChamber::Reset()
434 fLoadDigits = kFALSE;
435 fDigitsNeedRecompute = kTRUE;
439 fLoadRecPoints = kFALSE;
443 fLoadTracklets = kFALSE;
447 //______________________________________________________________________________
448 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
454 Int_t ism = geo->GetSector(fDet);
455 Int_t istk = geo->GetStack(fDet);
456 Int_t ilyr = geo->GetLayer(fDet);
457 Int_t icha = istk*6+ilyr;
459 // define pad plane size in pads
460 AliTRDpadPlane *pp = fGeo->GetPadPlane(ilyr, istk);
461 fNrows = pp->GetNrows();
462 fNcols = pp->GetNcols();
464 // this version for setting the rendarable object is not working very nice
465 // Int_t shape_offset = TEveGeoShape::Class()->GetDataMemberOffset("fShape");
466 // TEveGeoShape* eg_shape = new TEveGeoShape("geometry");
467 // eg_shape->RefMainTrans().SetFrom(* gGeoManager->GetCurrentMatrix());
468 // * (TGeoShape**) (((char*)eg_shape) + shape_offset) = gGeoManager->GetCurrentVolume()->GetShape();
470 // eg_shape->StampColorSelection();
472 AliCDBManager *fCDBManager=AliCDBManager::Instance();
473 fCDBManager->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
474 fCDBManager->SetRun(0);
475 AliEveEventManager::AssertGeometry();
478 // define rendarable volumes
479 gGeoManager->cd(Form("/B077_1/BSEGMO%d_1/BTRD%d_1/UTR1_1/UTS1_1/UTI1_1/UT%02d_1", ism, ism, icha));
480 fShape = new TEveGeoTopNode(gGeoManager, gGeoManager->GetCurrentNode());
481 fShape->RefMainTrans().SetFrom(*gGeoManager->GetCurrentMatrix());
482 fShape->DisableListElements();
483 fShape->SetRnrSelf(kFALSE);
484 // try to set the properties but it is crashing !!
485 // TEveGeoNode *node = 0x0;
486 // if((node = (TEveGeoNode*)fShape->FindChild(Form("UA%02d_1", icha)))) node->SetRnrState(kTRUE);
487 // else AliWarning(Form("Can not retrieve geo node UA%02d_1", icha));