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 "AliEveMacroExecutor.h"
12 #include <TEveManager.h>
14 #include <AliRunLoader.h>
16 #include <AliESDRun.h>
17 #include <AliESDEvent.h>
18 #include <AliESDfriend.h>
19 #include <AliAODEvent.h>
22 #include <AliRawEventHeaderBase.h>
23 #include <AliRawReaderRoot.h>
24 #include <AliRawReaderFile.h>
25 #include <AliRawReaderDate.h>
26 #include <AliMagFMaps.h>
27 #include <AliCDBManager.h>
28 #include <AliCDBStorage.h>
29 #include <AliHeader.h>
30 #include <AliGeomManager.h>
34 #include <TGeoManager.h>
36 #include <TTimeStamp.h>
38 //==============================================================================
39 //==============================================================================
41 //==============================================================================
43 //______________________________________________________________________________
45 // Provides interface for loading and navigating standard AliRoot data
46 // (AliRunLoader), ESD, AOD and RAW.
48 // ESDfriend is attached automatically, if the file is found.
50 // AODfriends are not attached automatically as there are several
51 // possible files involved. To have a specific AODfriend attached, call
53 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
54 // before initializing the event-manager.
56 // Also provides interface to magnetic-field and geometry. Mostly
57 // intended as wrappers over standard AliRoot functionality for
58 // convenient use from visualizateion macros.
60 // There can be a single main event-manger, it is stored in private
61 // data member fgMaster and can be accessed via static member function
64 // For event overlaying and embedding one can instantiate additional
65 // event-managers via static method AddDependentManager(const TString& path).
66 // This interface is under development.
68 ClassImp(AliEveEventManager)
70 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
71 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
72 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
73 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
75 TString AliEveEventManager::fgESDFileName("AliESDs.root");
76 TString AliEveEventManager::fgAODFileName("AliAOD.root");
77 TString AliEveEventManager::fgRawFileName("raw.root");
78 TString AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
80 AliMagF* AliEveEventManager::fgMagField = 0;
82 TList* AliEveEventManager::fgAODfriends = 0;
84 AliEveEventManager* AliEveEventManager::fgMaster = 0;
85 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
87 void AliEveEventManager::InitInternals()
89 // Initialize internal members.
91 static const TEveException kEH("AliEveEventManager::InitInternals ");
95 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
105 fAutoLoadTimer = new TTimer;
106 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
108 fExecutor = new AliEveMacroExecutor;
111 AliEveEventManager::AliEveEventManager(const TString& name) :
112 TEveEventManager(name),
114 fPath ( ), fEventId (-1),
116 fESDFile (0), fESDTree (0), fESD (0),
117 fESDfriend (0), fESDfriendExists(kFALSE),
118 fAODFile (0), fAODTree (0), fAOD (0),
120 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
121 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
122 fSelectOnTriggerType(kFALSE), fTriggerType(""),
125 fAutoLoadTimerRunning(kFALSE)
127 // Default constructor.
132 AliEveEventManager::AliEveEventManager(const TString& name, const TString& path, Int_t ev) :
133 TEveEventManager(name, path),
135 fPath (path), 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 fSelectOnTriggerType(kFALSE), fTriggerType(""),
146 fAutoLoadTimerRunning(kFALSE)
148 // Constructor with event-directory URL and event-id.
159 AliEveEventManager::~AliEveEventManager()
171 /******************************************************************************/
173 void AliEveEventManager::SetESDFileName(const TString& esd)
175 // Set file-name for opening ESD, default "AliESDs.root".
177 if ( ! esd.IsNull()) fgESDFileName = esd;
180 void AliEveEventManager::SetAODFileName(const TString& aod)
182 // Set file-name for opening AOD, default "AliAOD.root".
184 if ( ! aod.IsNull()) fgAODFileName = aod;
187 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
189 // Add new AOD friend file-name to be attached when opening AOD.
190 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
192 if (fgAODfriends == 0)
194 fgAODfriends = new TList;
195 fgAODfriends->SetOwner(kTRUE);
197 fgAODfriends->Add(new TObjString(friendFileName));
200 void AliEveEventManager::SetRawFileName(const TString& raw)
202 // Set file-name for opening of raw-data, default "raw.root"
203 if ( ! raw.IsNull()) fgRawFileName = raw;
206 void AliEveEventManager::SetCdbUri(const TString& cdb)
208 // Set path to CDB, default "local://$ALICE_ROOT".
210 if ( ! cdb.IsNull()) fgCdbUri = cdb;
213 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
214 Bool_t assertAod, Bool_t assertRaw)
216 // Set global flags that detrmine which parts of the event-data must
217 // be present when the event is opened.
219 fgAssertRunLoader = assertRunloader;
220 fgAssertESD = assertEsd;
221 fgAssertAOD = assertAod;
222 fgAssertRaw = assertRaw;
225 /******************************************************************************/
227 void AliEveEventManager::Open()
229 // Open event-data from URL specified in fPath.
230 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
231 // Warning is reported if run-loader or ESD is not found.
232 // Global data-members fgAssertRunLoader and fgAssertESD can be set
233 // to throw exceptions instead.
235 static const TEveException kEH("AliEveEventManager::Open ");
239 throw (kEH + "Event-loop is under external control.");
243 throw (kEH + "Event-files already opened.");
246 gSystem->ExpandPathName(fPath);
247 // The following magick is required for ESDfriends to be loaded properly
248 // from non-current directory.
249 if (fPath.IsNull() || fPath == ".")
251 fPath = gSystem->WorkingDirectory();
253 else if ( ! fPath.BeginsWith("file:/"))
255 TUrl url(fPath, kTRUE);
256 TString protocol(url.GetProtocol());
257 if (protocol == "file" && fPath[0] != '/')
258 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
263 // Open ESD and ESDfriends
265 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
266 if ((fESDFile = TFile::Open(esdPath)))
268 fESD = new AliESDEvent();
269 fESDTree = (TTree*) fESDFile->Get("esdTree");
272 // Check if ESDfriends exists and attach the branch.
273 // We use TFile::Open() instead of gSystem->AccessPathName
274 // as it seems to work better when attachine alieve to a
275 // running reconstruction process with auto-save on.
276 // There was also a problem with TTree::Refresh() - it didn't
277 // save the friend branch on a separate file, fixed in 5.22.2 -
278 // so we might want to try the old way again soon.
279 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
280 TFile *esdFriendFile = TFile::Open(p);
283 if (!esdFriendFile->IsZombie())
285 esdFriendFile->Close();
286 fESDfriendExists = kTRUE;
287 fESDTree->SetBranchStatus ("ESDfriend*", 1);
289 delete esdFriendFile;
292 fESD->ReadFromTree(fESDTree);
293 if (fESDfriendExists)
295 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
296 Info(kEH, "found and attached ESD friend.");
300 Warning(kEH, "ESDfriend not found.");
303 if (fESDTree->GetEntry(0) <= 0)
305 delete fESDFile; fESDFile = 0;
306 delete fESD; fESD = 0;
307 Warning(kEH, "failed getting the first entry from esdTree.");
312 runNo = fESD->GetESDRun()->GetRunNumber();
317 delete fESDFile; fESDFile = 0;
318 delete fESD; fESD = 0;
319 Warning(kEH, "failed getting the esdTree.");
322 else // esd not readable
324 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
330 throw (kEH + "ESD not initialized. Its precence was requested.");
332 Warning(kEH, "ESD not initialized.");
336 // Open AOD and registered friends
338 TString aodPath(Form("%s/%s", fPath.Data(), fgAODFileName.Data()));
339 if ((fAODFile = TFile::Open(aodPath)))
341 fAOD = new AliAODEvent();
342 fAODTree = (TTree*) fAODFile->Get("aodTree");
345 // Check if AODfriends exist and attach them.
346 TIter friends(fgAODfriends);
348 while ((name = (TObjString*) friends()) != 0)
350 TString p(Form("%s/%s", fPath.Data(), name->GetName()));
351 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
353 fAODTree->AddFriend("aodTree", name->GetName());
357 fAOD->ReadFromTree(fAODTree);
359 if (fAODTree->GetEntry(0) <= 0)
361 delete fAODFile; fAODFile = 0;
362 delete fAOD; fAOD = 0;
363 Warning(kEH, "failed getting the first entry from addTree.");
368 runNo = fAOD->GetRunNumber();
373 delete fAODFile; fAODFile = 0;
374 delete fAOD; fAOD = 0;
375 Warning(kEH, "failed getting the aodTree.");
378 else // aod not readable
380 Warning(kEH, "can not read AOD file '%s'.", aodPath.Data());
386 throw (kEH + "AOD not initialized. Its precence was requested.");
388 Warning(kEH, "AOD not initialized.");
392 // Open RunLoader from galice.root
394 TString gaPath(Form("%s/galice.root", fPath.Data()));
395 // If i use open directly, we get fatal.
396 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
397 if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
399 fRunLoader = AliRunLoader::Open(gaPath, GetName());
402 TString alicePath = fPath + "/";
403 fRunLoader->SetDirName(alicePath);
405 if (fRunLoader->LoadgAlice() != 0)
406 Warning(kEH, "failed loading gAlice via run-loader.");
408 if (fRunLoader->LoadHeader() == 0)
411 runNo = fRunLoader->GetHeader()->GetRun();
415 Warning(kEH, "failed loading run-loader's header.");
420 else // run-loader open failed
422 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
425 else // galice not readable
427 Warning(kEH, "can not read '%s'.", gaPath.Data());
431 if (fgAssertRunLoader)
432 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
434 Warning(kEH, "Bootstraping of run-loader failed.");
437 // Open raw-data file
439 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
440 // If i use open directly, raw-reader reports an error but i have
441 // no way to detect it.
442 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
443 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
444 if (fgAssertRaw == kFALSE)
446 AliLog::SetGlobalLogLevel(AliLog::kFatal);
448 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
450 fRawReader = AliRawReader::Create(rawPath);
454 fRawReader = AliRawReader::Create(fgRawFileName);
456 if (fgAssertRaw == kFALSE)
458 AliLog::SetGlobalLogLevel(oldLogLevel);
465 throw (kEH + "raw-data not initialized. Its precence was requested.");
467 Warning(kEH, "raw-data not initialized.");
475 fRawReader->NextEvent();
476 runNo = fRawReader->GetRunNumber();
477 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
478 fRawReader->RewindEvents();
480 throw (kEH + "unknown run number.");
484 // Initialize OCDB ... only in master event-manager
486 if (this == fgMaster)
488 AliCDBManager* cdb = AliCDBManager::Instance();
489 if (cdb->IsDefaultStorageSet() == kTRUE)
491 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
492 cdb->GetDefaultStorage()->GetURI().Data());
496 cdb->SetDefaultStorage(fgCdbUri);
497 if (cdb->IsDefaultStorageSet() == kFALSE)
498 throw (kEH + "CDB initialization failed.");
506 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
508 // Set an event from an external source.
509 // The method is used in the online visualisation.
510 // AOD is not supported.
512 static const TEveException kEH("AliEveEventManager::SetEvent ");
516 Warning(kEH, "Event-files were open. Closing and switching to external control.");
520 fRunLoader = runLoader;
521 fRawReader = rawReader;
528 fExternalCtrl = kTRUE;
530 SetTitle("Online event in memory");
531 SetName ("Online Event");
534 AfterNewEventLoaded();
536 if (fAutoLoad) StartAutoLoadTimer();
539 Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
541 // Returns maximum available event id.
542 // If under external control or event is not opened -1 is returned.
543 // If raw-data is the only data-source this can not be known
544 // and 10,000,000 is returned.
545 // If neither data-source is initialised an exception is thrown.
546 // If refresh_esd is true and ESD is the primary event-data source
547 // its header is re-read from disk.
549 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
551 if (fExternalCtrl || fIsOpen == kFALSE)
558 // Refresh crashes with root-5.21.1-alice.
559 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
560 // when we move to a newer root.
562 // fESDTree->Refresh();
563 return fESDTree->GetEntries() - 1;
567 return fAODTree->GetEntries() - 1;
571 return fRunLoader->GetNumberOfEvents() - 1;
575 Int_t n = fRawReader->GetNumberOfEvents() - 1;
576 return n > -1 ? n : 10000000;
580 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
584 void AliEveEventManager::GotoEvent(Int_t event)
586 // Load data for specified event.
587 // If event is out of range an exception is thrown and old state
589 // After successful loading of event, the virtual function
590 // AfterNewEventLoaded() is called. This executes commands that
591 // were registered via TEveEventManager::AddNewEventCommand().
593 // If event is negative, it is subtracted from the number of
594 // available events, thus passing -1 will load the last event.
595 // This is not supported when raw-data is the only data-source
596 // as the number of events is not known.
598 static const TEveException kEH("AliEveEventManager::GotoEvent ");
600 if (fAutoLoadTimerRunning)
602 throw (kEH + "Event auto-load timer is running.");
606 throw (kEH + "Event-loop is under external control.");
610 throw (kEH + "Event-files not opened.");
618 // Refresh crashes with root-5.21.1-alice.
619 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
620 // when we move to a newer root.
621 // fESDTree->Refresh();
622 maxEvent = fESDTree->GetEntries() - 1;
624 event = fESDTree->GetEntries() + event;
628 maxEvent = fAODTree->GetEntries() - 1;
630 event = fAODTree->GetEntries() + event;
634 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
636 event = fRunLoader->GetNumberOfEvents() + event;
640 maxEvent = fRawReader->GetNumberOfEvents() - 1;
645 Error(kEH, "current raw-data source does not support direct event access.");
648 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
653 event = fRawReader->GetNumberOfEvents() + event;
658 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
660 if (event < 0 || event > maxEvent)
662 throw (kEH + Form("event %d not present, available range [%d, %d].",
663 event, 0, maxEvent));
666 TEveManager::TRedrawDisabler rd(gEve);
667 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
669 // !!! MT this is somewhat brutal; at least optionally, one could be
670 // a bit gentler, checking for objs owning their external refs and having
671 // additinal parents.
675 if (fESDTree->GetEntry(event) <= 0)
676 throw (kEH + "failed getting required event from ESD.");
678 if (fESDfriendExists)
679 fESD->SetESDfriend(fESDfriend);
683 if (fAODTree->GetEntry(event) <= 0)
684 throw (kEH + "failed getting required event from AOD.");
688 if (fRunLoader->GetEvent(event) != 0)
689 throw (kEH + "failed getting required event.");
694 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
695 if (fRawReader->GotoEvent(event) == kFALSE)
697 // Use fallback method - iteration with NextEvent().
698 Int_t rawEv = fEventId;
701 fRawReader->RewindEvents();
705 while (rawEv < event)
707 if ( ! fRawReader->NextEvent())
709 fRawReader->RewindEvents();
711 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
715 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
721 if (this == fgMaster)
723 SetName(Form("Event %d", fEventId));
727 AfterNewEventLoaded();
730 void AliEveEventManager::NextEvent()
733 // Does magick needed for online display when under external event control.
735 static const TEveException kEH("AliEveEventManager::NextEvent ");
737 if (fAutoLoadTimerRunning)
739 throw (kEH + "Event auto-load timer is running.");
744 // !!! This should really go somewhere else. It is done in GotoEvent(),
745 // so here we should do it in SetEvent().
752 Int_t nexteventbytrigger=0;
753 if (fSelectOnTriggerType)
755 if (FindNextByTrigger(nexteventbytrigger)) //if not found do nothing
756 GotoEvent(nexteventbytrigger);
758 else if (fEventId < GetMaxEventId(kTRUE))
759 GotoEvent(fEventId + 1);
765 void AliEveEventManager::PrevEvent()
767 // Loads previous event.
769 static const TEveException kEH("AliEveEventManager::PrevEvent ");
771 if (fAutoLoadTimerRunning)
773 throw (kEH + "Event auto-load timer is running.");
777 throw (kEH + "Event-loop is under external control.");
779 Int_t nexteventbytrigger=0;
780 if (fSelectOnTriggerType)
782 if (FindPrevByTrigger(nexteventbytrigger))
783 GotoEvent(nexteventbytrigger);
786 GotoEvent(fEventId - 1);
789 void AliEveEventManager::Close()
791 // Close the event data-files and delete ESD, ESDfriend, run-loader
794 static const TEveException kEH("AliEveEventManager::Close ");
798 throw (kEH + "Event-files not opened.");
801 if (fAutoLoadTimerRunning)
805 delete fESD; fESD = 0;
806 delete fESDfriend; fESDfriend = 0;
807 fESDfriendExists = kFALSE;
809 delete fESDTree; fESDTree = 0;
810 delete fESDFile; fESDFile = 0;
814 delete fAOD; fAOD = 0;
816 delete fAODTree; fAODTree = 0;
817 delete fAODFile; fAODFile = 0;
821 delete fRunLoader; fRunLoader = 0;
825 delete fRawReader; fRawReader = 0;
834 //------------------------------------------------------------------------------
835 // Static convenience functions, mainly used from macros.
836 //------------------------------------------------------------------------------
838 Bool_t AliEveEventManager::HasRunLoader()
840 // Check if AliRunLoader is initialized.
842 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
845 Bool_t AliEveEventManager::HasESD()
847 // Check if AliESDEvent is initialized.
849 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
852 Bool_t AliEveEventManager::HasESDfriend()
854 // Check if AliESDfriend is initialized.
856 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
859 Bool_t AliEveEventManager::HasAOD()
861 // Check if AliESDEvent is initialized.
863 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
866 Bool_t AliEveEventManager::HasRawReader()
868 // Check if raw-reader is initialized.
870 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
873 AliRunLoader* AliEveEventManager::AssertRunLoader()
875 // Make sure AliRunLoader is initialized and return it.
876 // Throws exception in case run-loader is not available.
877 // Static utility for macros.
879 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
881 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
882 throw (kEH + "ALICE event not ready.");
883 if (fgCurrent->fRunLoader == 0)
884 throw (kEH + "AliRunLoader not initialised.");
885 return fgCurrent->fRunLoader;
888 AliESDEvent* AliEveEventManager::AssertESD()
890 // Make sure AliESDEvent is initialized and return it.
891 // Throws exception in case ESD is not available.
892 // Static utility for macros.
894 static const TEveException kEH("AliEveEventManager::AssertESD ");
896 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
897 throw (kEH + "ALICE event not ready.");
898 if (fgCurrent->fESD == 0)
899 throw (kEH + "AliESD not initialised.");
900 return fgCurrent->fESD;
903 AliESDfriend* AliEveEventManager::AssertESDfriend()
905 // Make sure AliESDfriend is initialized and return it.
906 // Throws exception in case ESDfriend-loader is not available.
907 // Static utility for macros.
909 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
911 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
912 throw (kEH + "ALICE event not ready.");
913 if (fgCurrent->fESDfriend == 0)
914 throw (kEH + "AliESDfriend not initialised.");
915 return fgCurrent->fESDfriend;
918 AliAODEvent* AliEveEventManager::AssertAOD()
920 // Make sure AliAODEvent is initialized and return it.
921 // Throws exception in case AOD is not available.
922 // Static utility for macros.
924 static const TEveException kEH("AliEveEventManager::AssertAOD ");
926 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
927 throw (kEH + "ALICE event not ready.");
928 if (fgCurrent->fAOD == 0)
929 throw (kEH + "AliAOD not initialised.");
930 return fgCurrent->fAOD;
933 AliRawReader* AliEveEventManager::AssertRawReader()
935 // Make sure raw-reader is initialized and return it.
937 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
939 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
940 throw (kEH + "ALICE event not ready.");
941 if (fgCurrent->fRawReader == 0)
942 throw (kEH + "RawReader not ready.");
944 return fgCurrent->fRawReader;
947 AliMagF* AliEveEventManager::AssertMagField()
949 // Make sure AliMagF is initialized and returns it.
950 // Run-loader must be initialized to get the correct magnetic field!
951 // Throws exception in case magnetic field is not available.
952 // Static utility for macros.
954 // !!!! This should be fixed ... get field also in some other way,
955 // not only via run-loader.
957 static const TEveException kEH("AliEveEventManager::AssertMagField ");
961 if (fgMaster && fgMaster->fRunLoader && fgMaster->fRunLoader->GetAliRun())
963 ::Info(kEH, "Retrieving magnetic field from AliRun.");
964 fgMagField = fgMaster->fRunLoader->GetAliRun()->Field();
968 ::Warning(kEH, "Instantiating default magnetic field (5kG).");
969 fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
975 TGeoManager* AliEveEventManager::AssertGeometry()
977 // Make sure AliGeomManager is initialized and returns the
978 // corresponding TGeoManger.
979 // gGeoManager is set to the return value.
980 // Throws exception if geometry can not be loaded or if it is not
981 // available and the TGeoManager is locked.
982 // Static utility for macros.
984 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
986 if (AliGeomManager::GetGeometry() == 0)
988 if (TGeoManager::IsLocked())
989 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
992 AliGeomManager::LoadGeometry();
993 if ( ! AliGeomManager::GetGeometry())
995 throw (kEH + "can not load geometry.");
997 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
999 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1000 // throw (kEH + "could not apply align objs.");
1002 AliGeomManager::GetGeometry()->DefaultColors();
1005 gGeoManager = AliGeomManager::GetGeometry();
1009 //------------------------------------------------------------------------------
1011 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1013 // Create and attach a dependent event-manager.
1014 // It is not added into eve list tree.
1016 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1019 throw(kEH + "Master event-manager must be instantiated first.");
1021 if (fgMaster->fSubManagers == 0)
1023 fgMaster->fSubManagers = new TList;
1024 fgMaster->fSubManagers->SetOwner(kTRUE);
1027 AliEveEventManager* new_mgr = 0;
1031 new_mgr = new AliEveEventManager(name, path, fgMaster->fEventId);
1032 fgMaster->fSubManagers->Add(new_mgr);
1034 catch (TEveException& exc)
1036 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1038 fgCurrent = fgMaster;
1043 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1045 // Get a dependant manager by name.
1046 // This will not change the current manager, use helper class
1047 // AliEveEventManager::CurrentChanger for that.
1049 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1052 throw(kEH + "Master event-manager must be instantiated first.");
1054 if (fgMaster->fSubManagers == 0)
1057 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1060 AliEveEventManager* AliEveEventManager::GetMaster()
1062 // Get master event-manager.
1067 AliEveEventManager* AliEveEventManager::GetCurrent()
1069 // Get current event-manager.
1074 //------------------------------------------------------------------------------
1075 // Autoloading of events
1076 //------------------------------------------------------------------------------
1078 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1080 // Set the auto-load time in seconds
1082 fAutoLoadTime = time;
1085 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1087 // Set the automatic event loading mode
1089 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1091 if (fAutoLoad == autoLoad)
1093 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1097 fAutoLoad = autoLoad;
1100 StartAutoLoadTimer();
1104 StopAutoLoadTimer();
1108 void AliEveEventManager::StartAutoLoadTimer()
1110 // Start the auto-load timer.
1112 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1113 fAutoLoadTimer->Reset();
1114 fAutoLoadTimer->TurnOn();
1115 fAutoLoadTimerRunning = kTRUE;
1118 void AliEveEventManager::StopAutoLoadTimer()
1120 // Stop the auto-load timer.
1122 fAutoLoadTimerRunning = kFALSE;
1123 fAutoLoadTimer->TurnOff();
1126 void AliEveEventManager::AutoLoadNextEvent()
1128 // Called from auto-load timer, so it has to be public.
1129 // Do NOT call it directly.
1131 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1133 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1135 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1139 StopAutoLoadTimer();
1141 if (fAutoLoad && !fExternalCtrl)
1142 StartAutoLoadTimer();
1146 //------------------------------------------------------------------------------
1147 // Event selection by trigger
1148 //------------------------------------------------------------------------------
1150 Bool_t AliEveEventManager::FindNextByTrigger(Int_t& event)
1152 // Find next event that matches the trigger.
1153 // If a matching event is not found, we loop around and eventually
1154 // end up at the same event.
1156 static const TEveException kEH("AliEveEventManager::FindNextByTrigger ");
1158 if (!fESDTree) return kFALSE;
1159 TString firedtrclasses;
1160 for (Int_t i = fEventId+1; i<GetMaxEventId(kTRUE)+1; i++)
1162 if (fESDTree->GetEntry(i) <= 0)
1163 throw (kEH + "failed getting required event from ESD.");
1164 firedtrclasses = fESD->GetFiredTriggerClasses();
1165 if (firedtrclasses.Contains(fTriggerType))
1171 for (Int_t i = 0; i<fEventId+1; i++)
1173 if (fESDTree->GetEntry(i) <= 0)
1174 throw (kEH + "failed getting required event from ESD.");
1175 firedtrclasses = fESD->GetFiredTriggerClasses();
1176 if (firedtrclasses.Contains(fTriggerType))
1185 Bool_t AliEveEventManager::FindPrevByTrigger(Int_t& event)
1187 // Find previous event that matches the trigger.
1189 static const TEveException kEH("AliEveEventManager::FindPrevByTrigger ");
1191 if (!fESDTree) return kFALSE;
1192 TString firedtrclasses;
1193 for (Int_t i = fEventId-1; i>=0; i--)
1195 if (fESDTree->GetEntry(i) <= 0)
1196 throw (kEH + "failed getting required event from ESD.");
1197 firedtrclasses = fESD->GetFiredTriggerClasses();
1198 if (firedtrclasses.Contains(fTriggerType))
1204 for (Int_t i = GetMaxEventId(kTRUE); i>fEventId-1; i--)
1206 if (fESDTree->GetEntry(i) <= 0)
1207 throw (kEH + "failed getting required event from ESD.");
1208 firedtrclasses = fESD->GetFiredTriggerClasses();
1209 if (firedtrclasses.Contains(fTriggerType))
1219 //------------------------------------------------------------------------------
1220 // Post event-loading functions
1221 //------------------------------------------------------------------------------
1223 void AliEveEventManager::AfterNewEventLoaded()
1225 // Execute registered macros and commands.
1226 // At the end emit NewEventLoaded signal.
1228 // Virtual from TEveEventManager.
1230 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1233 fExecutor->ExecMacros();
1235 TEveEventManager::AfterNewEventLoaded();
1239 if (this == fgMaster && fSubManagers != 0)
1241 TIter next(fSubManagers);
1242 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1244 gEve->SetCurrentEvent(fgCurrent);
1247 fgCurrent->GotoEvent(fEventId);
1249 catch (TEveException& exc)
1251 // !!! Should somehow tag / disable / remove it?
1252 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1253 fEventId, fgCurrent->GetName(), exc.Data());
1256 fgCurrent = fgMaster;
1257 gEve->SetCurrentEvent(fgMaster);
1261 void AliEveEventManager::NewEventLoaded()
1263 // Emit NewEventLoaded signal.
1265 Emit("NewEventLoaded()");
1269 //------------------------------------------------------------------------------
1270 // Event info dumpers
1271 //------------------------------------------------------------------------------
1273 TString AliEveEventManager::GetEventInfoHorizontal() const
1275 // Dumps the event-header contents in vertical formatting.
1277 TString rawInfo, esdInfo;
1281 rawInfo = "No raw-data event info is available!\n";
1285 const UInt_t* attr = fRawReader->GetAttributes();
1286 TTimeStamp ts(fRawReader->GetTimestamp());
1287 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1288 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1289 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1290 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1291 fRawReader->GetClassMask(),
1292 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1293 attr[0],attr[1],attr[2], ts.AsString("s"));
1298 esdInfo = "No ESD event info is available!";
1302 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1303 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1304 TTimeStamp ts(fESD->GetTimeStamp());
1305 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1306 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1307 fESD->GetRunNumber(),
1308 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1309 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1310 acttrclasses.Data(),
1311 fESD->GetTriggerMask(),firedtrclasses.Data(),
1312 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1315 return rawInfo + esdInfo;
1318 TString AliEveEventManager::GetEventInfoVertical() const
1320 // Dumps the event-header contents in vertical formatting.
1322 TString rawInfo, esdInfo;
1326 rawInfo = "No raw-data event info is available!\n";
1330 const UInt_t* attr = fRawReader->GetAttributes();
1331 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",
1332 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1333 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1334 fRawReader->GetClassMask(),
1335 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1336 attr[0],attr[1],attr[2],
1337 fRawReader->GetTimestamp());
1342 esdInfo = "No ESD event info is available!\n";
1346 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1347 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1348 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",
1349 fESD->GetRunNumber(),
1350 acttrclasses.Data(),
1351 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1352 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1353 fESD->GetTriggerMask(),firedtrclasses.Data(),
1354 fESD->GetEventNumberInFile(),
1355 fESD->GetTimeStamp());
1358 return rawInfo + "\n" + esdInfo;