#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;
//______________________________________________________________________
// 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);
}
/**************************************************************************/
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));
{
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));
}
/**************************************************************************/
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();
+}