2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #include "AliEveEventManager.h"
11 #include "AliEveEventSelector.h"
12 #include "AliEveMacroExecutor.h"
13 #include <TEveElement.h>
14 #include <TEveManager.h>
15 #include <TEveViewer.h>
17 #include <AliRunLoader.h>
19 #include <AliESDRun.h>
20 #include <AliESDEvent.h>
21 #include <AliESDfriend.h>
22 #include <AliAODEvent.h>
25 #include <AliRawEventHeaderBase.h>
26 #include <AliRawReaderRoot.h>
27 #include <AliRawReaderFile.h>
28 #include <AliRawReaderDate.h>
30 #include <AliCDBManager.h>
31 #include <AliCDBStorage.h>
32 #include <AliGRPObject.h>
33 #include <AliHeader.h>
34 #include <AliGeomManager.h>
35 #include <AliGRPManager.h>
36 #include <AliSysInfo.h>
40 #include <TGeoManager.h>
41 #include <TGeoGlobalMagField.h>
43 #include <TTimeStamp.h>
50 //==============================================================================
51 //==============================================================================
53 //==============================================================================
55 //______________________________________________________________________________
57 // Provides interface for loading and navigating standard AliRoot data
58 // (AliRunLoader), ESD, AOD and RAW.
60 // ESDfriend is attached automatically, if the file is found.
62 // AODfriends are not attached automatically as there are several
63 // possible files involved. To have a specific AODfriend attached, call
65 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
66 // before initializing the event-manager.
68 // Also provides interface to magnetic-field and geometry. Mostly
69 // intended as wrappers over standard AliRoot functionality for
70 // convenient use from visualizateion macros.
72 // There can be a single main event-manger, it is stored in private
73 // data member fgMaster and can be accessed via static member function
76 // For event overlaying and embedding one can instantiate additional
77 // event-managers via static method AddDependentManager(const TString& path).
78 // This interface is under development.
80 ClassImp(AliEveEventManager)
82 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
83 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
84 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
85 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
87 TString AliEveEventManager::fgESDFileName("AliESDs.root");
88 TString AliEveEventManager::fgAODFileName("AliAOD.root");
89 TString AliEveEventManager::fgRawFileName("raw.root");
90 TString AliEveEventManager::fgCdbUri;
92 TList* AliEveEventManager::fgAODfriends = 0;
94 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
96 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
97 AliMagF* AliEveEventManager::fgMagField = 0;
98 Bool_t AliEveEventManager::fgUniformField = kFALSE;
100 AliEveEventManager* AliEveEventManager::fgMaster = 0;
101 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
103 void AliEveEventManager::InitInternals()
105 // Initialize internal members.
107 static const TEveException kEH("AliEveEventManager::InitInternals ");
111 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
121 fAutoLoadTimer = new TTimer;
122 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
124 fExecutor = new AliEveMacroExecutor;
126 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
127 fTransients->IncDenyDestroy();
128 gEve->AddToListTree(fTransients, kFALSE);
130 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
131 fTransientLists->IncDenyDestroy();
132 gEve->AddToListTree(fTransientLists, kFALSE);
134 fPEventSelector = new AliEveEventSelector(this);
136 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
139 AliEveEventManager::AliEveEventManager(const TString& name) :
140 TEveEventManager(name),
142 fPath ( ), fEventId (-1),
144 fESDFile (0), fESDTree (0), fESD (0),
145 fESDfriend (0), fESDfriendExists(kFALSE),
146 fAODFile (0), fAODTree (0), fAOD (0),
148 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
149 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
150 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
151 fExecutor (0), fTransients(0), fTransientLists(0),
154 fAutoLoadTimerRunning(kFALSE)
156 // Default constructor.
161 AliEveEventManager::AliEveEventManager(const TString& name, const TString& path, Int_t ev) :
162 TEveEventManager(name, path),
164 fPath (path), fEventId(-1),
166 fESDFile (0), fESDTree (0), fESD (0),
167 fESDfriend (0), fESDfriendExists(kFALSE),
168 fAODFile (0), fAODTree (0), fAOD (0),
170 fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
171 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
172 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
173 fExecutor (0), fTransients(0), fTransientLists(0),
176 fAutoLoadTimerRunning(kFALSE)
178 // Constructor with event-directory URL and event-id.
189 AliEveEventManager::~AliEveEventManager()
200 fTransients->DecDenyDestroy();
201 fTransients->Destroy();
203 fTransientLists->DecDenyDestroy();
204 fTransientLists->Destroy();
207 /******************************************************************************/
209 void AliEveEventManager::SetESDFileName(const TString& esd)
211 // Set file-name for opening ESD, default "AliESDs.root".
213 if ( ! esd.IsNull()) fgESDFileName = esd;
216 void AliEveEventManager::SetAODFileName(const TString& aod)
218 // Set file-name for opening AOD, default "AliAOD.root".
220 if ( ! aod.IsNull()) fgAODFileName = aod;
223 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
225 // Add new AOD friend file-name to be attached when opening AOD.
226 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
228 if (fgAODfriends == 0)
230 fgAODfriends = new TList;
231 fgAODfriends->SetOwner(kTRUE);
233 if (fgAODfriends->FindObject(friendFileName) == 0)
235 fgAODfriends->Add(new TObjString(friendFileName));
239 void AliEveEventManager::SetRawFileName(const TString& raw)
241 // Set file-name for opening of raw-data, default "raw.root"
242 if ( ! raw.IsNull()) fgRawFileName = raw;
245 void AliEveEventManager::SetCdbUri(const TString& cdb)
247 // Set path to CDB, there is no default.
249 if ( ! cdb.IsNull()) fgCdbUri = cdb;
252 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
253 Bool_t assertAod, Bool_t assertRaw)
255 // Set global flags that detrmine which parts of the event-data must
256 // be present when the event is opened.
258 fgAssertRunLoader = assertRunloader;
259 fgAssertESD = assertEsd;
260 fgAssertAOD = assertAod;
261 fgAssertRaw = assertRaw;
264 void AliEveEventManager::SearchRawForCentralReconstruction()
266 // Enable searching of raw data in standard location. The path passed to
267 // Open() is expected to point to a centrally reconstructed run, e.g.:
268 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
270 fgRawFromStandardLoc = kTRUE;
273 /******************************************************************************/
275 void AliEveEventManager::Open()
277 // Open event-data from URL specified in fPath.
278 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
279 // Warning is reported if run-loader or ESD is not found.
280 // Global data-members fgAssertRunLoader and fgAssertESD can be set
281 // to throw exceptions instead.
283 static const TEveException kEH("AliEveEventManager::Open ");
287 throw (kEH + "Event-loop is under external control.");
291 throw (kEH + "Event-files already opened.");
294 gSystem->ExpandPathName(fPath);
295 // The following magick is required for ESDfriends to be loaded properly
296 // from non-current directory.
297 if (fPath.IsNull() || fPath == ".")
299 fPath = gSystem->WorkingDirectory();
301 else if ( ! fPath.BeginsWith("file:/"))
303 TUrl url(fPath, kTRUE);
304 TString protocol(url.GetProtocol());
305 if (protocol == "file" && fPath[0] != '/')
306 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
311 // Open ESD and ESDfriends
313 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
314 if ((fESDFile = TFile::Open(esdPath)))
316 fESD = new AliESDEvent();
317 fESDTree = (TTree*) fESDFile->Get("esdTree");
320 // Check if ESDfriends exists and attach the branch.
321 // We use TFile::Open() instead of gSystem->AccessPathName
322 // as it seems to work better when attachine alieve to a
323 // running reconstruction process with auto-save on.
324 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
325 TFile *esdFriendFile = TFile::Open(p);
328 if (!esdFriendFile->IsZombie())
330 esdFriendFile->Close();
331 fESDfriendExists = kTRUE;
332 fESDTree->SetBranchStatus ("ESDfriend*", 1);
334 delete esdFriendFile;
337 fESD->ReadFromTree(fESDTree);
338 if (fESDfriendExists)
340 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
341 Info(kEH, "found and attached ESD friend.");
345 Warning(kEH, "ESDfriend not found.");
348 if (fESDTree->GetEntry(0) <= 0)
350 delete fESDFile; fESDFile = 0;
351 delete fESD; fESD = 0;
352 Warning(kEH, "failed getting the first entry from esdTree.");
357 runNo = fESD->GetESDRun()->GetRunNumber();
362 delete fESDFile; fESDFile = 0;
363 delete fESD; fESD = 0;
364 Warning(kEH, "failed getting the esdTree.");
367 else // esd not readable
369 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
375 throw (kEH + "ESD not initialized. Its precence was requested.");
377 Warning(kEH, "ESD not initialized.");
381 // Open AOD and registered friends
383 TString aodPath(Form("%s/%s", fPath.Data(), fgAODFileName.Data()));
384 if ((fAODFile = TFile::Open(aodPath)))
386 fAOD = new AliAODEvent();
387 fAODTree = (TTree*) fAODFile->Get("aodTree");
390 // Check if AODfriends exist and attach them.
391 TIter friends(fgAODfriends);
393 while ((name = (TObjString*) friends()) != 0)
395 TString p(Form("%s/%s", fPath.Data(), name->GetName()));
396 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
398 fAODTree->AddFriend("aodTree", name->GetName());
402 fAOD->ReadFromTree(fAODTree);
404 if (fAODTree->GetEntry(0) <= 0)
406 delete fAODFile; fAODFile = 0;
407 delete fAOD; fAOD = 0;
408 Warning(kEH, "failed getting the first entry from addTree.");
413 runNo = fAOD->GetRunNumber();
418 delete fAODFile; fAODFile = 0;
419 delete fAOD; fAOD = 0;
420 Warning(kEH, "failed getting the aodTree.");
423 else // aod not readable
425 Warning(kEH, "can not read AOD file '%s'.", aodPath.Data());
431 throw (kEH + "AOD not initialized. Its precence was requested.");
433 Warning(kEH, "AOD not initialized.");
437 // Open RunLoader from galice.root
439 TString gaPath(Form("%s/galice.root", fPath.Data()));
440 // If i use open directly, we get fatal.
441 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
442 // Seems not to work for alien anymore.
443 // Fixed in ROOT on 27.10.2009, rev 30888.
444 // To revert after we move to root-5.26.
445 TFile *gafile = TFile::Open(gaPath);
450 // if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
452 fRunLoader = AliRunLoader::Open(gaPath, GetName());
455 TString alicePath = fPath + "/";
456 fRunLoader->SetDirName(alicePath);
458 if (fRunLoader->LoadgAlice() != 0)
459 Warning(kEH, "failed loading gAlice via run-loader.");
461 if (fRunLoader->LoadHeader() == 0)
464 runNo = fRunLoader->GetHeader()->GetRun();
468 Warning(kEH, "failed loading run-loader's header.");
473 else // run-loader open failed
475 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
478 else // galice not readable
480 Warning(kEH, "can not read '%s'.", gaPath.Data());
484 if (fgAssertRunLoader)
485 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
487 Warning(kEH, "Bootstraping of run-loader failed.");
490 // Open raw-data file
493 if (fgRawFromStandardLoc)
495 if (!fPath.BeginsWith("alien:"))
496 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
497 if (!fPath.Contains("/ESDs/"))
498 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
500 TPMERegexp chunk("/([\\d\\.])+/?$");
501 Int_t nm = chunk.Match(fPath);
503 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
505 TPMERegexp esdstrip("/ESDs/.*");
507 esdstrip.Substitute(rawPath, "/raw/");
511 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
515 rawPath.Form("%s/%s", fPath.Data(), fgRawFileName.Data());
517 // If i use open directly, raw-reader reports an error but i have
518 // no way to detect it.
519 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
520 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
521 if (fgAssertRaw == kFALSE)
523 AliLog::SetGlobalLogLevel(AliLog::kFatal);
525 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
527 fRawReader = AliRawReader::Create(rawPath);
531 fRawReader = AliRawReader::Create(fgRawFileName);
533 if (fgAssertRaw == kFALSE)
535 AliLog::SetGlobalLogLevel(oldLogLevel);
542 throw (kEH + "raw-data not initialized. Its precence was requested.");
544 Warning(kEH, "raw-data not initialized.");
552 fRawReader->NextEvent();
553 runNo = fRawReader->GetRunNumber();
554 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
555 fRawReader->RewindEvents();
557 throw (kEH + "unknown run number.");
561 // Initialize OCDB ... only in master event-manager
563 if (this == fgMaster)
565 AliCDBManager* cdb = AliCDBManager::Instance();
566 if (cdb->IsDefaultStorageSet() == kTRUE)
568 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
569 cdb->GetDefaultStorage()->GetURI().Data());
573 if (fgCdbUri.IsNull())
575 gEnv->SetValue("Root.Stacktrace", "no");
576 Fatal("Open()", "OCDB path was not specified.");
579 // Handle some special cases for MC (should be in OCDBManager).
580 if (fgCdbUri == "mcideal://")
581 cdb->SetDefaultStorage("MC", "Ideal");
582 else if (fgCdbUri == "mcresidual://")
583 cdb->SetDefaultStorage("MC", "Residual");
584 else if (fgCdbUri == "mcfull://")
585 cdb->SetDefaultStorage("MC", "Full");
586 else if (fgCdbUri == "local://") {
587 fgCdbUri = "local://$ALICE_ROOT/OCDB";
588 cdb->SetDefaultStorage(fgCdbUri);
590 cdb->SetDefaultStorage(fgCdbUri);
594 if (cdb->IsDefaultStorageSet() == kFALSE)
595 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
598 if (fgCdbUri.BeginsWith("local://"))
600 TString grp = "GRP/GRP/Data";
601 TString grppath = fPath + "/" + grp;
602 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
604 if (cdb->GetSpecificStorage(grp))
606 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
610 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
611 TString lpath("local://");
613 cdb->SetSpecificStorage(grp, lpath);
622 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
624 // Set an event from an external source.
625 // The method is used in the online visualisation.
626 // AOD is not supported.
628 static const TEveException kEH("AliEveEventManager::SetEvent ");
632 Warning(kEH, "Event-files were open. Closing and switching to external control.");
636 fRunLoader = runLoader;
637 fRawReader = rawReader;
644 fExternalCtrl = kTRUE;
646 SetTitle("Online event in memory");
647 SetName ("Online Event");
650 AfterNewEventLoaded();
652 if (fAutoLoad) StartAutoLoadTimer();
655 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
657 // Returns maximum available event id.
658 // If under external control or event is not opened -1 is returned.
659 // If raw-data is the only data-source this can not be known
660 // and 10,000,000 is returned.
661 // If neither data-source is initialised an exception is thrown.
662 // If refresh_esd is true and ESD is the primary event-data source
663 // its header is re-read from disk.
665 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
667 if (fExternalCtrl || fIsOpen == kFALSE)
677 fPEventSelector->Update();
679 return fESDTree->GetEntries() - 1;
683 return fAODTree->GetEntries() - 1;
687 return fRunLoader->GetNumberOfEvents() - 1;
691 Int_t n = fRawReader->GetNumberOfEvents() - 1;
692 return n > -1 ? n : 10000000;
696 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
700 void AliEveEventManager::GotoEvent(Int_t event)
702 // Load data for specified event.
703 // If event is out of range an exception is thrown and old state
705 // After successful loading of event, the virtual function
706 // AfterNewEventLoaded() is called. This executes commands that
707 // were registered via TEveEventManager::AddNewEventCommand().
709 // If event is negative, it is subtracted from the number of
710 // available events, thus passing -1 will load the last event.
711 // This is not supported when raw-data is the only data-source
712 // as the number of events is not known.
714 static const TEveException kEH("AliEveEventManager::GotoEvent ");
716 if (fAutoLoadTimerRunning)
718 throw (kEH + "Event auto-load timer is running.");
722 throw (kEH + "Event-loop is under external control.");
726 throw (kEH + "Event-files not opened.");
734 if (event >= fESDTree->GetEntries())
736 maxEvent = fESDTree->GetEntries() - 1;
738 event = fESDTree->GetEntries() + event;
742 maxEvent = fAODTree->GetEntries() - 1;
744 event = fAODTree->GetEntries() + event;
748 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
750 event = fRunLoader->GetNumberOfEvents() + event;
754 maxEvent = fRawReader->GetNumberOfEvents() - 1;
759 Error(kEH, "current raw-data source does not support direct event access.");
762 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
767 event = fRawReader->GetNumberOfEvents() + event;
772 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
774 if (event < 0 || event > maxEvent)
776 throw (kEH + Form("event %d not present, available range [%d, %d].",
777 event, 0, maxEvent));
780 TString sysInfoHeader;
781 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
782 AliSysInfo::AddStamp(sysInfoHeader + "Start");
784 TEveManager::TRedrawDisabler rd(gEve);
785 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
787 // !!! MT this is somewhat brutal; at least optionally, one could be
788 // a bit gentler, checking for objs owning their external refs and having
789 // additinal parents.
790 gEve->GetViewers()->DeleteAnnotations();
791 fTransients->DestroyElements();
792 for (TEveElement::List_i i = fTransientLists->BeginChildren();
793 i != fTransientLists->EndChildren(); ++i)
795 (*i)->DestroyElements();
799 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
802 if (fESDTree->GetEntry(event) <= 0)
803 throw (kEH + "failed getting required event from ESD.");
805 if (fESDfriendExists)
806 fESD->SetESDfriend(fESDfriend);
810 if (fAODTree->GetEntry(event) <= 0)
811 throw (kEH + "failed getting required event from AOD.");
815 if (fRunLoader->GetEvent(event) != 0)
816 throw (kEH + "failed getting required event.");
821 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
822 if (fRawReader->GotoEvent(event) == kFALSE)
824 // Use fallback method - iteration with NextEvent().
825 Int_t rawEv = fEventId;
828 fRawReader->RewindEvents();
832 while (rawEv < event)
834 if ( ! fRawReader->NextEvent())
836 fRawReader->RewindEvents();
838 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
842 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
848 if (this == fgMaster)
850 SetName(Form("Event %d", fEventId));
854 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
856 AfterNewEventLoaded();
858 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
861 void AliEveEventManager::NextEvent()
864 // Does magick needed for online display when under external event control.
866 static const TEveException kEH("AliEveEventManager::NextEvent ");
868 if (fAutoLoadTimerRunning)
870 throw (kEH + "Event auto-load timer is running.");
875 // !!! This should really go somewhere else. It is done in GotoEvent(),
876 // so here we should do it in SetEvent().
884 if (fPEventSelector->FindNext(nextevent))
886 GotoEvent(nextevent);
889 else if (fEventId < GetMaxEventId(kTRUE))
891 GotoEvent(fEventId + 1);
895 void AliEveEventManager::PrevEvent()
897 // Loads previous event.
899 static const TEveException kEH("AliEveEventManager::PrevEvent ");
901 if (fAutoLoadTimerRunning)
903 throw (kEH + "Event auto-load timer is running.");
907 throw (kEH + "Event-loop is under external control.");
913 if (fPEventSelector->FindPrev(nextevent))
915 GotoEvent(nextevent);
918 else if (fEventId > 0)
920 GotoEvent(fEventId - 1);
924 void AliEveEventManager::Close()
926 // Close the event data-files and delete ESD, ESDfriend, run-loader
929 static const TEveException kEH("AliEveEventManager::Close ");
933 throw (kEH + "Event-files not opened.");
936 if (fAutoLoadTimerRunning)
940 delete fESD; fESD = 0;
941 // delete fESDfriend; // friend tree is deleted with the tree
943 fESDfriendExists = kFALSE;
945 delete fESDTree; fESDTree = 0;
946 delete fESDFile; fESDFile = 0;
950 delete fAOD; fAOD = 0;
952 delete fAODTree; fAODTree = 0;
953 delete fAODFile; fAODFile = 0;
957 delete fRunLoader; fRunLoader = 0;
961 delete fRawReader; fRawReader = 0;
970 //------------------------------------------------------------------------------
971 // Static convenience functions, mainly used from macros.
972 //------------------------------------------------------------------------------
974 Int_t AliEveEventManager::CurrentEventId()
976 // Return current event-id.
978 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
980 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
981 throw (kEH + "ALICE event not ready.");
982 return fgCurrent->GetEventId();
985 Bool_t AliEveEventManager::HasRunLoader()
987 // Check if AliRunLoader is initialized.
989 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
992 Bool_t AliEveEventManager::HasESD()
994 // Check if AliESDEvent is initialized.
996 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
999 Bool_t AliEveEventManager::HasESDfriend()
1001 // Check if AliESDfriend is initialized.
1003 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1006 Bool_t AliEveEventManager::HasAOD()
1008 // Check if AliESDEvent is initialized.
1010 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1013 Bool_t AliEveEventManager::HasRawReader()
1015 // Check if raw-reader is initialized.
1017 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1020 AliRunLoader* AliEveEventManager::AssertRunLoader()
1022 // Make sure AliRunLoader is initialized and return it.
1023 // Throws exception in case run-loader is not available.
1024 // Static utility for macros.
1026 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1028 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1029 throw (kEH + "ALICE event not ready.");
1030 if (fgCurrent->fRunLoader == 0)
1031 throw (kEH + "AliRunLoader not initialised.");
1032 return fgCurrent->fRunLoader;
1035 AliESDEvent* AliEveEventManager::AssertESD()
1037 // Make sure AliESDEvent is initialized and return it.
1038 // Throws exception in case ESD is not available.
1039 // Static utility for macros.
1041 static const TEveException kEH("AliEveEventManager::AssertESD ");
1043 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1044 throw (kEH + "ALICE event not ready.");
1045 if (fgCurrent->fESD == 0)
1046 throw (kEH + "AliESD not initialised.");
1047 return fgCurrent->fESD;
1050 AliESDfriend* AliEveEventManager::AssertESDfriend()
1052 // Make sure AliESDfriend is initialized and return it.
1053 // Throws exception in case ESDfriend-loader is not available.
1054 // Static utility for macros.
1056 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1058 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1059 throw (kEH + "ALICE event not ready.");
1060 if (fgCurrent->fESDfriend == 0)
1061 throw (kEH + "AliESDfriend not initialised.");
1062 return fgCurrent->fESDfriend;
1065 AliAODEvent* AliEveEventManager::AssertAOD()
1067 // Make sure AliAODEvent is initialized and return it.
1068 // Throws exception in case AOD is not available.
1069 // Static utility for macros.
1071 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1073 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1074 throw (kEH + "ALICE event not ready.");
1075 if (fgCurrent->fAOD == 0)
1076 throw (kEH + "AliAOD not initialised.");
1077 return fgCurrent->fAOD;
1080 AliRawReader* AliEveEventManager::AssertRawReader()
1082 // Make sure raw-reader is initialized and return it.
1084 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1086 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1087 throw (kEH + "ALICE event not ready.");
1088 if (fgCurrent->fRawReader == 0)
1089 throw (kEH + "RawReader not ready.");
1091 return fgCurrent->fRawReader;
1094 //==============================================================================
1096 AliMagF* AliEveEventManager::AssertMagField()
1098 // Make sure AliMagF is initialized and returns it.
1099 // Throws exception in case magnetic field is not available.
1100 // Static utility for macros.
1102 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1107 if (TGeoGlobalMagField::Instance()->GetField())
1109 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1110 if (fgMagField == 0)
1111 throw kEH + "Global field set, but it is not AliMagF.";
1120 if (TGeoGlobalMagField::Instance()->GetField())
1122 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1123 if (fgMagField == 0)
1124 throw kEH + "Global field set, but it is not AliMagF.";
1128 throw kEH + "Could not initialize magnetic field.";
1134 TGeoManager* AliEveEventManager::AssertGeometry()
1136 // Make sure AliGeomManager is initialized and returns the
1137 // corresponding TGeoManger.
1138 // gGeoManager is set to the return value.
1139 // Throws exception if geometry can not be loaded or if it is not
1140 // available and the TGeoManager is locked.
1141 // Static utility for macros.
1143 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1145 if (AliGeomManager::GetGeometry() == 0)
1147 if (TGeoManager::IsLocked())
1148 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1151 AliGeomManager::LoadGeometry();
1152 if ( ! AliGeomManager::GetGeometry())
1154 throw (kEH + "can not load geometry.");
1156 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1158 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1159 // throw (kEH + "could not apply align objs.");
1161 AliGeomManager::GetGeometry()->DefaultColors();
1164 gGeoManager = AliGeomManager::GetGeometry();
1168 //------------------------------------------------------------------------------
1170 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1172 // Create and attach a dependent event-manager.
1173 // It is not added into eve list tree.
1175 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1178 throw(kEH + "Master event-manager must be instantiated first.");
1180 if (fgMaster->fSubManagers == 0)
1182 fgMaster->fSubManagers = new TList;
1183 fgMaster->fSubManagers->SetOwner(kTRUE);
1186 AliEveEventManager* new_mgr = 0;
1190 new_mgr = new AliEveEventManager(name, path, fgMaster->fEventId);
1191 fgMaster->fSubManagers->Add(new_mgr);
1193 catch (TEveException& exc)
1195 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1197 fgCurrent = fgMaster;
1202 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1204 // Get a dependant manager by name.
1205 // This will not change the current manager, use helper class
1206 // AliEveEventManager::CurrentChanger for that.
1208 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1211 throw(kEH + "Master event-manager must be instantiated first.");
1213 if (fgMaster->fSubManagers == 0)
1216 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1219 AliEveEventManager* AliEveEventManager::GetMaster()
1221 // Get master event-manager.
1226 AliEveEventManager* AliEveEventManager::GetCurrent()
1228 // Get current event-manager.
1233 void AliEveEventManager::RegisterTransient(TEveElement* element)
1235 GetCurrent()->fTransients->AddElement(element);
1238 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1240 GetCurrent()->fTransientLists->AddElement(element);
1243 //------------------------------------------------------------------------------
1244 // Autoloading of events
1245 //------------------------------------------------------------------------------
1247 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1249 // Set the auto-load time in seconds
1251 fAutoLoadTime = time;
1254 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1256 // Set the automatic event loading mode
1258 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1260 if (fAutoLoad == autoLoad)
1262 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1266 fAutoLoad = autoLoad;
1269 StartAutoLoadTimer();
1273 StopAutoLoadTimer();
1277 void AliEveEventManager::SetTrigSel(Int_t trig)
1279 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1283 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1288 ULong64_t trigMask = 0;
1289 if (trig >= 0) trigMask = (1ull << trig);
1290 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1291 fRawReader->SelectEvents(-1,trigMask,NULL);
1295 void AliEveEventManager::StartAutoLoadTimer()
1297 // Start the auto-load timer.
1299 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1300 fAutoLoadTimer->Reset();
1301 fAutoLoadTimer->TurnOn();
1302 fAutoLoadTimerRunning = kTRUE;
1305 void AliEveEventManager::StopAutoLoadTimer()
1307 // Stop the auto-load timer.
1309 fAutoLoadTimerRunning = kFALSE;
1310 fAutoLoadTimer->TurnOff();
1313 void AliEveEventManager::AutoLoadNextEvent()
1315 // Called from auto-load timer, so it has to be public.
1316 // Do NOT call it directly.
1318 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1320 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1322 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1326 StopAutoLoadTimer();
1328 if (fAutoLoad && !fExternalCtrl)
1329 StartAutoLoadTimer();
1332 //------------------------------------------------------------------------------
1333 // Post event-loading functions
1334 //------------------------------------------------------------------------------
1336 void AliEveEventManager::AfterNewEventLoaded()
1338 // Execute registered macros and commands.
1339 // At the end emit NewEventLoaded signal.
1341 // Virtual from TEveEventManager.
1343 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1345 NewEventDataLoaded();
1348 fExecutor->ExecMacros();
1350 TEveEventManager::AfterNewEventLoaded();
1354 if (this == fgMaster && fSubManagers != 0)
1356 TIter next(fSubManagers);
1357 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1359 gEve->SetCurrentEvent(fgCurrent);
1362 fgCurrent->GotoEvent(fEventId);
1364 catch (TEveException& exc)
1366 // !!! Should somehow tag / disable / remove it?
1367 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1368 fEventId, fgCurrent->GetName(), exc.Data());
1371 fgCurrent = fgMaster;
1372 gEve->SetCurrentEvent(fgMaster);
1376 void AliEveEventManager::NewEventDataLoaded()
1378 // Emit NewEventDataLoaded signal.
1380 Emit("NewEventDataLoaded()");
1383 void AliEveEventManager::NewEventLoaded()
1385 // Emit NewEventLoaded signal.
1387 Emit("NewEventLoaded()");
1391 //------------------------------------------------------------------------------
1392 // Event info dumpers
1393 //------------------------------------------------------------------------------
1395 TString AliEveEventManager::GetEventInfoHorizontal() const
1397 // Dumps the event-header contents in vertical formatting.
1399 TString rawInfo, esdInfo;
1403 rawInfo = "No raw-data event info is available!\n";
1407 const UInt_t* attr = fRawReader->GetAttributes();
1408 TTimeStamp ts(fRawReader->GetTimestamp());
1409 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1410 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1411 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1412 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1413 fRawReader->GetClassMask(),
1414 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1415 attr[0],attr[1],attr[2], ts.AsString("s"));
1420 esdInfo = "No ESD event info is available!";
1424 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1425 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1426 TTimeStamp ts(fESD->GetTimeStamp());
1427 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1428 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1429 fESD->GetRunNumber(),
1430 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1431 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1432 acttrclasses.Data(),
1433 fESD->GetTriggerMask(),firedtrclasses.Data(),
1434 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1437 return rawInfo + esdInfo;
1440 TString AliEveEventManager::GetEventInfoVertical() const
1442 // Dumps the event-header contents in vertical formatting.
1444 TString rawInfo, esdInfo;
1448 rawInfo = "No raw-data event info is available!\n";
1452 const UInt_t* attr = fRawReader->GetAttributes();
1453 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",
1454 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1455 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1456 fRawReader->GetClassMask(),
1457 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1458 attr[0],attr[1],attr[2],
1459 fRawReader->GetTimestamp());
1464 esdInfo = "No ESD event info is available!\n";
1468 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1469 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1470 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",
1471 fESD->GetRunNumber(),
1472 acttrclasses.Data(),
1473 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1474 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1475 fESD->GetTriggerMask(),firedtrclasses.Data(),
1476 fESD->GetEventNumberInFile(),
1477 fESD->GetTimeStamp());
1480 return rawInfo + "\n" + esdInfo;
1484 //==============================================================================
1485 // Reading of GRP and MagneticField.
1486 // This is a reap-off from reconstruction ... should really be a common
1487 // code to do this somewhere in STEER.
1488 //==============================================================================
1490 Bool_t AliEveEventManager::InitGRP()
1492 //------------------------------------
1493 // Initialization of the GRP entry
1494 //------------------------------------
1496 static const TEveException kEH("AliEveEventManager::InitGRP ");
1498 AliGRPManager grpMgr;
1499 if (!grpMgr.ReadGRPEntry()) {
1502 fgGRPLoaded = kTRUE;
1503 if (!grpMgr.SetMagField()) {
1504 throw kEH + "Setting of field failed!";
1507 //*** Get the diamond profiles from OCDB
1508 // Eventually useful.
1511 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1513 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1515 ::Error(kEH, "No SPD diamond profile found in OCDB!");
1518 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1520 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1522 ::Error(kEH, "No diamond profile found in OCDB!");
1525 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1527 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1529 ::Error(kEH, "No TPC diamond profile found in OCDB!");
1536 //------------------------------------
1537 // Global variables management
1538 //------------------------------------
1540 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
1542 // Insert a new visualization-parameter database entry with the default
1543 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
1546 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
1547 Bool_t replace, Bool_t update)
1549 TPair* pair = (TPair*) fGlobal->FindObject(tag);
1554 model->IncDenyDestroy();
1555 model->SetRnrChildren(kFALSE);
1557 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
1558 while (old_model->HasChildren())
1560 TEveElement *el = old_model->FirstChild();
1561 el->SetVizModel(model);
1564 el->CopyVizParams(model);
1565 el->PropagateVizParamsToProjecteds();
1568 old_model->DecDenyDestroy();
1570 pair->SetValue(dynamic_cast<TObject*>(model));
1580 model->IncDenyDestroy();
1581 model->SetRnrChildren(kFALSE);
1582 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
1587 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
1589 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));