]>
Commit | Line | Data |
---|---|---|
d810d0de | 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 * | |
51346b82 | 7 | * full copyright notice. * |
d810d0de | 8 | **************************************************************************/ |
9 | #include "AliEveTRDModuleImp.h" | |
10 | #include "AliEveTRDData.h" | |
a282bf09 | 11 | |
12 | #include "TMath.h" | |
13 | #include <TGListTree.h> | |
14 | ||
84aff7a4 | 15 | #include "TEveManager.h" |
16 | #include "TEveTrack.h" | |
a282bf09 | 17 | |
edf0c4a0 | 18 | #include "AliLog.h" |
a282bf09 | 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 | ||
a282bf09 | 31 | using namespace std; |
32 | ||
d810d0de | 33 | ClassImp(AliEveTRDChamber) |
34 | ClassImp(AliEveTRDNode) | |
a282bf09 | 35 | |
36 | //________________________________________________________ | |
d810d0de | 37 | AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) : |
38 | TEveElement(), AliEveTRDModule(typ, det) | |
a282bf09 | 39 | { |
40 | } | |
41 | ||
42 | //________________________________________________________ | |
d810d0de | 43 | void AliEveTRDNode::Paint(Option_t* option) |
a282bf09 | 44 | { |
e6ac3950 | 45 | List_i iter = fChildren.begin(); |
a282bf09 | 46 | while(iter != fChildren.end()){ |
d810d0de | 47 | (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option); |
a282bf09 | 48 | iter++; |
49 | } | |
50 | } | |
51 | ||
52 | //________________________________________________________ | |
d810d0de | 53 | void AliEveTRDNode::Reset() |
a282bf09 | 54 | { |
e6ac3950 | 55 | List_i iter = fChildren.begin(); |
a282bf09 | 56 | while(iter != fChildren.end()){ |
d810d0de | 57 | (dynamic_cast<AliEveTRDModule*>(*iter))->Reset(); |
a282bf09 | 58 | iter++; |
59 | } | |
60 | } | |
61 | ||
62 | //________________________________________________________ | |
d810d0de | 63 | void AliEveTRDNode::Collapse() |
a282bf09 | 64 | { |
84aff7a4 | 65 | TGListTree *list = gEve->GetListTree(); |
d810d0de | 66 | AliEveTRDNode *node = 0x0; |
e6ac3950 | 67 | List_i iter = fChildren.begin(); |
a282bf09 | 68 | while(iter != fChildren.end()){ |
d810d0de | 69 | if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse(); |
a282bf09 | 70 | list->CloseItem(FindListTreeItem(list)); |
71 | iter++; | |
72 | } | |
73 | } | |
74 | ||
75 | //________________________________________________________ | |
d810d0de | 76 | void AliEveTRDNode::Expand() |
a282bf09 | 77 | { |
84aff7a4 | 78 | TGListTree *list = gEve->GetListTree(); |
d810d0de | 79 | AliEveTRDNode *node = 0x0; |
e6ac3950 | 80 | List_i iter = fChildren.begin(); |
a282bf09 | 81 | while(iter != fChildren.end()){ |
d810d0de | 82 | if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand(); |
a282bf09 | 83 | list->OpenItem(FindListTreeItem(list)); |
84 | iter++; | |
85 | } | |
86 | } | |
87 | ||
88 | //________________________________________________________ | |
d810d0de | 89 | void AliEveTRDNode::EnableListElements() |
a282bf09 | 90 | { |
2caed564 | 91 | SetRnrSelf(kTRUE); |
d810d0de | 92 | AliEveTRDNode *node = 0x0; |
51346b82 | 93 | AliEveTRDChamber *chmb = 0x0; |
e6ac3950 | 94 | List_i iter = fChildren.begin(); |
a282bf09 | 95 | while(iter != fChildren.end()){ |
d810d0de | 96 | if((node = dynamic_cast<AliEveTRDNode*>(*iter))){ |
2caed564 | 97 | node->SetRnrSelf(kTRUE); |
a282bf09 | 98 | node->EnableListElements(); |
99 | } | |
d810d0de | 100 | if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE); |
a282bf09 | 101 | iter++; |
102 | } | |
84aff7a4 | 103 | gEve->Redraw3D(); |
a282bf09 | 104 | } |
105 | ||
106 | //________________________________________________________ | |
d810d0de | 107 | void AliEveTRDNode::DisableListElements() |
a282bf09 | 108 | { |
2caed564 | 109 | SetRnrSelf(kFALSE); |
d810d0de | 110 | AliEveTRDNode *node = 0x0; |
51346b82 | 111 | AliEveTRDChamber *chmb = 0x0; |
e6ac3950 | 112 | List_i iter = fChildren.begin(); |
a282bf09 | 113 | while(iter != fChildren.end()){ |
d810d0de | 114 | if((node = dynamic_cast<AliEveTRDNode*>(*iter))){ |
2caed564 | 115 | node->SetRnrSelf(kFALSE); |
a282bf09 | 116 | node->DisableListElements(); |
117 | } | |
d810d0de | 118 | if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE); |
a282bf09 | 119 | iter++; |
120 | } | |
84aff7a4 | 121 | gEve->Redraw3D(); |
a282bf09 | 122 | } |
123 | ||
124 | //________________________________________________________ | |
d810d0de | 125 | void AliEveTRDNode::UpdateLeaves() |
a282bf09 | 126 | { |
d810d0de | 127 | AliEveTRDModule *module; |
e6ac3950 | 128 | List_i iter = fChildren.begin(); |
a282bf09 | 129 | while(iter != fChildren.end()){ |
d810d0de | 130 | module = dynamic_cast<AliEveTRDModule*>(*iter); |
a282bf09 | 131 | if(!module) continue; |
51346b82 | 132 | |
a282bf09 | 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 | ||
d810d0de | 144 | AliEveTRDNode *node = 0x0; |
a282bf09 | 145 | iter = fChildren.begin(); |
146 | while(iter != fChildren.end()){ | |
d810d0de | 147 | if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves(); |
a282bf09 | 148 | iter++; |
149 | } | |
150 | } | |
151 | ||
152 | ||
153 | //________________________________________________________ | |
d810d0de | 154 | void AliEveTRDNode::UpdateNode() |
a282bf09 | 155 | { |
156 | // Info("UpdateNode()", Form("%s", GetName())); | |
d810d0de | 157 | AliEveTRDNode *node = 0x0; |
e6ac3950 | 158 | List_i iter = fChildren.begin(); |
a282bf09 | 159 | while(iter != fChildren.end()){ |
d810d0de | 160 | if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode(); |
a282bf09 | 161 | iter++; |
162 | } | |
163 | ||
164 | Int_t score[11]; | |
165 | for(int i=0; i<11; i++) score[i] = 0; | |
d810d0de | 166 | AliEveTRDModule *module; |
a282bf09 | 167 | iter = fChildren.begin(); |
168 | while(iter != fChildren.end()){ | |
d810d0de | 169 | module = dynamic_cast<AliEveTRDModule*>(*iter); |
a282bf09 | 170 | if(!module) continue; |
171 | score[0] += (module->fLoadHits) ? 1 : 0; | |
172 | score[1] += (module->fRnrHits) ? 1 : 0; | |
51346b82 | 173 | |
a282bf09 | 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 | ||
51346b82 | 188 | Int_t size = fChildren.size(); |
a282bf09 | 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 | /////////////////////////////////////////////////////////// | |
d810d0de | 207 | ///////////// AliEveTRDChamber ///////////////////// |
a282bf09 | 208 | /////////////////////////////////////////////////////////// |
209 | ||
210 | //________________________________________________________ | |
d810d0de | 211 | AliEveTRDChamber::AliEveTRDChamber(Int_t det) : |
212 | TEveElement(), AliEveTRDModule("Chmb", det), rowMax(-1), colMax(-1), timeMax(22), fX0(0.), fPla(-1) | |
a282bf09 | 213 | { |
214 | // | |
215 | // Constructor | |
216 | // | |
51346b82 | 217 | |
a282bf09 | 218 | fDigits = 0x0; |
219 | fHits = 0x0; | |
220 | fRecPoints = 0x0; | |
221 | fTracklets = 0x0; | |
51346b82 | 222 | |
c9625b63 | 223 | AliTRDCommonParam* parCom = AliTRDCommonParam::Instance(); |
224 | samplingFrequency = parCom->GetSamplingFrequency(); | |
51346b82 | 225 | |
14217b5f | 226 | fGeo = 0x0; |
227 | fPadPlane = 0x0; | |
a282bf09 | 228 | } |
229 | ||
230 | //________________________________________________________ | |
d810d0de | 231 | AliEveTRDChamber::AliEveTRDChamber(const AliEveTRDChamber &mod): |
232 | TEveElement(), AliEveTRDModule("Chmb", mod.fDet) | |
a282bf09 | 233 | { |
234 | // | |
235 | // Copy constructor | |
236 | // | |
237 | SetMainColor(mod.GetMainColor()); | |
238 | ||
239 | if(mod.fDigits) {} | |
240 | if(mod.fHits) {} | |
51346b82 | 241 | if(mod.fRecPoints){} |
a282bf09 | 242 | } |
243 | ||
244 | //________________________________________________________ | |
d810d0de | 245 | AliEveTRDChamber& AliEveTRDChamber::operator=(const AliEveTRDChamber &mod) |
a282bf09 | 246 | { |
247 | // | |
248 | // Assignment operator | |
249 | // | |
250 | ||
251 | if (this != &mod) { | |
252 | fDet = mod.fDet; | |
253 | if(mod.fDigits) {} | |
254 | if(mod.fHits) {} | |
51346b82 | 255 | if(mod.fRecPoints){} |
a282bf09 | 256 | } |
257 | return *this; | |
258 | } | |
259 | ||
edf0c4a0 | 260 | //________________________________________________________ |
d810d0de | 261 | Int_t AliEveTRDChamber::GetSM() const |
edf0c4a0 | 262 | { |
263 | if(!fGeo){ | |
264 | AliWarning("Fail. No TRD geometry defined."); | |
265 | return -1; | |
266 | } | |
267 | return fGeo->GetSector(fDet); | |
268 | } | |
269 | ||
270 | //________________________________________________________ | |
d810d0de | 271 | Int_t AliEveTRDChamber::GetSTK() const |
edf0c4a0 | 272 | { |
273 | if(!fGeo){ | |
274 | AliWarning("Fail. No TRD geometry defined."); | |
275 | return -1; | |
276 | } | |
277 | return fGeo->GetChamber(fDet); | |
278 | } | |
279 | ||
a282bf09 | 280 | //________________________________________________________ |
d810d0de | 281 | void AliEveTRDChamber::LoadClusters(TObjArray *clusters) |
a282bf09 | 282 | { |
283 | // | |
284 | // Draw clusters | |
285 | // | |
51346b82 | 286 | |
14217b5f | 287 | if(!fGeo){ |
d810d0de | 288 | AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet)); |
14217b5f | 289 | return; |
290 | } | |
51346b82 | 291 | |
a282bf09 | 292 | if(!fRecPoints){ |
d810d0de | 293 | fRecPoints = new AliEveTRDClusters(this); |
a282bf09 | 294 | fRecPoints->SetMarkerSize(1.); |
295 | fRecPoints->SetMarkerStyle(24); | |
296 | fRecPoints->SetMarkerColor(6); | |
edf0c4a0 | 297 | fRecPoints->SetOwnIds(kTRUE); |
14217b5f | 298 | } else fRecPoints->Reset(); |
a282bf09 | 299 | |
be2031ac | 300 | Float_t q; |
301 | Double_t cloc[3], cglo[3]; | |
51346b82 | 302 | |
a282bf09 | 303 | AliTRDcluster *c=0x0; |
304 | for(int iclus=0; iclus<clusters->GetEntriesFast(); iclus++){ | |
305 | c = (AliTRDcluster*)clusters->UncheckedAt(iclus); | |
be2031ac | 306 | cloc[0] = c->GetX(); |
307 | cloc[1] = c->GetY(); | |
308 | cloc[2] = c->GetZ(); | |
a282bf09 | 309 | q = c->GetQ(); |
310 | fGeo->RotateBack(fDet,cloc,cglo); | |
311 | fRecPoints->SetNextPoint(cglo[0], cglo[1], cglo[2]); | |
edf0c4a0 | 312 | fRecPoints->SetPointId(c); |
a282bf09 | 313 | } |
314 | fLoadRecPoints = kTRUE; | |
315 | } | |
316 | ||
317 | //________________________________________________________ | |
d810d0de | 318 | void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits) |
a282bf09 | 319 | { |
320 | // | |
321 | // Draw digits | |
322 | // | |
14217b5f | 323 | if(!fGeo){ |
d810d0de | 324 | AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet)); |
14217b5f | 325 | return; |
326 | } | |
327 | // Info("LoadDigits()", Form("digits =0x%x", digits)); | |
51346b82 | 328 | |
d810d0de | 329 | if(!fDigits) fDigits = new AliEveTRDDigits(this); |
a282bf09 | 330 | else fDigits->Reset(); |
51346b82 | 331 | |
a282bf09 | 332 | fDigits->SetData(digits); |
333 | fLoadDigits = kTRUE; | |
334 | } | |
335 | ||
336 | //________________________________________________________ | |
d810d0de | 337 | void AliEveTRDChamber::AddHit(AliTRDhit *hit) |
a282bf09 | 338 | { |
339 | // | |
340 | // Draw hits | |
341 | // | |
14217b5f | 342 | // Info("AddHit()", Form("%s", GetName())); |
343 | ||
a282bf09 | 344 | if(!fHits){ |
d810d0de | 345 | fHits = new AliEveTRDHits(this); |
a282bf09 | 346 | fHits->SetMarkerSize(.1); |
347 | fHits->SetMarkerColor(2); | |
edf0c4a0 | 348 | fHits->SetOwnIds(kTRUE); |
a282bf09 | 349 | } |
51346b82 | 350 | |
a282bf09 | 351 | fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z()); |
edf0c4a0 | 352 | fHits->SetPointId(hit); |
a282bf09 | 353 | fLoadHits = kTRUE; |
354 | } | |
355 | ||
356 | //________________________________________________________ | |
d810d0de | 357 | void AliEveTRDChamber::LoadTracklets(TObjArray *tracks) |
a282bf09 | 358 | { |
359 | // | |
360 | // Draw tracks | |
361 | // | |
14217b5f | 362 | if(!fGeo){ |
d810d0de | 363 | Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet)); |
14217b5f | 364 | return; |
365 | } | |
366 | // Info("LoadTracklets()", Form("tracks = 0x%x", tracks)); | |
51346b82 | 367 | |
a282bf09 | 368 | if(!fTracklets){ |
84aff7a4 | 369 | fTracklets = new std::vector<TEveTrack*>; |
14217b5f | 370 | } else fTracklets->clear(); |
51346b82 | 371 | |
372 | ||
a282bf09 | 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); | |
84aff7a4 | 378 | fTracklets->push_back(new TEveTrack()); |
a282bf09 | 379 | fTracklets->back()->SetLineColor(4); |
51346b82 | 380 | |
a282bf09 | 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]); | |
51346b82 | 386 | |
a282bf09 | 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 | //____________________________________________________ | |
d810d0de | 396 | void AliEveTRDChamber::Paint(Option_t* option) |
a282bf09 | 397 | { |
398 | /* Info("Paint()", Form("%s", GetName()));*/ | |
2caed564 | 399 | if(!fRnrSelf) return; |
a282bf09 | 400 | if(fDigits && fRnrDigits){ |
401 | if(kDigitsNeedRecompute){ | |
a282bf09 | 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){ | |
84aff7a4 | 410 | for(vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option); |
a282bf09 | 411 | } |
412 | } | |
413 | ||
414 | //________________________________________________________ | |
d810d0de | 415 | void AliEveTRDChamber::Reset() |
a282bf09 | 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 | ||
14217b5f | 435 | //________________________________________________________ |
d810d0de | 436 | void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo) |
14217b5f | 437 | { |
438 | fGeo = geo; | |
51346b82 | 439 | |
14217b5f | 440 | fPla = fGeo->GetPlane(fDet); |
441 | fX0 = fGeo->GetTime0(fPla); | |
51346b82 | 442 | |
2f767356 | 443 | fPadPlane = fGeo->GetPadPlane(fPla,fGeo->GetChamber(fDet)); |
14217b5f | 444 | rowMax = fPadPlane->GetNrows(); |
445 | colMax = fPadPlane->GetNcols(); | |
446 | } | |
447 |