fRawReader (0),
fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
+ fSelectOnTriggerType(kFALSE), fTriggerType(""),
fExecutor (0),
fAutoLoadTimerRunning(kFALSE)
{
fRawReader (0),
fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
+ fSelectOnTriggerType(kFALSE), fTriggerType(""),
fExecutor (0),
fAutoLoadTimerRunning(kFALSE)
{
// Open raw-data file
TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
- // If i use open directly, raw-reader reports an error but i have
- // no way to detect it.
- // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
+ // If i use open directly, raw-reader reports an error but i have
+ // no way to detect it.
+ // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
if (fgAssertRaw == kFALSE)
{
AliLog::SetGlobalLogLevel(AliLog::kFatal);
}
- if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
+ if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
{
fRawReader = AliRawReader::Create(rawPath);
}
ElementChanged();
AfterNewEventLoaded();
- if (fAutoLoad) StartAutoLoadTimer();
+ if (fAutoLoad) StartAutoLoadTimer();
}
Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
{
// Loads next event.
// Does magick needed for online display when under external event control.
-
+
static const TEveException kEH("AliEveEventManager::NextEvent ");
if (fAutoLoadTimerRunning)
}
else
{
- if (fEventId < GetMaxEventId(kTRUE))
+ Int_t nexteventbytrigger=0;
+ if (fSelectOnTriggerType)
+ {
+ if (FindNextByTrigger(nexteventbytrigger)) //if not found do nothing
+ GotoEvent(nexteventbytrigger);
+ }
+ else if (fEventId < GetMaxEventId(kTRUE))
GotoEvent(fEventId + 1);
else
GotoEvent(0);
{
throw (kEH + "Event-loop is under external control.");
}
-
- GotoEvent(fEventId - 1);
+ Int_t nexteventbytrigger=0;
+ if (fSelectOnTriggerType)
+ {
+ if (FindPrevByTrigger(nexteventbytrigger))
+ GotoEvent(nexteventbytrigger);
+ }
+ else
+ GotoEvent(fEventId - 1);
}
void AliEveEventManager::Close()
}
+//------------------------------------------------------------------------------
+// Event selection by trigger
+//------------------------------------------------------------------------------
+
+Bool_t AliEveEventManager::FindNextByTrigger(Int_t& event)
+{
+ // Find next event that matches the trigger.
+ // If a matching event is not found, we loop around and eventually
+ // end up at the same event.
+
+ static const TEveException kEH("AliEveEventManager::FindNextByTrigger ");
+
+ if (!fESDTree) return kFALSE;
+ TString firedtrclasses;
+ for (Int_t i = fEventId+1; i<GetMaxEventId(kTRUE)+1; i++)
+ {
+ if (fESDTree->GetEntry(i) <= 0)
+ throw (kEH + "failed getting required event from ESD.");
+ firedtrclasses = fESD->GetFiredTriggerClasses();
+ if (firedtrclasses.Contains(fTriggerType))
+ {
+ event=i;
+ return kTRUE;
+ }
+ }
+ for (Int_t i = 0; i<fEventId+1; i++)
+ {
+ if (fESDTree->GetEntry(i) <= 0)
+ throw (kEH + "failed getting required event from ESD.");
+ firedtrclasses = fESD->GetFiredTriggerClasses();
+ if (firedtrclasses.Contains(fTriggerType))
+ {
+ event=i;
+ return kTRUE;
+ }
+ }
+ return kFALSE;
+}
+
+Bool_t AliEveEventManager::FindPrevByTrigger(Int_t& event)
+{
+ // Find previous event that matches the trigger.
+
+ static const TEveException kEH("AliEveEventManager::FindPrevByTrigger ");
+
+ if (!fESDTree) return kFALSE;
+ TString firedtrclasses;
+ for (Int_t i = fEventId-1; i>=0; i--)
+ {
+ if (fESDTree->GetEntry(i) <= 0)
+ throw (kEH + "failed getting required event from ESD.");
+ firedtrclasses = fESD->GetFiredTriggerClasses();
+ if (firedtrclasses.Contains(fTriggerType))
+ {
+ event=i;
+ return kTRUE;
+ }
+ }
+ for (Int_t i = GetMaxEventId(kTRUE); i>fEventId-1; i--)
+ {
+ if (fESDTree->GetEntry(i) <= 0)
+ throw (kEH + "failed getting required event from ESD.");
+ firedtrclasses = fESD->GetFiredTriggerClasses();
+ if (firedtrclasses.Contains(fTriggerType))
+ {
+ event=i;
+ return kTRUE;
+ }
+ }
+ return kFALSE;
+}
+
+
//------------------------------------------------------------------------------
// Post event-loading functions
//------------------------------------------------------------------------------
TString firedtrclasses = fESD->GetFiredTriggerClasses();
TTimeStamp ts(fESD->GetTimeStamp());
esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
- "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s",
+ "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
fESD->GetRunNumber(),
fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
acttrclasses.Data(),
fESD->GetTriggerMask(),firedtrclasses.Data(),
- fESD->GetEventNumberInFile(), ts.AsString("s"));
+ fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
}
return rawInfo + esdInfo;
return rawInfo + "\n" + esdInfo;
}
-
* full copyright notice. *
**************************************************************************/
-#ifndef AliEveEventManaget_H
+#ifndef AliEveEventManager_H
#define AliEveEventManager_H
#include <TEveEventManager.h>
#include <TQObject.h>
+#include <TObjArray.h>
+#include <AliESDEvent.h>
class AliEveMacroExecutor;
virtual void NextEvent();
virtual void PrevEvent();
virtual void Close();
+ Bool_t FindNextByTrigger(Int_t& i);
+ Bool_t FindPrevByTrigger(Int_t& i);
Int_t GetEventId() const { return fEventId; }
void SetAutoLoad(Bool_t autoLoad);
void AutoLoadNextEvent();
+ Bool_t GetSelectOnTriggerType() const { return fSelectOnTriggerType; }
+ TString GetTriggerType() const { return fTriggerType; }
+ void SetTriggerType(const TString& triggertype) { fTriggerType = triggertype; }
+ void SetSelectOnTriggerType(Bool_t sel) { fSelectOnTriggerType = sel; }
+
Bool_t AreEventFilesOpened() const { return fIsOpen; }
Bool_t IsEventAvailable() const { return fHasEvent; }
Bool_t IsUnderExternalControl() const { return fExternalCtrl; }
Bool_t fHasEvent; // Is an event available.
Bool_t fExternalCtrl; // Are we under external event-loop.
+ Bool_t fSelectOnTriggerType; //whether to select on triggertype
+ TString fTriggerType; //triggertype to select on
AliEveMacroExecutor *fExecutor; // Executor for std macros
fNextEvent (0),
fLastEvent (0),
fRefresh (0),
+ fTrigger (0),
fEventId (0),
fInfoLabel (0),
fAutoLoad (0),
fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()");
fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0);
- f->AddFrame(fAutoLoadTime);
+ f->AddFrame(fAutoLoadTime);
fAutoLoadTime->SetShowSlider(kFALSE);
fAutoLoadTime->SetNELength(4);
fAutoLoadTime->Build();
fAutoLoadTime->SetLimits(0, 1000);
fAutoLoadTime->SetToolTip("Automatic event loading time in seconds.");
fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()");
+
+ MkLabel(f, "||", 0, 8, 8);
+
+ MkLabel(f, "TRG select:", 0, 0, 4, 4);
+ fTrigger = new TGComboBox(f);
+ f->AddFrame(fTrigger, new TGLayoutHints(kLHintsNormal));
+ fTrigger->Resize(75,20);
+ //fTrigger->EnableTextInput(kTRUE);
+ fTrigger->Connect("Selected(const char*)", cls, this, "DoSetTriggerType(const char*)");
}
fEventInfo = new TGTextView(this, 400, 600);
gAliEveEvent->SetAutoLoadTime(fAutoLoadTime->GetValue());
}
+//______________________________________________________________________________
+void AliEveEventManagerWindow::DoSetTriggerType(const char* type)
+{
+ // Slot for setting trigger type.
+
+ TString typestr = type;
+ if (typestr=="")
+ {
+ gAliEveEvent->SetSelectOnTriggerType(kFALSE);
+ }
+ else
+ {
+ gAliEveEvent->SetTriggerType( typestr );
+ gAliEveEvent->SetSelectOnTriggerType(kTRUE);
+ }
+}
+
//______________________________________________________________________________
void AliEveEventManagerWindow::Update()
{
- // Update current event, number of available events.
+ // Update current event, number of available events, list of active triggers
Bool_t autoLoad = gAliEveEvent->GetAutoLoad();
Bool_t extCtrl = gAliEveEvent->IsUnderExternalControl();
fEventInfo->LoadBuffer(gAliEveEvent->GetEventInfoHorizontal());
+ SetupTriggerSelect();
+
Layout();
}
p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
return l;
}
+
+void AliEveEventManagerWindow::SetupTriggerSelect()
+{
+ if (fTrigger->GetNumberOfEntries()>0) return; //do nothing if already enabled
+
+ AliESDEvent* esd = gAliEveEvent->AssertESD(); //get ESD
+ if (esd)
+ {
+ TString activetrg = esd->GetESDRun()->GetActiveTriggerClasses(); //Get list of active classes
+ TObjArray* activetrgarr = activetrg.Tokenize(" "); //break up the classes string, space as separator
+ Int_t entries = activetrgarr->GetEntries(); //how many triggerclasses
+ TString entry; //to hold the triger class name
+ TObjString* entryobj;
+ if (entries == 0)
+ {
+ fTrigger->SetEnabled(kFALSE); //no trigger classes
+ }
+ else
+ {
+ fTrigger->RemoveAll(); //some initial cleanup
+ fTrigger->SetEnabled(kTRUE); //no trigger classes
+ fTrigger->AddEntry("",-1); //first entry empty - select to not filter by trigger
+ for (Int_t i=0;i<entries;i++)
+ {
+ entryobj = (TObjString*)activetrgarr->At(i);
+ entry = entryobj->GetString();
+ fTrigger->AddEntry(entry.Data(), i);
+ }
+ }
+ fTrigger->Select(-1, kTRUE); //set default no filtering and emit
+ }
+ else
+ {
+ fTrigger->SetEnabled(kFALSE);
+ }
+}
+