2 // Author: Stefano Carrazza 2010, CERN, stefano.carrazza@cern.ch
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 **************************************************************************/
10 #include "AliEveBeamsInfo.h"
11 #include "AliPhysicsSelection.h"
12 #include "AliESDEvent.h"
13 #include "AliEveEventManager.h"
14 #include "AliEveEventSelector.h"
15 #include "AliEveMultiView.h"
16 #include "AliRawEventHeaderBase.h"
18 #include "TEveWindow.h"
19 #include "TEveManager.h"
20 #include "TEveBrowser.h"
21 #include "TEveViewer.h"
22 #include "TEveScene.h"
23 #include "TGLOverlayButton.h"
24 #include "TTimeStamp.h"
27 //______________________________________________________________________________
28 // This class provides:
30 // 1) Run and event information from ESD as TGLOverlayButtons.
32 // 2) Determine for real and MC data if the event is collision candidate or not.
34 // 3) Possibility to filter events per type.
37 ClassImp(AliEveBeamsInfo)
39 //______________________________________________________________________________
40 AliEveBeamsInfo::AliEveBeamsInfo(const char* name) :
41 TEveElementList(name),
45 fShowEventsInfo(kTRUE),
48 fCollisionCandidate(0),
63 fTriggerClassesPanel(0),
64 fNumberOfActiveTriggerClasses(0),
71 gEve->AddToListTree(this,0);
73 // Get current ESD event
74 fEsd = AliEveEventManager::AssertESD();
75 fAl = AliEveMultiView::Instance();
76 fEventSelector = AliEveEventManager::GetMaster()->GetEventSelector();
78 // AliPhysicsSelection
79 fPhysicsSelection = new AliPhysicsSelection();
80 fPhysicsSelection->SetAnalyzeMC(kFALSE);
81 fPhysicsSelection->Initialize(fEsd);
83 // Loading physics selection and triggers buttons
88 ShowBeamsInfo(fShowEventsInfo, kFALSE);
92 //______________________________________________________________________________
93 AliEveBeamsInfo::~AliEveBeamsInfo()
97 delete fPhysicsSelection;
99 delete fCollisionCandidate;
100 delete fCollisionBoolean;
102 delete fBeam1Boolean;
104 delete fBeam2Boolean;
112 delete fTriggerClassesPanel;
114 delete fEventTypeLabel;
117 RemoveTriggerClasses();
120 //______________________________________________________________________________
121 void AliEveBeamsInfo::CreateEventPanel()
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;
129 fEventNumber = new TGLOverlayButton(0 , "", fPosx, fPosy, fXlengh, fStep);
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);
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);
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);
144 fTriggerClassesPanel = new TGLOverlayButton(0, "Active trigger classes:", fPosx, fPosy, fXlengh, fStep);
147 //______________________________________________________________________________
148 void AliEveBeamsInfo::CreateRunPanel()
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;
157 fText.Form("Run #: %d",fEsd->GetRunNumber());
158 fRunNumber = new TGLOverlayButton(0, fText.Data(), fPosx, fPosy, fXlengh, fStep);
161 fEventType = new TGLOverlayButton(0, "", fPosx, fPosy , fXlengh, fStep);
164 fEventTypeLabel = new TGLOverlayButton(0, "", fPosx, fPosy, 2*fXlengh, fStep);
170 fPeriod = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep);
173 fOrbit = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep);
176 fBC = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep);
179 fTrigger = new TGLOverlayButton(0, "", fPosx, fPosy, fXlengh, fStep);
185 fTimeStamp = new TGLOverlayButton(0, "", fPosx, fPosy, 2*fXlengh, fStep);
188 fMagnetField = new TGLOverlayButton(0, "", fPosx, fPosy, 2*fXlengh, fStep);
192 //______________________________________________________________________________
193 void AliEveBeamsInfo::ShowBeamsInfo(Bool_t show, Bool_t updateonly)
195 // Update & setup TGLOverlayButtons
196 fHisto2dv = (TEveViewer*) gEve->GetViewers()->FindChild("2D Lego Viewer");
200 RemoveOverlayButton(fEventNumber);
201 RemoveOverlayButton(fCollisionCandidate);
202 RemoveOverlayButton(fCollisionBoolean);
203 RemoveOverlayButton(fBeam1);
204 RemoveOverlayButton(fBeam1Boolean);
205 RemoveOverlayButton(fBeam2);
206 RemoveOverlayButton(fBeam2Boolean);
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);
218 RemoveOverlayButton(fTriggerClassesPanel);
219 RemoveTriggerClasses();
224 AddOverlayButton(fEventNumber);
225 AddOverlayButton(fCollisionCandidate);
226 AddOverlayButton(fCollisionBoolean);
227 AddOverlayButton(fBeam1);
228 AddOverlayButton(fBeam1Boolean);
229 AddOverlayButton(fBeam2);
230 AddOverlayButton(fBeam2Boolean);
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);
242 AddOverlayButton(fTriggerClassesPanel);
247 fText.Form("Event #: %d", fEsd->GetEventNumberInFile());
248 fEventNumber->SetText(fText.Data());
250 fText.Form("Event type: %d",fEsd->GetEventType());
251 fEventType->SetText(fText.Data());
253 if(fEsd->GetEventType() == 0)
255 fText.Form("UNKNOW EVENT TYPE");
257 fText.Form("%s", AliRawEventHeaderBase::GetTypeName(fEsd->GetEventType()));
259 fEventTypeLabel->SetText(fText.Data());
261 fText.Form("Period: %x", fEsd->GetPeriodNumber());
262 fPeriod->SetText(fText.Data());
264 fText.Form("Orbit: %x", fEsd->GetOrbitNumber());
265 fOrbit->SetText(fText.Data());
267 fText.Form("BC: %x", fEsd->GetBunchCrossNumber());
268 fBC->SetText(fText.Data());
270 TTimeStamp ts(fEsd->GetTimeStamp());
271 fText.Form("Timestamp: %s",ts.AsString("s"));
272 fTimeStamp->SetText(fText.Data());
274 fText.Form("Magnetic field: %.2e kG", fEsd->GetMagneticField());
275 fMagnetField->SetText(fText.Data());
277 if (fEsd->GetTriggerMask() > (ULong64_t) 100 && fIsMC == kFALSE)
279 fText.Form("Trigger: #");
281 fText.Form("Trigger: %llx", fEsd->GetTriggerMask());
283 fTrigger->SetText(fText.Data());
285 UpdateTriggerClasses();
287 Bool_t ev = fPhysicsSelection->IsCollisionCandidate(fEsd);
291 fCollisionBoolean->SetText("YES");
292 fCollisionBoolean->SetBackColor(0x00ff00);
294 fCollisionBoolean->SetText("NO");
295 fCollisionBoolean->SetBackColor(0xff0000);
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");
302 if (b1 == 1 || b12 == 1)
304 fBeam1Boolean->SetText("YES");
305 fBeam1Boolean->SetBackColor(0x00ff00);
307 fBeam1Boolean->SetText("NO");
308 fBeam1Boolean->SetBackColor(0xff0000);
311 if (b2 == 1 || b12 == 1)
313 fBeam2Boolean->SetText("YES");
314 fBeam2Boolean->SetBackColor(0x00ff00);
316 fBeam2Boolean->SetText("NO");
317 fBeam2Boolean->SetBackColor(0xff0000);
321 gEve->Redraw3D(kTRUE);
325 //______________________________________________________________________________
326 void AliEveBeamsInfo::Update()
328 // Update beams information for current event
329 ShowBeamsInfo(fShowEventsInfo, kTRUE);
332 //______________________________________________________________________________
333 void AliEveBeamsInfo::AddOverlayButton(TGLOverlayButton *button)
335 // Add buttons to viewers
336 button->SetAlphaValues(fAlpha, fAlpha);
338 gEve->GetDefaultGLViewer()->AddOverlayElement(button);
339 fAl->Get3DView()->GetGLViewer()->AddOverlayElement(button);
341 fHisto2dv->GetGLViewer()->AddOverlayElement(button);
344 //______________________________________________________________________________
345 void AliEveBeamsInfo::RemoveOverlayButton(TGLOverlayButton *button)
347 // Remove buttons to viewers
348 gEve->GetDefaultGLViewer()->RemoveOverlayElement(button);
349 fAl->Get3DView()->GetGLViewer()->RemoveOverlayElement(button);
351 fHisto2dv->GetGLViewer()->RemoveOverlayElement(button);
354 //______________________________________________________________________________
355 void AliEveBeamsInfo::ShowEventSelection(Bool_t status)
357 // Activate/deactivate info box
358 fShowEventsInfo = status;
359 ShowBeamsInfo(fShowEventsInfo);
362 //______________________________________________________________________________
363 void AliEveBeamsInfo::SelectEventSelection(Int_t id)
365 // Show trigger information
368 fEventSelector->SetSelectOnTriggerType(kFALSE);
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);
377 //______________________________________________________________________________
378 void AliEveBeamsInfo::ShowPrevEvent()
380 // Go to the previous event
381 AliEveEventManager::GetMaster()->PrevEvent();
384 //______________________________________________________________________________
385 void AliEveBeamsInfo::ShowNextEvent()
387 // Go to the next event
388 AliEveEventManager::GetMaster()->NextEvent();
391 //______________________________________________________________________________
392 void AliEveBeamsInfo::SwitchDataType(Bool_t status)
394 // Activate/deactivate MC / real data type
397 // Removing defaul physics selection
398 delete fPhysicsSelection;
399 fPhysicsSelection = NULL;
401 fPhysicsSelection = new AliPhysicsSelection();
402 fPhysicsSelection->SetAnalyzeMC(fIsMC);
403 fPhysicsSelection->Initialize(fEsd);
407 //______________________________________________________________________________
408 void AliEveBeamsInfo::AddTriggerClasses()
410 // Add trigger classes
411 if (!fTriggerClasses){
413 TString fTriggerNameString = fEsd->GetESDRun()->GetActiveTriggerClasses();
414 TString *fTriggerName = SepareTriggerClasses(fNumberOfActiveTriggerClasses, fTriggerNameString);
416 fTriggerClasses = new TGLOverlayButton*[fNumberOfActiveTriggerClasses];
418 Double_t fPosy = -130.0;
419 Double_t fStep = 20.0;
420 for (Int_t i = 0; i < fNumberOfActiveTriggerClasses; i++)
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);
427 AddOverlayButton(fTriggerClasses[i]);
432 //______________________________________________________________________________
433 void AliEveBeamsInfo::RemoveTriggerClasses()
435 // Remove overlay buttons
436 for(Int_t i = 0; i < fNumberOfActiveTriggerClasses; i++)
438 RemoveOverlayButton(fTriggerClasses[i]);
441 delete[] fTriggerClasses;
445 //______________________________________________________________________________
446 void AliEveBeamsInfo::UpdateTriggerClasses()
448 // Remove trigger information and update it
449 RemoveTriggerClasses();
453 //______________________________________________________________________________
454 TString *AliEveBeamsInfo::SepareTriggerClasses(Int_t &fNumberOfClasses, TString fTriggerSource)
456 // Get trigger string and separe triggers into TString's
457 Int_t fStringLength = fTriggerSource.Length();
458 fNumberOfClasses = 0;
460 for (Int_t i = 1; i < fStringLength; i++)
462 TString fString = fTriggerSource(i,2);
469 TString *fTriggerResult = new TString[fNumberOfClasses];
472 Int_t fLastIndex = 0;
473 Int_t fFirstIndex = 1;
474 Int_t fClassNumber = 0;
477 if(fIndex >= fStringLength) break;
478 TString fString = fTriggerSource(fIndex,1);
482 fTriggerResult[fClassNumber] = fTriggerSource(fFirstIndex, fLastIndex-1);
483 fFirstIndex = fIndex+1;
489 return fTriggerResult;
492 //______________________________________________________________________________
493 void AliEveBeamsInfo::SetAlpha(Double_t val)
495 // Set the new alpha value for TGLOverlayButton
498 // First remove all buttons from viewers
499 ShowBeamsInfo(kFALSE);
501 // Then replot everything with the next alpha value
502 ShowBeamsInfo(kTRUE);
505 /******************************************************************************/