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 <TEveManager.h>
14 #include <TEveViewer.h>
16 #include <AliRunLoader.h>
18 #include <AliESDRun.h>
19 #include <AliESDEvent.h>
20 #include <AliESDfriend.h>
21 #include <AliAODEvent.h>
24 #include <AliRawEventHeaderBase.h>
25 #include <AliRawReaderRoot.h>
26 #include <AliRawReaderFile.h>
27 #include <AliRawReaderDate.h>
29 #include <AliCDBManager.h>
30 #include <AliCDBStorage.h>
31 #include <AliGRPObject.h>
32 #include <AliHeader.h>
33 #include <AliGeomManager.h>
34 #include <AliGRPManager.h>
35 #include <AliSysInfo.h>
39 #include <TGeoManager.h>
40 #include <TGeoGlobalMagField.h>
42 #include <TTimeStamp.h>
47 //==============================================================================
48 //==============================================================================
50 //==============================================================================
52 //______________________________________________________________________________
54 // Provides interface for loading and navigating standard AliRoot data
55 // (AliRunLoader), ESD, AOD and RAW.
57 // ESDfriend is attached automatically, if the file is found.
59 // AODfriends are not attached automatically as there are several
60 // possible files involved. To have a specific AODfriend attached, call
62 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
63 // before initializing the event-manager.
65 // Also provides interface to magnetic-field and geometry. Mostly
66 // intended as wrappers over standard AliRoot functionality for
67 // convenient use from visualizateion macros.
69 // There can be a single main event-manger, it is stored in private
70 // data member fgMaster and can be accessed via static member function
73 // For event overlaying and embedding one can instantiate additional
74 // event-managers via static method AddDependentManager(const TString& path).
75 // This interface is under development.
77 ClassImp(AliEveEventManager)
79 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
80 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
81 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
82 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
84 TString AliEveEventManager::fgESDFileName("AliESDs.root");
85 TString AliEveEventManager::fgAODFileName("AliAOD.root");
86 TString AliEveEventManager::fgRawFileName("raw.root");
87 TString AliEveEventManager::fgCdbUri;
89 TList* AliEveEventManager::fgAODfriends = 0;
91 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
92 AliMagF* AliEveEventManager::fgMagField = 0;
93 Bool_t AliEveEventManager::fgUniformField = kFALSE;
95 AliEveEventManager* AliEveEventManager::fgMaster = 0;
96 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
98 void AliEveEventManager::InitInternals()
100 // Initialize internal members.
102 static const TEveException kEH("AliEveEventManager::InitInternals ");
106 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
116 fAutoLoadTimer = new TTimer;
117 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
119 fExecutor = new AliEveMacroExecutor;
121 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
122 fTransients->IncDenyDestroy();
123 gEve->AddToListTree(fTransients, kFALSE);
125 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
126 fTransientLists->IncDenyDestroy();
127 gEve->AddToListTree(fTransientLists, kFALSE);
129 fPEventSelector = new AliEveEventSelector(this);
132 AliEveEventManager::AliEveEventManager(const TString& name) :
133 TEveEventManager(name),
135 fPath ( ), fEventId (-1),
137 fESDFile (0), fESDTree (0), fESD (0),
138 fESDfriend (0), fESDfriendExists(kFALSE),
139 fAODFile (0), fAODTree (0), fAOD (0),
141 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
142 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
143 fExecutor (0), fTransients(0), fTransientLists(0),
146 fAutoLoadTimerRunning(kFALSE)
148 // Default constructor.
153 AliEveEventManager::AliEveEventManager(const TString& name, const TString& path, Int_t ev) :
154 TEveEventManager(name, path),
156 fPath (path), fEventId(-1),
158 fESDFile (0), fESDTree (0), fESD (0),
159 fESDfriend (0), fESDfriendExists(kFALSE),
160 fAODFile (0), fAODTree (0), fAOD (0),
162 fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
163 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
164 fExecutor (0), fTransients(0), fTransientLists(0),
167 fAutoLoadTimerRunning(kFALSE)
169 // Constructor with event-directory URL and event-id.
180 AliEveEventManager::~AliEveEventManager()
191 fTransients->DecDenyDestroy();
192 fTransients->Destroy();
194 fTransientLists->DecDenyDestroy();
195 fTransientLists->Destroy();
198 /******************************************************************************/
200 void AliEveEventManager::SetESDFileName(const TString& esd)
202 // Set file-name for opening ESD, default "AliESDs.root".
204 if ( ! esd.IsNull()) fgESDFileName = esd;
207 void AliEveEventManager::SetAODFileName(const TString& aod)
209 // Set file-name for opening AOD, default "AliAOD.root".
211 if ( ! aod.IsNull()) fgAODFileName = aod;
214 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
216 // Add new AOD friend file-name to be attached when opening AOD.
217 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
219 if (fgAODfriends == 0)
221 fgAODfriends = new TList;
222 fgAODfriends->SetOwner(kTRUE);
224 if (fgAODfriends->FindObject(friendFileName) == 0)
226 fgAODfriends->Add(new TObjString(friendFileName));
230 void AliEveEventManager::SetRawFileName(const TString& raw)
232 // Set file-name for opening of raw-data, default "raw.root"
233 if ( ! raw.IsNull()) fgRawFileName = raw;
236 void AliEveEventManager::SetCdbUri(const TString& cdb)
238 // Set path to CDB, there is no default.
240 if ( ! cdb.IsNull()) fgCdbUri = cdb;
243 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
244 Bool_t assertAod, Bool_t assertRaw)
246 // Set global flags that detrmine which parts of the event-data must
247 // be present when the event is opened.
249 fgAssertRunLoader = assertRunloader;
250 fgAssertESD = assertEsd;
251 fgAssertAOD = assertAod;
252 fgAssertRaw = assertRaw;
255 /******************************************************************************/
257 void AliEveEventManager::Open()
259 // Open event-data from URL specified in fPath.
260 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
261 // Warning is reported if run-loader or ESD is not found.
262 // Global data-members fgAssertRunLoader and fgAssertESD can be set
263 // to throw exceptions instead.
265 static const TEveException kEH("AliEveEventManager::Open ");
269 throw (kEH + "Event-loop is under external control.");
273 throw (kEH + "Event-files already opened.");
276 gSystem->ExpandPathName(fPath);
277 // The following magick is required for ESDfriends to be loaded properly
278 // from non-current directory.
279 if (fPath.IsNull() || fPath == ".")
281 fPath = gSystem->WorkingDirectory();
283 else if ( ! fPath.BeginsWith("file:/"))
285 TUrl url(fPath, kTRUE);
286 TString protocol(url.GetProtocol());
287 if (protocol == "file" && fPath[0] != '/')
288 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
293 // Open ESD and ESDfriends
295 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
296 if ((fESDFile = TFile::Open(esdPath)))
298 fESD = new AliESDEvent();
299 fESDTree = (TTree*) fESDFile->Get("esdTree");
302 // Check if ESDfriends exists and attach the branch.
303 // We use TFile::Open() instead of gSystem->AccessPathName
304 // as it seems to work better when attachine alieve to a
305 // running reconstruction process with auto-save on.
306 // There was also a problem with TTree::Refresh() - it didn't
307 // save the friend branch on a separate file, fixed in 5.22.2 -
308 // so we might want to try the old way again soon.
309 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
310 TFile *esdFriendFile = TFile::Open(p);
313 if (!esdFriendFile->IsZombie())
315 esdFriendFile->Close();
316 fESDfriendExists = kTRUE;
317 fESDTree->SetBranchStatus ("ESDfriend*", 1);
319 delete esdFriendFile;
322 fESD->ReadFromTree(fESDTree);
323 if (fESDfriendExists)
325 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
326 Info(kEH, "found and attached ESD friend.");
330 Warning(kEH, "ESDfriend not found.");
333 if (fESDTree->GetEntry(0) <= 0)
335 delete fESDFile; fESDFile = 0;
336 delete fESD; fESD = 0;
337 Warning(kEH, "failed getting the first entry from esdTree.");
342 runNo = fESD->GetESDRun()->GetRunNumber();
347 delete fESDFile; fESDFile = 0;
348 delete fESD; fESD = 0;
349 Warning(kEH, "failed getting the esdTree.");
352 else // esd not readable
354 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
360 throw (kEH + "ESD not initialized. Its precence was requested.");
362 Warning(kEH, "ESD not initialized.");
366 // Open AOD and registered friends
368 TString aodPath(Form("%s/%s", fPath.Data(), fgAODFileName.Data()));
369 if ((fAODFile = TFile::Open(aodPath)))
371 fAOD = new AliAODEvent();
372 fAODTree = (TTree*) fAODFile->Get("aodTree");
375 // Check if AODfriends exist and attach them.
376 TIter friends(fgAODfriends);
378 while ((name = (TObjString*) friends()) != 0)
380 TString p(Form("%s/%s", fPath.Data(), name->GetName()));
381 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
383 fAODTree->AddFriend("aodTree", name->GetName());
387 fAOD->ReadFromTree(fAODTree);
389 if (fAODTree->GetEntry(0) <= 0)
391 delete fAODFile; fAODFile = 0;
392 delete fAOD; fAOD = 0;
393 Warning(kEH, "failed getting the first entry from addTree.");
398 runNo = fAOD->GetRunNumber();
403 delete fAODFile; fAODFile = 0;
404 delete fAOD; fAOD = 0;
405 Warning(kEH, "failed getting the aodTree.");
408 else // aod not readable
410 Warning(kEH, "can not read AOD file '%s'.", aodPath.Data());
416 throw (kEH + "AOD not initialized. Its precence was requested.");
418 Warning(kEH, "AOD not initialized.");
422 // Open RunLoader from galice.root
424 TString gaPath(Form("%s/galice.root", fPath.Data()));
425 // If i use open directly, we get fatal.
426 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
427 // Seems not to work for alien anymore.
428 // Fixed in ROOT on 27.10.2009, rev 30888.
429 // To revert after we move to root-5.26.
430 TFile *gafile = TFile::Open(gaPath);
435 // if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
437 fRunLoader = AliRunLoader::Open(gaPath, GetName());
440 TString alicePath = fPath + "/";
441 fRunLoader->SetDirName(alicePath);
443 if (fRunLoader->LoadgAlice() != 0)
444 Warning(kEH, "failed loading gAlice via run-loader.");
446 if (fRunLoader->LoadHeader() == 0)
449 runNo = fRunLoader->GetHeader()->GetRun();
453 Warning(kEH, "failed loading run-loader's header.");
458 else // run-loader open failed
460 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
463 else // galice not readable
465 Warning(kEH, "can not read '%s'.", gaPath.Data());
469 if (fgAssertRunLoader)
470 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
472 Warning(kEH, "Bootstraping of run-loader failed.");
475 // Open raw-data file
477 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
478 // If i use open directly, raw-reader reports an error but i have
479 // no way to detect it.
480 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
481 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
482 if (fgAssertRaw == kFALSE)
484 AliLog::SetGlobalLogLevel(AliLog::kFatal);
486 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
488 fRawReader = AliRawReader::Create(rawPath);
492 fRawReader = AliRawReader::Create(fgRawFileName);
494 if (fgAssertRaw == kFALSE)
496 AliLog::SetGlobalLogLevel(oldLogLevel);
503 throw (kEH + "raw-data not initialized. Its precence was requested.");
505 Warning(kEH, "raw-data not initialized.");
513 fRawReader->NextEvent();
514 runNo = fRawReader->GetRunNumber();
515 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
516 fRawReader->RewindEvents();
518 throw (kEH + "unknown run number.");
522 // Initialize OCDB ... only in master event-manager
524 if (this == fgMaster)
526 AliCDBManager* cdb = AliCDBManager::Instance();
527 if (cdb->IsDefaultStorageSet() == kTRUE)
529 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
530 cdb->GetDefaultStorage()->GetURI().Data());
534 if (fgCdbUri.IsNull())
536 gEnv->SetValue("Root.Stacktrace", "no");
537 Fatal("Open()", "OCDB path was not specified.");
540 // Handle some special cases for MC (should be in OCDBManager).
541 if (fgCdbUri == "mcideal://")
542 cdb->SetDefaultStorage("MC", "Ideal");
543 else if (fgCdbUri == "mcresidual://")
544 cdb->SetDefaultStorage("MC", "Residual");
545 else if (fgCdbUri == "mcfull://")
546 cdb->SetDefaultStorage("MC", "Full");
547 else if (fgCdbUri == "local://") {
548 fgCdbUri = "local://$ALICE_ROOT/OCDB";
549 cdb->SetDefaultStorage(fgCdbUri);
551 cdb->SetDefaultStorage(fgCdbUri);
555 if (cdb->IsDefaultStorageSet() == kFALSE)
556 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
559 if (fgCdbUri.BeginsWith("local://"))
561 TString grp = "GRP/GRP/Data";
562 TString grppath = fPath + "/" + grp;
563 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
565 if (cdb->GetSpecificStorage(grp))
567 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
571 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
572 TString lpath("local://");
574 cdb->SetSpecificStorage(grp, lpath);
583 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
585 // Set an event from an external source.
586 // The method is used in the online visualisation.
587 // AOD is not supported.
589 static const TEveException kEH("AliEveEventManager::SetEvent ");
593 Warning(kEH, "Event-files were open. Closing and switching to external control.");
597 fRunLoader = runLoader;
598 fRawReader = rawReader;
605 fExternalCtrl = kTRUE;
607 SetTitle("Online event in memory");
608 SetName ("Online Event");
611 AfterNewEventLoaded();
613 if (fAutoLoad) StartAutoLoadTimer();
616 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
618 // Returns maximum available event id.
619 // If under external control or event is not opened -1 is returned.
620 // If raw-data is the only data-source this can not be known
621 // and 10,000,000 is returned.
622 // If neither data-source is initialised an exception is thrown.
623 // If refresh_esd is true and ESD is the primary event-data source
624 // its header is re-read from disk.
626 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
628 if (fExternalCtrl || fIsOpen == kFALSE)
638 fPEventSelector->Update();
640 return fESDTree->GetEntries() - 1;
644 return fAODTree->GetEntries() - 1;
648 return fRunLoader->GetNumberOfEvents() - 1;
652 Int_t n = fRawReader->GetNumberOfEvents() - 1;
653 return n > -1 ? n : 10000000;
657 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
661 void AliEveEventManager::GotoEvent(Int_t event)
663 // Load data for specified event.
664 // If event is out of range an exception is thrown and old state
666 // After successful loading of event, the virtual function
667 // AfterNewEventLoaded() is called. This executes commands that
668 // were registered via TEveEventManager::AddNewEventCommand().
670 // If event is negative, it is subtracted from the number of
671 // available events, thus passing -1 will load the last event.
672 // This is not supported when raw-data is the only data-source
673 // as the number of events is not known.
675 static const TEveException kEH("AliEveEventManager::GotoEvent ");
677 if (fAutoLoadTimerRunning)
679 throw (kEH + "Event auto-load timer is running.");
683 throw (kEH + "Event-loop is under external control.");
687 throw (kEH + "Event-files not opened.");
695 // Refresh crashes with root-5.21.1-alice.
696 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
697 // when we move to a newer root.
698 // fESDTree->Refresh();
699 maxEvent = fESDTree->GetEntries() - 1;
701 event = fESDTree->GetEntries() + event;
705 maxEvent = fAODTree->GetEntries() - 1;
707 event = fAODTree->GetEntries() + event;
711 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
713 event = fRunLoader->GetNumberOfEvents() + event;
717 maxEvent = fRawReader->GetNumberOfEvents() - 1;
722 Error(kEH, "current raw-data source does not support direct event access.");
725 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
730 event = fRawReader->GetNumberOfEvents() + event;
735 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
737 if (event < 0 || event > maxEvent)
739 throw (kEH + Form("event %d not present, available range [%d, %d].",
740 event, 0, maxEvent));
743 TString sysInfoHeader;
744 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
745 AliSysInfo::AddStamp(sysInfoHeader + "Start");
747 TEveManager::TRedrawDisabler rd(gEve);
748 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
750 // !!! MT this is somewhat brutal; at least optionally, one could be
751 // a bit gentler, checking for objs owning their external refs and having
752 // additinal parents.
753 gEve->GetViewers()->DeleteAnnotations();
754 fTransients->DestroyElements();
755 for (TEveElement::List_i i = fTransientLists->BeginChildren();
756 i != fTransientLists->EndChildren(); ++i)
758 (*i)->DestroyElements();
762 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
765 if (fESDTree->GetEntry(event) <= 0)
766 throw (kEH + "failed getting required event from ESD.");
768 if (fESDfriendExists)
769 fESD->SetESDfriend(fESDfriend);
773 if (fAODTree->GetEntry(event) <= 0)
774 throw (kEH + "failed getting required event from AOD.");
778 if (fRunLoader->GetEvent(event) != 0)
779 throw (kEH + "failed getting required event.");
784 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
785 if (fRawReader->GotoEvent(event) == kFALSE)
787 // Use fallback method - iteration with NextEvent().
788 Int_t rawEv = fEventId;
791 fRawReader->RewindEvents();
795 while (rawEv < event)
797 if ( ! fRawReader->NextEvent())
799 fRawReader->RewindEvents();
801 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
805 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
811 if (this == fgMaster)
813 SetName(Form("Event %d", fEventId));
817 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
819 AfterNewEventLoaded();
821 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
824 void AliEveEventManager::NextEvent()
827 // Does magick needed for online display when under external event control.
829 static const TEveException kEH("AliEveEventManager::NextEvent ");
831 if (fAutoLoadTimerRunning)
833 throw (kEH + "Event auto-load timer is running.");
838 // !!! This should really go somewhere else. It is done in GotoEvent(),
839 // so here we should do it in SetEvent().
847 if (fPEventSelector->FindNext(nextevent))
849 GotoEvent(nextevent);
852 else if (fEventId < GetMaxEventId(kTRUE))
854 GotoEvent(fEventId + 1);
858 void AliEveEventManager::PrevEvent()
860 // Loads previous event.
862 static const TEveException kEH("AliEveEventManager::PrevEvent ");
864 if (fAutoLoadTimerRunning)
866 throw (kEH + "Event auto-load timer is running.");
870 throw (kEH + "Event-loop is under external control.");
876 if (fPEventSelector->FindPrev(nextevent))
878 GotoEvent(nextevent);
881 else if (fEventId > 0)
883 GotoEvent(fEventId - 1);
887 void AliEveEventManager::Close()
889 // Close the event data-files and delete ESD, ESDfriend, run-loader
892 static const TEveException kEH("AliEveEventManager::Close ");
896 throw (kEH + "Event-files not opened.");
899 if (fAutoLoadTimerRunning)
903 delete fESD; fESD = 0;
904 // delete fESDfriend; // friend tree is deleted with the tree
906 fESDfriendExists = kFALSE;
908 delete fESDTree; fESDTree = 0;
909 delete fESDFile; fESDFile = 0;
913 delete fAOD; fAOD = 0;
915 delete fAODTree; fAODTree = 0;
916 delete fAODFile; fAODFile = 0;
920 delete fRunLoader; fRunLoader = 0;
924 delete fRawReader; fRawReader = 0;
933 //------------------------------------------------------------------------------
934 // Static convenience functions, mainly used from macros.
935 //------------------------------------------------------------------------------
937 Bool_t AliEveEventManager::HasRunLoader()
939 // Check if AliRunLoader is initialized.
941 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
944 Bool_t AliEveEventManager::HasESD()
946 // Check if AliESDEvent is initialized.
948 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
951 Bool_t AliEveEventManager::HasESDfriend()
953 // Check if AliESDfriend is initialized.
955 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
958 Bool_t AliEveEventManager::HasAOD()
960 // Check if AliESDEvent is initialized.
962 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
965 Bool_t AliEveEventManager::HasRawReader()
967 // Check if raw-reader is initialized.
969 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
972 AliRunLoader* AliEveEventManager::AssertRunLoader()
974 // Make sure AliRunLoader is initialized and return it.
975 // Throws exception in case run-loader is not available.
976 // Static utility for macros.
978 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
980 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
981 throw (kEH + "ALICE event not ready.");
982 if (fgCurrent->fRunLoader == 0)
983 throw (kEH + "AliRunLoader not initialised.");
984 return fgCurrent->fRunLoader;
987 AliESDEvent* AliEveEventManager::AssertESD()
989 // Make sure AliESDEvent is initialized and return it.
990 // Throws exception in case ESD is not available.
991 // Static utility for macros.
993 static const TEveException kEH("AliEveEventManager::AssertESD ");
995 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
996 throw (kEH + "ALICE event not ready.");
997 if (fgCurrent->fESD == 0)
998 throw (kEH + "AliESD not initialised.");
999 return fgCurrent->fESD;
1002 AliESDfriend* AliEveEventManager::AssertESDfriend()
1004 // Make sure AliESDfriend is initialized and return it.
1005 // Throws exception in case ESDfriend-loader is not available.
1006 // Static utility for macros.
1008 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1010 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1011 throw (kEH + "ALICE event not ready.");
1012 if (fgCurrent->fESDfriend == 0)
1013 throw (kEH + "AliESDfriend not initialised.");
1014 return fgCurrent->fESDfriend;
1017 AliAODEvent* AliEveEventManager::AssertAOD()
1019 // Make sure AliAODEvent is initialized and return it.
1020 // Throws exception in case AOD is not available.
1021 // Static utility for macros.
1023 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1025 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1026 throw (kEH + "ALICE event not ready.");
1027 if (fgCurrent->fAOD == 0)
1028 throw (kEH + "AliAOD not initialised.");
1029 return fgCurrent->fAOD;
1032 AliRawReader* AliEveEventManager::AssertRawReader()
1034 // Make sure raw-reader is initialized and return it.
1036 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1038 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1039 throw (kEH + "ALICE event not ready.");
1040 if (fgCurrent->fRawReader == 0)
1041 throw (kEH + "RawReader not ready.");
1043 return fgCurrent->fRawReader;
1046 //==============================================================================
1048 AliMagF* AliEveEventManager::AssertMagField()
1050 // Make sure AliMagF is initialized and returns it.
1051 // Throws exception in case magnetic field is not available.
1052 // Static utility for macros.
1054 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1059 if (TGeoGlobalMagField::Instance()->GetField())
1061 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1062 if (fgMagField == 0)
1063 throw kEH + "Global field set, but it is not AliMagF.";
1072 if (TGeoGlobalMagField::Instance()->GetField())
1074 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1075 if (fgMagField == 0)
1076 throw kEH + "Global field set, but it is not AliMagF.";
1080 throw kEH + "Could not initialize magnetic field.";
1086 TGeoManager* AliEveEventManager::AssertGeometry()
1088 // Make sure AliGeomManager is initialized and returns the
1089 // corresponding TGeoManger.
1090 // gGeoManager is set to the return value.
1091 // Throws exception if geometry can not be loaded or if it is not
1092 // available and the TGeoManager is locked.
1093 // Static utility for macros.
1095 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1097 if (AliGeomManager::GetGeometry() == 0)
1099 if (TGeoManager::IsLocked())
1100 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1103 AliGeomManager::LoadGeometry();
1104 if ( ! AliGeomManager::GetGeometry())
1106 throw (kEH + "can not load geometry.");
1108 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1110 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1111 // throw (kEH + "could not apply align objs.");
1113 AliGeomManager::GetGeometry()->DefaultColors();
1116 gGeoManager = AliGeomManager::GetGeometry();
1120 //------------------------------------------------------------------------------
1122 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1124 // Create and attach a dependent event-manager.
1125 // It is not added into eve list tree.
1127 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1130 throw(kEH + "Master event-manager must be instantiated first.");
1132 if (fgMaster->fSubManagers == 0)
1134 fgMaster->fSubManagers = new TList;
1135 fgMaster->fSubManagers->SetOwner(kTRUE);
1138 AliEveEventManager* new_mgr = 0;
1142 new_mgr = new AliEveEventManager(name, path, fgMaster->fEventId);
1143 fgMaster->fSubManagers->Add(new_mgr);
1145 catch (TEveException& exc)
1147 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1149 fgCurrent = fgMaster;
1154 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1156 // Get a dependant manager by name.
1157 // This will not change the current manager, use helper class
1158 // AliEveEventManager::CurrentChanger for that.
1160 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1163 throw(kEH + "Master event-manager must be instantiated first.");
1165 if (fgMaster->fSubManagers == 0)
1168 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1171 AliEveEventManager* AliEveEventManager::GetMaster()
1173 // Get master event-manager.
1178 AliEveEventManager* AliEveEventManager::GetCurrent()
1180 // Get current event-manager.
1185 void AliEveEventManager::RegisterTransient(TEveElement* element)
1187 GetCurrent()->fTransients->AddElement(element);
1190 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1192 GetCurrent()->fTransientLists->AddElement(element);
1195 //------------------------------------------------------------------------------
1196 // Autoloading of events
1197 //------------------------------------------------------------------------------
1199 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1201 // Set the auto-load time in seconds
1203 fAutoLoadTime = time;
1206 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1208 // Set the automatic event loading mode
1210 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1212 if (fAutoLoad == autoLoad)
1214 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1218 fAutoLoad = autoLoad;
1221 StartAutoLoadTimer();
1225 StopAutoLoadTimer();
1229 void AliEveEventManager::SetTrigSel(Int_t trig)
1231 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1235 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1240 ULong64_t trigMask = 0;
1241 if (trig >= 0) trigMask = (1ull << trig);
1242 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1243 fRawReader->SelectEvents(-1,trigMask,NULL);
1247 void AliEveEventManager::StartAutoLoadTimer()
1249 // Start the auto-load timer.
1251 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1252 fAutoLoadTimer->Reset();
1253 fAutoLoadTimer->TurnOn();
1254 fAutoLoadTimerRunning = kTRUE;
1257 void AliEveEventManager::StopAutoLoadTimer()
1259 // Stop the auto-load timer.
1261 fAutoLoadTimerRunning = kFALSE;
1262 fAutoLoadTimer->TurnOff();
1265 void AliEveEventManager::AutoLoadNextEvent()
1267 // Called from auto-load timer, so it has to be public.
1268 // Do NOT call it directly.
1270 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1272 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1274 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1278 StopAutoLoadTimer();
1280 if (fAutoLoad && !fExternalCtrl)
1281 StartAutoLoadTimer();
1284 //------------------------------------------------------------------------------
1285 // Post event-loading functions
1286 //------------------------------------------------------------------------------
1288 void AliEveEventManager::AfterNewEventLoaded()
1290 // Execute registered macros and commands.
1291 // At the end emit NewEventLoaded signal.
1293 // Virtual from TEveEventManager.
1295 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1298 fExecutor->ExecMacros();
1300 TEveEventManager::AfterNewEventLoaded();
1304 if (this == fgMaster && fSubManagers != 0)
1306 TIter next(fSubManagers);
1307 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1309 gEve->SetCurrentEvent(fgCurrent);
1312 fgCurrent->GotoEvent(fEventId);
1314 catch (TEveException& exc)
1316 // !!! Should somehow tag / disable / remove it?
1317 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1318 fEventId, fgCurrent->GetName(), exc.Data());
1321 fgCurrent = fgMaster;
1322 gEve->SetCurrentEvent(fgMaster);
1326 void AliEveEventManager::NewEventLoaded()
1328 // Emit NewEventLoaded signal.
1330 Emit("NewEventLoaded()");
1334 //------------------------------------------------------------------------------
1335 // Event info dumpers
1336 //------------------------------------------------------------------------------
1338 TString AliEveEventManager::GetEventInfoHorizontal() const
1340 // Dumps the event-header contents in vertical formatting.
1342 TString rawInfo, esdInfo;
1346 rawInfo = "No raw-data event info is available!\n";
1350 const UInt_t* attr = fRawReader->GetAttributes();
1351 TTimeStamp ts(fRawReader->GetTimestamp());
1352 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1353 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1354 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1355 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1356 fRawReader->GetClassMask(),
1357 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1358 attr[0],attr[1],attr[2], ts.AsString("s"));
1363 esdInfo = "No ESD event info is available!";
1367 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1368 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1369 TTimeStamp ts(fESD->GetTimeStamp());
1370 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1371 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1372 fESD->GetRunNumber(),
1373 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1374 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1375 acttrclasses.Data(),
1376 fESD->GetTriggerMask(),firedtrclasses.Data(),
1377 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1380 return rawInfo + esdInfo;
1383 TString AliEveEventManager::GetEventInfoVertical() const
1385 // Dumps the event-header contents in vertical formatting.
1387 TString rawInfo, esdInfo;
1391 rawInfo = "No raw-data event info is available!\n";
1395 const UInt_t* attr = fRawReader->GetAttributes();
1396 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",
1397 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1398 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1399 fRawReader->GetClassMask(),
1400 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1401 attr[0],attr[1],attr[2],
1402 fRawReader->GetTimestamp());
1407 esdInfo = "No ESD event info is available!\n";
1411 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1412 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1413 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",
1414 fESD->GetRunNumber(),
1415 acttrclasses.Data(),
1416 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1417 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1418 fESD->GetTriggerMask(),firedtrclasses.Data(),
1419 fESD->GetEventNumberInFile(),
1420 fESD->GetTimeStamp());
1423 return rawInfo + "\n" + esdInfo;
1427 //==============================================================================
1428 // Reading of GRP and MagneticField.
1429 // This is a reap-off from reconstruction ... should really be a common
1430 // code to do this somewhere in STEER.
1431 //==============================================================================
1433 Bool_t AliEveEventManager::InitGRP()
1435 //------------------------------------
1436 // Initialization of the GRP entry
1437 //------------------------------------
1439 static const TEveException kEH("AliEveEventManager::InitGRP ");
1441 AliGRPManager grpMgr;
1442 if (!grpMgr.ReadGRPEntry()) {
1445 fgGRPLoaded = kTRUE;
1446 if (!grpMgr.SetMagField()) {
1447 throw kEH + "Setting of field failed!";
1450 //*** Get the diamond profiles from OCDB
1451 // Eventually useful.
1454 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1456 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1458 ::Error(kEH, "No SPD diamond profile found in OCDB!");
1461 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1463 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1465 ::Error(kEH, "No diamond profile found in OCDB!");
1468 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1470 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1472 ::Error(kEH, "No TPC diamond profile found in OCDB!");