From Mikolaj.
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 8 Sep 2008 18:28:08 +0000 (18:28 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 8 Sep 2008 18:28:08 +0000 (18:28 +0000)
Add controls for selecting next event based on trigger-type.

EVE/EveBase/AliEveEventManager.cxx
EVE/EveBase/AliEveEventManager.h
EVE/EveBase/AliEveEventManagerEditor.cxx
EVE/EveBase/AliEveEventManagerEditor.h

index ea97152..1bd4373 100644 (file)
@@ -82,6 +82,7 @@ AliEveEventManager::AliEveEventManager() :
   fRawReader (0),
   fAutoLoad  (kFALSE), fAutoLoadTime (5.),     fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
+  fSelectOnTriggerType(kFALSE), fTriggerType(""),
   fExecutor  (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -100,6 +101,7 @@ AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
   fRawReader (0),
   fAutoLoad  (kFALSE), fAutoLoadTime (5),      fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
+  fSelectOnTriggerType(kFALSE), fTriggerType(""),
   fExecutor  (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -321,15 +323,15 @@ void AliEveEventManager::Open()
   // 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);
   }
@@ -405,7 +407,7 @@ void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawRead
   ElementChanged();
   AfterNewEventLoaded();
 
-  if (fAutoLoad) StartAutoLoadTimer(); 
+  if (fAutoLoad) StartAutoLoadTimer();
 }
 
 Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
@@ -585,7 +587,7 @@ void AliEveEventManager::NextEvent()
 {
   // Loads next event.
   // Does magick needed for online display when under external event control.
-  
+
   static const TEveException kEH("AliEveEventManager::NextEvent ");
 
   if (fAutoLoadTimerRunning)
@@ -603,7 +605,13 @@ void AliEveEventManager::NextEvent()
   }
   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);
@@ -624,8 +632,14 @@ void AliEveEventManager::PrevEvent()
   {
     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()
@@ -885,6 +899,79 @@ void AliEveEventManager::AutoLoadNextEvent()
 
 
 //------------------------------------------------------------------------------
+// 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
 //------------------------------------------------------------------------------
 
@@ -948,13 +1035,13 @@ TString AliEveEventManager::GetEventInfoHorizontal() const
     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;
@@ -1002,4 +1089,3 @@ TString AliEveEventManager::GetEventInfoVertical() const
 
   return rawInfo + "\n" + esdInfo;
 }
-  
index aa9f55e..5b9a9d8 100644 (file)
@@ -7,11 +7,13 @@
  * 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;
 
@@ -56,6 +58,8 @@ public:
   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; }
@@ -88,6 +92,11 @@ public:
   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; }
@@ -119,6 +128,8 @@ protected:
   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
 
index 92fbc9b..cd7843c 100644 (file)
@@ -100,6 +100,7 @@ AliEveEventManagerWindow::AliEveEventManagerWindow() :
   fNextEvent    (0),
   fLastEvent    (0),
   fRefresh      (0),
+  fTrigger      (0),
   fEventId      (0),
   fInfoLabel    (0),
   fAutoLoad     (0),
@@ -146,13 +147,22 @@ AliEveEventManagerWindow::AliEveEventManagerWindow() :
     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);
@@ -238,9 +248,26 @@ void AliEveEventManagerWindow::DoSetAutoLoadTime()
 }
 
 //______________________________________________________________________________
+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();
@@ -262,6 +289,8 @@ void AliEveEventManagerWindow::Update()
 
   fEventInfo->LoadBuffer(gAliEveEvent->GetEventInfoHorizontal());
 
+  SetupTriggerSelect();
+
   Layout();
 }
 
@@ -302,3 +331,40 @@ TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
   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);
+  }
+}
+
index 748eee1..17ae642 100644 (file)
@@ -11,6 +11,8 @@
 #define AliEveEventManagerEditor_H
 
 #include "TGedFrame.h"
+#include "TGComboBox.h"
+#include <TObjString.h>
 
 class AliEveEventManager;
 class TEveGValuator;
@@ -79,6 +81,8 @@ public:
   void DoSetAutoLoad();
   void DoSetAutoLoadTime();
 
+  void DoSetTriggerType(const char* type);
+
   void Update();
 
 protected:
@@ -88,6 +92,8 @@ protected:
   TGTextButton         *fLastEvent;    // Go to last event
   TGTextButton         *fRefresh;      // Refresh event-file state
 
+  TGComboBox           *fTrigger;
+
   TGNumberEntry        *fEventId;      // Display/edit current event id
   TGLabel              *fInfoLabel;    // Display last available event id
 
@@ -101,6 +107,8 @@ protected:
   TGLabel* MkLabel(TGCompositeFrame* p, const char* txt, Int_t width,
                   Int_t lo=0, Int_t ro=0, Int_t to=2, Int_t bo=0);
 
+  void SetupTriggerSelect();                //Sets up the trigger selection list
+
 private:
   AliEveEventManagerWindow(const AliEveEventManagerWindow&);            // Not implemented
   AliEveEventManagerWindow& operator=(const AliEveEventManagerWindow&); // Not implemented