]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveBase/AliEveEventManager.cxx
Make use of new method AliRawReader::GetNumberOfEvents() - goinf to the last event...
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManager.cxx
index bbdb25e90bb898f2f5c9084bc315aa09d0f04d48..a0107193035875b61596a54f042791d067a5fc96 100644 (file)
@@ -260,14 +260,17 @@ 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 (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
+  // 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 (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)      
   {
     fRawReader = AliRawReader::Create(rawPath);
   }
-
+  else
+  {
+    fRawReader = AliRawReader::Create(fgRawFileName);
+  }
   if (fRawReader == 0)
   {
     if (fgAssertRaw)
@@ -318,7 +321,7 @@ void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawRead
   AfterNewEventLoaded();
 }
 
-Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
+Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
 {
   // Returns maximum available event id.
   // If raw-data is the only data-source this can not be known
@@ -329,19 +332,23 @@ Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
 
   static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
 
-  if (fRunLoader)
+  if (fESDTree)
   {
-    return fRunLoader->GetNumberOfEvents() - 1;
+    // Refresh crashes with root-5.21.1-alice.
+    // Fixed by Philippe 5.8.2008 r25053, can be reactivated
+    // when we move to a newer root.
+    // if (refreshESD)
+    //   fESDTree->Refresh();
+    return fESDTree->GetEntries() - 1;
   }
-  else if (fESDTree)
+  else if (fRunLoader)
   {
-    if (refreshESD)
-      fESDTree->Refresh();
-    return fESDTree->GetEntries() - 1;
+    return fRunLoader->GetNumberOfEvents() - 1;
   }
   else if (fRawReader)
   {
-    return 10000000;
+    Int_t n = fRawReader->GetNumberOfEvents() - 1;
+    return n > -1 ? n : 10000000;
   }
   else
   {
@@ -384,12 +391,21 @@ void AliEveEventManager::GotoEvent(Int_t event)
   }
   else if (fRawReader)
   {
-    maxEvent = 10000000;
-    if (event < 0) {
-      Error(kEH, "negative event id passed for raw-data as source. Operation not supported.");
-      return;
+    maxEvent = fRawReader->GetNumberOfEvents() - 1;
+    if (maxEvent < 0)
+    {
+      maxEvent = 10000000;
+      if (event < 0) {
+        Error(kEH, "current raw-data source does not support direct event access.");
+        return;
+      }
+      Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
+    }
+    else
+    {
+      if (event < 0)
+        event = fRawReader->GetNumberOfEvents() + event;
     }
-    Info(kEH, "number of events unknown for raw-data, setting max-event id to 10M.");
   }
   else
   {
@@ -454,6 +470,7 @@ void AliEveEventManager::GotoEvent(Int_t event)
   ElementChanged();
 
   AfterNewEventLoaded();
+  NewEventLoaded();
 }
 
 void AliEveEventManager::NextEvent()
@@ -462,14 +479,16 @@ void AliEveEventManager::NextEvent()
   // either in automatic (online) or
   // manual mode
   
-  if (fIsOnline) {
+  if (fIsOnline)
+  {
     if (fAutoLoadTimer) fAutoLoadTimer->Stop();
 
     DestroyElements();
 
     gSystem->ExitLoop();
   }
-  else {
+  else
+  {
     if (fEventId < GetMaxEventId(kTRUE))
       GotoEvent(fEventId + 1);
     else
@@ -642,18 +661,28 @@ void AliEveEventManager::StartStopAutoLoadTimer()
 {
   // Create if needed and start
   // the automatic event loading timer
-  if (fAutoLoad) {
-    if (!fAutoLoadTimer) {
+  if (fAutoLoad)
+  {
+    if (!fAutoLoadTimer)
+    {
       fAutoLoadTimer = new TTimer;
       fAutoLoadTimer->Connect("Timeout()","AliEveEventManager",this,"NextEvent()");
     }
     fAutoLoadTimer->Start((Long_t)fAutoLoadTime*1000,kTRUE);
   }
-  else {
+  else
+  {
     if (fAutoLoadTimer) fAutoLoadTimer->Stop();
   }
 }
 
+void AliEveEventManager::NewEventLoaded()
+{
+  // Emit NewEventLoaded signal.
+
+  Emit("NewEventLoaded()");
+}
+
 const char* AliEveEventManager::GetEventInfo() const
 {
   // Dumps the event-header contents