]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveTRDModuleImp.cxx
df97c5bfd308adf93d3012450174137ae7732a19
[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 #include "AliEveTRDModuleImp.h"
10 #include "AliEveTRDData.h"
11
12 #include "TMath.h"
13 #include <TGListTree.h>
14
15 #include "TEveManager.h"
16 #include "TEveTrack.h"
17
18 #include "AliLog.h"
19 #include "AliRun.h"
20 #include "AliTRDv1.h"
21 #include "AliTRDgeometry.h"
22 #include "AliTRDCommonParam.h"
23 #include "AliTRDpadPlane.h"
24 #include "AliTRDdigit.h"
25 #include "AliTRDhit.h"
26 #include "AliTRDcluster.h"
27 #include "AliTRDcalibDB.h"
28 #include "AliTRDdataArrayI.h"
29 #include "AliTRDmcmTracklet.h"
30
31 using namespace std;
32
33 ClassImp(AliEveTRDChamber)
34 ClassImp(AliEveTRDNode)
35
36 //________________________________________________________
37 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
38   TEveElement(), AliEveTRDModule(typ, det)
39 {
40 }
41
42 //________________________________________________________
43 void    AliEveTRDNode::Paint(Option_t* option)
44 {
45         List_i iter = fChildren.begin();
46         while(iter != fChildren.end()){
47                 (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
48                 iter++;
49         }
50 }
51
52 //________________________________________________________
53 void    AliEveTRDNode::Reset()
54 {
55         List_i iter = fChildren.begin();
56         while(iter != fChildren.end()){
57                 (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
58                 iter++;
59         }
60 }
61
62 //________________________________________________________
63 void AliEveTRDNode::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         TGListTree *list = gEve->GetListTree();
79         AliEveTRDNode *node = 0x0;
80         List_i iter = fChildren.begin();
81         while(iter != fChildren.end()){
82                 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
83                 list->OpenItem(FindListTreeItem(list));
84                 iter++;
85         }
86 }
87
88 //________________________________________________________
89 void AliEveTRDNode::EnableListElements()
90 {
91         SetRnrSelf(kTRUE);
92         AliEveTRDNode *node = 0x0;
93         AliEveTRDChamber *chmb = 0x0;
94         List_i iter = fChildren.begin();
95         while(iter != fChildren.end()){
96                 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
97                         node->SetRnrSelf(kTRUE);
98                         node->EnableListElements();
99                 }
100                 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
101                 iter++;
102         }
103         gEve->Redraw3D();
104 }
105
106 //________________________________________________________
107 void AliEveTRDNode::DisableListElements()
108 {
109         SetRnrSelf(kFALSE);
110         AliEveTRDNode *node = 0x0;
111         AliEveTRDChamber *chmb = 0x0;
112         List_i iter = fChildren.begin();
113         while(iter != fChildren.end()){
114                 if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
115                         node->SetRnrSelf(kFALSE);
116                         node->DisableListElements();
117                 }
118                 if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
119                 iter++;
120         }
121         gEve->Redraw3D();
122 }
123
124 //________________________________________________________
125 void AliEveTRDNode::UpdateLeaves()
126 {
127         AliEveTRDModule *module;
128         List_i iter = fChildren.begin();
129         while(iter != fChildren.end()){
130                 module = dynamic_cast<AliEveTRDModule*>(*iter);
131                 if(!module) continue;
132
133                 module->fRnrHits = fRnrHits;
134                 module->fRnrDigits = fRnrDigits;
135                 module->fDigitsLog = fDigitsLog;
136                 module->fDigitsBox = fDigitsBox;
137                 module->fDigitsThreshold = fDigitsThreshold;
138                 module->kDigitsNeedRecompute = kDigitsNeedRecompute;
139                 module->fRnrRecPoints = fRnrRecPoints;
140                 module->fRnrTracklets = fRnrTracklets;
141                 iter++;
142         }
143
144         AliEveTRDNode *node = 0x0;
145         iter = fChildren.begin();
146         while(iter != fChildren.end()){
147                 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
148                 iter++;
149         }
150 }
151
152
153 //________________________________________________________
154 void AliEveTRDNode::UpdateNode()
155 {
156 //      Info("UpdateNode()", Form("%s", GetName()));
157         AliEveTRDNode *node = 0x0;
158         List_i iter = fChildren.begin();
159         while(iter != fChildren.end()){
160                 if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
161                 iter++;
162         }
163
164         Int_t score[11];
165         for(int i=0; i<11; i++) score[i] = 0;
166         AliEveTRDModule *module;
167         iter = fChildren.begin();
168         while(iter != fChildren.end()){
169                 module = dynamic_cast<AliEveTRDModule*>(*iter);
170                 if(!module) continue;
171                 score[0] += (module->fLoadHits) ? 1 : 0;
172                 score[1] += (module->fRnrHits) ? 1 : 0;
173
174                 score[2] += (module->fLoadDigits) ? 1 : 0;
175                 score[3] += (module->fRnrDigits) ? 1 : 0;
176                 score[4] += (module->fDigitsLog) ? 1 : 0;
177                 score[5] += (module->fDigitsBox) ? 1 : 0;
178                 score[6] += (module->kDigitsNeedRecompute) ? 1 : 0;
179
180                 score[7] += (module->fLoadRecPoints) ? 1 : 0;
181                 score[8] += (module->fRnrRecPoints) ? 1 : 0;
182
183                 score[9] += (module->fLoadTracklets) ? 1 : 0;
184                 score[10] += (module->fRnrTracklets) ? 1 : 0;
185                 iter++;
186         }
187
188         Int_t size = fChildren.size();
189         fLoadHits      = (score[0] > 0) ? kTRUE : kFALSE;
190         fRnrHits       = (score[1] == size) ? kTRUE : kFALSE;
191
192         fLoadDigits    = (score[2] > 0) ? kTRUE : kFALSE;
193         fRnrDigits     = (score[3] == size) ? kTRUE : kFALSE;
194         fDigitsLog     = (score[4] == size) ? kTRUE : kFALSE;
195         fDigitsBox     = (score[5] == size) ? kTRUE : kFALSE;
196         kDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
197
198         fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
199         fRnrRecPoints  = (score[8] == size) ? kTRUE : kFALSE;
200
201         fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
202         fRnrTracklets  = (score[10] == size) ? kTRUE : kFALSE;
203 }
204
205
206 ///////////////////////////////////////////////////////////
207 /////////////        AliEveTRDChamber       /////////////////////
208 ///////////////////////////////////////////////////////////
209
210 //________________________________________________________
211 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
212   TEveElement(), AliEveTRDModule("Chmb", det), rowMax(-1), colMax(-1), timeMax(22), fX0(0.), fPla(-1)
213 {
214   //
215   // Constructor
216   //
217
218         fDigits    = 0x0;
219         fHits      = 0x0;
220         fRecPoints = 0x0;
221         fTracklets = 0x0;
222
223         AliTRDCommonParam* parCom = AliTRDCommonParam::Instance();
224         samplingFrequency = parCom->GetSamplingFrequency();
225
226         fGeo      = 0x0;
227         fPadPlane = 0x0;
228 }
229
230 //________________________________________________________
231 AliEveTRDChamber::AliEveTRDChamber(const AliEveTRDChamber &mod):
232   TEveElement(), AliEveTRDModule("Chmb", mod.fDet)
233 {
234   //
235   // Copy constructor
236   //
237         SetMainColor(mod.GetMainColor());
238
239         if(mod.fDigits) {}
240         if(mod.fHits) {}
241         if(mod.fRecPoints){}
242 }
243
244 //________________________________________________________
245 AliEveTRDChamber& AliEveTRDChamber::operator=(const AliEveTRDChamber &mod)
246 {
247   //
248   // Assignment operator
249   //
250
251   if (this != &mod) {
252     fDet    = mod.fDet;
253                 if(mod.fDigits) {}
254                 if(mod.fHits) {}
255                 if(mod.fRecPoints){}
256   }
257   return *this;
258 }
259
260 //________________________________________________________
261 Int_t   AliEveTRDChamber::GetSM() const
262 {
263         if(!fGeo){
264                 AliWarning("Fail. No TRD geometry defined.");
265                 return -1;
266         }
267         return fGeo->GetSector(fDet);
268 }
269
270 //________________________________________________________
271 Int_t   AliEveTRDChamber::GetSTK() const
272 {
273         if(!fGeo){
274                 AliWarning("Fail. No TRD geometry defined.");
275                 return -1;
276         }
277         return fGeo->GetChamber(fDet);
278 }
279
280 //________________________________________________________
281 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
282 {
283   //
284   // Draw clusters
285   //
286
287         if(!fGeo){
288                 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
289                 return;
290         }
291
292         if(!fRecPoints){
293                 fRecPoints = new AliEveTRDClusters(this);
294                 fRecPoints->SetMarkerSize(1.);
295                 fRecPoints->SetMarkerStyle(24);
296                 fRecPoints->SetMarkerColor(6);
297                 fRecPoints->SetOwnIds(kTRUE);
298         } else fRecPoints->Reset();
299
300         Float_t q;
301         Double_t cloc[3], cglo[3];
302
303         AliTRDcluster *c=0x0;
304         for(int iclus=0; iclus<clusters->GetEntriesFast(); iclus++){
305                 c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
306                 cloc[0] = c->GetX();
307                 cloc[1] = c->GetY();
308                 cloc[2] = c->GetZ();
309                 q = c->GetQ();
310                 fGeo->RotateBack(fDet,cloc,cglo);
311                 fRecPoints->SetNextPoint(cglo[0], cglo[1], cglo[2]);
312                 fRecPoints->SetPointId(c);
313         }
314         fLoadRecPoints = kTRUE;
315 }
316
317 //________________________________________________________
318 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
319 {
320   //
321   // Draw digits
322   //
323         if(!fGeo){
324                 AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
325                 return;
326         }
327 //      Info("LoadDigits()", Form("digits =0x%x", digits));
328
329         if(!fDigits) fDigits = new AliEveTRDDigits(this);
330         else fDigits->Reset();
331
332         fDigits->SetData(digits);
333         fLoadDigits = kTRUE;
334 }
335
336 //________________________________________________________
337 void AliEveTRDChamber::AddHit(AliTRDhit *hit)
338 {
339   //
340   // Draw hits
341   //
342 //      Info("AddHit()", Form("%s", GetName()));
343
344         if(!fHits){
345                 fHits = new AliEveTRDHits(this);
346                 fHits->SetMarkerSize(.1);
347                 fHits->SetMarkerColor(2);
348                 fHits->SetOwnIds(kTRUE);
349         }
350
351         fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
352         fHits->SetPointId(hit);
353         fLoadHits = kTRUE;
354 }
355
356 //________________________________________________________
357 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
358 {
359   //
360   // Draw tracks
361   //
362         if(!fGeo){
363                 Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
364                 return;
365         }
366 //      Info("LoadTracklets()", Form("tracks = 0x%x", tracks));
367
368         if(!fTracklets){
369                 fTracklets = new std::vector<TEveTrack*>;
370         } else fTracklets->clear();
371
372
373         AliTRDmcmTracklet *trk = 0x0;
374         Double_t cloc[3], cglo[3];
375         for(int itrk=0; itrk<tracks->GetEntries();itrk++){
376                 trk = (AliTRDmcmTracklet*)tracks->At(itrk);
377                 trk->MakeTrackletGraph(fGeo,.5);
378                 fTracklets->push_back(new TEveTrack());
379                 fTracklets->back()->SetLineColor(4);
380
381                 cloc[0] = trk->GetTime0(); // x0
382                 cloc[1] = trk->GetOffset(); // y0
383                 cloc[2] = trk->GetRowz(); // z
384           fGeo->RotateBack(fDet,cloc,cglo);
385                 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
386
387                 cloc[0] += 3.7; // x1
388                 cloc[1] += TMath::Tan(trk->GetSlope()*TMath::Pi()/180.) * 3.7; // y1
389           fGeo->RotateBack(fDet,cloc,cglo);
390                 fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
391         }
392         fLoadTracklets = kTRUE;
393 }
394
395 //____________________________________________________
396 void    AliEveTRDChamber::Paint(Option_t* option)
397 {
398 /*      Info("Paint()", Form("%s", GetName()));*/
399         if(!fRnrSelf) return;
400         if(fDigits && fRnrDigits){
401                 if(kDigitsNeedRecompute){
402                         fDigits->ComputeRepresentation();
403                         kDigitsNeedRecompute = kFALSE;
404                 }
405                 fDigits->Paint(option);
406         }
407         if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
408         if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
409         if(fTracklets && fRnrTracklets){
410                 for(vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
411         }
412 }
413
414 //________________________________________________________
415 void    AliEveTRDChamber::Reset()
416 {
417         if(fHits){
418                 fHits->Reset();
419                 fLoadHits = kFALSE;
420         }
421         if(fDigits){
422                 fDigits->Reset();
423                 fLoadDigits = kFALSE;
424         }
425         if(fRecPoints){
426                 fRecPoints->Reset();
427                 fLoadRecPoints = kFALSE;
428         }
429         if(fTracklets){
430                 fTracklets->clear();
431                 fLoadTracklets = kFALSE;
432         }
433 }
434
435 //________________________________________________________
436 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
437 {
438         fGeo = geo;
439
440         fPla = fGeo->GetPlane(fDet);
441         fX0 = fGeo->GetTime0(fPla);
442
443         fPadPlane = fGeo->GetPadPlane(fPla,fGeo->GetChamber(fDet));
444         rowMax = fPadPlane->GetNrows();
445         colMax = fPadPlane->GetNcols();
446 }
447