]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveBase/AliEveEventManager.cxx
Fix coverity report -- missing check on AliRawReader::NextEvent() when attempting...
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManager.cxx
index 18414909b70dbd85a1b2f34747fc920a2d6ea8a2..4d38ed381df0613f0747874c224596b3769e7ace 100644 (file)
@@ -8,8 +8,11 @@
  **************************************************************************/
 
 #include "AliEveEventManager.h"
+#include "AliEveEventSelector.h"
 #include "AliEveMacroExecutor.h"
+#include <TEveElement.h>
 #include <TEveManager.h>
+#include <TEveViewer.h>
 
 #include <AliRunLoader.h>
 #include <AliRun.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,10 +87,16 @@ 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/OCDB");
+TString  AliEveEventManager::fgCdbUri;
 
 TList*   AliEveEventManager::fgAODfriends = 0;
 
+Bool_t   AliEveEventManager::fgRawFromStandardLoc = kFALSE;
+
+Bool_t   AliEveEventManager::fgGRPLoaded    = kFALSE;
+AliMagF* AliEveEventManager::fgMagField     = 0;
+Bool_t   AliEveEventManager::fgUniformField = kFALSE;
+
 AliEveEventManager* AliEveEventManager::fgMaster  = 0;
 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
 
@@ -107,7 +125,15 @@ void AliEveEventManager::InitInternals()
 
   fTransients = new TEveElementList("Transients", "Transient per-event elements.");
   fTransients->IncDenyDestroy();
-  gEve->AddToListTree(fTransients, kTRUE);
+  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) :
@@ -121,8 +147,9 @@ AliEveEventManager::AliEveEventManager(const TString& name) :
   fRawReader (0),
   fAutoLoad  (kFALSE), fAutoLoadTime (5.),     fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
-  fSelectOnTriggerType(kFALSE), fTriggerType(""),
-  fExecutor    (0), fTransients(0),
+  fGlobal    (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
+  fExecutor    (0), fTransients(0), fTransientLists(0),
+  fPEventSelector(0),
   fSubManagers (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -142,8 +169,9 @@ AliEveEventManager::AliEveEventManager(const TString& name, const TString& path,
   fRawReader (0),
   fAutoLoad  (kFALSE), fAutoLoadTime (5),      fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
-  fSelectOnTriggerType(kFALSE), fTriggerType(""),
-  fExecutor    (0), fTransients(0),
+  fGlobal    (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
+  fExecutor    (0), fTransients(0), fTransientLists(0),
+  fPEventSelector(0),
   fSubManagers (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -171,6 +199,9 @@ AliEveEventManager::~AliEveEventManager()
 
   fTransients->DecDenyDestroy();
   fTransients->Destroy();
+
+  fTransientLists->DecDenyDestroy();
+  fTransientLists->Destroy();
 }
 
 /******************************************************************************/
@@ -199,7 +230,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)
@@ -210,7 +244,7 @@ void AliEveEventManager::SetRawFileName(const TString& raw)
 
 void AliEveEventManager::SetCdbUri(const TString& cdb)
 {
-  // Set path to CDB, default "local://$ALICE_ROOT/OCDB".
+  // Set path to CDB, there is no default.
 
   if ( ! cdb.IsNull()) fgCdbUri = cdb;
 }
@@ -227,6 +261,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()
@@ -268,6 +311,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();
@@ -278,10 +322,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)
       {
@@ -341,6 +383,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();
@@ -353,6 +396,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());
@@ -397,10 +441,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)
     {
@@ -441,7 +494,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.
@@ -468,7 +545,9 @@ void AliEveEventManager::Open()
     if (fgAssertRaw)
     {
       throw (kEH + "raw-data not initialized. Its precence was requested.");
-    } else {
+    }
+    else
+    {
       Warning(kEH, "raw-data not initialized.");
     }
   }
@@ -477,11 +556,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.");
     }
   }
@@ -498,11 +582,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;
@@ -541,7 +664,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.
@@ -560,11 +683,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)
@@ -620,10 +743,8 @@ void AliEveEventManager::GotoEvent(Int_t event)
   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;
@@ -668,15 +789,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.");
@@ -730,7 +863,11 @@ void AliEveEventManager::GotoEvent(Int_t event)
     ElementChanged();
   }
 
+  AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
+
   AfterNewEventLoaded();
+
+  AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
 }
 
 void AliEveEventManager::NextEvent()
@@ -753,18 +890,17 @@ void AliEveEventManager::NextEvent()
 
     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);
   }
 }
 
@@ -782,14 +918,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()
@@ -809,7 +950,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;
@@ -841,6 +983,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.
@@ -950,6 +1103,45 @@ AliRawReader* AliEveEventManager::AssertRawReader()
   return fgCurrent->fRawReader;
 }
 
+//==============================================================================
+
+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 ");        
+                
+  if (fgMagField)
+    return fgMagField;
+
+  if (TGeoGlobalMagField::Instance()->GetField())
+  {
+    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;    
+}
 
 TGeoManager* AliEveEventManager::AssertGeometry()
 {
@@ -1055,6 +1247,11 @@ void AliEveEventManager::RegisterTransient(TEveElement* element)
   GetCurrent()->fTransients->AddElement(element);
 }
 
+void AliEveEventManager::RegisterTransientList(TEveElement* element)
+{
+  GetCurrent()->fTransientLists->AddElement(element);
+}
+
 //------------------------------------------------------------------------------
 // Autoloading of events
 //------------------------------------------------------------------------------
@@ -1089,6 +1286,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.
@@ -1126,80 +1341,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
 //------------------------------------------------------------------------------
@@ -1213,6 +1354,8 @@ void AliEveEventManager::AfterNewEventLoaded()
 
   static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
 
+  NewEventDataLoaded();
+
   if (fExecutor)
     fExecutor->ExecMacros();
 
@@ -1242,6 +1385,13 @@ void AliEveEventManager::AfterNewEventLoaded()
   }
 }
 
+void AliEveEventManager::NewEventDataLoaded()
+{
+  // Emit NewEventDataLoaded signal.
+
+  Emit("NewEventDataLoaded()");
+}
+
 void AliEveEventManager::NewEventLoaded()
 {
   // Emit NewEventLoaded signal.
@@ -1341,3 +1491,112 @@ 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());
+         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));
+}