]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/Alieve/EventAlieve.cxx
Invert the modality of run-loader and esd loading: always try to open them and compla...
[u/mrichter/AliRoot.git] / EVE / Alieve / EventAlieve.cxx
index 3d1b17f41b50e2e6b29caea61dd5fcd31b75a8c0..5219c772ff79eae6bad58fdeb727916f3b7c1297 100644 (file)
@@ -2,16 +2,25 @@
 
 #include "EventAlieve.h"
 #include <Reve/Reve.h>
+#include <Reve/RGTopFrame.h>
 
 #include <AliRunLoader.h>
+#include <AliRun.h>
 #include <AliESD.h>
 #include <AliESDfriend.h>
+#include <AliMagFMaps.h>
+#include <AliCDBManager.h>
+#include <AliHeader.h>
+#include <AliGeomManager.h>
 
 #include <TFile.h>
 #include <TTree.h>
+#include <TObjString.h>
+#include <TError.h>
 
 #include <TROOT.h>
 #include <TSystem.h>
+#include <TCint.h>
 
 using namespace Reve;
 using namespace Alieve;
@@ -19,59 +28,46 @@ using namespace Alieve;
 //______________________________________________________________________
 // Event
 //
+// Provide interface for loading and navigating standard AliRoot data
+// (AliRunLoader) and ESDs.
+//
+// Missing support for raw-data. For now this is handled individually
+// by each sub-detector.
+// 
 
 ClassImp(Event)
 
 Event* Alieve::gEvent = 0;
 
-Bool_t Alieve::Event::fgUseRunLoader = true;
-Bool_t Alieve::Event::fgUseESDTree   = true;
-
-void Event::Initialize(Bool_t use_runloader, Bool_t use_esd)
-{
-  static const Exc_t eH("Event::Initialize ");
-
-  fgUseRunLoader = use_runloader;
-  fgUseESDTree   = use_esd;
-
-  /*
-  if(fgUseRunLoader == false && fgUseESDTree == false)
-    throw(eH + "should use at least one data source.");
+Bool_t Alieve::Event::fgAssertRunLoader = kFALSE;
+Bool_t Alieve::Event::fgAssertESDTree   = kFALSE;
 
-  if(fgUseRunLoader) {
-    AssertMacro("loadlibs.C");
-  }
-  else if(fgUseESDTree) {
-    gSystem->Load("libESD.so");
-  }
-  */
-}
+TString  Alieve::Event::fgCdbUri("local://$ALICE_ROOT");
 
-/**************************************************************************/
+AliMagF* Alieve::Event::fgMagField = 0;
 
-void Event::Init()
-{
-  fRunLoader = 0;
-  fESDFile   = 0;
-  fESDTree   = 0;
-  fESD       = 0;
-  fESDfriendFile = 0;
-  fESDfriendTree = 0;
-  fESDfriend     = 0;
-}
 
 Event::Event() :
-  EventBase(), fEventId(0)
-{
-  Init();
-}
+  EventBase(),
+
+  fPath (), fEventId   (0),
+  fRunLoader (0),
+  fESDFile   (0), fESDTree (0), fESD (0),
+  fESDfriend (0), fESDfriendExists(kFALSE),
+  fNewEventCommands()
+{}
 
 Event::Event(TString path, Int_t ev) :
   EventBase("AliEVE Event"),
-  fPath(path), fEventId(ev)
+
+  fPath (path), fEventId(-1),
+  fRunLoader (0),
+  fESDFile   (0), fESDTree (0), fESD (0),
+  fESDfriend (0), fESDfriendExists(kFALSE),
+  fNewEventCommands()
 {
-  Init();
   Open();
+  if (ev >= 0) GotoEvent(ev);
 }
 
 /**************************************************************************/
@@ -84,59 +80,106 @@ void Event::Open()
   if(fPath[0] != '/')
     fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
 
-  if(fgUseRunLoader) {
-    TString ga_path(Form("%s/galice.root", fPath.Data()));
-    if(gSystem->AccessPathName(ga_path, kReadPermission))
-      throw(eH + "can not read '" + ga_path + "'.");
+  Int_t runNo = -1;
+
+  TString ga_path(Form("%s/galice.root", fPath.Data()));
+  if(gSystem->AccessPathName(ga_path, kReadPermission) == kFALSE)
+  {
     fRunLoader = AliRunLoader::Open(ga_path);
-    if(!fRunLoader)
-      throw(eH + "failed opening ALICE run loader from '" + ga_path + "'.");
+    if (fRunLoader)
     {
       TString alice_path = fPath + "/";
       fRunLoader->SetDirName(alice_path);
-    }
-    if(fRunLoader->LoadgAlice() != 0)
-      throw(eH + "failed loading gAlice.");
 
-    if(fRunLoader->GetEvent(fEventId) != 0)
-      throw(eH + "failed getting required event.");
-  }
+      if (fRunLoader->LoadgAlice() != 0)
+       Warning(eH, "failed loading gAlice via run-loader.");
 
-  if(fgUseESDTree) {
-    TString p(Form("%s/AliESDs.root", fPath.Data()));
-    if(gSystem->AccessPathName(p, kReadPermission))
-      throw(eH + "can not read '" + p + "'.");
-    fESDFile = new TFile(p);
-    if(fESDFile->IsZombie()) {
-      delete fESDFile; fESDFile = 0;
-      throw(eH + "failed opening ALICE ESD from '" + p + "'.");
+      if (fRunLoader->LoadHeader() == 0)
+      {
+       runNo = fRunLoader->GetHeader()->GetRun();
+      }
+      else
+      {
+       Warning(eH, "failed loading run-loader's header.");
+       delete fRunLoader;
+       fRunLoader = 0;
+      }
     }
+    else // run-loader open failed
+    {
+      Warning(eH, "failed opening ALICE run-loader from '%s'.", ga_path.Data());
+    }
+  }
+  else // galice not readable
+  {
+    Warning(eH, "can not read '%s'.", ga_path.Data());
+  }
+  if (fRunLoader == 0)
+  {
+    if(fgAssertRunLoader)
+      throw(eH + "Bootstraping of run-loader failed. Its precence was requested.");
+    else
+      Warning(eH, "Bootstraping of run-loader failed.");
+  }
+  
 
-    fESDTree = (TTree*) fESDFile->Get("esdTree");
-    if(fESDTree == 0)
-      throw(eH + "failed getting the esdTree.");
-    fESDTree->SetBranchAddress("ESD", &fESD);
-    if(fESDTree->GetEntry(fEventId) <= 0)
-      throw(eH + "failed getting required event from ESD.");
-
-    // Check if ESDfriends exists and load it
-    p = Form("%s/AliESDfriends.root", fPath.Data());
-    if(gSystem->AccessPathName(p, kReadPermission) == kFALSE) {
-      fESDfriendFile = new TFile(p);
-      if(fESDfriendFile->IsZombie()) {
-       delete fESDfriendFile; fESDfriendFile = 0;
-       throw(eH + "failed opening ALICE ESDfriend from '" + p + "'.");
+  TString esd_path(Form("%s/AliESDs.root", fPath.Data()));
+  if(gSystem->AccessPathName(esd_path, kReadPermission) == kFALSE)
+  {
+    fESDFile = new TFile(esd_path);
+    if(fESDFile->IsZombie() == kFALSE)
+    {
+      fESD = new AliESD();
+      fESDTree = (TTree*) fESDFile->Get("esdTree");
+      if (fESDTree != 0)
+      {
+       fESD->ReadFromTree(fESDTree);
+       runNo = fESD->GetESDRun()->GetRunNumber();
+
+       // Check if ESDfriends exists and attach the branch
+       TString p = Form("%s/AliESDfriends.root", fPath.Data());
+       if(gSystem->AccessPathName(p, kReadPermission) == kFALSE)
+       {
+         fESDfriendExists = kTRUE;
+         fESDTree->SetBranchStatus ("ESDfriend*", 1);
+         fESDTree->SetBranchAddress("ESDfriend.", &fESDfriend);
+       }
       }
+      else // esdtree == 0
+      {
+       delete fESDFile; fESDFile = 0;
+       Warning(eH, "failed getting the esdTree.");
+      }
+    }
+    else // esd tfile is zombie
+    {
+      delete fESDFile; fESDFile = 0;
+      Warning(eH, "failed opening ESD from '%s'.", esd_path.Data());
+    }
+  }
+  else // esd not readable
+  {
+    Warning(eH, "can not read ESD file '%s'.", esd_path.Data());
+  }
+  if (fESDTree == 0)
+  {
+    if (fgAssertESDTree)
+    {
+      throw(eH + "ESD not initialized. Its precence was requested.");
+    } else { 
+      Warning(eH, "ESD not initialized.");
+    }
+  }
 
-      fESDfriendTree = (TTree*) fESDfriendFile->Get("esdFriendTree");
-      if(fESDfriendTree == 0)
-       throw(eH + "failed getting the esdFriendTree.");
-      fESDfriendTree->SetBranchAddress("ESDfriend", &fESDfriend);
-      if(fESDfriendTree->GetEntry(fEventId) <= 0)
-       throw(eH + "failed getting required event from ESDfriend.");
+  if (runNo < 0)
+    throw(eH + "invalid run number.");
 
-      fESD->SetESDfriend(fESDfriend);
-    }
+  {
+    AliCDBManager* cdb = AliCDBManager::Instance();
+    cdb->SetDefaultStorage(fgCdbUri);
+    if (cdb->IsDefaultStorageSet() == kFALSE)
+      throw(eH + "CDB initialization failed.");
+    cdb->SetRun(runNo);
   }
 
   SetName(Form("Event %d", fEventId));
@@ -147,48 +190,69 @@ void Event::GotoEvent(Int_t event)
 {
   static const Exc_t eH("Event::GotoEvent ");
 
-  if(fgUseRunLoader && fRunLoader == 0)
-    throw(eH + "RunLoader not initialized.");
-
-  if(fgUseESDTree && fESDTree == 0)
-    throw(eH + "ESDTree not initialized.");
-
   Int_t maxEvent = 0;
-  if(fgUseRunLoader)
+  if(fRunLoader)
     maxEvent = fRunLoader->GetNumberOfEvents() - 1;
-  else if(fgUseESDTree)
+  else if(fESDTree)
     maxEvent = fESDTree->GetEntries() - 1;
+  else
+    throw(eH + "neither RunLoader nor ESD loaded.");
 
   if(event < 0 || event > maxEvent)
     throw(eH + Form("event %d not present, available range [%d, %d].",
                    event, 0, maxEvent));
 
+  RGTopFrame::RedrawDisabler rd(gReve);
+  gReve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
+
   DestroyElements();
   fEventId = event;
   SetName(Form("Event %d", fEventId));
   UpdateItems();
 
-  if(fgUseRunLoader) {
+  if(fRunLoader) {
     if(fRunLoader->GetEvent(fEventId) != 0)
       throw(eH + "failed getting required event.");
   }
 
-  if(fgUseESDTree) {
+  if(fESDTree) {
     if(fESDTree->GetEntry(fEventId) <= 0)
       throw(eH + "failed getting required event from ESD.");
 
-    if(fESDfriendTree != 0) {
-      if(fESDfriendTree->GetEntry(fEventId) <= 0)
-       throw(eH + "failed getting required event from ESDfriend.");
-
+    if (fESDfriendExists)
       fESD->SetESDfriend(fESDfriend);
-    }
   }
+
+  AfterNewEventLoaded();
 }
 
 void Event::Close()
 {
-  
+  if (fESDTree) {
+    delete fESD;       fESD       = 0;
+    delete fESDfriend; fESDfriend = 0;
+
+    delete fESDTree; fESDTree = 0;
+    delete fESDFile; fESDFile = 0;
+  }
+}
+
+/**************************************************************************/
+
+void Event::AfterNewEventLoaded()
+{
+  TIter next(&fNewEventCommands);
+  TObject* o;
+  while ((o = next())) {
+    TObjString* s = dynamic_cast<TObjString*>(o);
+    if (s)
+      gInterpreter->ProcessLine(s->String());
+  }
+}
+
+void Event::AddNewEventCommand(const Text_t* cmd)
+{
+  fNewEventCommands.Add(new TObjString(cmd));
 }
 
 /**************************************************************************/
@@ -228,3 +292,36 @@ AliESDfriend* Event::AssertESDfriend()
     throw(eH + "AliESDfriend not initialised.");
   return gEvent->fESDfriend;
 }
+
+AliMagF* Event::AssertMagField()
+{
+  if (fgMagField == 0)
+  {
+    if (gEvent && gEvent->fRunLoader && gEvent->fRunLoader->GetAliRun())
+      fgMagField = gEvent->fRunLoader->GetAliRun()->Field();
+    else
+      fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
+  }
+  return fgMagField;
+}
+
+TGeoManager* Event::AssertGeometry()
+{
+  static const Exc_t eH("Event::AssertGeometry ");
+
+  if (AliGeomManager::GetGeometry() == 0)
+  {
+    AliGeomManager::LoadGeometry();
+    if ( ! AliGeomManager::GetGeometry())
+    {
+      throw(eH + "can not load geometry.");
+    }
+    if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
+    {
+      ::Warning(eH, "mismatch of alignable volumes. Proceeding.");
+      // throw(eH + "could not apply align objs.");
+    }
+  }
+
+  return AliGeomManager::GetGeometry();
+}