]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveTRDModuleImp.cxx
No need for TGLObject.h (C.Holm)
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDModuleImp.cxx
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
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  **************************************************************************/
9
10 #include "AliEveTRDModuleImp.h"
11 #include "AliEveTRDData.h"
12
13 #include <TGListTree.h>
14
15 #include "TEveManager.h"
16 #include "TEveTrack.h"
17
18 #include "AliLog.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"
25
26 ClassImp(AliEveTRDChamber)
27 ClassImp(AliEveTRDNode)
28
29 //______________________________________________________________________________
30 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
31   TEveElement(), AliEveTRDModule(typ, det)
32 {
33   // Xonstructor.
34 }
35
36 //______________________________________________________________________________
37 void AliEveTRDNode::Paint(Option_t* option)
38 {
39   // Paint object.
40
41   List_i iter = fChildren.begin();
42   while(iter != fChildren.end()){
43     (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
44     iter++;
45   }
46 }
47
48 //______________________________________________________________________________
49 void AliEveTRDNode::Reset()
50 {
51   // Reset.
52
53   List_i iter = fChildren.begin();
54   while(iter != fChildren.end()){
55     (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
56     iter++;
57   }
58 }
59
60 //______________________________________________________________________________
61 void AliEveTRDNode::Collapse()
62 {
63   // Collapse.
64
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));
71     iter++;
72   }
73 }
74
75 //______________________________________________________________________________
76 void AliEveTRDNode::Expand()
77 {
78   // Expand.
79
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));
86     iter++;
87   }
88 }
89
90 //______________________________________________________________________________
91 void AliEveTRDNode::EnableListElements()
92 {
93   // Enable list elements.
94
95   SetRnrSelf(kTRUE);
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();
103     }
104     if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
105     iter++;
106   }
107   gEve->Redraw3D();
108 }
109
110 //______________________________________________________________________________
111 void AliEveTRDNode::DisableListElements()
112 {
113   // Disable list elements.
114
115   SetRnrSelf(kFALSE);
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();
123     }
124     if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
125     iter++;
126   }
127   gEve->Redraw3D();
128 }
129
130 //______________________________________________________________________________
131 void AliEveTRDNode::UpdateLeaves()
132 {
133   // Update leaves.
134
135   AliEveTRDModule *module;
136   List_i iter = fChildren.begin();
137   while(iter != fChildren.end()){
138     module = dynamic_cast<AliEveTRDModule*>(*iter);
139     if(!module) continue;
140
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;
149     iter++;
150   }
151
152   AliEveTRDNode *node = 0x0;
153   iter = fChildren.begin();
154   while(iter != fChildren.end()){
155     if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
156     iter++;
157   }
158 }
159
160
161 //______________________________________________________________________________
162 void AliEveTRDNode::UpdateNode()
163 {
164   // Update node.
165
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();
171     iter++;
172   }
173
174   Int_t score[11];
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;
183
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;
189
190     score[7] += (module->fLoadRecPoints) ? 1 : 0;
191     score[8] += (module->fRnrRecPoints) ? 1 : 0;
192
193     score[9] += (module->fLoadTracklets) ? 1 : 0;
194     score[10] += (module->fRnrTracklets) ? 1 : 0;
195     iter++;
196   }
197
198   Int_t size = fChildren.size();
199   fLoadHits      = (score[0] > 0) ? kTRUE : kFALSE;
200   fRnrHits       = (score[1] == size) ? kTRUE : kFALSE;
201
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;
207
208   fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
209   fRnrRecPoints  = (score[8] == size) ? kTRUE : kFALSE;
210
211   fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
212   fRnrTracklets  = (score[10] == size) ? kTRUE : kFALSE;
213 }
214
215
216 ///////////////////////////////////////////////////////////
217 ////////////      AliEveTRDChamber     ////////////////////
218 ///////////////////////////////////////////////////////////
219
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),
225   fX0(0.), fPla(-1),
226   fPadPlane (0),
227   fGeo      (0)
228 {
229   //
230   // Constructor
231   //
232
233   AliTRDCommonParam* parCom = AliTRDCommonParam::Instance();
234   fSamplingFrequency = parCom->GetSamplingFrequency();
235 }
236
237 //______________________________________________________________________________
238 Int_t AliEveTRDChamber::GetSM() const
239 {
240   // Get supermodule.
241
242   if(!fGeo){
243     AliWarning("Fail. No TRD geometry defined.");
244     return -1;
245   }
246   return fGeo->GetSector(fDet);
247 }
248
249 //______________________________________________________________________________
250 Int_t AliEveTRDChamber::GetSTK() const
251 {
252   // Get stack.
253
254   if(!fGeo){
255     AliWarning("Fail. No TRD geometry defined.");
256     return -1;
257   }
258   return fGeo->GetChamber(fDet);
259 }
260
261 //______________________________________________________________________________
262 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
263 {
264   //
265   // Draw clusters
266   //
267
268   if(!fGeo){
269     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
270     return;
271   }
272
273   if(!fRecPoints){
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();
280
281   Float_t q;
282   Double_t cloc[3], cglo[3];
283
284   AliTRDcluster *c=0x0;
285   for(int iclus=0; iclus<clusters->GetEntriesFast(); iclus++){
286     c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
287     cloc[0] = c->GetX();
288     cloc[1] = c->GetY();
289     cloc[2] = c->GetZ();
290     q = c->GetQ();
291     fGeo->RotateBack(fDet,cloc,cglo);
292     fRecPoints->SetNextPoint(cglo[0], cglo[1], cglo[2]);
293     fRecPoints->SetPointId(c);
294   }
295   fLoadRecPoints = kTRUE;
296 }
297
298 //______________________________________________________________________________
299 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
300 {
301   //
302   // Draw digits
303   //
304   if(!fGeo){
305     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
306     return;
307   }
308   // Info("LoadDigits()", Form("digits =0x%x", digits));
309
310   if(!fDigits) fDigits = new AliEveTRDDigits(this);
311   else fDigits->Reset();
312
313   fDigits->SetData(digits);
314   fLoadDigits = kTRUE;
315 }
316
317 //______________________________________________________________________________
318 void AliEveTRDChamber::AddHit(AliTRDhit *hit)
319 {
320   //
321   // Draw hits
322   //
323   // Info("AddHit()", Form("%s", GetName()));
324
325   if(!fHits){
326     fHits = new AliEveTRDHits(this);
327     fHits->SetMarkerSize(.1);
328     fHits->SetMarkerColor(2);
329     fHits->SetOwnIds(kTRUE);
330   }
331
332   fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
333   fHits->SetPointId(hit);
334   fLoadHits = kTRUE;
335 }
336
337 //______________________________________________________________________________
338 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
339 {
340   //
341   // Draw tracks
342   //
343   if(!fGeo){
344     Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
345     return;
346   }
347   // Info("LoadTracklets()", Form("tracks = 0x%x", tracks));
348
349   if(!fTracklets){
350     fTracklets = new std::vector<TEveTrack*>;
351   } else fTracklets->clear();
352
353
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);
361
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]);
367
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]);
372   }
373   fLoadTracklets = kTRUE;
374 }
375
376 //____________________________________________________
377 void AliEveTRDChamber::Paint(Option_t* option)
378 {
379   // Paint object.
380
381   if(!fRnrSelf) return;
382   if(fDigits && fRnrDigits){
383     if(fDigitsNeedRecompute){
384       fDigits->ComputeRepresentation();
385       fDigitsNeedRecompute = kFALSE;
386     }
387     fDigits->Paint(option);
388   }
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);
393   }
394 }
395
396 //______________________________________________________________________________
397 void AliEveTRDChamber::Reset()
398 {
399   // Reset.
400
401   if(fHits){
402     fHits->Reset();
403     fLoadHits = kFALSE;
404   }
405   if(fDigits){
406     fDigits->Reset();
407     fLoadDigits = kFALSE;
408   }
409   if(fRecPoints){
410     fRecPoints->Reset();
411     fLoadRecPoints = kFALSE;
412   }
413   if(fTracklets){
414     fTracklets->clear();
415     fLoadTracklets = kFALSE;
416   }
417 }
418
419 //______________________________________________________________________________
420 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
421 {
422   // Set geometry.
423
424   fGeo = geo;
425
426   fPla = fGeo->GetPlane(fDet);
427   fX0 = fGeo->GetTime0(fPla);
428
429   fPadPlane = fGeo->GetPadPlane(fPla,fGeo->GetChamber(fDet));
430   fRowMax   = fPadPlane->GetNrows();
431   fColMax   = fPadPlane->GetNcols();
432 }
433