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"
13 #include "TGListTree.h"
14 #include "TClonesArray.h"
15 #include "TGeoManager.h"
16 #include "TGeoMatrix.h"
18 #include "TEveManager.h"
19 #include "TEveTrack.h"
20 #include "TEveGeoNode.h"
21 #include "TEveTrans.h"
25 #include "AliTRDgeometry.h"
26 #include "AliTRDCommonParam.h"
27 #include "AliTRDpadPlane.h"
28 #include "AliTRDhit.h"
29 #include "AliTRDcluster.h"
30 #include "AliTRDmcmTracklet.h"
32 ClassImp(AliEveTRDChamber)
33 ClassImp(AliEveTRDNode)
35 //______________________________________________________________________________
36 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
37 TEveElement(), AliEveTRDModule(typ, det)
42 //______________________________________________________________________________
43 void AliEveTRDNode::Paint(Option_t* option)
47 List_i iter = fChildren.begin();
48 while(iter != fChildren.end()){
49 (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
54 //______________________________________________________________________________
55 void AliEveTRDNode::Reset()
59 List_i iter = fChildren.begin();
60 while(iter != fChildren.end()){
61 (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
66 //______________________________________________________________________________
67 void AliEveTRDNode::Collapse()
71 TGListTree *list = gEve->GetListTree();
72 AliEveTRDNode *node = 0x0;
73 List_i iter = fChildren.begin();
74 while(iter != fChildren.end()){
75 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse();
76 list->CloseItem(FindListTreeItem(list));
81 //______________________________________________________________________________
82 void AliEveTRDNode::Expand()
86 TGListTree *list = gEve->GetListTree();
87 AliEveTRDNode *node = 0x0;
88 List_i iter = fChildren.begin();
89 while(iter != fChildren.end()){
90 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
91 list->OpenItem(FindListTreeItem(list));
96 //______________________________________________________________________________
97 void AliEveTRDNode::EnableListElements()
99 // Enable list elements.
102 AliEveTRDNode *node = 0x0;
103 AliEveTRDChamber *chmb = 0x0;
104 List_i iter = fChildren.begin();
105 while(iter != fChildren.end()){
106 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
107 node->SetRnrSelf(kTRUE);
108 node->EnableListElements();
110 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
116 //______________________________________________________________________________
117 void AliEveTRDNode::DisableListElements()
119 // Disable list elements.
122 AliEveTRDNode *node = 0x0;
123 AliEveTRDChamber *chmb = 0x0;
124 List_i iter = fChildren.begin();
125 while(iter != fChildren.end()){
126 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
127 node->SetRnrSelf(kFALSE);
128 node->DisableListElements();
130 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
136 //______________________________________________________________________________
137 void AliEveTRDNode::UpdateLeaves()
141 AliEveTRDModule *module;
142 List_i iter = fChildren.begin();
143 while(iter != fChildren.end()){
144 module = dynamic_cast<AliEveTRDModule*>(*iter);
145 if(!module) continue;
147 module->fRnrHits = fRnrHits;
148 module->fRnrDigits = fRnrDigits;
149 module->fDigitsLog = fDigitsLog;
150 module->fDigitsBox = fDigitsBox;
151 module->fDigitsThreshold = fDigitsThreshold;
152 module->fDigitsNeedRecompute = fDigitsNeedRecompute;
153 module->fRnrRecPoints = fRnrRecPoints;
154 module->fRnrTracklets = fRnrTracklets;
158 AliEveTRDNode *node = 0x0;
159 iter = fChildren.begin();
160 while(iter != fChildren.end()){
161 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
167 //______________________________________________________________________________
168 void AliEveTRDNode::UpdateNode()
172 // Info("UpdateNode()", Form("%s", GetName()));
173 AliEveTRDNode *node = 0x0;
174 List_i iter = fChildren.begin();
175 while(iter != fChildren.end()){
176 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
181 for(int i=0; i<11; i++) score[i] = 0;
182 AliEveTRDModule *module;
183 iter = fChildren.begin();
184 while(iter != fChildren.end()){
185 module = dynamic_cast<AliEveTRDModule*>(*iter);
186 if(!module) continue;
187 score[0] += (module->fLoadHits) ? 1 : 0;
188 score[1] += (module->fRnrHits) ? 1 : 0;
190 score[2] += (module->fLoadDigits) ? 1 : 0;
191 score[3] += (module->fRnrDigits) ? 1 : 0;
192 score[4] += (module->fDigitsLog) ? 1 : 0;
193 score[5] += (module->fDigitsBox) ? 1 : 0;
194 score[6] += (module->fDigitsNeedRecompute) ? 1 : 0;
196 score[7] += (module->fLoadRecPoints) ? 1 : 0;
197 score[8] += (module->fRnrRecPoints) ? 1 : 0;
199 score[9] += (module->fLoadTracklets) ? 1 : 0;
200 score[10] += (module->fRnrTracklets) ? 1 : 0;
204 Int_t size = fChildren.size();
205 fLoadHits = (score[0] > 0) ? kTRUE : kFALSE;
206 fRnrHits = (score[1] == size) ? kTRUE : kFALSE;
208 fLoadDigits = (score[2] > 0) ? kTRUE : kFALSE;
209 fRnrDigits = (score[3] == size) ? kTRUE : kFALSE;
210 fDigitsLog = (score[4] == size) ? kTRUE : kFALSE;
211 fDigitsBox = (score[5] == size) ? kTRUE : kFALSE;
212 fDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
214 fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
215 fRnrRecPoints = (score[8] == size) ? kTRUE : kFALSE;
217 fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
218 fRnrTracklets = (score[10] == size) ? kTRUE : kFALSE;
222 ///////////////////////////////////////////////////////////
223 //////////// AliEveTRDChamber ////////////////////
224 ///////////////////////////////////////////////////////////
226 //______________________________________________________________________________
227 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
229 ,AliEveTRDModule("Chmb", det)
246 //______________________________________________________________________________
247 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
254 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
259 AddElement(fRecPoints = new AliEveTRDClusters());
260 fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
265 Float_t g[3]; //global coordinates
266 AliTRDcluster *c=0x0;
267 Int_t nc = clusters->GetEntriesFast();
268 for(int iclus=0; iclus<nc; iclus++){
269 c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
272 Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);
273 fRecPoints->SetPointId(id, new AliTRDcluster(*c));
275 fRecPoints->StampObjProps();
276 fLoadRecPoints = kTRUE;
279 //______________________________________________________________________________
280 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
286 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
290 if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
293 fDigits->SetData(digits);
294 fDigits->StampObjProps();
295 fDigitsNeedRecompute = kTRUE;
299 //______________________________________________________________________________
300 void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
307 AddElement(fHits = new AliEveTRDHits());
308 fHits->SetTitle(Form("Hits for Det %d", GetID()));
311 Int_t nhits = hits->GetEntriesFast();
313 AliTRDhit *hit = 0x0;
315 hit = (AliTRDhit*)hits->UncheckedAt(idx);
316 if(hit->GetDetector() != fDet) return;
318 Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
319 fHits->SetPointId(id, new AliTRDhit(*hit));
320 fHits->StampObjProps();
326 //______________________________________________________________________________
327 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
333 Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
338 fTracklets = new std::vector<TEveTrack*>;
339 } else fTracklets->clear();
342 AliTRDmcmTracklet *trk = 0x0;
343 Double_t cloc[3], cglo[3];
344 for(int itrk=0; itrk<tracks->GetEntries();itrk++){
345 trk = (AliTRDmcmTracklet*)tracks->At(itrk);
346 trk->MakeTrackletGraph(fGeo,.5);
347 fTracklets->push_back(new TEveTrack());
348 fTracklets->back()->SetLineColor(4);
350 cloc[0] = trk->GetTime0(); // x0
351 cloc[1] = trk->GetOffset(); // y0
352 cloc[2] = trk->GetRowz(); // z
353 fGeo->RotateBack(fDet,cloc,cglo);
354 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
356 cloc[0] += 3.7; // x1
357 cloc[1] += TMath::Tan(trk->GetSlope()*TMath::Pi()/180.) * 3.7; // y1
358 fGeo->RotateBack(fDet,cloc,cglo);
359 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
361 fLoadTracklets = kTRUE;
364 //____________________________________________________
365 void AliEveTRDChamber::Paint(Option_t* option)
369 if(!fRnrSelf) return;
370 if(fDigits && fRnrDigits){
371 if(fDigitsNeedRecompute){
372 fDigits->ComputeRepresentation();
373 fDigitsNeedRecompute = kFALSE;
375 fDigits->Paint(option);
378 if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
380 if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
382 if(fTracklets && fRnrTracklets){
383 for(std::vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
387 //______________________________________________________________________________
388 void AliEveTRDChamber::Reset()
398 fLoadDigits = kFALSE;
399 fDigitsNeedRecompute = kTRUE;
403 fLoadRecPoints = kFALSE;
407 fLoadTracklets = kFALSE;
411 //______________________________________________________________________________
412 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
418 Int_t ism = geo->GetSector(fDet);
419 Int_t istk = geo->GetStack(fDet);
420 Int_t ilyr = geo->GetLayer(fDet);
421 Int_t icha = istk*6+ilyr;
423 // define pad plane size in pads
424 AliTRDpadPlane *pp = fGeo->GetPadPlane(ilyr, istk);
425 fNrows = pp->GetNrows();
426 fNcols = pp->GetNcols();
428 // this version for setting the rendarable object is not working very nice
429 // Int_t shape_offset = TEveGeoShape::Class()->GetDataMemberOffset("fShape");
430 // TEveGeoShape* eg_shape = new TEveGeoShape("geometry");
431 // eg_shape->RefMainTrans().SetFrom(* gGeoManager->GetCurrentMatrix());
432 // * (TGeoShape**) (((char*)eg_shape) + shape_offset) = gGeoManager->GetCurrentVolume()->GetShape();
434 // eg_shape->StampColorSelection();
436 // define rendarable volumes
437 gGeoManager->cd(Form("/B077_1/BSEGMO%d_1/BTRD%d_1/UTR1_1/UTS1_1/UTI1_1/UT%02d_1", ism, ism, icha));
438 fShape = new TEveGeoTopNode(gGeoManager, gGeoManager->GetCurrentNode());
439 fShape->RefMainTrans().SetFrom(*gGeoManager->GetCurrentMatrix());
440 fShape->DisableListElements();
441 fShape->SetRnrSelf(kFALSE);
442 // try to set the properties but it is crashing !!
443 // TEveGeoNode *node = 0x0;
444 // if((node = (TEveGeoNode*)fShape->FindChild(Form("UA%02d_1", icha)))) node->SetRnrState(kTRUE);
445 // else AliWarning(Form("Can not retrieve geo node UA%02d_1", icha));