]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveTRDModuleImp.cxx
propagate modifications from AliTRDtrackingChamber
[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 #include "EveBase/AliEveEventManager.h"
13
14 #include "TGListTree.h"
15 #include "TClonesArray.h"
16 #include "TGeoManager.h"
17 #include "TGeoMatrix.h"
18
19 #include "TEveManager.h"
20 #include "TEveTrack.h"
21 #include "TEveGeoNode.h"
22 #include "TEveTrans.h"
23
24
25 #include "AliLog.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"
34
35 ClassImp(AliEveTRDChamber)
36 ClassImp(AliEveTRDNode)
37
38 //______________________________________________________________________________
39 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
40   TEveElement(), AliEveTRDModule(typ, det)
41 {
42   // Xonstructor.
43 }
44
45 //______________________________________________________________________________
46 void AliEveTRDNode::Paint(Option_t* option)
47 {
48   // Paint object.
49
50   List_i iter = fChildren.begin();
51   while(iter != fChildren.end()){
52     (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
53     iter++;
54   }
55 }
56
57 //______________________________________________________________________________
58 void AliEveTRDNode::Reset()
59 {
60   // Reset.
61
62   List_i iter = fChildren.begin();
63   while(iter != fChildren.end()){
64     (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
65     iter++;
66   }
67 }
68
69 //______________________________________________________________________________
70 void AliEveTRDNode::Collapse()
71 {
72   // Collapse.
73
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));
80     iter++;
81   }
82 }
83
84 //______________________________________________________________________________
85 void AliEveTRDNode::Expand()
86 {
87   // Expand.
88
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));
95     iter++;
96   }
97 }
98
99 //______________________________________________________________________________
100 void AliEveTRDNode::EnableListElements()
101 {
102   // Enable list elements.
103
104   SetRnrSelf(kTRUE);
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();
112     }
113     if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
114     iter++;
115   }
116   gEve->Redraw3D();
117 }
118
119 //______________________________________________________________________________
120 void AliEveTRDNode::DisableListElements()
121 {
122   // Disable list elements.
123
124   SetRnrSelf(kFALSE);
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();
132     }
133     if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
134     iter++;
135   }
136   gEve->Redraw3D();
137 }
138
139 //______________________________________________________________________________
140 void AliEveTRDNode::UpdateLeaves()
141 {
142   // Update leaves.
143
144   AliEveTRDModule *module;
145   List_i iter = fChildren.begin();
146   while(iter != fChildren.end()){
147     module = dynamic_cast<AliEveTRDModule*>(*iter);
148     if(!module) continue;
149
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;
158     iter++;
159   }
160
161   AliEveTRDNode *node = 0x0;
162   iter = fChildren.begin();
163   while(iter != fChildren.end()){
164     if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
165     iter++;
166   }
167 }
168
169
170 //______________________________________________________________________________
171 void AliEveTRDNode::UpdateNode()
172 {
173   // Update node.
174
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();
180     iter++;
181   }
182
183   Int_t score[11];
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;
192
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;
198
199     score[7] += (module->fLoadRecPoints) ? 1 : 0;
200     score[8] += (module->fRnrRecPoints) ? 1 : 0;
201
202     score[9] += (module->fLoadTracklets) ? 1 : 0;
203     score[10] += (module->fRnrTracklets) ? 1 : 0;
204     iter++;
205   }
206
207   Int_t size = fChildren.size();
208   fLoadHits      = (score[0] > 0) ? kTRUE : kFALSE;
209   fRnrHits       = (score[1] == size) ? kTRUE : kFALSE;
210
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;
216
217   fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
218   fRnrRecPoints  = (score[8] == size) ? kTRUE : kFALSE;
219
220   fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
221   fRnrTracklets  = (score[10] == size) ? kTRUE : kFALSE;
222 }
223
224
225 ///////////////////////////////////////////////////////////
226 ////////////      AliEveTRDChamber     ////////////////////
227 ///////////////////////////////////////////////////////////
228
229 //______________________________________________________________________________
230 AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
231   TEveElement()
232   ,AliEveTRDModule("Chmb", det)
233   ,fDigits(0x0)
234   ,fHits(0x0)
235   ,fRecPoints(0x0)
236   ,fTracklets(0x0)
237   ,fGeo(0x0)
238   ,fShape(0x0)
239   ,fNrows(-1)
240   ,fNcols(-1)
241   ,fNtime(22)
242 {
243   //
244   // Constructor
245   //
246 }
247
248
249 //______________________________________________________________________________
250 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
251 {
252   //
253   // Draw clusters
254   //
255
256   if(!fGeo){
257     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
258     return;
259   }
260
261   if(!fRecPoints){ 
262     AddElement(fRecPoints = new AliEveTRDClusters());
263     fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
264   }
265   fRecPoints->Reset();
266
267   Float_t q;
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);
273     c->GetGlobalXYZ(g); 
274     q = c->GetQ();
275     Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);    
276     fRecPoints->SetPointId(id, new AliTRDcluster(*c));
277   }
278   fRecPoints->StampObjProps();
279   fLoadRecPoints = kTRUE;
280 }
281
282
283 //______________________________________________________________________________
284 void AliEveTRDChamber::LoadClusters(AliTRDtrackingChamber *tc)
285 {
286   if(!fGeo){
287     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
288     return;
289   }
290
291   if(!fRecPoints){ 
292     AddElement(fRecPoints = new AliEveTRDClusters());
293     fRecPoints->SetTitle(Form("Clusters for Det %d", GetID()));
294   }
295   fRecPoints->Reset();
296
297   Float_t g[3]; //global coordinates
298   const AliTRDchamberTimeBin *tb = 0x0;
299   for(int itb=0; itb<AliTRDseedV1::kNtb; itb++){
300     tb = tc->GetTB(itb);
301     if(!(Int_t(*tb))) continue;
302     const AliTRDcluster *c= 0x0; Int_t ic = 0;
303     while((c=tb->GetCluster(ic))){
304       c->GetGlobalXYZ(g); 
305       Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);    
306       fRecPoints->SetPointId(id, new AliTRDcluster(*c));
307       ic++;
308     }
309   }
310   fRecPoints->StampObjProps();
311   fLoadRecPoints = kTRUE;
312 }
313
314
315 //______________________________________________________________________________
316 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
317 {
318   //
319   // Draw digits
320   //
321   if(!fGeo){
322     AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
323     return;
324   }
325
326   if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
327
328   fDigits->Reset();
329   fDigits->SetData(digits);
330   fDigits->StampObjProps();
331   fDigitsNeedRecompute = kTRUE;  
332   fLoadDigits = kTRUE;
333 }
334
335 //______________________________________________________________________________
336 void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
337 {
338   //
339   // Draw hits
340   //
341
342   if(!fHits){ 
343     AddElement(fHits = new AliEveTRDHits());
344     fHits->SetTitle(Form("Hits for Det %d", GetID()));
345   }
346   fLoadHits = kTRUE;
347   Int_t nhits = hits->GetEntriesFast();
348
349   AliTRDhit *hit = 0x0;
350   while(idx<nhits){
351     hit = (AliTRDhit*)hits->UncheckedAt(idx);
352     if(hit->GetDetector() != fDet) return;
353
354     Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
355     fHits->SetPointId(id, new AliTRDhit(*hit));
356     fHits->StampObjProps();
357     idx++;
358   }
359   return;
360 }
361
362 //______________________________________________________________________________
363 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
364 {
365   //
366   // Draw tracks
367   //
368   if(!fGeo){
369     Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
370     return;
371   }
372
373   if(!fTracklets){
374     fTracklets = new std::vector<TEveTrack*>;
375   } else fTracklets->clear();
376
377
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);
385
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]);
391
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]);
396   }
397   fLoadTracklets = kTRUE;
398 }
399
400 //____________________________________________________
401 void AliEveTRDChamber::Paint(Option_t* option)
402 {
403   // Paint object.
404
405   if(!fRnrSelf) return;
406   if(fDigits && fRnrDigits){
407     if(fDigitsNeedRecompute){
408       fDigits->ComputeRepresentation();
409       fDigitsNeedRecompute = kFALSE;
410     }
411     fDigits->Paint(option);
412   }
413
414   if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
415
416   if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
417
418   if(fTracklets && fRnrTracklets){
419     for(std::vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
420   }
421 }
422
423 //______________________________________________________________________________
424 void AliEveTRDChamber::Reset()
425 {
426   // Reset.
427
428   if(fHits){
429     fHits->Reset();
430     fLoadHits = kFALSE;
431   }
432   if(fDigits){
433     fDigits->Reset();
434     fLoadDigits = kFALSE;
435     fDigitsNeedRecompute = kTRUE;
436   }
437   if(fRecPoints){
438     fRecPoints->Reset();
439     fLoadRecPoints = kFALSE;
440   }
441   if(fTracklets){
442     fTracklets->clear();
443     fLoadTracklets = kFALSE;
444   }
445 }
446
447 //______________________________________________________________________________
448 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
449 {
450   // Set geometry.
451
452   fGeo = geo;
453
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;
458
459   // define pad plane size in pads
460   AliTRDpadPlane *pp = fGeo->GetPadPlane(ilyr, istk);
461   fNrows   = pp->GetNrows();
462   fNcols   = pp->GetNcols();
463
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();
469 // 
470 // eg_shape->StampColorSelection();
471   if(!(gGeoManager)){ 
472     AliCDBManager *fCDBManager=AliCDBManager::Instance();
473     fCDBManager->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
474     fCDBManager->SetRun(0);
475     AliEveEventManager::AssertGeometry();
476   }
477
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));
488
489   AddElement(fShape);
490 }
491