X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EVE%2FEveBase%2FAliEveEventManager.cxx;h=4d38ed381df0613f0747874c224596b3769e7ace;hb=ea8fceefe5a73a1a1fe3836b6edbd3ff8e9f0574;hp=18414909b70dbd85a1b2f34747fc920a2d6ea8a2;hpb=08b0f222125b476420c2dff6a883a618bb42051d;p=u%2Fmrichter%2FAliRoot.git diff --git a/EVE/EveBase/AliEveEventManager.cxx b/EVE/EveBase/AliEveEventManager.cxx index 18414909b70..4d38ed381df 100644 --- a/EVE/EveBase/AliEveEventManager.cxx +++ b/EVE/EveBase/AliEveEventManager.cxx @@ -8,8 +8,11 @@ **************************************************************************/ #include "AliEveEventManager.h" +#include "AliEveEventSelector.h" #include "AliEveMacroExecutor.h" +#include #include +#include #include #include @@ -26,14 +29,23 @@ #include #include #include +#include #include #include +#include +#include #include #include #include +#include #include #include +#include +#include +#include +#include +#include //============================================================================== //============================================================================== @@ -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(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(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; iGetEntry(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; iGetEntry(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 (entry->GetObject()); + } else { + ::Error(kEH, "No SPD diamond profile found in OCDB!"); + } + + entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex"); + if (entry) { + fDiamondProfile = dynamic_cast (entry->GetObject()); + } else { + ::Error(kEH, "No diamond profile found in OCDB!"); + } + + entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC"); + if (entry) { + fDiamondProfileTPC = dynamic_cast (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(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(model)); + return kTRUE; + } + else + { + return kFALSE; + } + } + else + { + model->IncDenyDestroy(); + model->SetRnrChildren(kFALSE); + fGlobal->Add(new TObjString(tag), dynamic_cast(model)); + return kTRUE; + } +} + +TEveElement* AliEveEventManager::FindGlobal(const TString& tag) +{ + return dynamic_cast(fGlobal->GetValue(tag)); +}