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 <AliESDEvent.h>
17 #include <AliESDfriend.h>
19 #include <AliRawEventHeaderBase.h>
20 #include <AliRawReaderRoot.h>
21 #include <AliRawReaderFile.h>
22 #include <AliRawReaderDate.h>
23 #include <AliMagFMaps.h>
24 #include <AliCDBManager.h>
25 #include <AliCDBStorage.h>
26 #include <AliHeader.h>
27 #include <AliGeomManager.h>
31 #include <TGeoManager.h>
33 #include <TTimeStamp.h>
35 //==============================================================================
36 //==============================================================================
38 //==============================================================================
40 //______________________________________________________________________________
42 // Provide interface for loading and navigating standard AliRoot data
43 // (AliRunLoader) and ESDs.
45 // Missing support for raw-data. For now this is handled individually
46 // by each sub-detector.
48 // Also provides interface to magnetic-field and geometry. Mostly
49 // intended as wrappers over standard AliRoot functionality for
50 // convenient use from visualizateion macros.
52 ClassImp(AliEveEventManager)
54 AliEveEventManager* gAliEveEvent = 0;
56 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
57 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
58 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
60 TString AliEveEventManager::fgESDFileName("AliESDs.root");
61 TString AliEveEventManager::fgRawFileName("raw.root");
62 TString AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
64 AliMagF* AliEveEventManager::fgMagField = 0;
66 void AliEveEventManager::InitInternals()
68 // Initialize internal members.
70 fAutoLoadTimer = new TTimer;
71 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
73 fExecutor = new AliEveMacroExecutor;
76 AliEveEventManager::AliEveEventManager() :
79 fPath ( ), fEventId (-1),
81 fESDFile (0), fESDTree (0), fESD (0),
82 fESDfriend (0), fESDfriendExists(kFALSE),
84 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
85 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
86 fSelectOnTriggerType(kFALSE), fTriggerType(""),
88 fAutoLoadTimerRunning(kFALSE)
90 // Default constructor.
95 AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
96 TEveEventManager("AliEVE AliEveEventManager"),
98 fPath (path), fEventId(-1),
100 fESDFile (0), fESDTree (0), fESD (0),
101 fESDfriend (0), fESDfriendExists(kFALSE),
103 fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
104 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
105 fSelectOnTriggerType(kFALSE), fTriggerType(""),
107 fAutoLoadTimerRunning(kFALSE)
109 // Constructor with event-directory URL and event-id.
120 AliEveEventManager::~AliEveEventManager()
129 // Somewhat unclear what to do here.
130 // In principle should wipe event data and deregister from
134 /******************************************************************************/
136 void AliEveEventManager::SetESDFileName(const Text_t* esd)
138 // Set file-name for opening ESD, default "AliESDs.root".
140 if (esd) fgESDFileName = esd;
143 void AliEveEventManager::SetRawFileName(const Text_t* raw)
145 // Set file-name for opening of raw-data, default "raw.root"
146 if (raw) fgRawFileName = raw;
149 void AliEveEventManager::SetCdbUri(const Text_t* cdb)
151 // Set path to CDB, default "local://$ALICE_ROOT".
153 if (cdb) fgCdbUri = cdb;
156 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader,
160 // Set global flags that detrmine which parts of the event-data must
161 // be present when the event is opened.
163 fgAssertRunLoader = assertRunloader;
164 fgAssertESD = assertEsd;
165 fgAssertRaw = assertRaw;
168 /******************************************************************************/
170 void AliEveEventManager::Open()
172 // Open event-data from URL specified in fPath.
173 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
174 // Warning is reported if run-loader or ESD is not found.
175 // Global data-members fgAssertRunLoader and fgAssertESD can be set
176 // to throw exceptions instead.
178 static const TEveException kEH("AliEveEventManager::Open ");
182 throw (kEH + "Event-loop is under external control.");
186 throw (kEH + "Event-files already opened.");
189 gSystem->ExpandPathName(fPath);
190 // The following magick is required for ESDriends to be loaded properly
191 // from non-current directory.
192 if (fPath.IsNull() || fPath == ".")
194 fPath = gSystem->WorkingDirectory();
196 else if ( ! fPath.BeginsWith("file:/"))
198 TUrl url(fPath, kTRUE);
199 TString protocol(url.GetProtocol());
200 if (protocol == "file" && fPath[0] != '/')
201 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
206 // Open ESD and ESDfriends
208 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
209 if ((fESDFile = TFile::Open(esdPath)))
211 fESD = new AliESDEvent();
212 fESDTree = (TTree*) fESDFile->Get("esdTree");
215 // Check if ESDfriends exists and attach the branch.
216 // We use TFile::Open() instead of gSystem->AccessPathName
217 // as it seems to work better when attachine alieve to a
218 // running reconstruction process with auto-save on.
219 // There was also a problem with TTree::Refresh() - it didn't
220 // save the friend branch on a separate file, fixed in 5.22.2 -
221 // so we might want to try the old way again soon.
222 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
223 TFile *esdFriendFile = TFile::Open(p);
226 if (!esdFriendFile->IsZombie())
228 esdFriendFile->Close();
229 fESDfriendExists = kTRUE;
230 fESDTree->SetBranchStatus ("ESDfriend*", 1);
232 delete esdFriendFile;
235 fESD->ReadFromTree(fESDTree);
236 if (fESDfriendExists)
238 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
239 Info(kEH, "found and attached ESD friend.");
243 Warning(kEH, "ESDfriend not found.");
246 if (fESDTree->GetEntry(0) <= 0)
248 delete fESDFile; fESDFile = 0;
249 delete fESD; fESD = 0;
250 Warning(kEH, "failed getting the first entry from esdTree.");
255 runNo = fESD->GetESDRun()->GetRunNumber();
260 delete fESDFile; fESDFile = 0;
261 delete fESD; fESD = 0;
262 Warning(kEH, "failed getting the esdTree.");
265 else // esd not readable
267 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
273 throw (kEH + "ESD not initialized. Its precence was requested.");
275 Warning(kEH, "ESD not initialized.");
279 // Open RunLoader from galice.root
281 TString gaPath(Form("%s/galice.root", fPath.Data()));
282 // If i use open directly, we get fatal.
283 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
284 if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
286 fRunLoader = AliRunLoader::Open(gaPath);
289 TString alicePath = fPath + "/";
290 fRunLoader->SetDirName(alicePath);
292 if (fRunLoader->LoadgAlice() != 0)
293 Warning(kEH, "failed loading gAlice via run-loader.");
295 if (fRunLoader->LoadHeader() == 0)
298 runNo = fRunLoader->GetHeader()->GetRun();
302 Warning(kEH, "failed loading run-loader's header.");
307 else // run-loader open failed
309 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
312 else // galice not readable
314 Warning(kEH, "can not read '%s'.", gaPath.Data());
318 if (fgAssertRunLoader)
319 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
321 Warning(kEH, "Bootstraping of run-loader failed.");
324 // Open raw-data file
326 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
327 // If i use open directly, raw-reader reports an error but i have
328 // no way to detect it.
329 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
330 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
331 if (fgAssertRaw == kFALSE)
333 AliLog::SetGlobalLogLevel(AliLog::kFatal);
335 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
337 fRawReader = AliRawReader::Create(rawPath);
341 fRawReader = AliRawReader::Create(fgRawFileName);
343 if (fgAssertRaw == kFALSE)
345 AliLog::SetGlobalLogLevel(oldLogLevel);
352 throw (kEH + "raw-data not initialized. Its precence was requested.");
354 Warning(kEH, "raw-data not initialized.");
362 fRawReader->NextEvent();
363 runNo = fRawReader->GetRunNumber();
364 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
365 fRawReader->RewindEvents();
367 throw (kEH + "unknown run number.");
372 AliCDBManager* cdb = AliCDBManager::Instance();
373 if (cdb->IsDefaultStorageSet() == kTRUE)
375 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
376 cdb->GetDefaultStorage()->GetURI().Data());
380 cdb->SetDefaultStorage(fgCdbUri);
381 if (cdb->IsDefaultStorageSet() == kFALSE)
382 throw (kEH + "CDB initialization failed.");
387 SetName(Form("Event %d", fEventId));
392 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd)
394 // Set an event from an external source
395 // The method is used in the online visualisation
397 static const TEveException kEH("AliEveEventManager::SetEvent ");
401 Warning(kEH, "Event-files were open. Closing and switching to external control.");
405 fRunLoader = runLoader;
406 fRawReader = rawReader;
411 fExternalCtrl = kTRUE;
413 SetTitle("Online event in memory");
414 SetName ("Online Event");
417 AfterNewEventLoaded();
419 if (fAutoLoad) StartAutoLoadTimer();
422 Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
424 // Returns maximum available event id.
425 // If under external control or event is not opened -1 is returned.
426 // If raw-data is the only data-source this can not be known
427 // and 10,000,000 is returned.
428 // If neither data-source is initialised an exception is thrown.
429 // If refresh_esd is true and ESD is the primary event-data source
430 // its header is re-read from disk.
432 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
434 if (fExternalCtrl || fIsOpen == kFALSE)
441 // Refresh crashes with root-5.21.1-alice.
442 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
443 // when we move to a newer root.
445 // fESDTree->Refresh();
446 return fESDTree->GetEntries() - 1;
450 return fRunLoader->GetNumberOfEvents() - 1;
454 Int_t n = fRawReader->GetNumberOfEvents() - 1;
455 return n > -1 ? n : 10000000;
459 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
463 void AliEveEventManager::GotoEvent(Int_t event)
465 // Load data for specified event.
466 // If event is out of range an exception is thrown and old state
468 // After successful loading of event, the virtual function
469 // AfterNewEventLoaded() is called. This executes commands that
470 // were registered via TEveEventManager::AddNewEventCommand().
472 // If event is negative, it is subtracted from the number of
473 // available events, thus passing -1 will load the last event.
474 // This is not supported when raw-data is the only data-source
475 // as the number of events is not known.
477 static const TEveException kEH("AliEveEventManager::GotoEvent ");
479 if (fAutoLoadTimerRunning)
481 throw (kEH + "Event auto-load timer is running.");
485 throw (kEH + "Event-loop is under external control.");
489 throw (kEH + "Event-files not opened.");
497 // Refresh crashes with root-5.21.1-alice.
498 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
499 // when we move to a newer root.
500 // fESDTree->Refresh();
501 maxEvent = fESDTree->GetEntries() - 1;
503 event = fESDTree->GetEntries() + event;
507 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
509 event = fRunLoader->GetNumberOfEvents() + event;
513 maxEvent = fRawReader->GetNumberOfEvents() - 1;
518 Error(kEH, "current raw-data source does not support direct event access.");
521 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
526 event = fRawReader->GetNumberOfEvents() + event;
531 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
533 if (event < 0 || event > maxEvent)
535 throw (kEH + Form("event %d not present, available range [%d, %d].",
536 event, 0, maxEvent));
539 TEveManager::TRedrawDisabler rd(gEve);
540 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
542 // !!! MT this is somewhat brutal; at least optionally, one could be
543 // a bit gentler, checking for objs owning their external refs and having
544 // additinal parents.
548 if (fESDTree->GetEntry(event) <= 0)
549 throw (kEH + "failed getting required event from ESD.");
551 if (fESDfriendExists)
552 fESD->SetESDfriend(fESDfriend);
556 if (fRunLoader->GetEvent(event) != 0)
557 throw (kEH + "failed getting required event.");
562 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
563 if (fRawReader->GotoEvent(event) == kFALSE)
565 // Use fallback method - iteration with NextEvent().
566 Int_t rawEv = fEventId;
569 fRawReader->RewindEvents();
573 while (rawEv < event)
575 if ( ! fRawReader->NextEvent())
577 fRawReader->RewindEvents();
579 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
583 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
589 SetName(Form("Event %d", fEventId));
592 AfterNewEventLoaded();
595 void AliEveEventManager::NextEvent()
598 // Does magick needed for online display when under external event control.
600 static const TEveException kEH("AliEveEventManager::NextEvent ");
602 if (fAutoLoadTimerRunning)
604 throw (kEH + "Event auto-load timer is running.");
609 // !!! This should really go somewhere else. It is done in GotoEvent(),
610 // so here we should do it in SetEvent().
617 Int_t nexteventbytrigger=0;
618 if (fSelectOnTriggerType)
620 if (FindNextByTrigger(nexteventbytrigger)) //if not found do nothing
621 GotoEvent(nexteventbytrigger);
623 else if (fEventId < GetMaxEventId(kTRUE))
624 GotoEvent(fEventId + 1);
630 void AliEveEventManager::PrevEvent()
632 // Loads previous event.
634 static const TEveException kEH("AliEveEventManager::PrevEvent ");
636 if (fAutoLoadTimerRunning)
638 throw (kEH + "Event auto-load timer is running.");
642 throw (kEH + "Event-loop is under external control.");
644 Int_t nexteventbytrigger=0;
645 if (fSelectOnTriggerType)
647 if (FindPrevByTrigger(nexteventbytrigger))
648 GotoEvent(nexteventbytrigger);
651 GotoEvent(fEventId - 1);
654 void AliEveEventManager::Close()
656 // Close the event data-files and delete ESD, ESDfriend, run-loader
659 static const TEveException kEH("AliEveEventManager::Close ");
663 throw (kEH + "Event-files not opened.");
666 if (fAutoLoadTimerRunning)
670 delete fESD; fESD = 0;
671 delete fESDfriend; fESDfriend = 0;
672 fESDfriendExists = kFALSE;
674 delete fESDTree; fESDTree = 0;
675 delete fESDFile; fESDFile = 0;
679 delete fRunLoader; fRunLoader = 0;
683 delete fRawReader; fRawReader = 0;
692 //------------------------------------------------------------------------------
693 // Static convenience functions, mainly used from macros.
694 //------------------------------------------------------------------------------
696 Bool_t AliEveEventManager::HasRunLoader()
698 // Check if AliRunLoader is initialized.
700 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fRunLoader;
703 Bool_t AliEveEventManager::HasESD()
705 // Check if AliESDEvent is initialized.
707 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fESD;
710 Bool_t AliEveEventManager::HasESDfriend()
712 // Check if AliESDfriend is initialized.
714 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fESDfriend;
717 Bool_t AliEveEventManager::HasRawReader()
719 // Check if raw-reader is initialized.
721 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fRawReader;
724 AliRunLoader* AliEveEventManager::AssertRunLoader()
726 // Make sure AliRunLoader is initialized and return it.
727 // Throws exception in case run-loader is not available.
728 // Static utility for macros.
730 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
732 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
733 throw (kEH + "ALICE event not ready.");
734 if (gAliEveEvent->fRunLoader == 0)
735 throw (kEH + "AliRunLoader not initialised.");
736 return gAliEveEvent->fRunLoader;
739 AliESDEvent* AliEveEventManager::AssertESD()
741 // Make sure AliESDEvent is initialized and return it.
742 // Throws exception in case ESD is not available.
743 // Static utility for macros.
745 static const TEveException kEH("AliEveEventManager::AssertESD ");
747 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
748 throw (kEH + "ALICE event not ready.");
749 if (gAliEveEvent->fESD == 0)
750 throw (kEH + "AliESD not initialised.");
751 return gAliEveEvent->fESD;
754 AliESDfriend* AliEveEventManager::AssertESDfriend()
756 // Make sure AliESDfriend is initialized and return it.
757 // Throws exception in case ESDfriend-loader is not available.
758 // Static utility for macros.
760 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
762 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
763 throw (kEH + "ALICE event not ready.");
764 if (gAliEveEvent->fESDfriend == 0)
765 throw (kEH + "AliESDfriend not initialised.");
766 return gAliEveEvent->fESDfriend;
769 AliRawReader* AliEveEventManager::AssertRawReader()
771 // Make sure raw-reader is initialized and return it.
773 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
775 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
776 throw (kEH + "ALICE event not ready.");
777 if (gAliEveEvent->fRawReader == 0)
778 throw (kEH + "RawReader not ready.");
780 return gAliEveEvent->fRawReader;
783 AliMagF* AliEveEventManager::AssertMagField()
785 // Make sure AliMagF is initialized and returns it.
786 // Run-loader must be initialized to get the correct magnetic field!
787 // Throws exception in case magnetic field is not available.
788 // Static utility for macros.
790 // !!!! This should be fixed ... get field also in some other way,
791 // not only via run-loader.
795 if (gAliEveEvent && gAliEveEvent->fRunLoader && gAliEveEvent->fRunLoader->GetAliRun())
796 fgMagField = gAliEveEvent->fRunLoader->GetAliRun()->Field();
798 fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
803 TGeoManager* AliEveEventManager::AssertGeometry()
805 // Make sure AliGeomManager is initialized and returns the
806 // corresponding TGeoManger.
807 // gGeoManager is set to the return value.
808 // Throws exception if geometry can not be loaded or if it is not
809 // available and the TGeoManager is locked.
810 // Static utility for macros.
812 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
814 if (AliGeomManager::GetGeometry() == 0)
816 if (TGeoManager::IsLocked())
817 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
820 AliGeomManager::LoadGeometry();
821 if ( ! AliGeomManager::GetGeometry())
823 throw (kEH + "can not load geometry.");
825 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
827 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
828 // throw (kEH + "could not apply align objs.");
830 AliGeomManager::GetGeometry()->DefaultColors();
833 gGeoManager = AliGeomManager::GetGeometry();
838 //------------------------------------------------------------------------------
839 // Autoloading of events
840 //------------------------------------------------------------------------------
842 void AliEveEventManager::SetAutoLoadTime(Float_t time)
844 // Set the auto-load time in seconds
846 fAutoLoadTime = time;
849 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
851 // Set the automatic event loading mode
853 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
855 if (fAutoLoad == autoLoad)
857 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
861 fAutoLoad = autoLoad;
864 StartAutoLoadTimer();
872 void AliEveEventManager::StartAutoLoadTimer()
874 // Start the auto-load timer.
876 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
877 fAutoLoadTimer->Reset();
878 fAutoLoadTimer->TurnOn();
879 fAutoLoadTimerRunning = kTRUE;
882 void AliEveEventManager::StopAutoLoadTimer()
884 // Stop the auto-load timer.
886 fAutoLoadTimerRunning = kFALSE;
887 fAutoLoadTimer->TurnOff();
890 void AliEveEventManager::AutoLoadNextEvent()
892 // Called from auto-load timer, so it has to be public.
893 // Do NOT call it directly.
895 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
897 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
899 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
905 if (fAutoLoad && !fExternalCtrl)
906 StartAutoLoadTimer();
910 //------------------------------------------------------------------------------
911 // Event selection by trigger
912 //------------------------------------------------------------------------------
914 Bool_t AliEveEventManager::FindNextByTrigger(Int_t& event)
916 // Find next event that matches the trigger.
917 // If a matching event is not found, we loop around and eventually
918 // end up at the same event.
920 static const TEveException kEH("AliEveEventManager::FindNextByTrigger ");
922 if (!fESDTree) return kFALSE;
923 TString firedtrclasses;
924 for (Int_t i = fEventId+1; i<GetMaxEventId(kTRUE)+1; i++)
926 if (fESDTree->GetEntry(i) <= 0)
927 throw (kEH + "failed getting required event from ESD.");
928 firedtrclasses = fESD->GetFiredTriggerClasses();
929 if (firedtrclasses.Contains(fTriggerType))
935 for (Int_t i = 0; i<fEventId+1; i++)
937 if (fESDTree->GetEntry(i) <= 0)
938 throw (kEH + "failed getting required event from ESD.");
939 firedtrclasses = fESD->GetFiredTriggerClasses();
940 if (firedtrclasses.Contains(fTriggerType))
949 Bool_t AliEveEventManager::FindPrevByTrigger(Int_t& event)
951 // Find previous event that matches the trigger.
953 static const TEveException kEH("AliEveEventManager::FindPrevByTrigger ");
955 if (!fESDTree) return kFALSE;
956 TString firedtrclasses;
957 for (Int_t i = fEventId-1; i>=0; i--)
959 if (fESDTree->GetEntry(i) <= 0)
960 throw (kEH + "failed getting required event from ESD.");
961 firedtrclasses = fESD->GetFiredTriggerClasses();
962 if (firedtrclasses.Contains(fTriggerType))
968 for (Int_t i = GetMaxEventId(kTRUE); i>fEventId-1; i--)
970 if (fESDTree->GetEntry(i) <= 0)
971 throw (kEH + "failed getting required event from ESD.");
972 firedtrclasses = fESD->GetFiredTriggerClasses();
973 if (firedtrclasses.Contains(fTriggerType))
983 //------------------------------------------------------------------------------
984 // Post event-loading functions
985 //------------------------------------------------------------------------------
987 void AliEveEventManager::AfterNewEventLoaded()
989 // Execute registered macros and commands.
990 // At the end emit NewEventLoaded signal.
992 // Virtual from TEveEventManager.
995 fExecutor->ExecMacros();
997 TEveEventManager::AfterNewEventLoaded();
1002 void AliEveEventManager::NewEventLoaded()
1004 // Emit NewEventLoaded signal.
1006 Emit("NewEventLoaded()");
1010 //------------------------------------------------------------------------------
1011 // Event info dumpers
1012 //------------------------------------------------------------------------------
1014 TString AliEveEventManager::GetEventInfoHorizontal() const
1016 // Dumps the event-header contents in vertical formatting.
1018 TString rawInfo, esdInfo;
1022 rawInfo = "No raw-data event info is available!\n";
1026 const UInt_t* attr = fRawReader->GetAttributes();
1027 TTimeStamp ts(fRawReader->GetTimestamp());
1028 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1029 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1030 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1031 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1032 fRawReader->GetClassMask(),
1033 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1034 attr[0],attr[1],attr[2], ts.AsString("s"));
1039 esdInfo = "No ESD event info is available!";
1043 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1044 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1045 TTimeStamp ts(fESD->GetTimeStamp());
1046 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1047 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1048 fESD->GetRunNumber(),
1049 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1050 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1051 acttrclasses.Data(),
1052 fESD->GetTriggerMask(),firedtrclasses.Data(),
1053 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1056 return rawInfo + esdInfo;
1059 TString AliEveEventManager::GetEventInfoVertical() const
1061 // Dumps the event-header contents in vertical formatting.
1063 TString rawInfo, esdInfo;
1067 rawInfo = "No raw-data event info is available!\n";
1071 const UInt_t* attr = fRawReader->GetAttributes();
1072 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",
1073 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1074 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1075 fRawReader->GetClassMask(),
1076 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1077 attr[0],attr[1],attr[2],
1078 fRawReader->GetTimestamp());
1083 esdInfo = "No ESD event info is available!\n";
1087 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1088 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1089 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",
1090 fESD->GetRunNumber(),
1091 acttrclasses.Data(),
1092 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1093 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1094 fESD->GetTriggerMask(),firedtrclasses.Data(),
1095 fESD->GetEventNumberInFile(),
1096 fESD->GetTimeStamp());
1099 return rawInfo + "\n" + esdInfo;