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 if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
429 fRunLoader = AliRunLoader::Open(gaPath, GetName());
432 TString alicePath = fPath + "/";
433 fRunLoader->SetDirName(alicePath);
435 if (fRunLoader->LoadgAlice() != 0)
436 Warning(kEH, "failed loading gAlice via run-loader.");
438 if (fRunLoader->LoadHeader() == 0)
441 runNo = fRunLoader->GetHeader()->GetRun();
445 Warning(kEH, "failed loading run-loader's header.");
450 else // run-loader open failed
452 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
455 else // galice not readable
457 Warning(kEH, "can not read '%s'.", gaPath.Data());
461 if (fgAssertRunLoader)
462 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
464 Warning(kEH, "Bootstraping of run-loader failed.");
467 // Open raw-data file
469 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
470 // If i use open directly, raw-reader reports an error but i have
471 // no way to detect it.
472 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
473 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
474 if (fgAssertRaw == kFALSE)
476 AliLog::SetGlobalLogLevel(AliLog::kFatal);
478 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
480 fRawReader = AliRawReader::Create(rawPath);
484 fRawReader = AliRawReader::Create(fgRawFileName);
486 if (fgAssertRaw == kFALSE)
488 AliLog::SetGlobalLogLevel(oldLogLevel);
495 throw (kEH + "raw-data not initialized. Its precence was requested.");
497 Warning(kEH, "raw-data not initialized.");
505 fRawReader->NextEvent();
506 runNo = fRawReader->GetRunNumber();
507 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
508 fRawReader->RewindEvents();
510 throw (kEH + "unknown run number.");
514 // Initialize OCDB ... only in master event-manager
516 if (this == fgMaster)
518 AliCDBManager* cdb = AliCDBManager::Instance();
519 if (cdb->IsDefaultStorageSet() == kTRUE)
521 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
522 cdb->GetDefaultStorage()->GetURI().Data());
526 if (fgCdbUri.IsNull())
528 gEnv->SetValue("Root.Stacktrace", "no");
529 Fatal("Open()", "OCDB path was not specified.");
532 // Handle some special cases for MC (should be in OCDBManager).
533 if (fgCdbUri == "mcideal://")
534 cdb->SetDefaultStorage("MC", "Ideal");
535 else if (fgCdbUri == "mcresidual://")
536 cdb->SetDefaultStorage("MC", "Residual");
537 else if (fgCdbUri == "mcfull://")
538 cdb->SetDefaultStorage("MC", "Full");
539 else if (fgCdbUri == "local://") {
540 fgCdbUri = "local://$ALICE_ROOT/OCDB";
541 cdb->SetDefaultStorage(fgCdbUri);
543 cdb->SetDefaultStorage(fgCdbUri);
544 if (cdb->IsDefaultStorageSet() == kFALSE)
545 throw kEH + "CDB initialization failed.";
548 if (fgCdbUri.BeginsWith("local://"))
550 TString grp = "GRP/GRP/Data";
551 TString grppath = fPath + "/" + grp;
552 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
554 if (cdb->GetSpecificStorage(grp))
556 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
560 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
561 TString lpath("local://");
563 cdb->SetSpecificStorage(grp, lpath);
573 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
575 // Set an event from an external source.
576 // The method is used in the online visualisation.
577 // AOD is not supported.
579 static const TEveException kEH("AliEveEventManager::SetEvent ");
583 Warning(kEH, "Event-files were open. Closing and switching to external control.");
587 fRunLoader = runLoader;
588 fRawReader = rawReader;
595 fExternalCtrl = kTRUE;
597 SetTitle("Online event in memory");
598 SetName ("Online Event");
601 AfterNewEventLoaded();
603 if (fAutoLoad) StartAutoLoadTimer();
606 Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
608 // Returns maximum available event id.
609 // If under external control or event is not opened -1 is returned.
610 // If raw-data is the only data-source this can not be known
611 // and 10,000,000 is returned.
612 // If neither data-source is initialised an exception is thrown.
613 // If refresh_esd is true and ESD is the primary event-data source
614 // its header is re-read from disk.
616 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
618 if (fExternalCtrl || fIsOpen == kFALSE)
625 // Refresh crashes with root-5.21.1-alice.
626 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
627 // when we move to a newer root.
629 // fESDTree->Refresh();
630 return fESDTree->GetEntries() - 1;
634 return fAODTree->GetEntries() - 1;
638 return fRunLoader->GetNumberOfEvents() - 1;
642 Int_t n = fRawReader->GetNumberOfEvents() - 1;
643 return n > -1 ? n : 10000000;
647 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
651 void AliEveEventManager::GotoEvent(Int_t event)
653 // Load data for specified event.
654 // If event is out of range an exception is thrown and old state
656 // After successful loading of event, the virtual function
657 // AfterNewEventLoaded() is called. This executes commands that
658 // were registered via TEveEventManager::AddNewEventCommand().
660 // If event is negative, it is subtracted from the number of
661 // available events, thus passing -1 will load the last event.
662 // This is not supported when raw-data is the only data-source
663 // as the number of events is not known.
665 static const TEveException kEH("AliEveEventManager::GotoEvent ");
667 if (fAutoLoadTimerRunning)
669 throw (kEH + "Event auto-load timer is running.");
673 throw (kEH + "Event-loop is under external control.");
677 throw (kEH + "Event-files not opened.");
685 // Refresh crashes with root-5.21.1-alice.
686 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
687 // when we move to a newer root.
688 // fESDTree->Refresh();
689 maxEvent = fESDTree->GetEntries() - 1;
691 event = fESDTree->GetEntries() + event;
695 maxEvent = fAODTree->GetEntries() - 1;
697 event = fAODTree->GetEntries() + event;
701 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
703 event = fRunLoader->GetNumberOfEvents() + event;
707 maxEvent = fRawReader->GetNumberOfEvents() - 1;
712 Error(kEH, "current raw-data source does not support direct event access.");
715 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
720 event = fRawReader->GetNumberOfEvents() + event;
725 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
727 if (event < 0 || event > maxEvent)
729 throw (kEH + Form("event %d not present, available range [%d, %d].",
730 event, 0, maxEvent));
733 TString sysInfoHeader;
734 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
735 AliSysInfo::AddStamp(sysInfoHeader + "Start");
737 TEveManager::TRedrawDisabler rd(gEve);
738 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
740 // !!! MT this is somewhat brutal; at least optionally, one could be
741 // a bit gentler, checking for objs owning their external refs and having
742 // additinal parents.
743 gEve->GetViewers()->DeleteAnnotations();
744 fTransients->DestroyElements();
745 for (TEveElement::List_i i = fTransientLists->BeginChildren();
746 i != fTransientLists->EndChildren(); ++i)
748 (*i)->DestroyElements();
752 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
755 if (fESDTree->GetEntry(event) <= 0)
756 throw (kEH + "failed getting required event from ESD.");
758 if (fESDfriendExists)
759 fESD->SetESDfriend(fESDfriend);
763 if (fAODTree->GetEntry(event) <= 0)
764 throw (kEH + "failed getting required event from AOD.");
768 if (fRunLoader->GetEvent(event) != 0)
769 throw (kEH + "failed getting required event.");
774 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
775 if (fRawReader->GotoEvent(event) == kFALSE)
777 // Use fallback method - iteration with NextEvent().
778 Int_t rawEv = fEventId;
781 fRawReader->RewindEvents();
785 while (rawEv < event)
787 if ( ! fRawReader->NextEvent())
789 fRawReader->RewindEvents();
791 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
795 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
801 if (this == fgMaster)
803 SetName(Form("Event %d", fEventId));
807 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
809 AfterNewEventLoaded();
811 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
814 void AliEveEventManager::NextEvent()
817 // Does magick needed for online display when under external event control.
819 static const TEveException kEH("AliEveEventManager::NextEvent ");
821 if (fAutoLoadTimerRunning)
823 throw (kEH + "Event auto-load timer is running.");
828 // !!! This should really go somewhere else. It is done in GotoEvent(),
829 // so here we should do it in SetEvent().
837 if (fPEventSelector->FindNext(nextevent))
839 GotoEvent(nextevent);
844 void AliEveEventManager::PrevEvent()
846 // Loads previous event.
848 static const TEveException kEH("AliEveEventManager::PrevEvent ");
850 if (fAutoLoadTimerRunning)
852 throw (kEH + "Event auto-load timer is running.");
856 throw (kEH + "Event-loop is under external control.");
859 if (fPEventSelector->FindPrev(nextevent))
861 GotoEvent(nextevent);
865 void AliEveEventManager::Close()
867 // Close the event data-files and delete ESD, ESDfriend, run-loader
870 static const TEveException kEH("AliEveEventManager::Close ");
874 throw (kEH + "Event-files not opened.");
877 if (fAutoLoadTimerRunning)
881 delete fESD; fESD = 0;
882 delete fESDfriend; fESDfriend = 0;
883 fESDfriendExists = kFALSE;
885 delete fESDTree; fESDTree = 0;
886 delete fESDFile; fESDFile = 0;
890 delete fAOD; fAOD = 0;
892 delete fAODTree; fAODTree = 0;
893 delete fAODFile; fAODFile = 0;
897 delete fRunLoader; fRunLoader = 0;
901 delete fRawReader; fRawReader = 0;
910 //------------------------------------------------------------------------------
911 // Static convenience functions, mainly used from macros.
912 //------------------------------------------------------------------------------
914 Bool_t AliEveEventManager::HasRunLoader()
916 // Check if AliRunLoader is initialized.
918 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
921 Bool_t AliEveEventManager::HasESD()
923 // Check if AliESDEvent is initialized.
925 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
928 Bool_t AliEveEventManager::HasESDfriend()
930 // Check if AliESDfriend is initialized.
932 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
935 Bool_t AliEveEventManager::HasAOD()
937 // Check if AliESDEvent is initialized.
939 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
942 Bool_t AliEveEventManager::HasRawReader()
944 // Check if raw-reader is initialized.
946 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
949 AliRunLoader* AliEveEventManager::AssertRunLoader()
951 // Make sure AliRunLoader is initialized and return it.
952 // Throws exception in case run-loader is not available.
953 // Static utility for macros.
955 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
957 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
958 throw (kEH + "ALICE event not ready.");
959 if (fgCurrent->fRunLoader == 0)
960 throw (kEH + "AliRunLoader not initialised.");
961 return fgCurrent->fRunLoader;
964 AliESDEvent* AliEveEventManager::AssertESD()
966 // Make sure AliESDEvent is initialized and return it.
967 // Throws exception in case ESD is not available.
968 // Static utility for macros.
970 static const TEveException kEH("AliEveEventManager::AssertESD ");
972 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
973 throw (kEH + "ALICE event not ready.");
974 if (fgCurrent->fESD == 0)
975 throw (kEH + "AliESD not initialised.");
976 return fgCurrent->fESD;
979 AliESDfriend* AliEveEventManager::AssertESDfriend()
981 // Make sure AliESDfriend is initialized and return it.
982 // Throws exception in case ESDfriend-loader is not available.
983 // Static utility for macros.
985 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
987 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
988 throw (kEH + "ALICE event not ready.");
989 if (fgCurrent->fESDfriend == 0)
990 throw (kEH + "AliESDfriend not initialised.");
991 return fgCurrent->fESDfriend;
994 AliAODEvent* AliEveEventManager::AssertAOD()
996 // Make sure AliAODEvent is initialized and return it.
997 // Throws exception in case AOD is not available.
998 // Static utility for macros.
1000 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1002 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1003 throw (kEH + "ALICE event not ready.");
1004 if (fgCurrent->fAOD == 0)
1005 throw (kEH + "AliAOD not initialised.");
1006 return fgCurrent->fAOD;
1009 AliRawReader* AliEveEventManager::AssertRawReader()
1011 // Make sure raw-reader is initialized and return it.
1013 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1015 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1016 throw (kEH + "ALICE event not ready.");
1017 if (fgCurrent->fRawReader == 0)
1018 throw (kEH + "RawReader not ready.");
1020 return fgCurrent->fRawReader;
1023 //==============================================================================
1025 AliMagF* AliEveEventManager::AssertMagField()
1027 // Make sure AliMagF is initialized and returns it.
1028 // Throws exception in case magnetic field is not available.
1029 // Static utility for macros.
1031 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1036 if (TGeoGlobalMagField::Instance()->GetField())
1038 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1039 if (fgMagField == 0)
1040 throw kEH + "Global field set, but it is not AliMagF.";
1049 if (TGeoGlobalMagField::Instance()->GetField())
1051 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1052 if (fgMagField == 0)
1053 throw kEH + "Global field set, but it is not AliMagF.";
1057 throw kEH + "Could not initialize magnetic field.";
1063 TGeoManager* AliEveEventManager::AssertGeometry()
1065 // Make sure AliGeomManager is initialized and returns the
1066 // corresponding TGeoManger.
1067 // gGeoManager is set to the return value.
1068 // Throws exception if geometry can not be loaded or if it is not
1069 // available and the TGeoManager is locked.
1070 // Static utility for macros.
1072 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1074 if (AliGeomManager::GetGeometry() == 0)
1076 if (TGeoManager::IsLocked())
1077 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1080 AliGeomManager::LoadGeometry();
1081 if ( ! AliGeomManager::GetGeometry())
1083 throw (kEH + "can not load geometry.");
1085 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1087 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1088 // throw (kEH + "could not apply align objs.");
1090 AliGeomManager::GetGeometry()->DefaultColors();
1093 gGeoManager = AliGeomManager::GetGeometry();
1097 //------------------------------------------------------------------------------
1099 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1101 // Create and attach a dependent event-manager.
1102 // It is not added into eve list tree.
1104 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1107 throw(kEH + "Master event-manager must be instantiated first.");
1109 if (fgMaster->fSubManagers == 0)
1111 fgMaster->fSubManagers = new TList;
1112 fgMaster->fSubManagers->SetOwner(kTRUE);
1115 AliEveEventManager* new_mgr = 0;
1119 new_mgr = new AliEveEventManager(name, path, fgMaster->fEventId);
1120 fgMaster->fSubManagers->Add(new_mgr);
1122 catch (TEveException& exc)
1124 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1126 fgCurrent = fgMaster;
1131 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1133 // Get a dependant manager by name.
1134 // This will not change the current manager, use helper class
1135 // AliEveEventManager::CurrentChanger for that.
1137 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1140 throw(kEH + "Master event-manager must be instantiated first.");
1142 if (fgMaster->fSubManagers == 0)
1145 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1148 AliEveEventManager* AliEveEventManager::GetMaster()
1150 // Get master event-manager.
1155 AliEveEventManager* AliEveEventManager::GetCurrent()
1157 // Get current event-manager.
1162 void AliEveEventManager::RegisterTransient(TEveElement* element)
1164 GetCurrent()->fTransients->AddElement(element);
1167 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1169 GetCurrent()->fTransientLists->AddElement(element);
1172 //------------------------------------------------------------------------------
1173 // Autoloading of events
1174 //------------------------------------------------------------------------------
1176 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1178 // Set the auto-load time in seconds
1180 fAutoLoadTime = time;
1183 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1185 // Set the automatic event loading mode
1187 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1189 if (fAutoLoad == autoLoad)
1191 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1195 fAutoLoad = autoLoad;
1198 StartAutoLoadTimer();
1202 StopAutoLoadTimer();
1206 void AliEveEventManager::SetTrigSel(Int_t trig)
1208 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1212 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1217 ULong64_t trigMask = 0;
1218 if (trig >= 0) trigMask = (1ull << trig);
1219 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1220 fRawReader->SelectEvents(-1,trigMask,NULL);
1224 void AliEveEventManager::StartAutoLoadTimer()
1226 // Start the auto-load timer.
1228 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1229 fAutoLoadTimer->Reset();
1230 fAutoLoadTimer->TurnOn();
1231 fAutoLoadTimerRunning = kTRUE;
1234 void AliEveEventManager::StopAutoLoadTimer()
1236 // Stop the auto-load timer.
1238 fAutoLoadTimerRunning = kFALSE;
1239 fAutoLoadTimer->TurnOff();
1242 void AliEveEventManager::AutoLoadNextEvent()
1244 // Called from auto-load timer, so it has to be public.
1245 // Do NOT call it directly.
1247 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1249 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1251 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1255 StopAutoLoadTimer();
1257 if (fAutoLoad && !fExternalCtrl)
1258 StartAutoLoadTimer();
1261 //------------------------------------------------------------------------------
1262 // Post event-loading functions
1263 //------------------------------------------------------------------------------
1265 void AliEveEventManager::AfterNewEventLoaded()
1267 // Execute registered macros and commands.
1268 // At the end emit NewEventLoaded signal.
1270 // Virtual from TEveEventManager.
1272 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1275 fExecutor->ExecMacros();
1277 TEveEventManager::AfterNewEventLoaded();
1281 if (this == fgMaster && fSubManagers != 0)
1283 TIter next(fSubManagers);
1284 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1286 gEve->SetCurrentEvent(fgCurrent);
1289 fgCurrent->GotoEvent(fEventId);
1291 catch (TEveException& exc)
1293 // !!! Should somehow tag / disable / remove it?
1294 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1295 fEventId, fgCurrent->GetName(), exc.Data());
1298 fgCurrent = fgMaster;
1299 gEve->SetCurrentEvent(fgMaster);
1303 void AliEveEventManager::NewEventLoaded()
1305 // Emit NewEventLoaded signal.
1307 Emit("NewEventLoaded()");
1311 //------------------------------------------------------------------------------
1312 // Event info dumpers
1313 //------------------------------------------------------------------------------
1315 TString AliEveEventManager::GetEventInfoHorizontal() const
1317 // Dumps the event-header contents in vertical formatting.
1319 TString rawInfo, esdInfo;
1323 rawInfo = "No raw-data event info is available!\n";
1327 const UInt_t* attr = fRawReader->GetAttributes();
1328 TTimeStamp ts(fRawReader->GetTimestamp());
1329 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1330 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1331 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1332 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1333 fRawReader->GetClassMask(),
1334 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1335 attr[0],attr[1],attr[2], ts.AsString("s"));
1340 esdInfo = "No ESD event info is available!";
1344 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1345 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1346 TTimeStamp ts(fESD->GetTimeStamp());
1347 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1348 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1349 fESD->GetRunNumber(),
1350 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1351 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1352 acttrclasses.Data(),
1353 fESD->GetTriggerMask(),firedtrclasses.Data(),
1354 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1357 return rawInfo + esdInfo;
1360 TString AliEveEventManager::GetEventInfoVertical() const
1362 // Dumps the event-header contents in vertical formatting.
1364 TString rawInfo, esdInfo;
1368 rawInfo = "No raw-data event info is available!\n";
1372 const UInt_t* attr = fRawReader->GetAttributes();
1373 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",
1374 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1375 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1376 fRawReader->GetClassMask(),
1377 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1378 attr[0],attr[1],attr[2],
1379 fRawReader->GetTimestamp());
1384 esdInfo = "No ESD event info is available!\n";
1388 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1389 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1390 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",
1391 fESD->GetRunNumber(),
1392 acttrclasses.Data(),
1393 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1394 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1395 fESD->GetTriggerMask(),firedtrclasses.Data(),
1396 fESD->GetEventNumberInFile(),
1397 fESD->GetTimeStamp());
1400 return rawInfo + "\n" + esdInfo;
1404 //==============================================================================
1405 // Reading of GRP and MagneticField.
1406 // This is a reap-off from reconstruction ... should really be a common
1407 // code to do this somewhere in STEER.
1408 //==============================================================================
1410 Bool_t AliEveEventManager::InitGRP()
1412 //------------------------------------
1413 // Initialization of the GRP entry
1414 //------------------------------------
1416 static const TEveException kEH("AliEveEventManager::InitGRP ");
1418 AliGRPManager grpMgr;
1419 if (!grpMgr.ReadGRPEntry()) {
1422 fgGRPLoaded = kTRUE;
1423 if (!grpMgr.SetMagField()) {
1424 throw kEH + "Setting of field failed!";
1427 //*** Get the diamond profiles from OCDB
1428 // Eventually useful.
1431 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1433 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1435 ::Error(kEH, "No SPD diamond profile found in OCDB!");
1438 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1440 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1442 ::Error(kEH, "No diamond profile found in OCDB!");
1445 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1447 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1449 ::Error(kEH, "No TPC diamond profile found in OCDB!");