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>
15 #include "TEveManager.h"
16 #include "TEveTrack.h"
19 #include "AliTRDgeometry.h"
20 #include "AliTRDCommonParam.h"
21 #include "AliTRDpadPlane.h"
22 #include "AliTRDhit.h"
23 #include "AliTRDcluster.h"
24 #include "AliTRDmcmTracklet.h"
26 ClassImp(AliEveTRDChamber)
27 ClassImp(AliEveTRDNode)
29 //______________________________________________________________________________
30 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
31 TEveElement(), AliEveTRDModule(typ, det)
36 //______________________________________________________________________________
37 void AliEveTRDNode::Paint(Option_t* option)
41 List_i iter = fChildren.begin();
42 while(iter != fChildren.end()){
43 (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
48 //______________________________________________________________________________
49 void AliEveTRDNode::Reset()
53 List_i iter = fChildren.begin();
54 while(iter != fChildren.end()){
55 (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
60 //______________________________________________________________________________
61 void AliEveTRDNode::Collapse()
65 TGListTree *list = gEve->GetListTree();
66 AliEveTRDNode *node = 0x0;
67 List_i iter = fChildren.begin();
68 while(iter != fChildren.end()){
69 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse();
70 list->CloseItem(FindListTreeItem(list));
75 //______________________________________________________________________________
76 void AliEveTRDNode::Expand()
80 TGListTree *list = gEve->GetListTree();
81 AliEveTRDNode *node = 0x0;
82 List_i iter = fChildren.begin();
83 while(iter != fChildren.end()){
84 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
85 list->OpenItem(FindListTreeItem(list));
90 //______________________________________________________________________________
91 void AliEveTRDNode::EnableListElements()
93 // Enable list elements.
96 AliEveTRDNode *node = 0x0;
97 AliEveTRDChamber *chmb = 0x0;
98 List_i iter = fChildren.begin();
99 while(iter != fChildren.end()){
100 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
101 node->SetRnrSelf(kTRUE);
102 node->EnableListElements();
104 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
110 //______________________________________________________________________________
111 void AliEveTRDNode::DisableListElements()
113 // Disable list elements.
116 AliEveTRDNode *node = 0x0;
117 AliEveTRDChamber *chmb = 0x0;
118 List_i iter = fChildren.begin();
119 while(iter != fChildren.end()){
120 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
121 node->SetRnrSelf(kFALSE);
122 node->DisableListElements();
124 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
130 //______________________________________________________________________________
131 void AliEveTRDNode::UpdateLeaves()
135 AliEveTRDModule *module;
136 List_i iter = fChildren.begin();
137 while(iter != fChildren.end()){
138 module = dynamic_cast<AliEveTRDModule*>(*iter);
139 if(!module) continue;
141 module->fRnrHits = fRnrHits;
142 module->fRnrDigits = fRnrDigits;
143 module->fDigitsLog = fDigitsLog;
144 module->fDigitsBox = fDigitsBox;
145 module->fDigitsThreshold = fDigitsThreshold;
146 module->fDigitsNeedRecompute = fDigitsNeedRecompute;
147 module->fRnrRecPoints = fRnrRecPoints;
148 module->fRnrTracklets = fRnrTracklets;
152 AliEveTRDNode *node = 0x0;
153 iter = fChildren.begin();
154 while(iter != fChildren.end()){
155 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
161 //______________________________________________________________________________
162 void AliEveTRDNode::UpdateNode()
166 // Info("UpdateNode()", Form("%s", GetName()));
167 AliEveTRDNode *node = 0x0;
168 List_i iter = fChildren.begin();
169 while(iter != fChildren.end()){
170 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
175 for(int i=0; i<11; i++) score[i] = 0;
176 AliEveTRDModule *module;
177 iter = fChildren.begin();
178 while(iter != fChildren.end()){
179 module = dynamic_cast<AliEveTRDModule*>(*iter);
180 if(!module) continue;
181 score[0] += (module->fLoadHits) ? 1 : 0;
182 score[1] += (module->fRnrHits) ? 1 : 0;
184 score[2] += (module->fLoadDigits) ? 1 : 0;
185 score[3] += (module->fRnrDigits) ? 1 : 0;
186 score[4] += (module->fDigitsLog) ? 1 : 0;
187 score[5] += (module->fDigitsBox) ? 1 : 0;
188 score[6] += (module->fDigitsNeedRecompute) ? 1 : 0;
190 score[7] += (module->fLoadRecPoints) ? 1 : 0;
191 score[8] += (module->fRnrRecPoints) ? 1 : 0;
193 score[9] += (module->fLoadTracklets) ? 1 : 0;
194 score[10] += (module->fRnrTracklets) ? 1 : 0;
198 Int_t size = fChildren.size();
199 fLoadHits = (score[0] > 0) ? kTRUE : kFALSE;
200 fRnrHits = (score[1] == size) ? kTRUE : kFALSE;
202 fLoadDigits = (score[2] > 0) ? kTRUE : kFALSE;
203 fRnrDigits = (score[3] == size) ? kTRUE : kFALSE;
204 fDigitsLog = (score[4] == size) ? kTRUE : kFALSE;
205 fDigitsBox = (score[5] == size) ? kTRUE : kFALSE;
206 fDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
208 fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
209 fRnrRecPoints = (score[8] == size) ? kTRUE : kFALSE;
211 fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
212 fRnrTracklets = (score[10] == size) ? kTRUE : kFALSE;
216 ///////////////////////////////////////////////////////////
217 //////////// AliEveTRDChamber ////////////////////
218 ///////////////////////////////////////////////////////////
220 //______________________________________________________________________________
221 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
222 TEveElement(), AliEveTRDModule("Chmb", det),
223 fDigits(0), fHits(0), fRecPoints(0), fTracklets(0),
224 fRowMax(-1), fColMax(-1), fTimeMax(22), fSamplingFrequency(0),
233 AliTRDCommonParam* parCom = AliTRDCommonParam::Instance();
234 fSamplingFrequency = parCom->GetSamplingFrequency();
237 //______________________________________________________________________________
238 Int_t AliEveTRDChamber::GetSM() const
243 AliWarning("Fail. No TRD geometry defined.");
246 return fGeo->GetSector(fDet);
249 //______________________________________________________________________________
250 Int_t AliEveTRDChamber::GetSTK() const
255 AliWarning("Fail. No TRD geometry defined.");
258 return fGeo->GetChamber(fDet);
261 //______________________________________________________________________________
262 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
269 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
274 fRecPoints = new AliEveTRDClusters(this);
275 fRecPoints->SetMarkerSize(1.);
276 fRecPoints->SetMarkerStyle(24);
277 fRecPoints->SetMarkerColor(6);
278 fRecPoints->SetOwnIds(kTRUE);
279 } else fRecPoints->Reset();
282 Double_t cloc[3], cglo[3];
284 AliTRDcluster *c=0x0;
285 for(int iclus=0; iclus<clusters->GetEntriesFast(); iclus++){
286 c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
291 fGeo->RotateBack(fDet,cloc,cglo);
292 fRecPoints->SetNextPoint(cglo[0], cglo[1], cglo[2]);
293 fRecPoints->SetPointId(c);
295 fLoadRecPoints = kTRUE;
298 //______________________________________________________________________________
299 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
305 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
308 // Info("LoadDigits()", Form("digits =0x%x", digits));
310 if(!fDigits) fDigits = new AliEveTRDDigits(this);
311 else fDigits->Reset();
313 fDigits->SetData(digits);
317 //______________________________________________________________________________
318 void AliEveTRDChamber::AddHit(AliTRDhit *hit)
323 // Info("AddHit()", Form("%s", GetName()));
326 fHits = new AliEveTRDHits(this);
327 fHits->SetMarkerSize(.1);
328 fHits->SetMarkerColor(2);
329 fHits->SetOwnIds(kTRUE);
332 fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
333 fHits->SetPointId(hit);
337 //______________________________________________________________________________
338 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
344 Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
347 // Info("LoadTracklets()", Form("tracks = 0x%x", tracks));
350 fTracklets = new std::vector<TEveTrack*>;
351 } else fTracklets->clear();
354 AliTRDmcmTracklet *trk = 0x0;
355 Double_t cloc[3], cglo[3];
356 for(int itrk=0; itrk<tracks->GetEntries();itrk++){
357 trk = (AliTRDmcmTracklet*)tracks->At(itrk);
358 trk->MakeTrackletGraph(fGeo,.5);
359 fTracklets->push_back(new TEveTrack());
360 fTracklets->back()->SetLineColor(4);
362 cloc[0] = trk->GetTime0(); // x0
363 cloc[1] = trk->GetOffset(); // y0
364 cloc[2] = trk->GetRowz(); // z
365 fGeo->RotateBack(fDet,cloc,cglo);
366 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
368 cloc[0] += 3.7; // x1
369 cloc[1] += TMath::Tan(trk->GetSlope()*TMath::Pi()/180.) * 3.7; // y1
370 fGeo->RotateBack(fDet,cloc,cglo);
371 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
373 fLoadTracklets = kTRUE;
376 //____________________________________________________
377 void AliEveTRDChamber::Paint(Option_t* option)
381 if(!fRnrSelf) return;
382 if(fDigits && fRnrDigits){
383 if(fDigitsNeedRecompute){
384 fDigits->ComputeRepresentation();
385 fDigitsNeedRecompute = kFALSE;
387 fDigits->Paint(option);
389 if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
390 if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
391 if(fTracklets && fRnrTracklets){
392 for(std::vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
396 //______________________________________________________________________________
397 void AliEveTRDChamber::Reset()
407 fLoadDigits = kFALSE;
411 fLoadRecPoints = kFALSE;
415 fLoadTracklets = kFALSE;
419 //______________________________________________________________________________
420 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
426 fPla = fGeo->GetPlane(fDet);
427 fX0 = fGeo->GetTime0(fPla);
429 fPadPlane = fGeo->GetPadPlane(fPla,fGeo->GetChamber(fDet));
430 fRowMax = fPadPlane->GetNrows();
431 fColMax = fPadPlane->GetNcols();