2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #include "AliEveEventManager.h"
11 #include "AliEveEventSelector.h"
12 #include "AliEveMacroExecutor.h"
13 #include <TEveElement.h>
14 #include <TEveManager.h>
15 #include <TEveViewer.h>
17 #include <AliRunLoader.h>
19 #include <AliESDRun.h>
20 #include <AliESDEvent.h>
21 #include <AliESDfriend.h>
22 #include <AliAODEvent.h>
25 #include <AliRawEventHeaderBase.h>
26 #include <AliRawReaderRoot.h>
27 #include <AliRawReaderFile.h>
28 #include <AliRawReaderDate.h>
30 #include <AliCDBManager.h>
31 #include <AliCDBStorage.h>
32 #include <AliGRPObject.h>
33 #include <AliHeader.h>
34 #include <AliGeomManager.h>
35 #include <AliGRPManager.h>
36 #include <AliSysInfo.h>
40 #include <TGeoManager.h>
41 #include <TGeoGlobalMagField.h>
43 #include <TTimeStamp.h>
50 //==============================================================================
51 //==============================================================================
53 //==============================================================================
55 //______________________________________________________________________________
57 // Provides interface for loading and navigating standard AliRoot data
58 // (AliRunLoader), ESD, AOD and RAW.
60 // ESDfriend is attached automatically, if the file is found.
62 // AODfriends are not attached automatically as there are several
63 // possible files involved. To have a specific AODfriend attached, call
65 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
66 // before initializing the event-manager.
68 // Also provides interface to magnetic-field and geometry. Mostly
69 // intended as wrappers over standard AliRoot functionality for
70 // convenient use from visualizateion macros.
72 // There can be a single main event-manger, it is stored in private
73 // data member fgMaster and can be accessed via static member function
76 // For event overlaying and embedding one can instantiate additional
77 // event-managers via static method AddDependentManager(const TString& path).
78 // This interface is under development.
80 ClassImp(AliEveEventManager)
82 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
83 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
84 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
85 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
87 TString AliEveEventManager::fgESDFileName("AliESDs.root");
88 TString AliEveEventManager::fgAODFileName("AliAOD.root");
89 TString AliEveEventManager::fgRawFileName("raw.root");
90 TString AliEveEventManager::fgCdbUri;
92 TList* AliEveEventManager::fgAODfriends = 0;
94 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
96 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
97 AliMagF* AliEveEventManager::fgMagField = 0;
98 Bool_t AliEveEventManager::fgUniformField = kFALSE;
100 AliEveEventManager* AliEveEventManager::fgMaster = 0;
101 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
103 void AliEveEventManager::InitInternals()
105 // Initialize internal members.
107 static const TEveException kEH("AliEveEventManager::InitInternals ");
111 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
121 fAutoLoadTimer = new TTimer;
122 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
124 fExecutor = new AliEveMacroExecutor;
126 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
127 fTransients->IncDenyDestroy();
128 gEve->AddToListTree(fTransients, kFALSE);
130 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
131 fTransientLists->IncDenyDestroy();
132 gEve->AddToListTree(fTransientLists, kFALSE);
134 fPEventSelector = new AliEveEventSelector(this);
136 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
139 AliEveEventManager::AliEveEventManager(const TString& name) :
140 TEveEventManager(name),
142 fPath ( ), fEventId (-1),
144 fESDFile (0), fESDTree (0), fESD (0),
145 fESDfriend (0), fESDfriendExists(kFALSE),
146 fAODFile (0), fAODTree (0), fAOD (0),
148 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
149 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
150 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
151 fExecutor (0), fTransients(0), fTransientLists(0),
154 fAutoLoadTimerRunning(kFALSE)
156 // Default constructor.
161 AliEveEventManager::AliEveEventManager(const TString& name, const TString& path, Int_t ev) :
162 TEveEventManager(name, path),
164 fPath (path), fEventId(-1),
166 fESDFile (0), fESDTree (0), fESD (0),
167 fESDfriend (0), fESDfriendExists(kFALSE),
168 fAODFile (0), fAODTree (0), fAOD (0),
170 fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
171 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
172 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
173 fExecutor (0), fTransients(0), fTransientLists(0),
176 fAutoLoadTimerRunning(kFALSE)
178 // Constructor with event-directory URL and event-id.
189 AliEveEventManager::~AliEveEventManager()
200 fTransients->DecDenyDestroy();
201 fTransients->Destroy();
203 fTransientLists->DecDenyDestroy();
204 fTransientLists->Destroy();
207 /******************************************************************************/
209 void AliEveEventManager::SetESDFileName(const TString& esd)
211 // Set file-name for opening ESD, default "AliESDs.root".
213 if ( ! esd.IsNull()) fgESDFileName = esd;
216 void AliEveEventManager::SetAODFileName(const TString& aod)
218 // Set file-name for opening AOD, default "AliAOD.root".
220 if ( ! aod.IsNull()) fgAODFileName = aod;
223 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
225 // Add new AOD friend file-name to be attached when opening AOD.
226 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
228 if (fgAODfriends == 0)
230 fgAODfriends = new TList;
231 fgAODfriends->SetOwner(kTRUE);
233 if (fgAODfriends->FindObject(friendFileName) == 0)
235 fgAODfriends->Add(new TObjString(friendFileName));
239 void AliEveEventManager::SetRawFileName(const TString& raw)
241 // Set file-name for opening of raw-data, default "raw.root"
242 if ( ! raw.IsNull()) fgRawFileName = raw;
245 void AliEveEventManager::SetCdbUri(const TString& cdb)
247 // Set path to CDB, there is no default.
249 if ( ! cdb.IsNull()) fgCdbUri = cdb;
252 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
253 Bool_t assertAod, Bool_t assertRaw)
255 // Set global flags that detrmine which parts of the event-data must
256 // be present when the event is opened.
258 fgAssertRunLoader = assertRunloader;
259 fgAssertESD = assertEsd;
260 fgAssertAOD = assertAod;
261 fgAssertRaw = assertRaw;
264 void AliEveEventManager::SearchRawForCentralReconstruction()
266 // Enable searching of raw data in standard location. The path passed to
267 // Open() is expected to point to a centrally reconstructed run, e.g.:
268 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
270 fgRawFromStandardLoc = kTRUE;
273 /******************************************************************************/
275 void AliEveEventManager::Open()
277 // Open event-data from URL specified in fPath.
278 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
279 // Warning is reported if run-loader or ESD is not found.
280 // Global data-members fgAssertRunLoader and fgAssertESD can be set
281 // to throw exceptions instead.
283 static const TEveException kEH("AliEveEventManager::Open ");
287 throw (kEH + "Event-loop is under external control.");
291 throw (kEH + "Event-files already opened.");
294 gSystem->ExpandPathName(fPath);
295 // The following magick is required for ESDfriends to be loaded properly
296 // from non-current directory.
297 if (fPath.IsNull() || fPath == ".")
299 fPath = gSystem->WorkingDirectory();
301 else if ( ! fPath.BeginsWith("file:/"))
303 TUrl url(fPath, kTRUE);
304 TString protocol(url.GetProtocol());
305 if (protocol == "file" && fPath[0] != '/')
306 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
311 // Open ESD and ESDfriends
313 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
314 if (fPath.EndsWith(".zip")) esdPath.Form("%s#%s",fPath.Data(),fgESDFileName.Data());
315 if ((fESDFile = TFile::Open(esdPath)))
317 fESD = new AliESDEvent();
318 fESDTree = (TTree*) fESDFile->Get("esdTree");
321 // Check if ESDfriends exists and attach the branch.
322 // We use TFile::Open() instead of gSystem->AccessPathName
323 // as it seems to work better when attachine alieve to a
324 // running reconstruction process with auto-save on.
325 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
326 if (fPath.EndsWith(".zip")) p.Form("%s#AliESDfriends.root",fPath.Data());
327 TFile *esdFriendFile = TFile::Open(p);
330 if (!esdFriendFile->IsZombie())
332 esdFriendFile->Close();
333 fESDfriendExists = kTRUE;
334 fESDTree->SetBranchStatus ("ESDfriend*", 1);
336 delete esdFriendFile;
339 fESD->ReadFromTree(fESDTree);
340 if (fESDfriendExists)
342 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
343 Info(kEH, "found and attached ESD friend.");
347 Warning(kEH, "ESDfriend not found.");
350 if (fESDTree->GetEntry(0) <= 0)
352 delete fESDFile; fESDFile = 0;
353 delete fESD; fESD = 0;
354 Warning(kEH, "failed getting the first entry from esdTree.");
359 runNo = fESD->GetESDRun()->GetRunNumber();
364 delete fESDFile; fESDFile = 0;
365 delete fESD; fESD = 0;
366 Warning(kEH, "failed getting the esdTree.");
369 else // esd not readable
371 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
377 throw (kEH + "ESD not initialized. Its precence was requested.");
379 Warning(kEH, "ESD not initialized.");
383 // Open AOD and registered friends
385 TString aodPath(Form("%s/%s", fPath.Data(), fgAODFileName.Data()));
386 if (fPath.EndsWith(".zip")) aodPath.Form("%s#%s",fPath.Data(),fgAODFileName.Data());
387 if ((fAODFile = TFile::Open(aodPath)))
389 fAOD = new AliAODEvent();
390 fAODTree = (TTree*) fAODFile->Get("aodTree");
393 // Check if AODfriends exist and attach them.
394 TIter friends(fgAODfriends);
396 while ((name = (TObjString*) friends()) != 0)
398 TString p(Form("%s/%s", fPath.Data(), name->GetName()));
399 if (fPath.EndsWith(".zip")) p.Form("%s#%s",fPath.Data(),name->GetName());
400 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
402 fAODTree->AddFriend("aodTree", name->GetName());
406 fAOD->ReadFromTree(fAODTree);
408 if (fAODTree->GetEntry(0) <= 0)
410 delete fAODFile; fAODFile = 0;
411 delete fAOD; fAOD = 0;
412 Warning(kEH, "failed getting the first entry from addTree.");
417 runNo = fAOD->GetRunNumber();
422 delete fAODFile; fAODFile = 0;
423 delete fAOD; fAOD = 0;
424 Warning(kEH, "failed getting the aodTree.");
427 else // aod not readable
429 Warning(kEH, "can not read AOD file '%s'.", aodPath.Data());
435 throw (kEH + "AOD not initialized. Its precence was requested.");
437 Warning(kEH, "AOD not initialized.");
441 // Open RunLoader from galice.root
443 TString gaPath(Form("%s/galice.root", fPath.Data()));
444 if (fPath.EndsWith(".zip")) gaPath.Form("%s#%s",fPath.Data(),"galice.root");
445 // If i use open directly, we get fatal.
446 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
447 // Seems not to work for alien anymore.
448 // Fixed in ROOT on 27.10.2009, rev 30888.
449 // To revert after we move to root-5.26.
450 TFile *gafile = TFile::Open(gaPath);
455 // if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
457 fRunLoader = AliRunLoader::Open(gaPath, GetName());
460 TString alicePath = fPath + "/";
461 fRunLoader->SetDirName(alicePath);
463 if (fRunLoader->LoadgAlice() != 0)
464 Warning(kEH, "failed loading gAlice via run-loader.");
466 if (fRunLoader->LoadHeader() == 0)
469 runNo = fRunLoader->GetHeader()->GetRun();
473 Warning(kEH, "failed loading run-loader's header.");
478 else // run-loader open failed
480 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
483 else // galice not readable
485 Warning(kEH, "can not read '%s'.", gaPath.Data());
489 if (fgAssertRunLoader)
490 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
492 Warning(kEH, "Bootstraping of run-loader failed.");
495 // Open raw-data file
498 if (fgRawFromStandardLoc)
500 if (!fPath.BeginsWith("alien:"))
501 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
502 if (!fPath.Contains("/ESDs/"))
503 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
505 TPMERegexp chunk("/([\\d\\.])+/?$");
506 Int_t nm = chunk.Match(fPath);
508 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
510 TPMERegexp esdstrip("/ESDs/.*");
512 esdstrip.Substitute(rawPath, "/raw/");
516 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
520 rawPath.Form("%s/%s", fPath.Data(), fgRawFileName.Data());
522 // If i use open directly, raw-reader reports an error but i have
523 // no way to detect it.
524 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
525 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
526 if (fgAssertRaw == kFALSE)
528 AliLog::SetGlobalLogLevel(AliLog::kFatal);
530 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
532 fRawReader = AliRawReader::Create(rawPath);
536 fRawReader = AliRawReader::Create(fgRawFileName);
538 if (fgAssertRaw == kFALSE)
540 AliLog::SetGlobalLogLevel(oldLogLevel);
547 throw (kEH + "raw-data not initialized. Its precence was requested.");
551 Warning(kEH, "raw-data not initialized.");
559 if ( ! fRawReader->NextEvent())
561 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
563 runNo = fRawReader->GetRunNumber();
564 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
565 fRawReader->RewindEvents();
569 throw (kEH + "unknown run number.");
573 // Initialize OCDB ... only in master event-manager
575 if (this == fgMaster)
577 AliCDBManager* cdb = AliCDBManager::Instance();
578 if (cdb->IsDefaultStorageSet() == kTRUE)
580 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
581 cdb->GetDefaultStorage()->GetURI().Data());
585 if (fgCdbUri.IsNull())
587 gEnv->SetValue("Root.Stacktrace", "no");
588 Fatal("Open()", "OCDB path was not specified.");
591 // Handle some special cases for MC (should be in OCDBManager).
592 if (fgCdbUri == "mcideal://")
593 cdb->SetDefaultStorage("MC", "Ideal");
594 else if (fgCdbUri == "mcresidual://")
595 cdb->SetDefaultStorage("MC", "Residual");
596 else if (fgCdbUri == "mcfull://")
597 cdb->SetDefaultStorage("MC", "Full");
598 else if (fgCdbUri == "local://") {
599 fgCdbUri = "local://$ALICE_ROOT/OCDB";
600 cdb->SetDefaultStorage(fgCdbUri);
602 cdb->SetDefaultStorage(fgCdbUri);
606 if (cdb->IsDefaultStorageSet() == kFALSE)
607 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
610 if (fgCdbUri.BeginsWith("local://"))
612 TString grp = "GRP/GRP/Data";
613 TString grppath = fPath + "/" + grp;
614 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
616 if (cdb->GetSpecificStorage(grp))
618 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
622 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
623 TString lpath("local://");
625 cdb->SetSpecificStorage(grp, lpath);
634 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
636 // Set an event from an external source.
637 // The method is used in the online visualisation.
638 // AOD is not supported.
640 static const TEveException kEH("AliEveEventManager::SetEvent ");
644 Warning(kEH, "Event-files were open. Closing and switching to external control.");
648 fRunLoader = runLoader;
649 fRawReader = rawReader;
656 fExternalCtrl = kTRUE;
658 SetTitle("Online event in memory");
659 SetName ("Online Event");
662 AfterNewEventLoaded();
664 if (fAutoLoad) StartAutoLoadTimer();
667 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
669 // Returns maximum available event id.
670 // If under external control or event is not opened -1 is returned.
671 // If raw-data is the only data-source this can not be known
672 // and 10,000,000 is returned.
673 // If neither data-source is initialised an exception is thrown.
674 // If refresh_esd is true and ESD is the primary event-data source
675 // its header is re-read from disk.
677 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
679 if (fExternalCtrl || fIsOpen == kFALSE)
689 fPEventSelector->Update();
691 return fESDTree->GetEntries() - 1;
695 return fAODTree->GetEntries() - 1;
699 return fRunLoader->GetNumberOfEvents() - 1;
703 Int_t n = fRawReader->GetNumberOfEvents() - 1;
704 return n > -1 ? n : 10000000;
708 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
712 void AliEveEventManager::GotoEvent(Int_t event)
714 // Load data for specified event.
715 // If event is out of range an exception is thrown and old state
717 // After successful loading of event, the virtual function
718 // AfterNewEventLoaded() is called. This executes commands that
719 // were registered via TEveEventManager::AddNewEventCommand().
721 // If event is negative, it is subtracted from the number of
722 // available events, thus passing -1 will load the last event.
723 // This is not supported when raw-data is the only data-source
724 // as the number of events is not known.
726 static const TEveException kEH("AliEveEventManager::GotoEvent ");
728 if (fAutoLoadTimerRunning)
730 throw (kEH + "Event auto-load timer is running.");
734 throw (kEH + "Event-loop is under external control.");
738 throw (kEH + "Event-files not opened.");
746 if (event >= fESDTree->GetEntries())
748 maxEvent = fESDTree->GetEntries() - 1;
750 event = fESDTree->GetEntries() + event;
754 maxEvent = fAODTree->GetEntries() - 1;
756 event = fAODTree->GetEntries() + event;
760 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
762 event = fRunLoader->GetNumberOfEvents() + event;
766 maxEvent = fRawReader->GetNumberOfEvents() - 1;
771 Error(kEH, "current raw-data source does not support direct event access.");
774 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
779 event = fRawReader->GetNumberOfEvents() + event;
784 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
786 if (event < 0 || event > maxEvent)
788 throw (kEH + Form("event %d not present, available range [%d, %d].",
789 event, 0, maxEvent));
792 TString sysInfoHeader;
793 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
794 AliSysInfo::AddStamp(sysInfoHeader + "Start");
796 TEveManager::TRedrawDisabler rd(gEve);
797 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
799 // !!! MT this is somewhat brutal; at least optionally, one could be
800 // a bit gentler, checking for objs owning their external refs and having
801 // additinal parents.
802 gEve->GetViewers()->DeleteAnnotations();
803 fTransients->DestroyElements();
804 for (TEveElement::List_i i = fTransientLists->BeginChildren();
805 i != fTransientLists->EndChildren(); ++i)
807 (*i)->DestroyElements();
811 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
814 if (fESDTree->GetEntry(event) <= 0)
815 throw (kEH + "failed getting required event from ESD.");
817 if (fESDfriendExists)
818 fESD->SetESDfriend(fESDfriend);
822 if (fAODTree->GetEntry(event) <= 0)
823 throw (kEH + "failed getting required event from AOD.");
827 if (fRunLoader->GetEvent(event) != 0)
828 throw (kEH + "failed getting required event.");
833 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
834 if (fRawReader->GotoEvent(event) == kFALSE)
836 // Use fallback method - iteration with NextEvent().
837 Int_t rawEv = fEventId;
840 fRawReader->RewindEvents();
844 while (rawEv < event)
846 if ( ! fRawReader->NextEvent())
848 fRawReader->RewindEvents();
850 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
854 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
860 if (this == fgMaster)
862 SetName(Form("Event %d", fEventId));
866 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
868 AfterNewEventLoaded();
870 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
873 void AliEveEventManager::NextEvent()
876 // Does magick needed for online display when under external event control.
878 static const TEveException kEH("AliEveEventManager::NextEvent ");
880 if (fAutoLoadTimerRunning)
882 throw (kEH + "Event auto-load timer is running.");
887 // !!! This should really go somewhere else. It is done in GotoEvent(),
888 // so here we should do it in SetEvent().
896 if (fPEventSelector->FindNext(nextevent))
898 GotoEvent(nextevent);
901 else if (fEventId < GetMaxEventId(kTRUE))
903 GotoEvent(fEventId + 1);
907 void AliEveEventManager::PrevEvent()
909 // Loads previous event.
911 static const TEveException kEH("AliEveEventManager::PrevEvent ");
913 if (fAutoLoadTimerRunning)
915 throw (kEH + "Event auto-load timer is running.");
919 throw (kEH + "Event-loop is under external control.");
925 if (fPEventSelector->FindPrev(nextevent))
927 GotoEvent(nextevent);
930 else if (fEventId > 0)
932 GotoEvent(fEventId - 1);
936 void AliEveEventManager::Close()
938 // Close the event data-files and delete ESD, ESDfriend, run-loader
941 static const TEveException kEH("AliEveEventManager::Close ");
945 throw (kEH + "Event-files not opened.");
948 if (fAutoLoadTimerRunning)
952 delete fESD; fESD = 0;
953 // delete fESDfriend; // friend tree is deleted with the tree
955 fESDfriendExists = kFALSE;
957 delete fESDTree; fESDTree = 0;
958 delete fESDFile; fESDFile = 0;
962 delete fAOD; fAOD = 0;
964 delete fAODTree; fAODTree = 0;
965 delete fAODFile; fAODFile = 0;
969 delete fRunLoader; fRunLoader = 0;
973 delete fRawReader; fRawReader = 0;
982 //------------------------------------------------------------------------------
983 // Static convenience functions, mainly used from macros.
984 //------------------------------------------------------------------------------
986 Int_t AliEveEventManager::CurrentEventId()
988 // Return current event-id.
990 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
992 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
993 throw (kEH + "ALICE event not ready.");
994 return fgCurrent->GetEventId();
997 Bool_t AliEveEventManager::HasRunLoader()
999 // Check if AliRunLoader is initialized.
1001 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1004 Bool_t AliEveEventManager::HasESD()
1006 // Check if AliESDEvent is initialized.
1008 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1011 Bool_t AliEveEventManager::HasESDfriend()
1013 // Check if AliESDfriend is initialized.
1015 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1018 Bool_t AliEveEventManager::HasAOD()
1020 // Check if AliESDEvent is initialized.
1022 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1025 Bool_t AliEveEventManager::HasRawReader()
1027 // Check if raw-reader is initialized.
1029 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1032 AliRunLoader* AliEveEventManager::AssertRunLoader()
1034 // Make sure AliRunLoader is initialized and return it.
1035 // Throws exception in case run-loader is not available.
1036 // Static utility for macros.
1038 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1040 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1041 throw (kEH + "ALICE event not ready.");
1042 if (fgCurrent->fRunLoader == 0)
1043 throw (kEH + "AliRunLoader not initialised.");
1044 return fgCurrent->fRunLoader;
1047 AliESDEvent* AliEveEventManager::AssertESD()
1049 // Make sure AliESDEvent is initialized and return it.
1050 // Throws exception in case ESD is not available.
1051 // Static utility for macros.
1053 static const TEveException kEH("AliEveEventManager::AssertESD ");
1055 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1056 throw (kEH + "ALICE event not ready.");
1057 if (fgCurrent->fESD == 0)
1058 throw (kEH + "AliESD not initialised.");
1059 return fgCurrent->fESD;
1062 AliESDfriend* AliEveEventManager::AssertESDfriend()
1064 // Make sure AliESDfriend is initialized and return it.
1065 // Throws exception in case ESDfriend-loader is not available.
1066 // Static utility for macros.
1068 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1070 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1071 throw (kEH + "ALICE event not ready.");
1072 if (fgCurrent->fESDfriend == 0)
1073 throw (kEH + "AliESDfriend not initialised.");
1074 return fgCurrent->fESDfriend;
1077 AliAODEvent* AliEveEventManager::AssertAOD()
1079 // Make sure AliAODEvent is initialized and return it.
1080 // Throws exception in case AOD is not available.
1081 // Static utility for macros.
1083 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1085 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1086 throw (kEH + "ALICE event not ready.");
1087 if (fgCurrent->fAOD == 0)
1088 throw (kEH + "AliAOD not initialised.");
1089 return fgCurrent->fAOD;
1092 AliRawReader* AliEveEventManager::AssertRawReader()
1094 // Make sure raw-reader is initialized and return it.
1096 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1098 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1099 throw (kEH + "ALICE event not ready.");
1100 if (fgCurrent->fRawReader == 0)
1101 throw (kEH + "RawReader not ready.");
1103 return fgCurrent->fRawReader;
1106 //==============================================================================
1108 AliMagF* AliEveEventManager::AssertMagField()
1110 // Make sure AliMagF is initialized and returns it.
1111 // Throws exception in case magnetic field is not available.
1112 // Static utility for macros.
1114 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1119 if (TGeoGlobalMagField::Instance()->GetField())
1121 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1122 if (fgMagField == 0)
1123 throw kEH + "Global field set, but it is not AliMagF.";
1132 if (TGeoGlobalMagField::Instance()->GetField())
1134 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1135 if (fgMagField == 0)
1136 throw kEH + "Global field set, but it is not AliMagF.";
1140 throw kEH + "Could not initialize magnetic field.";
1146 TGeoManager* AliEveEventManager::AssertGeometry()
1148 // Make sure AliGeomManager is initialized and returns the
1149 // corresponding TGeoManger.
1150 // gGeoManager is set to the return value.
1151 // Throws exception if geometry can not be loaded or if it is not
1152 // available and the TGeoManager is locked.
1153 // Static utility for macros.
1155 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1157 if (AliGeomManager::GetGeometry() == 0)
1159 if (TGeoManager::IsLocked())
1160 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1163 AliGeomManager::LoadGeometry();
1164 if ( ! AliGeomManager::GetGeometry())
1166 throw (kEH + "can not load geometry.");
1168 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1170 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1171 // throw (kEH + "could not apply align objs.");
1173 AliGeomManager::GetGeometry()->DefaultColors();
1176 gGeoManager = AliGeomManager::GetGeometry();
1180 //------------------------------------------------------------------------------
1182 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1184 // Create and attach a dependent event-manager.
1185 // It is not added into eve list tree.
1187 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1190 throw(kEH + "Master event-manager must be instantiated first.");
1192 if (fgMaster->fSubManagers == 0)
1194 fgMaster->fSubManagers = new TList;
1195 fgMaster->fSubManagers->SetOwner(kTRUE);
1198 AliEveEventManager* new_mgr = 0;
1202 new_mgr = new AliEveEventManager(name, path, fgMaster->fEventId);
1203 fgMaster->fSubManagers->Add(new_mgr);
1205 catch (TEveException& exc)
1207 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1209 fgCurrent = fgMaster;
1214 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1216 // Get a dependant manager by name.
1217 // This will not change the current manager, use helper class
1218 // AliEveEventManager::CurrentChanger for that.
1220 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1223 throw(kEH + "Master event-manager must be instantiated first.");
1225 if (fgMaster->fSubManagers == 0)
1228 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1231 AliEveEventManager* AliEveEventManager::GetMaster()
1233 // Get master event-manager.
1238 AliEveEventManager* AliEveEventManager::GetCurrent()
1240 // Get current event-manager.
1245 void AliEveEventManager::RegisterTransient(TEveElement* element)
1247 GetCurrent()->fTransients->AddElement(element);
1250 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1252 GetCurrent()->fTransientLists->AddElement(element);
1255 //------------------------------------------------------------------------------
1256 // Autoloading of events
1257 //------------------------------------------------------------------------------
1259 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1261 // Set the auto-load time in seconds
1263 fAutoLoadTime = time;
1266 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1268 // Set the automatic event loading mode
1270 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1272 if (fAutoLoad == autoLoad)
1274 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1278 fAutoLoad = autoLoad;
1281 StartAutoLoadTimer();
1285 StopAutoLoadTimer();
1289 void AliEveEventManager::SetTrigSel(Int_t trig)
1291 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1295 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1300 ULong64_t trigMask = 0;
1301 if (trig >= 0) trigMask = (1ull << trig);
1302 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1303 fRawReader->SelectEvents(-1,trigMask,NULL);
1307 void AliEveEventManager::StartAutoLoadTimer()
1309 // Start the auto-load timer.
1311 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1312 fAutoLoadTimer->Reset();
1313 fAutoLoadTimer->TurnOn();
1314 fAutoLoadTimerRunning = kTRUE;
1317 void AliEveEventManager::StopAutoLoadTimer()
1319 // Stop the auto-load timer.
1321 fAutoLoadTimerRunning = kFALSE;
1322 fAutoLoadTimer->TurnOff();
1325 void AliEveEventManager::AutoLoadNextEvent()
1327 // Called from auto-load timer, so it has to be public.
1328 // Do NOT call it directly.
1330 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1332 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1334 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1338 StopAutoLoadTimer();
1340 if (fAutoLoad && !fExternalCtrl)
1341 StartAutoLoadTimer();
1344 //------------------------------------------------------------------------------
1345 // Post event-loading functions
1346 //------------------------------------------------------------------------------
1348 void AliEveEventManager::AfterNewEventLoaded()
1350 // Execute registered macros and commands.
1351 // At the end emit NewEventLoaded signal.
1353 // Virtual from TEveEventManager.
1355 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1357 NewEventDataLoaded();
1360 fExecutor->ExecMacros();
1362 TEveEventManager::AfterNewEventLoaded();
1366 if (this == fgMaster && fSubManagers != 0)
1368 TIter next(fSubManagers);
1369 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1371 gEve->SetCurrentEvent(fgCurrent);
1374 fgCurrent->GotoEvent(fEventId);
1376 catch (TEveException& exc)
1378 // !!! Should somehow tag / disable / remove it?
1379 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1380 fEventId, fgCurrent->GetName(), exc.Data());
1383 fgCurrent = fgMaster;
1384 gEve->SetCurrentEvent(fgMaster);
1388 void AliEveEventManager::NewEventDataLoaded()
1390 // Emit NewEventDataLoaded signal.
1392 Emit("NewEventDataLoaded()");
1395 void AliEveEventManager::NewEventLoaded()
1397 // Emit NewEventLoaded signal.
1399 Emit("NewEventLoaded()");
1403 //------------------------------------------------------------------------------
1404 // Event info dumpers
1405 //------------------------------------------------------------------------------
1407 TString AliEveEventManager::GetEventInfoHorizontal() const
1409 // Dumps the event-header contents in vertical formatting.
1411 TString rawInfo, esdInfo;
1415 rawInfo = "No raw-data event info is available!\n";
1419 const UInt_t* attr = fRawReader->GetAttributes();
1420 TTimeStamp ts(fRawReader->GetTimestamp());
1421 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1422 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1423 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1424 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1425 fRawReader->GetClassMask(),
1426 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1427 attr[0],attr[1],attr[2], ts.AsString("s"));
1432 esdInfo = "No ESD event info is available!";
1436 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1437 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1438 TTimeStamp ts(fESD->GetTimeStamp());
1439 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1440 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1441 fESD->GetRunNumber(),
1442 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1443 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1444 acttrclasses.Data(),
1445 fESD->GetTriggerMask(),firedtrclasses.Data(),
1446 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1449 return rawInfo + esdInfo;
1452 TString AliEveEventManager::GetEventInfoVertical() const
1454 // Dumps the event-header contents in vertical formatting.
1456 TString rawInfo, esdInfo;
1460 rawInfo = "No raw-data event info is available!\n";
1464 const UInt_t* attr = fRawReader->GetAttributes();
1465 rawInfo.Form("Raw-data event info:\nRun#: %d\nEvent type: %d (%s)\nPeriod: %x\nOrbit: %x BC: %x\nTrigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x\nTimestamp: %x\n",
1466 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1467 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1468 fRawReader->GetClassMask(),
1469 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1470 attr[0],attr[1],attr[2],
1471 fRawReader->GetTimestamp());
1476 esdInfo = "No ESD event info is available!\n";
1480 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1481 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1482 esdInfo.Form("ESD event info:\nRun#: %d\nActive trigger classes: %s\nEvent type: %d (%s)\nPeriod: %x\nOrbit: %x BC: %x\nTrigger: %llx (%s)\nEvent# in file:%d\nTimestamp: %x\n",
1483 fESD->GetRunNumber(),
1484 acttrclasses.Data(),
1485 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1486 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1487 fESD->GetTriggerMask(),firedtrclasses.Data(),
1488 fESD->GetEventNumberInFile(),
1489 fESD->GetTimeStamp());
1492 return rawInfo + "\n" + esdInfo;
1496 //==============================================================================
1497 // Reading of GRP and MagneticField.
1498 // This is a reap-off from reconstruction ... should really be a common
1499 // code to do this somewhere in STEER.
1500 //==============================================================================
1502 Bool_t AliEveEventManager::InitGRP()
1504 //------------------------------------
1505 // Initialization of the GRP entry
1506 //------------------------------------
1508 static const TEveException kEH("AliEveEventManager::InitGRP ");
1510 AliGRPManager grpMgr;
1511 if (!grpMgr.ReadGRPEntry()) {
1514 fgGRPLoaded = kTRUE;
1515 if (!grpMgr.SetMagField()) {
1516 throw kEH + "Setting of field failed!";
1519 //*** Get the diamond profiles from OCDB
1520 // Eventually useful.
1523 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1525 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1527 ::Error(kEH, "No SPD diamond profile found in OCDB!");
1530 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1532 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1534 ::Error(kEH, "No diamond profile found in OCDB!");
1537 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1539 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1541 ::Error(kEH, "No TPC diamond profile found in OCDB!");
1548 //------------------------------------
1549 // Global variables management
1550 //------------------------------------
1552 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
1554 // Insert a new visualization-parameter database entry with the default
1555 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
1558 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
1559 Bool_t replace, Bool_t update)
1561 TPair* pair = (TPair*) fGlobal->FindObject(tag);
1566 model->IncDenyDestroy();
1567 model->SetRnrChildren(kFALSE);
1569 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
1570 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
1571 while (old_model->HasChildren())
1573 TEveElement *el = old_model->FirstChild();
1574 el->SetVizModel(model);
1577 el->CopyVizParams(model);
1578 el->PropagateVizParamsToProjecteds();
1581 old_model->DecDenyDestroy();
1583 pair->SetValue(dynamic_cast<TObject*>(model));
1593 model->IncDenyDestroy();
1594 model->SetRnrChildren(kFALSE);
1595 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
1600 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
1602 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));