AliEveEventManager
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 21 Aug 2008 11:24:13 +0000 (11:24 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 21 Aug 2008 11:24:13 +0000 (11:24 +0000)
------------------

Make handling of auto event-loading timer more transparent:
 - add methods to manipulate the timer;
 - add members that allow to check its state in event-navigation functions.

AliEveEventManagerEditor
------------------------

Do not call SetAutoLoad() when only timeout has changed.

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

index 02880f3..fb04133 100644 (file)
@@ -62,6 +62,15 @@ TString  AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
 
 AliMagF* AliEveEventManager::fgMagField = 0;
 
+void AliEveEventManager::InitInternals()
+{
+  // Initialize internal members.
+
+  fAutoLoadTimer = new TTimer;
+  fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
+
+  fExecutor = new AliEveMacroExecutor;
+}
 
 AliEveEventManager::AliEveEventManager() :
   TEveEventManager(),
@@ -73,9 +82,12 @@ AliEveEventManager::AliEveEventManager() :
   fRawReader (0),
   fAutoLoad  (kFALSE), fAutoLoadTime (5.),     fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
-  fExecutor  (new AliEveMacroExecutor)
+  fExecutor  (0),
+  fAutoLoadTimerRunning(kFALSE)
 {
   // Default constructor.
+
+  InitInternals();
 }
 
 AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
@@ -86,14 +98,20 @@ AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
   fESDFile   (0), fESDTree (0), fESD (0),
   fESDfriend (0), fESDfriendExists(kFALSE),
   fRawReader (0),
-  fAutoLoad  (kFALSE), fAutoLoadTime (5.),     fAutoLoadTimer(0),
+  fAutoLoad  (kFALSE), fAutoLoadTime (5),      fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
-  fExecutor  (new AliEveMacroExecutor)
+  fExecutor  (0),
+  fAutoLoadTimerRunning(kFALSE)
 {
   // Constructor with event-directory URL and event-id.
 
+  InitInternals();
+
   Open();
-  if (ev >= 0) GotoEvent(ev);
+  if (ev >= 0)
+  {
+    GotoEvent(ev);
+  }
 }
 
 AliEveEventManager::~AliEveEventManager()
@@ -105,9 +123,8 @@ AliEveEventManager::~AliEveEventManager()
     Close();
   }
 
-  if (fAutoLoadTimer) delete fAutoLoadTimer;
   // Somewhat unclear what to do here.
-  // In principle should close all data sources and deregister from
+  // In principle should wipe event data and deregister from
   // TEveManager.
 }
 
@@ -426,11 +443,15 @@ void AliEveEventManager::GotoEvent(Int_t event)
 
   static const TEveException kEH("AliEveEventManager::GotoEvent ");
 
+  if (fAutoLoadTimerRunning)
+  {
+    throw (kEH + "Event auto-load timer is running.");
+  }
   if (fExternalCtrl)
   {
     throw (kEH + "Event-loop is under external control.");
   }
-  if (!fIsOpen)
+  else if (!fIsOpen)
   {
     throw (kEH + "Event-files not opened.");
   }
@@ -543,10 +564,17 @@ void AliEveEventManager::NextEvent()
   // Loads next event.
   // Does magick needed for online display when under external event control.
   
-  if (fExternalCtrl)
+  static const TEveException kEH("AliEveEventManager::NextEvent ");
+
+  if (fAutoLoadTimerRunning)
   {
-    if (fAutoLoadTimer) fAutoLoadTimer->Stop();
+    throw (kEH + "Event auto-load timer is running.");
+  }
 
+  if (fExternalCtrl)
+  {
+    // !!! This should really go somewhere else. It is done in GotoEvent(),
+    // so here we should do it in SetEvent().
     DestroyElements();
 
     gSystem->ExitLoop();
@@ -557,7 +585,6 @@ void AliEveEventManager::NextEvent()
       GotoEvent(fEventId + 1);
     else
       GotoEvent(0);
-    StartStopAutoLoadTimer();
   }
 }
 
@@ -567,17 +594,16 @@ void AliEveEventManager::PrevEvent()
 
   static const TEveException kEH("AliEveEventManager::PrevEvent ");
 
-  if (fExternalCtrl)
+  if (fAutoLoadTimerRunning)
   {
-    throw (kEH + "Event-loop is under external control.");
+    throw (kEH + "Event auto-load timer is running.");
   }
-  if (!fIsOpen)
+  if (fExternalCtrl)
   {
-    throw (kEH + "Event-files not opened.");
+    throw (kEH + "Event-loop is under external control.");
   }
 
   GotoEvent(fEventId - 1);
-  StartStopAutoLoadTimer();
 }
 
 void AliEveEventManager::Close()
@@ -592,6 +618,9 @@ void AliEveEventManager::Close()
     throw (kEH + "Event-files not opened.");
   }
 
+  if (fAutoLoadTimerRunning)
+    StopAutoLoadTimer();
+
   if (fESDTree) {
     delete fESD;       fESD       = 0;
     delete fESDfriend; fESDfriend = 0;
@@ -761,43 +790,74 @@ TGeoManager* AliEveEventManager::AssertGeometry()
 
 
 //------------------------------------------------------------------------------
-// Autoloading
+// Autoloading of events
 //------------------------------------------------------------------------------
 
+void AliEveEventManager::SetAutoLoadTime(Float_t time)
+{
+  // Set the auto-load time in seconds
+
+  fAutoLoadTime = time;
+}
+
 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
 {
   // Set the automatic event loading mode
 
+  static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
+
+  if (fAutoLoad == autoLoad)
+  {
+    Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
+    return;
+  }
+
   fAutoLoad = autoLoad;
-  StartStopAutoLoadTimer();
+  if (fAutoLoad)
+  {
+    StartAutoLoadTimer();
+  }
+  else
+  {
+    StopAutoLoadTimer();
+  }
 }
 
-void AliEveEventManager::SetAutoLoadTime(Double_t time)
+void AliEveEventManager::StartAutoLoadTimer()
 {
-  // Set the auto-load time in seconds
+  // Start the auto-load timer.
 
-  fAutoLoadTime = time;
-  StartStopAutoLoadTimer();
+  fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
+  fAutoLoadTimer->Reset();
+  fAutoLoadTimer->TurnOn();
+  fAutoLoadTimerRunning = kTRUE;
 }
 
-void AliEveEventManager::StartStopAutoLoadTimer()
+void AliEveEventManager::StopAutoLoadTimer()
 {
-  // Create if needed and start
-  // the automatic event loading timer
+  // Stop the auto-load timer.
 
-  if (fAutoLoad)
-  {
-    if (!fAutoLoadTimer)
-    {
-      fAutoLoadTimer = new TTimer;
-      fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "NextEvent()");
-    }
-    fAutoLoadTimer->Start((Long_t)fAutoLoadTime*1000, kTRUE);
-  }
-  else
+  fAutoLoadTimerRunning = kFALSE;
+  fAutoLoadTimer->TurnOff();
+}
+
+void AliEveEventManager::AutoLoadNextEvent()
+{
+  // Called from auto-load timer, so it has to be public.
+  // Do NOT call it directly.
+
+  static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
+
+  if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
   {
-    if (fAutoLoadTimer) fAutoLoadTimer->Stop();
+    Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
+    return;
   }
+
+  StopAutoLoadTimer();
+  NextEvent();
+  if (fAutoLoad)
+    StartAutoLoadTimer();
 }
 
 
index 1404e15..aa9f55e 100644 (file)
@@ -82,16 +82,15 @@ public:
 
   static TGeoManager*  AssertGeometry();
 
-  Bool_t        GetAutoLoad() const {return fAutoLoad;}
-  Double_t      GetAutoLoadTime() const {return fAutoLoadTime;}
+  Double_t      GetAutoLoadTime()        const { return fAutoLoadTime; }
+  Bool_t        GetAutoLoad()            const { return fAutoLoad;     }
+  void          SetAutoLoadTime(Float_t time);
   void          SetAutoLoad(Bool_t autoLoad);
-  void          SetAutoLoadTime(Double_t time);
+  void          AutoLoadNextEvent();
 
-  Bool_t AreEventFilesOpened()    const { return fIsOpen;       }
-  Bool_t IsEventAvailable()       const { return fHasEvent;     }
-  Bool_t IsUnderExternalControl() const { return fExternalCtrl; }
-
-  void          StartStopAutoLoadTimer();
+  Bool_t        AreEventFilesOpened()    const { return fIsOpen;       }
+  Bool_t        IsEventAvailable()       const { return fHasEvent;     }
+  Bool_t        IsUnderExternalControl() const { return fExternalCtrl; }
 
   virtual void  AfterNewEventLoaded();
   void          NewEventLoaded();      // *SIGNAL*
@@ -113,7 +112,7 @@ protected:
   AliRawReader* fRawReader;             // Raw-adata reader.
 
   Bool_t        fAutoLoad;              // Automatic loading of events (online)
-  Double_t      fAutoLoadTime;          // Auto-load time in seconds
+  Float_t       fAutoLoadTime;          // Auto-load time in seconds
   TTimer       *fAutoLoadTimer;         // Timer for automatic event loading
 
   Bool_t        fIsOpen;                // Are event-files opened.
@@ -136,6 +135,12 @@ private:
   AliEveEventManager(const AliEveEventManager&);            // Not implemented
   AliEveEventManager& operator=(const AliEveEventManager&); // Not implemented
 
+  void InitInternals();
+  void StartAutoLoadTimer();
+  void StopAutoLoadTimer();
+
+  Bool_t fAutoLoadTimerRunning; // State of auto-load timer.
+
   ClassDef(AliEveEventManager, 0); // Interface for getting all event components in a uniform way.
 };
 
index a7b9630..92fbc9b 100644 (file)
@@ -108,7 +108,7 @@ AliEveEventManagerWindow::AliEveEventManagerWindow() :
 {
   // Constructor.
 
-  TString cls("AliEveEventManagerWindow");
+  const TString cls("AliEveEventManagerWindow");
   TGTextButton *b = 0;
   {
     Int_t width = 50;
@@ -235,8 +235,6 @@ void AliEveEventManagerWindow::DoSetAutoLoadTime()
   // Set the auto-load time in seconds
 
   gAliEveEvent->SetAutoLoadTime(fAutoLoadTime->GetValue());
-  gAliEveEvent->SetAutoLoad(fAutoLoad->IsOn());
-  Update();
 }
 
 //______________________________________________________________________________