]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveBase/AliEveEventManager.cxx
exit loop when in external control
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManager.cxx
index 2e487cabf29e19ce839c83d322a50788f0f5bb6d..d93f104524df296d40037bbac7a7e69d41e5a919 100644 (file)
@@ -8,9 +8,15 @@
  **************************************************************************/
 
 #include "AliEveEventManager.h"
+#include "AliEveEventSelector.h"
 #include "AliEveMacroExecutor.h"
+
+#include <THashList.h>
+#include <TEveElement.h>
 #include <TEveManager.h>
+#include <TEveViewer.h>
 
+#include <AliLog.h>
 #include <AliRunLoader.h>
 #include <AliRun.h>
 #include <AliESDRun.h>
 #include <AliESDfriend.h>
 #include <AliAODEvent.h>
 
+#include <AliRecoParam.h>
+#include <AliCentralTrigger.h>
+#include <AliCDBEntry.h>
+#include <AliTriggerClass.h>
+#include <AliTriggerConfiguration.h>
+#include <AliTriggerCluster.h>
+#include <AliDetectorRecoParam.h>
+
 #include <AliDAQ.h>
 #include <AliRawEventHeaderBase.h>
 #include <AliRawReaderRoot.h>
 #include <AliRawReaderFile.h>
 #include <AliRawReaderDate.h>
-#include <AliMagFMaps.h>
+#include <AliMagF.h>
 #include <AliCDBManager.h>
 #include <AliCDBStorage.h>
+#include <AliGRPObject.h>
 #include <AliHeader.h>
 #include <AliGeomManager.h>
+#include <AliGRPManager.h>
+#include <AliSysInfo.h>
 
 #include <TFile.h>
 #include <TTree.h>
 #include <TGeoManager.h>
+#include <TGeoGlobalMagField.h>
 #include <TSystem.h>
 #include <TTimeStamp.h>
+#include <TPRegexp.h>
+#include <TError.h>
+#include <TEnv.h>
+#include <TString.h>
+#include <TMap.h>
 
 //==============================================================================
 //==============================================================================
@@ -75,12 +98,17 @@ Bool_t AliEveEventManager::fgAssertRaw       = kFALSE;
 TString  AliEveEventManager::fgESDFileName("AliESDs.root");
 TString  AliEveEventManager::fgAODFileName("AliAOD.root");
 TString  AliEveEventManager::fgRawFileName("raw.root");
-TString  AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
-
-AliMagF* AliEveEventManager::fgMagField = 0;
+TString  AliEveEventManager::fgCdbUri;
 
 TList*   AliEveEventManager::fgAODfriends = 0;
 
+Bool_t   AliEveEventManager::fgRawFromStandardLoc = kFALSE;
+
+Bool_t   AliEveEventManager::fgGRPLoaded    = kFALSE;
+AliMagF* AliEveEventManager::fgMagField     = 0;
+AliRecoParam* AliEveEventManager::fgRecoParam = 0;
+Bool_t   AliEveEventManager::fgUniformField = kFALSE;
+
 AliEveEventManager* AliEveEventManager::fgMaster  = 0;
 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
 
@@ -104,8 +132,21 @@ void AliEveEventManager::InitInternals()
 
   fAutoLoadTimer = new TTimer;
   fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
+  fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
 
   fExecutor = new AliEveMacroExecutor;
+
+  fTransients = new TEveElementList("Transients", "Transient per-event elements.");
+  fTransients->IncDenyDestroy();
+  gEve->AddToListTree(fTransients, kFALSE);
+
+  fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
+  fTransientLists->IncDenyDestroy();
+  gEve->AddToListTree(fTransientLists, kFALSE);
+
+  fPEventSelector = new AliEveEventSelector(this);
+
+  fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
 }
 
 AliEveEventManager::AliEveEventManager(const TString& name) :
@@ -116,11 +157,12 @@ AliEveEventManager::AliEveEventManager(const TString& name) :
   fESDFile   (0), fESDTree (0), fESD (0),
   fESDfriend (0), fESDfriendExists(kFALSE),
   fAODFile   (0), fAODTree (0), fAOD (0),
-  fRawReader (0),
+  fRawReader (0), fEventInfo(),
   fAutoLoad  (kFALSE), fAutoLoadTime (5.),     fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
-  fSelectOnTriggerType(kFALSE), fTriggerType(""),
-  fExecutor    (0),
+  fGlobal    (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
+  fExecutor    (0), fTransients(0), fTransientLists(0),
+  fPEventSelector(0),
   fSubManagers (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -137,11 +179,12 @@ AliEveEventManager::AliEveEventManager(const TString& name, const TString& path,
   fESDFile   (0), fESDTree (0), fESD (0),
   fESDfriend (0), fESDfriendExists(kFALSE),
   fAODFile   (0), fAODTree (0), fAOD (0),
-  fRawReader (0),
+  fRawReader (0), fEventInfo(), 
   fAutoLoad  (kFALSE), fAutoLoadTime (5),      fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
-  fSelectOnTriggerType(kFALSE), fTriggerType(""),
-  fExecutor    (0),
+  fGlobal    (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
+  fExecutor    (0), fTransients(0), fTransientLists(0),
+  fPEventSelector(0),
   fSubManagers (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -159,6 +202,8 @@ AliEveEventManager::AliEveEventManager(const TString& name, const TString& path,
 AliEveEventManager::~AliEveEventManager()
 {
   // Destructor.
+  fAutoLoadTimer->Stop();
+       fAutoLoadTimer->Disconnect("Timeout");
 
   delete fSubManagers;
 
@@ -166,6 +211,14 @@ AliEveEventManager::~AliEveEventManager()
   {
     Close();
   }
+
+  fTransients->DecDenyDestroy();
+  fTransients->Destroy();
+
+  fTransientLists->DecDenyDestroy();
+  fTransientLists->Destroy();
+  
+  //delete fExecutor;
 }
 
 /******************************************************************************/
@@ -194,7 +247,10 @@ void AliEveEventManager::AddAODfriend(const TString& friendFileName)
     fgAODfriends = new TList;
     fgAODfriends->SetOwner(kTRUE);
   }
-  fgAODfriends->Add(new TObjString(friendFileName));
+  if (fgAODfriends->FindObject(friendFileName) == 0)
+  {
+    fgAODfriends->Add(new TObjString(friendFileName));
+  }
 }
 
 void AliEveEventManager::SetRawFileName(const TString& raw)
@@ -205,7 +261,7 @@ void AliEveEventManager::SetRawFileName(const TString& raw)
 
 void AliEveEventManager::SetCdbUri(const TString& cdb)
 {
-  // Set path to CDB, default "local://$ALICE_ROOT".
+  // Set path to CDB, there is no default.
 
   if ( ! cdb.IsNull()) fgCdbUri = cdb;
 }
@@ -222,6 +278,15 @@ void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assert
   fgAssertRaw = assertRaw;
 }
 
+void AliEveEventManager::SearchRawForCentralReconstruction()
+{
+  // Enable searching of raw data in standard location. The path passed to
+  // Open() is expected to point to a centrally reconstructed run, e.g.:
+  // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
+
+  fgRawFromStandardLoc = kTRUE;
+}
+
 /******************************************************************************/
 
 void AliEveEventManager::Open()
@@ -263,6 +328,7 @@ void AliEveEventManager::Open()
   // Open ESD and ESDfriends
 
   TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
+  if (fPath.EndsWith(".zip")) esdPath.Form("%s#%s",fPath.Data(),fgESDFileName.Data());
   if ((fESDFile = TFile::Open(esdPath)))
   {
     fESD = new AliESDEvent();
@@ -273,10 +339,8 @@ void AliEveEventManager::Open()
       // We use TFile::Open() instead of gSystem->AccessPathName
       // as it seems to work better when attachine alieve to a
       // running reconstruction process with auto-save on.
-      // There was also a problem with TTree::Refresh() - it didn't
-      // save the friend branch on a separate file, fixed in 5.22.2 -
-      // so we might want to try the old way again soon.
       TString p(Form("%s/AliESDfriends.root", fPath.Data()));
+      if (fPath.EndsWith(".zip")) p.Form("%s#AliESDfriends.root",fPath.Data());
       TFile *esdFriendFile = TFile::Open(p);
       if (esdFriendFile)
       {
@@ -336,6 +400,7 @@ void AliEveEventManager::Open()
   // Open AOD and registered friends
 
   TString aodPath(Form("%s/%s", fPath.Data(), fgAODFileName.Data()));
+  if (fPath.EndsWith(".zip")) aodPath.Form("%s#%s",fPath.Data(),fgAODFileName.Data());
   if ((fAODFile = TFile::Open(aodPath)))
   {
     fAOD = new AliAODEvent();
@@ -348,6 +413,7 @@ void AliEveEventManager::Open()
       while ((name = (TObjString*) friends()) != 0)
       {
        TString p(Form("%s/%s", fPath.Data(), name->GetName()));
+        if (fPath.EndsWith(".zip")) p.Form("%s#%s",fPath.Data(),name->GetName());
        if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
        {
          fAODTree->AddFriend("aodTree", name->GetName());
@@ -392,10 +458,19 @@ void AliEveEventManager::Open()
   // Open RunLoader from galice.root
 
   TString gaPath(Form("%s/galice.root", fPath.Data()));
+  if (fPath.EndsWith(".zip")) gaPath.Form("%s#%s",fPath.Data(),"galice.root");
   // If i use open directly, we get fatal.
   // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
-  if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
-  {
+  // Seems not to work for alien anymore.
+  // Fixed in ROOT on 27.10.2009, rev 30888.
+  // To revert after we move to root-5.26.
+  TFile *gafile = TFile::Open(gaPath);
+  if (gafile)
+  {
+    gafile->Close();
+    delete gafile;
+  // if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
+  // {
     fRunLoader = AliRunLoader::Open(gaPath, GetName());
     if (fRunLoader)
     {
@@ -436,7 +511,31 @@ void AliEveEventManager::Open()
 
   // Open raw-data file
 
-  TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
+  TString rawPath;
+  if (fgRawFromStandardLoc)
+  {
+    if (!fPath.BeginsWith("alien:"))
+      throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
+    if (!fPath.Contains("/ESDs/"))
+      throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
+
+    TPMERegexp chunk("/([\\d\\.])+/?$");
+    Int_t nm = chunk.Match(fPath);
+    if (nm != 2)
+      throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
+
+    TPMERegexp esdstrip("/ESDs/.*");
+    rawPath = fPath;
+    esdstrip.Substitute(rawPath, "/raw/");
+    rawPath += chunk[0];
+    rawPath += ".root";
+
+    Info(kEH, "Standard raw search requested, using the following path:\n  %s\n", rawPath.Data());
+  }
+  else
+  {
+    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.
@@ -463,7 +562,9 @@ void AliEveEventManager::Open()
     if (fgAssertRaw)
     {
       throw (kEH + "raw-data not initialized. Its precence was requested.");
-    } else {
+    }
+    else
+    {
       Warning(kEH, "raw-data not initialized.");
     }
   }
@@ -472,11 +573,16 @@ void AliEveEventManager::Open()
   {
     if (fRawReader)
     {
-      fRawReader->NextEvent();
+      if ( ! fRawReader->NextEvent())
+      {
+       throw (kEH + "can not go to first event in raw-reader to determine run-id.");
+      }
       runNo = fRawReader->GetRunNumber();
       Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
       fRawReader->RewindEvents();
-    } else {
+    }
+    else 
+    {
       throw (kEH + "unknown run number.");
     }
   }
@@ -493,11 +599,50 @@ void AliEveEventManager::Open()
     }
     else
     {
-      cdb->SetDefaultStorage(fgCdbUri);
+      if (fgCdbUri.IsNull())
+      {
+       gEnv->SetValue("Root.Stacktrace", "no");
+       Fatal("Open()", "OCDB path was not specified.");
+      }
+
+      // Handle some special cases for MC (should be in OCDBManager).
+      if (fgCdbUri == "mcideal://")
+       cdb->SetDefaultStorage("MC", "Ideal");
+      else if (fgCdbUri == "mcresidual://")
+       cdb->SetDefaultStorage("MC", "Residual");
+      else if (fgCdbUri == "mcfull://")
+       cdb->SetDefaultStorage("MC", "Full");
+      else if (fgCdbUri == "local://") {
+       fgCdbUri = "local://$ALICE_ROOT/OCDB";
+       cdb->SetDefaultStorage(fgCdbUri);
+      } else
+       cdb->SetDefaultStorage(fgCdbUri);
+
+      cdb->SetRun(runNo);
+
       if (cdb->IsDefaultStorageSet() == kFALSE)
-       throw (kEH + "CDB initialization failed.");
+       throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
+    }
+    
+    if (fgCdbUri.BeginsWith("local://"))
+    {
+      TString grp     = "GRP/GRP/Data";
+      TString grppath = fPath + "/" + grp;
+      if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
+      {
+       if (cdb->GetSpecificStorage(grp))
+       {
+         Warning(kEH, "Local GRP exists, but the specific storage is already set.");
+       }
+       else
+       {
+         Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
+         TString lpath("local://");
+         lpath += fPath;
+         cdb->SetSpecificStorage(grp, lpath);
+       }
+      }
     }
-    cdb->SetRun(runNo);
   }
 
   fIsOpen = kTRUE;
@@ -536,7 +681,7 @@ void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawRead
   if (fAutoLoad) StartAutoLoadTimer();
 }
 
-Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
+Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
 {
   // Returns maximum available event id.
   // If under external control or event is not opened -1 is returned.
@@ -555,11 +700,11 @@ Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
 
   if (fESDTree)
   {
-    // 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();
+    if (refreshESD)
+    {
+       fESDTree->Refresh();
+       fPEventSelector->Update();
+    }
     return fESDTree->GetEntries() - 1;
   }
   else if (fAODTree)
@@ -610,15 +755,15 @@ void AliEveEventManager::GotoEvent(Int_t event)
     throw (kEH + "Event-files not opened.");
   }
 
+ fEventInfo.Reset();
   fHasEvent = kFALSE;
 
   Int_t maxEvent = 0;
   if (fESDTree)
   {
-    // 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.
-    // fESDTree->Refresh();
+    if (event >= fESDTree->GetEntries())
+      fESDTree->Refresh();
     maxEvent = fESDTree->GetEntries() - 1;
     if (event < 0)
       event = fESDTree->GetEntries() + event;
@@ -663,14 +808,27 @@ void AliEveEventManager::GotoEvent(Int_t event)
                       event, 0, maxEvent));
   }
 
+  TString sysInfoHeader;
+  sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
+  AliSysInfo::AddStamp(sysInfoHeader + "Start");
+
   TEveManager::TRedrawDisabler rd(gEve);
   gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
 
   // !!! MT this is somewhat brutal; at least optionally, one could be
   // a bit gentler, checking for objs owning their external refs and having
   // additinal parents.
+  gEve->GetViewers()->DeleteAnnotations();
+  fTransients->DestroyElements();
+  for (TEveElement::List_i i = fTransientLists->BeginChildren();
+       i != fTransientLists->EndChildren(); ++i)
+  {
+    (*i)->DestroyElements();
+  }
   DestroyElements();
 
+  AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
+
   if (fESDTree) {
     if (fESDTree->GetEntry(event) <= 0)
       throw (kEH + "failed getting required event from ESD.");
@@ -724,7 +882,16 @@ void AliEveEventManager::GotoEvent(Int_t event)
     ElementChanged();
   }
 
+  AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
+
   AfterNewEventLoaded();
+
+  AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
+}
+
+void AliEveEventManager::Timeout()
+{
+               Emit("Timeout()");
 }
 
 void AliEveEventManager::NextEvent()
@@ -744,28 +911,27 @@ void AliEveEventManager::NextEvent()
     // !!! This should really go somewhere else. It is done in GotoEvent(),
     // so here we should do it in SetEvent().
     DestroyElements();
+               gSystem->ExitLoop();
 
-    gSystem->ExitLoop();
   }
-  else
+  else if (fESDTree)
   {
-    Int_t nexteventbytrigger=0;
-    if (fSelectOnTriggerType)
+    Int_t nextevent=0;
+    if (fPEventSelector->FindNext(nextevent))
     {
-      if (FindNextByTrigger(nexteventbytrigger)) //if not found do nothing
-        GotoEvent(nexteventbytrigger);
+      GotoEvent(nextevent);
     }
-    else if (fEventId < GetMaxEventId(kTRUE))
-      GotoEvent(fEventId + 1);
-    else
-      GotoEvent(0);
+  } 
+  else if (fEventId < GetMaxEventId(kTRUE))
+  {
+    GotoEvent(fEventId + 1);
   }
 }
 
 void AliEveEventManager::PrevEvent()
 {
   // Loads previous event.
-
+       
   static const TEveException kEH("AliEveEventManager::PrevEvent ");
 
   if (fAutoLoadTimerRunning)
@@ -776,14 +942,19 @@ void AliEveEventManager::PrevEvent()
   {
     throw (kEH + "Event-loop is under external control.");
   }
-  Int_t nexteventbytrigger=0;
-  if (fSelectOnTriggerType)
+
+  if (fESDTree)
   {
-    if (FindPrevByTrigger(nexteventbytrigger))
-      GotoEvent(nexteventbytrigger);
+    Int_t nextevent=0;
+    if (fPEventSelector->FindPrev(nextevent))
+    {
+      GotoEvent(nextevent);
+    }
   }
-  else
+  else if (fEventId > 0)
+  {
     GotoEvent(fEventId - 1);
+  }
 }
 
 void AliEveEventManager::Close()
@@ -803,7 +974,8 @@ void AliEveEventManager::Close()
 
   if (fESDTree) {
     delete fESD;       fESD       = 0;
-    delete fESDfriend; fESDfriend = 0;
+    // delete fESDfriend; // friend tree is deleted with the tree
+    fESDfriend = 0;
     fESDfriendExists = kFALSE;
 
     delete fESDTree;   fESDTree = 0;
@@ -835,6 +1007,17 @@ void AliEveEventManager::Close()
 // Static convenience functions, mainly used from macros.
 //------------------------------------------------------------------------------
 
+Int_t AliEveEventManager::CurrentEventId()
+{
+  // Return current event-id.
+
+  static const TEveException kEH("AliEveEventManager::CurrentEventId ");
+
+  if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
+    throw (kEH + "ALICE event not ready.");
+  return fgCurrent->GetEventId();
+}
+
 Bool_t AliEveEventManager::HasRunLoader()
 {
   // Check if AliRunLoader is initialized.
@@ -944,32 +1127,44 @@ AliRawReader* AliEveEventManager::AssertRawReader()
   return fgCurrent->fRawReader;
 }
 
-AliMagF* AliEveEventManager::AssertMagField()
-{
-  // Make sure AliMagF is initialized and returns it.
-  // Run-loader must be initialized to get the correct magnetic field!
-  // Throws exception in case magnetic field is not available.
-  // Static utility for macros.
+//==============================================================================
 
-  // !!!! This should be fixed ... get field also in some other way,
-  // not only via run-loader.
+AliMagF* AliEveEventManager::AssertMagField()   
+{       
+  // Make sure AliMagF is initialized and returns it.   
+  // Throws exception in case magnetic field is not available.          
+  // Static utility for macros.         
 
-  static const TEveException kEH("AliEveEventManager::AssertMagField ");
+  static const TEveException kEH("AliEveEventManager::AssertMagField ");        
+                
+  if (fgMagField)
+    return fgMagField;
 
-  if (fgMagField == 0)
+  if (TGeoGlobalMagField::Instance()->GetField())
   {
-    if (fgMaster && fgMaster->fRunLoader && fgMaster->fRunLoader->GetAliRun())
-    {
-      ::Info(kEH, "Retrieving magnetic field from AliRun.");
-      fgMagField = fgMaster->fRunLoader->GetAliRun()->Field();
-    }
-    else
-    {
-      ::Warning(kEH, "Instantiating default magnetic field (5kG).");
-      fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
-    }
+    fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
+    if (fgMagField == 0)
+      throw kEH + "Global field set, but it is not AliMagF.";
+    return fgMagField;
+  }
+
+  if (!fgGRPLoaded)
+  {
+    InitGRP();
+  }
+
+  if (TGeoGlobalMagField::Instance()->GetField())
+  {
+    fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
+    if (fgMagField == 0)
+      throw kEH + "Global field set, but it is not AliMagF.";
+  }
+  else
+  {
+    throw kEH + "Could not initialize magnetic field.";
   }
-  return fgMagField;
+
+  return fgMagField;    
 }
 
 TGeoManager* AliEveEventManager::AssertGeometry()
@@ -1006,6 +1201,111 @@ TGeoManager* AliEveEventManager::AssertGeometry()
   return gGeoManager;
 }
 
+AliRecoParam* AliEveEventManager::AssertRecoParams()
+{
+  if(!fgRecoParam) 
+    InitRecoParam();
+               
+  return fgRecoParam;
+}
+
+Bool_t AliEveEventManager::InitRecoParam()
+{
+// This is mostly a reap-off from reconstruction
+// The method accesses OCDB and retrieves all
+// the available reco-param objects from there.
+
+  fgRecoParam = new AliRecoParam;
+  const Int_t  kNDetectors = 14;
+       
+  static const TEveException kEH("AliEveEventManager::InitRecoParam ");
+  
+  Bool_t isOK = kTRUE;
+
+  if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
+    ::Info(kEH, "Using custom GRP reconstruction parameters");
+  }
+  else {
+    ::Info(kEH, "Loading GRP reconstruction parameter objects");
+
+    AliCDBPath path("GRP","Calib","RecoParam");
+    AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
+    if(!entry){ 
+      ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
+      isOK = kFALSE;
+    }
+    else {
+      TObject *recoParamObj = entry->GetObject();
+      if (dynamic_cast<TObjArray*>(recoParamObj)) {
+       // GRP has a normal TobjArray of AliDetectorRecoParam objects
+       // Registering them in AliRecoParam
+       fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
+      }
+      else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
+       // GRP has only onse set of reco parameters
+       // Registering it in AliRecoParam
+       ::Info(kEH, "Single set of GRP reconstruction parameters found");
+       dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
+       fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
+      }
+      else {
+       ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
+       isOK = kFALSE;
+      }
+      entry->SetOwner(0);
+    }
+  }
+
+  const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
+
+  
+  for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+
+    if (fgRecoParam->GetDetRecoParamArray(iDet)) {
+      ::Info(kEH, Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
+      continue;
+    }
+
+    ::Info(kEH, Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
+  
+    AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
+    AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
+    if(!entry){ 
+      ::Warning(kEH, Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
+      isOK = kFALSE;
+    }
+    else {
+      TObject *recoParamObj = entry->GetObject();
+      if (dynamic_cast<TObjArray*>(recoParamObj)) {
+       // The detector has a normal TobjArray of AliDetectorRecoParam objects
+       // Registering them in AliRecoParam
+       fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
+      }
+      else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
+       // The detector has only onse set of reco parameters
+       // Registering it in AliRecoParam
+       ::Info(kEH, Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
+       dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
+       fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
+      }
+      else {
+       ::Error(kEH, Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
+       isOK = kFALSE;
+      }
+      entry->SetOwner(0);
+    
+    }
+  }
+  
+  if(!isOK) {
+    delete fgRecoParam;
+    fgRecoParam = 0;
+  }
+
+  return isOK;
+}
+
+
 //------------------------------------------------------------------------------
 
 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
@@ -1071,6 +1371,16 @@ AliEveEventManager* AliEveEventManager::GetCurrent()
   return fgCurrent;
 }
 
+void AliEveEventManager::RegisterTransient(TEveElement* element)
+{
+  GetCurrent()->fTransients->AddElement(element);
+}
+
+void AliEveEventManager::RegisterTransientList(TEveElement* element)
+{
+  GetCurrent()->fTransientLists->AddElement(element);
+}
+
 //------------------------------------------------------------------------------
 // Autoloading of events
 //------------------------------------------------------------------------------
@@ -1105,6 +1415,24 @@ void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
   }
 }
 
+void AliEveEventManager::SetTrigSel(Int_t trig)
+{
+  static const TEveException kEH("AliEveEventManager::SetTrigSel ");
+
+  if (!fRawReader)
+    {
+    Warning(kEH, "No Raw-reader exists. Ignoring the call.");
+    return;
+  }
+  else
+  {
+    ULong64_t trigMask = 0;
+    if (trig >= 0) trigMask = (1ull << trig);
+    Info(kEH,"Trigger selection: 0x%llx",trigMask);
+    fRawReader->SelectEvents(-1,trigMask,NULL);
+  }
+}
+
 void AliEveEventManager::StartAutoLoadTimer()
 {
   // Start the auto-load timer.
@@ -1142,80 +1470,6 @@ void AliEveEventManager::AutoLoadNextEvent()
     StartAutoLoadTimer();
 }
 
-
-//------------------------------------------------------------------------------
-// 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
 //------------------------------------------------------------------------------
@@ -1229,6 +1483,8 @@ void AliEveEventManager::AfterNewEventLoaded()
 
   static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
 
+  NewEventDataLoaded();
+
   if (fExecutor)
     fExecutor->ExecMacros();
 
@@ -1258,6 +1514,13 @@ void AliEveEventManager::AfterNewEventLoaded()
   }
 }
 
+void AliEveEventManager::NewEventDataLoaded()
+{
+  // Emit NewEventDataLoaded signal.
+
+  Emit("NewEventDataLoaded()");
+}
+
 void AliEveEventManager::NewEventLoaded()
 {
   // Emit NewEventLoaded signal.
@@ -1270,6 +1533,122 @@ void AliEveEventManager::NewEventLoaded()
 // Event info dumpers
 //------------------------------------------------------------------------------
 
+const AliEventInfo* AliEveEventManager::GetEventInfo() 
+{
+  // Fill the event info object
+
+  AliCentralTrigger *aCTP = NULL;
+  if (fRawReader) {
+    fEventInfo.SetEventType(fRawReader->GetType());
+
+    ULong64_t mask = fRawReader->GetClassMask();
+    fEventInfo.SetTriggerMask(mask);
+    UInt_t clmask = fRawReader->GetDetectorPattern()[0];
+    fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
+
+    aCTP = new AliCentralTrigger();
+    TString configstr("");
+    if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
+      AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
+      delete aCTP;
+      return 0;
+    }
+    aCTP->SetClassMask(mask);
+    aCTP->SetClusterMask(clmask);
+
+    if (fRunLoader) {
+      AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
+      if (rlCTP) {
+       rlCTP->SetClassMask(mask);
+       rlCTP->SetClusterMask(clmask);
+      }
+    }
+  }
+  else {
+    fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
+
+    if (fRunLoader && (!fRunLoader->LoadTrigger())) {
+      aCTP = fRunLoader->GetTrigger();
+      fEventInfo.SetTriggerMask(aCTP->GetClassMask());
+      // get inputs from actp - just get
+      AliESDHeader* esdheader = fESD->GetHeader();
+      esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
+      esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
+      esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
+      fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
+    }
+    else {
+      AliWarning("No trigger can be loaded! The trigger information will not be used!");
+      return 0;
+    }
+  }
+
+  AliTriggerConfiguration *config = aCTP->GetConfiguration();
+  if (!config) {
+    AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
+    if (fRawReader) delete aCTP;
+    return 0;
+  }
+
+  TString declTriggerClasses;
+       
+  // Load trigger aliases and declare the trigger classes included in aliases
+  AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
+  if (entry) {
+    THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
+    if (lst) {
+      lst->Sort(kSortDescending); // to avoid problems with substrings
+      if (fRawReader) fRawReader->LoadTriggerAlias(lst);
+      // Now declare all the triggers present in the aliases
+      TIter iter(lst);
+      TNamed *nmd = 0;
+      while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
+       declTriggerClasses += " ";
+       declTriggerClasses += nmd->GetName();
+      }
+    }
+    else {
+      AliError("Cannot cast the object with trigger aliases to THashList!");
+    }
+  }
+  else {
+    AliError("No OCDB entry for the trigger aliases!");
+  }
+  
+  // Load trigger classes for this run
+  UChar_t clustmask = 0;
+  TString trclasses;
+  ULong64_t trmask = fEventInfo.GetTriggerMask();
+  const TObjArray& classesArray = config->GetClasses();
+  Int_t nclasses = classesArray.GetEntriesFast();
+  for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
+    AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
+    if (trclass && trclass->GetMask()>0) {
+      Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
+      if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
+      if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
+      if (trmask & (1ull << trindex)) {
+       trclasses += " ";
+       trclasses += trclass->GetName();
+       trclasses += " ";
+       clustmask |= trclass->GetCluster()->GetClusterMask();
+      }
+    }
+  }
+  fEventInfo.SetTriggerClasses(trclasses);
+
+  if (!aCTP->CheckTriggeredDetectors()) {
+    if (fRawReader) delete aCTP;
+    return 0;
+  }
+
+  if (fRawReader) delete aCTP;
+
+// everything went ok, return pointer
+  return (&fEventInfo);
+}
+
+
 TString AliEveEventManager::GetEventInfoHorizontal() const
 {
   // Dumps the event-header contents in vertical formatting.
@@ -1357,3 +1736,113 @@ TString AliEveEventManager::GetEventInfoVertical() const
 
   return rawInfo + "\n" + esdInfo;
 }
+
+
+//==============================================================================
+// Reading of GRP and MagneticField.
+// This is a reap-off from reconstruction ... should really be a common
+// code to do this somewhere in STEER.
+//==============================================================================
+
+Bool_t AliEveEventManager::InitGRP()
+{
+  //------------------------------------
+  // Initialization of the GRP entry 
+  //------------------------------------
+
+  static const TEveException kEH("AliEveEventManager::InitGRP ");
+
+  AliGRPManager grpMgr;
+  if (!grpMgr.ReadGRPEntry()) {
+    return kFALSE;
+  }
+  fgGRPLoaded = kTRUE;
+  if (!grpMgr.SetMagField()) {
+    throw kEH + "Setting of field failed!";
+  }
+
+  //*** Get the diamond profiles from OCDB
+  // Eventually useful.
+
+  /*
+    entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
+    if (entry) {
+    fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+    } else {
+    ::Error(kEH, "No SPD diamond profile found in OCDB!");
+    }
+
+    entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
+    if (entry) {
+    fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+    } else {
+    ::Error(kEH, "No diamond profile found in OCDB!");
+    }
+
+    entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
+    if (entry) {
+    fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+    } else {
+    ::Error(kEH, "No TPC diamond profile found in OCDB!");
+    }
+  */
+
+  return kTRUE;
+} 
+
+//------------------------------------
+// Global variables management
+//------------------------------------
+
+Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
+{
+   // Insert a new visualization-parameter database entry with the default
+   return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
+}
+
+Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
+                    Bool_t replace, Bool_t update)
+{
+   TPair* pair = (TPair*) fGlobal->FindObject(tag);
+   if (pair)
+   {
+      if (replace)
+      {
+         model->IncDenyDestroy();
+         model->SetRnrChildren(kFALSE);
+
+         TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
+                if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
+         while (old_model->HasChildren())
+         {
+            TEveElement *el = old_model->FirstChild();
+            el->SetVizModel(model);
+            if (update)
+            {
+               el->CopyVizParams(model);
+               el->PropagateVizParamsToProjecteds();
+            }
+         }
+         old_model->DecDenyDestroy();
+
+         pair->SetValue(dynamic_cast<TObject*>(model));
+         return kTRUE;
+      }
+      else
+      {
+         return kFALSE;
+      }
+   }
+   else
+   {
+      model->IncDenyDestroy();
+      model->SetRnrChildren(kFALSE);
+      fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
+      return kTRUE;
+   }
+}
+
+TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
+{
+   return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));
+}