#include "AliEveEventManager.h"
#include "AliEveEventSelector.h"
#include "AliEveMacroExecutor.h"
+#include <TEveElement.h>
#include <TEveManager.h>
#include <TEveViewer.h>
#include <AliHeader.h>
#include <AliGeomManager.h>
#include <AliGRPManager.h>
+#include <AliSysInfo.h>
#include <TFile.h>
#include <TTree.h>
#include <TTimeStamp.h>
#include <TPRegexp.h>
#include <TError.h>
+#include <TEnv.h>
+#include <TString.h>
+#include <TMap.h>
//==============================================================================
//==============================================================================
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::fgGRPLoaded = kFALSE;
-AliMagF* AliEveEventManager::fgMagField = 0;
-Bool_t AliEveEventManager::fgUniformField = kFALSE;
+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;
fAutoLoadTimer = new TTimer;
fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
+ fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
fExecutor = new AliEveMacroExecutor;
gEve->AddToListTree(fTransientLists, kFALSE);
fPEventSelector = new AliEveEventSelector(this);
+
+ fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
}
AliEveEventManager::AliEveEventManager(const TString& name) :
fRawReader (0),
fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
+ fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
fExecutor (0), fTransients(0), fTransientLists(0),
fPEventSelector(0),
fSubManagers (0),
fRawReader (0),
fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
+ fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
fExecutor (0), fTransients(0), fTransientLists(0),
fPEventSelector(0),
fSubManagers (0),
AliEveEventManager::~AliEveEventManager()
{
// Destructor.
+ fAutoLoadTimer->Stop();
+ fAutoLoadTimer->Disconnect("Timeout");
delete fSubManagers;
fTransientLists->DecDenyDestroy();
fTransientLists->Destroy();
+
+ //delete fExecutor;
}
/******************************************************************************/
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;
}
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()
// 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();
// 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)
{
// 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();
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());
// 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)
{
// 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.
if (fgAssertRaw)
{
throw (kEH + "raw-data not initialized. Its precence was requested.");
- } else {
+ }
+ else
+ {
Warning(kEH, "raw-data not initialized.");
}
}
{
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.");
}
}
}
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;
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.
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)
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;
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.
}
DestroyElements();
+ AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
+
if (fESDTree) {
if (fESDTree->GetEntry(event) <= 0)
throw (kEH + "failed getting required event from ESD.");
ElementChanged();
}
+ AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
+
AfterNewEventLoaded();
+
+ AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
+}
+
+void AliEveEventManager::Timeout()
+{
+ Emit("Timeout()");
}
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();
+
}
- else
+ else if (fESDTree)
{
Int_t nextevent=0;
if (fPEventSelector->FindNext(nextevent))
GotoEvent(nextevent);
}
}
+ else if (fEventId < GetMaxEventId(kTRUE))
+ {
+ GotoEvent(fEventId + 1);
+ }
}
void AliEveEventManager::PrevEvent()
{
// Loads previous event.
-
+
static const TEveException kEH("AliEveEventManager::PrevEvent ");
if (fAutoLoadTimerRunning)
{
throw (kEH + "Event-loop is under external control.");
}
- Int_t nextevent=0;
- if (fPEventSelector->FindPrev(nextevent))
+
+ if (fESDTree)
+ {
+ Int_t nextevent=0;
+ if (fPEventSelector->FindPrev(nextevent))
+ {
+ GotoEvent(nextevent);
+ }
+ }
+ else if (fEventId > 0)
{
- GotoEvent(nextevent);
+ GotoEvent(fEventId - 1);
}
}
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;
// 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.
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())
+ if (TGeoGlobalMagField::Instance()->GetField())
{
fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
if (fgMagField == 0)
}
}
+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.
static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
+ NewEventDataLoaded();
+
if (fExecutor)
fExecutor->ExecMacros();
}
}
+void AliEveEventManager::NewEventDataLoaded()
+{
+ // Emit NewEventDataLoaded signal.
+
+ Emit("NewEventDataLoaded()");
+}
+
void AliEveEventManager::NewEventLoaded()
{
// Emit NewEventLoaded signal.
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));
+}