]>
Commit | Line | Data |
---|---|---|
6e994a7b | 1 | // $Id$ |
cce980ec | 2 | // Author: Stefano Carrazza 2010, CERN, stefano.carrazza@cern.ch |
6e994a7b | 3 | |
4 | /************************************************************************** | |
5 | * Copyright(c) 1998-2009, 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 "AliEveBeamsInfo.h" | |
11 | #include "AliPhysicsSelection.h" | |
12 | #include "AliESDEvent.h" | |
13 | #include "AliEveEventManager.h" | |
14 | #include "AliEveEventSelector.h" | |
15 | #include "AliEveMultiView.h" | |
cce980ec | 16 | #include "AliRawEventHeaderBase.h" |
6e994a7b | 17 | |
18 | #include "TEveWindow.h" | |
19 | #include "TEveManager.h" | |
20 | #include "TEveBrowser.h" | |
21 | #include "TEveViewer.h" | |
22 | #include "TEveScene.h" | |
23 | #include "TGLOverlayButton.h" | |
cce980ec | 24 | #include "TTimeStamp.h" |
6e994a7b | 25 | |
26 | ||
27 | //______________________________________________________________________________ | |
cce980ec | 28 | // This class provides: |
29 | // | |
30 | // 1) Run and event information from ESD as TGLOverlayButtons. | |
31 | // | |
32 | // 2) Determine for real and MC data if the event is collision candidate or not. | |
33 | // | |
34 | // 3) Possibility to filter events per type. | |
6e994a7b | 35 | // |
36 | ||
37 | ClassImp(AliEveBeamsInfo) | |
38 | ||
39 | //______________________________________________________________________________ | |
40 | AliEveBeamsInfo::AliEveBeamsInfo(const char* name) : | |
41 | TEveElementList(name), | |
cce980ec | 42 | fAlpha(1.5), |
43 | fIsMC(kFALSE), | |
6e994a7b | 44 | fEsd(0), |
45 | fShowEventsInfo(kTRUE), | |
46 | fPhysicsSelection(0), | |
cce980ec | 47 | fEventNumber(0), |
6e994a7b | 48 | fCollisionCandidate(0), |
cce980ec | 49 | fCollisionBoolean(0), |
6e994a7b | 50 | fBeam1(0), |
cce980ec | 51 | fBeam1Boolean(0), |
6e994a7b | 52 | fBeam2(0), |
cce980ec | 53 | fBeam2Boolean(0), |
54 | fRunNumber(0), | |
55 | fEventType(0), | |
56 | fEventTypeLabel(0), | |
57 | fPeriod(0), | |
58 | fOrbit(0), | |
59 | fBC(0), | |
60 | fTimeStamp(0), | |
61 | fMagnetField(0), | |
62 | fTrigger(0), | |
63 | fTriggerClassesPanel(0), | |
64 | fNumberOfActiveTriggerClasses(0), | |
65 | fTriggerClasses(0), | |
6e994a7b | 66 | fAl(0), |
67 | fHisto2dv(0), | |
68 | fEventSelector(0) | |
69 | { | |
70 | // Constructor. | |
71 | gEve->AddToListTree(this,0); | |
72 | ||
cce980ec | 73 | // Get current ESD event |
6e994a7b | 74 | fEsd = AliEveEventManager::AssertESD(); |
75 | fAl = AliEveMultiView::Instance(); | |
76 | fEventSelector = AliEveEventManager::GetMaster()->GetEventSelector(); | |
77 | ||
78 | // AliPhysicsSelection | |
79 | fPhysicsSelection = new AliPhysicsSelection(); | |
80 | fPhysicsSelection->SetAnalyzeMC(kFALSE); | |
1107e2ce | 81 | fPhysicsSelection->Initialize(fEsd); |
6e994a7b | 82 | |
cce980ec | 83 | // Loading physics selection and triggers buttons |
84 | CreateEventPanel(); | |
85 | CreateRunPanel(); | |
6e994a7b | 86 | |
cce980ec | 87 | // Show beams info |
6e994a7b | 88 | ShowBeamsInfo(fShowEventsInfo, kFALSE); |
89 | ||
90 | } | |
91 | ||
92 | //______________________________________________________________________________ | |
93 | AliEveBeamsInfo::~AliEveBeamsInfo() | |
94 | { | |
cce980ec | 95 | // Deleting variables |
d9c35666 | 96 | RemoveTriggerClasses(); |
6e994a7b | 97 | delete fEsd; |
98 | delete fPhysicsSelection; | |
cce980ec | 99 | delete fEventNumber; |
6e994a7b | 100 | delete fCollisionCandidate; |
cce980ec | 101 | delete fCollisionBoolean; |
6e994a7b | 102 | delete fBeam1; |
cce980ec | 103 | delete fBeam1Boolean; |
6e994a7b | 104 | delete fBeam2; |
cce980ec | 105 | delete fBeam2Boolean; |
106 | delete fRunNumber; | |
107 | delete fPeriod; | |
108 | delete fOrbit; | |
109 | delete fBC; | |
110 | delete fTimeStamp; | |
111 | delete fMagnetField; | |
112 | delete fTrigger; | |
113 | delete fTriggerClassesPanel; | |
114 | delete fEventType; | |
115 | delete fEventTypeLabel; | |
6e994a7b | 116 | delete fAl; |
117 | delete fHisto2dv; | |
cce980ec | 118 | } |
119 | ||
120 | //______________________________________________________________________________ | |
121 | void AliEveBeamsInfo::CreateEventPanel() | |
122 | { | |
123 | // Create vertical panel | |
124 | Double_t fPosx = 10.0; | |
125 | Double_t fPosy = -10.0; | |
126 | Double_t fXlengh = 220.0; | |
127 | Double_t fStep = 20.0; | |
6e994a7b | 128 | |
cce980ec | 129 | fEventNumber = new TGLOverlayButton(0 , "", fPosx, fPosy, fXlengh, fStep); |
130 | fPosy-=fStep; | |
131 | ||
132 | fCollisionCandidate = new TGLOverlayButton(0, "Collision:", fPosx, fPosy, fXlengh-fXlengh/2.0, fStep); | |
133 | fCollisionBoolean = new TGLOverlayButton(0, "", fPosx+fXlengh/2.0, fPosy, fXlengh/2.0, fStep); | |
134 | fPosy-=fStep; | |
135 | ||
136 | fBeam1 = new TGLOverlayButton(0, "Beam 1:", fPosx, fPosy, fXlengh-fXlengh/2.0, fStep); | |
137 | fBeam1Boolean = new TGLOverlayButton(0, "", fPosx+fXlengh/2.0, fPosy, fXlengh/2.0, fStep); | |
138 | fPosy-=fStep; | |
139 | ||
140 | fBeam2 = new TGLOverlayButton(0, "Beam 2:", fPosx, fPosy, fXlengh-fXlengh/2.0, fStep); | |
141 | fBeam2Boolean = new TGLOverlayButton(0, "", fPosx+fXlengh/2.0, fPosy, fXlengh/2.0, fStep); | |
142 | ||
143 | fPosy-=2*fStep; | |
144 | fTriggerClassesPanel = new TGLOverlayButton(0, "Active trigger classes:", fPosx, fPosy, fXlengh, fStep); | |
6e994a7b | 145 | } |
146 | ||
cce980ec | 147 | //______________________________________________________________________________ |
148 | void AliEveBeamsInfo::CreateRunPanel() | |
149 | { | |
150 | // Create horizontal panel | |
151 | Double_t fPosy = -10.0; | |
152 | Double_t fPosx = 250.0; | |
153 | Double_t fStep = 20.0; | |
154 | Double_t fXlengh = 120.0; | |
155 | TString fText; | |
156 | ||
157 | fText.Form("Run #: %d",fEsd->GetRunNumber()); | |
158 | fRunNumber = new TGLOverlayButton(0, fText.Data(), fPosx, fPosy, fXlengh, fStep); | |
159 | fPosx+=fXlengh; | |
160 | ||
161 | fEventType = new TGLOverlayButton(0, "", fPosx, fPosy , fXlengh, fStep); | |
162 | fPosx+=fXlengh; | |
163 | ||
164 | fEventTypeLabel = new TGLOverlayButton(0, "", fPosx, fPosy, 2*fXlengh, fStep); | |
165 | ||
166 | // New line | |
167 | fPosx = 250.0; | |
168 | fPosy = -30.0; | |
169 | ||
170 | fPeriod = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep); | |
171 | fPosx+=fXlengh; | |
172 | ||
173 | fOrbit = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep); | |
174 | fPosx+=fXlengh; | |
175 | ||
176 | fBC = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep); | |
177 | fPosx+=fXlengh; | |
178 | ||
179 | fTrigger = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep); | |
180 | ||
181 | // New line | |
182 | fPosx = 250.0; | |
183 | fPosy = -50.0; | |
184 | ||
185 | fTimeStamp = new TGLOverlayButton(0, "", fPosx, fPosy, 2*fXlengh, fStep); | |
186 | fPosx+=2*fXlengh; | |
187 | ||
188 | fMagnetField = new TGLOverlayButton(0, "", fPosx, fPosy, 2*fXlengh, fStep); | |
189 | fPosx+=2*fXlengh; | |
190 | } | |
191 | ||
192 | //______________________________________________________________________________ | |
6e994a7b | 193 | void AliEveBeamsInfo::ShowBeamsInfo(Bool_t show, Bool_t updateonly) |
194 | { | |
cce980ec | 195 | // Update & setup TGLOverlayButtons |
6e994a7b | 196 | fHisto2dv = (TEveViewer*) gEve->GetViewers()->FindChild("2D Lego Viewer"); |
197 | ||
cce980ec | 198 | if (!show) |
6e994a7b | 199 | { |
cce980ec | 200 | RemoveOverlayButton(fEventNumber); |
201 | RemoveOverlayButton(fCollisionCandidate); | |
202 | RemoveOverlayButton(fCollisionBoolean); | |
203 | RemoveOverlayButton(fBeam1); | |
204 | RemoveOverlayButton(fBeam1Boolean); | |
205 | RemoveOverlayButton(fBeam2); | |
206 | RemoveOverlayButton(fBeam2Boolean); | |
207 | ||
208 | RemoveOverlayButton(fRunNumber); | |
209 | RemoveOverlayButton(fEventType); | |
210 | RemoveOverlayButton(fEventTypeLabel); | |
211 | RemoveOverlayButton(fPeriod); | |
212 | RemoveOverlayButton(fOrbit); | |
213 | RemoveOverlayButton(fBC); | |
214 | RemoveOverlayButton(fTimeStamp); | |
215 | RemoveOverlayButton(fMagnetField); | |
216 | RemoveOverlayButton(fTrigger); | |
217 | ||
218 | RemoveOverlayButton(fTriggerClassesPanel); | |
219 | RemoveTriggerClasses(); | |
220 | } else { | |
6e994a7b | 221 | |
cce980ec | 222 | if (!updateonly) |
223 | { | |
224 | AddOverlayButton(fEventNumber); | |
225 | AddOverlayButton(fCollisionCandidate); | |
226 | AddOverlayButton(fCollisionBoolean); | |
227 | AddOverlayButton(fBeam1); | |
228 | AddOverlayButton(fBeam1Boolean); | |
229 | AddOverlayButton(fBeam2); | |
230 | AddOverlayButton(fBeam2Boolean); | |
231 | ||
232 | AddOverlayButton(fRunNumber); | |
233 | AddOverlayButton(fEventType); | |
234 | AddOverlayButton(fEventTypeLabel); | |
235 | AddOverlayButton(fPeriod); | |
236 | AddOverlayButton(fOrbit); | |
237 | AddOverlayButton(fBC); | |
238 | AddOverlayButton(fTimeStamp); | |
239 | AddOverlayButton(fMagnetField); | |
240 | AddOverlayButton(fTrigger); | |
241 | ||
242 | AddOverlayButton(fTriggerClassesPanel); | |
243 | AddTriggerClasses(); | |
244 | } | |
6e994a7b | 245 | |
cce980ec | 246 | TString fText; |
247 | fText.Form("Event #: %d", fEsd->GetEventNumberInFile()); | |
248 | fEventNumber->SetText(fText.Data()); | |
6e994a7b | 249 | |
cce980ec | 250 | fText.Form("Event type: %d",fEsd->GetEventType()); |
251 | fEventType->SetText(fText.Data()); | |
6e994a7b | 252 | |
cce980ec | 253 | if(fEsd->GetEventType() == 0) |
254 | { | |
255 | fText.Form("UNKNOW EVENT TYPE"); | |
6e994a7b | 256 | } else { |
cce980ec | 257 | fText.Form("%s", AliRawEventHeaderBase::GetTypeName(fEsd->GetEventType())); |
258 | } | |
259 | fEventTypeLabel->SetText(fText.Data()); | |
260 | ||
261 | fText.Form("Period: %x", fEsd->GetPeriodNumber()); | |
262 | fPeriod->SetText(fText.Data()); | |
263 | ||
264 | fText.Form("Orbit: %x", fEsd->GetOrbitNumber()); | |
265 | fOrbit->SetText(fText.Data()); | |
266 | ||
267 | fText.Form("BC: %x", fEsd->GetBunchCrossNumber()); | |
268 | fBC->SetText(fText.Data()); | |
269 | ||
270 | TTimeStamp ts(fEsd->GetTimeStamp()); | |
271 | fText.Form("Timestamp: %s",ts.AsString("s")); | |
272 | fTimeStamp->SetText(fText.Data()); | |
273 | ||
274 | fText.Form("Magnetic field: %.2e kG", fEsd->GetMagneticField()); | |
275 | fMagnetField->SetText(fText.Data()); | |
6e994a7b | 276 | |
cce980ec | 277 | if (fEsd->GetTriggerMask() > (ULong64_t) 100 && fIsMC == kFALSE) |
278 | { | |
279 | fText.Form("Trigger: #"); | |
280 | } else { | |
281 | fText.Form("Trigger: %llx", fEsd->GetTriggerMask()); | |
6e994a7b | 282 | } |
cce980ec | 283 | fTrigger->SetText(fText.Data()); |
284 | ||
285 | UpdateTriggerClasses(); | |
6e994a7b | 286 | |
287 | Bool_t ev = fPhysicsSelection->IsCollisionCandidate(fEsd); | |
288 | ||
289 | if (ev == 1) | |
290 | { | |
cce980ec | 291 | fCollisionBoolean->SetText("YES"); |
292 | fCollisionBoolean->SetBackColor(0x00ff00); | |
6e994a7b | 293 | } else { |
cce980ec | 294 | fCollisionBoolean->SetText("NO"); |
295 | fCollisionBoolean->SetBackColor(0xff0000); | |
6e994a7b | 296 | } |
297 | ||
298 | Bool_t b1 = fEsd->IsTriggerClassFired("CINT1A-ABCE-NOPF-ALL"); | |
299 | Bool_t b2 = fEsd->IsTriggerClassFired("CINT1C-ABCE-NOPF-ALL"); | |
300 | Bool_t b12 = fEsd->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL"); | |
301 | ||
302 | if (b1 == 1 || b12 == 1) | |
303 | { | |
cce980ec | 304 | fBeam1Boolean->SetText("YES"); |
305 | fBeam1Boolean->SetBackColor(0x00ff00); | |
6e994a7b | 306 | } else { |
cce980ec | 307 | fBeam1Boolean->SetText("NO"); |
308 | fBeam1Boolean->SetBackColor(0xff0000); | |
6e994a7b | 309 | } |
310 | ||
311 | if (b2 == 1 || b12 == 1) | |
312 | { | |
cce980ec | 313 | fBeam2Boolean->SetText("YES"); |
314 | fBeam2Boolean->SetBackColor(0x00ff00); | |
6e994a7b | 315 | } else { |
cce980ec | 316 | fBeam2Boolean->SetText("NO"); |
317 | fBeam2Boolean->SetBackColor(0xff0000); | |
6e994a7b | 318 | } |
319 | } | |
320 | ||
321 | gEve->Redraw3D(kTRUE); | |
322 | ||
323 | } | |
324 | ||
325 | //______________________________________________________________________________ | |
326 | void AliEveBeamsInfo::Update() | |
327 | { | |
cce980ec | 328 | // Update beams information for current event |
6e994a7b | 329 | ShowBeamsInfo(fShowEventsInfo, kTRUE); |
330 | } | |
331 | ||
332 | //______________________________________________________________________________ | |
cce980ec | 333 | void AliEveBeamsInfo::AddOverlayButton(TGLOverlayButton *button) |
6e994a7b | 334 | { |
cce980ec | 335 | // Add buttons to viewers |
336 | button->SetAlphaValues(fAlpha, fAlpha); | |
337 | ||
338 | gEve->GetDefaultGLViewer()->AddOverlayElement(button); | |
339 | fAl->Get3DView()->GetGLViewer()->AddOverlayElement(button); | |
340 | if(fHisto2dv) | |
341 | fHisto2dv->GetGLViewer()->AddOverlayElement(button); | |
342 | } | |
343 | ||
344 | //______________________________________________________________________________ | |
345 | void AliEveBeamsInfo::RemoveOverlayButton(TGLOverlayButton *button) | |
346 | { | |
347 | // Remove buttons to viewers | |
348 | gEve->GetDefaultGLViewer()->RemoveOverlayElement(button); | |
349 | fAl->Get3DView()->GetGLViewer()->RemoveOverlayElement(button); | |
350 | if(fHisto2dv) | |
351 | fHisto2dv->GetGLViewer()->RemoveOverlayElement(button); | |
352 | } | |
6e994a7b | 353 | |
cce980ec | 354 | //______________________________________________________________________________ |
355 | void AliEveBeamsInfo::ShowEventSelection(Bool_t status) | |
356 | { | |
357 | // Activate/deactivate info box | |
358 | fShowEventsInfo = status; | |
6e994a7b | 359 | ShowBeamsInfo(fShowEventsInfo); |
360 | } | |
361 | ||
362 | //______________________________________________________________________________ | |
363 | void AliEveBeamsInfo::SelectEventSelection(Int_t id) | |
364 | { | |
cce980ec | 365 | // Show trigger information |
6e994a7b | 366 | if (id == 0) |
367 | { | |
368 | fEventSelector->SetSelectOnTriggerType(kFALSE); | |
369 | } else { | |
370 | if (id == 1) fEventSelector->SetTriggerType("CINT1A-ABCE-NOPF-ALL"); | |
371 | if (id == 2) fEventSelector->SetTriggerType("CINT1C-ABCE-NOPF-ALL"); | |
372 | if (id == 3) fEventSelector->SetTriggerType("CINT1B-ABCE-NOPF-ALL"); | |
373 | fEventSelector->SetSelectOnTriggerType(kTRUE); | |
374 | } | |
375 | } | |
376 | ||
377 | //______________________________________________________________________________ | |
378 | void AliEveBeamsInfo::ShowPrevEvent() | |
379 | { | |
cce980ec | 380 | // Go to the previous event |
6e994a7b | 381 | AliEveEventManager::GetMaster()->PrevEvent(); |
382 | } | |
383 | ||
384 | //______________________________________________________________________________ | |
385 | void AliEveBeamsInfo::ShowNextEvent() | |
386 | { | |
cce980ec | 387 | // Go to the next event |
6e994a7b | 388 | AliEveEventManager::GetMaster()->NextEvent(); |
389 | } | |
390 | ||
cce980ec | 391 | //______________________________________________________________________________ |
392 | void AliEveBeamsInfo::SwitchDataType(Bool_t status) | |
393 | { | |
394 | // Activate/deactivate MC / real data type | |
395 | fIsMC = status; | |
396 | ||
397 | // Removing defaul physics selection | |
398 | delete fPhysicsSelection; | |
399 | fPhysicsSelection = NULL; | |
400 | ||
401 | fPhysicsSelection = new AliPhysicsSelection(); | |
402 | fPhysicsSelection->SetAnalyzeMC(fIsMC); | |
1107e2ce | 403 | fPhysicsSelection->Initialize(fEsd); |
cce980ec | 404 | Update(); |
405 | } | |
406 | ||
407 | //______________________________________________________________________________ | |
408 | void AliEveBeamsInfo::AddTriggerClasses() | |
409 | { | |
410 | // Add trigger classes | |
411 | if (!fTriggerClasses){ | |
412 | ||
413 | TString fTriggerNameString = fEsd->GetESDRun()->GetActiveTriggerClasses(); | |
414 | TString *fTriggerName = SepareTriggerClasses(fNumberOfActiveTriggerClasses, fTriggerNameString); | |
415 | ||
416 | fTriggerClasses = new TGLOverlayButton*[fNumberOfActiveTriggerClasses]; | |
417 | ||
418 | Double_t fPosy = -130.0; | |
419 | Double_t fStep = 20.0; | |
420 | for (Int_t i = 0; i < fNumberOfActiveTriggerClasses; i++) | |
421 | { | |
422 | fTriggerClasses[i] = new TGLOverlayButton(0, fTriggerName[i].Data(), 10, fPosy, 220.0, 20); | |
423 | fTriggerClasses[i]->SetBackColor(0xce970a); | |
424 | fTriggerClasses[i]->SetAlphaValues(fAlpha, fAlpha); | |
425 | fPosy-=fStep; | |
426 | ||
427 | AddOverlayButton(fTriggerClasses[i]); | |
428 | } | |
429 | } | |
430 | } | |
431 | ||
432 | //______________________________________________________________________________ | |
433 | void AliEveBeamsInfo::RemoveTriggerClasses() | |
434 | { | |
435 | // Remove overlay buttons | |
436 | for(Int_t i = 0; i < fNumberOfActiveTriggerClasses; i++) | |
437 | { | |
438 | RemoveOverlayButton(fTriggerClasses[i]); | |
439 | } | |
440 | ||
441 | delete[] fTriggerClasses; | |
442 | fTriggerClasses = 0; | |
443 | } | |
444 | ||
445 | //______________________________________________________________________________ | |
446 | void AliEveBeamsInfo::UpdateTriggerClasses() | |
447 | { | |
448 | // Remove trigger information and update it | |
449 | RemoveTriggerClasses(); | |
450 | AddTriggerClasses(); | |
451 | } | |
452 | ||
453 | //______________________________________________________________________________ | |
454 | TString *AliEveBeamsInfo::SepareTriggerClasses(Int_t &fNumberOfClasses, TString fTriggerSource) | |
455 | { | |
456 | // Get trigger string and separe triggers into TString's | |
457 | Int_t fStringLength = fTriggerSource.Length(); | |
458 | fNumberOfClasses = 0; | |
459 | ||
460 | for (Int_t i = 1; i < fStringLength; i++) | |
461 | { | |
462 | TString fString = fTriggerSource(i,2); | |
463 | if (fString == " "){ | |
464 | fNumberOfClasses++; | |
465 | } | |
466 | } | |
467 | fNumberOfClasses++; | |
468 | ||
469 | TString *fTriggerResult = new TString[fNumberOfClasses]; | |
470 | ||
471 | Int_t fIndex = 1; | |
472 | Int_t fLastIndex = 0; | |
473 | Int_t fFirstIndex = 1; | |
474 | Int_t fClassNumber = 0; | |
475 | for(;;) | |
476 | { | |
477 | if(fIndex >= fStringLength) break; | |
478 | TString fString = fTriggerSource(fIndex,1); | |
479 | fIndex++; | |
480 | fLastIndex++; | |
481 | if (fString == " "){ | |
482 | fTriggerResult[fClassNumber] = fTriggerSource(fFirstIndex, fLastIndex-1); | |
483 | fFirstIndex = fIndex+1; | |
484 | fLastIndex = 0; | |
485 | fIndex++; | |
486 | fClassNumber++; | |
487 | } | |
488 | } | |
489 | return fTriggerResult; | |
490 | } | |
491 | ||
492 | //______________________________________________________________________________ | |
493 | void AliEveBeamsInfo::SetAlpha(Double_t val) | |
494 | { | |
495 | // Set the new alpha value for TGLOverlayButton | |
496 | fAlpha = val; | |
497 | ||
498 | // First remove all buttons from viewers | |
499 | ShowBeamsInfo(kFALSE); | |
500 | ||
501 | // Then replot everything with the next alpha value | |
502 | ShowBeamsInfo(kTRUE); | |
503 | } | |
504 | ||
6e994a7b | 505 | /******************************************************************************/ |