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 <AliHeader.h>
26 #include <AliGeomManager.h>
30 #include <TGeoManager.h>
32 #include <TTimeStamp.h>
34 //==============================================================================
35 //==============================================================================
37 //==============================================================================
39 //______________________________________________________________________________
41 // Provide interface for loading and navigating standard AliRoot data
42 // (AliRunLoader) and ESDs.
44 // Missing support for raw-data. For now this is handled individually
45 // by each sub-detector.
47 // Also provides interface to magnetic-field and geometry. Mostly
48 // intended as wrappers over standard AliRoot functionality for
49 // convenient use from visualizateion macros.
51 ClassImp(AliEveEventManager)
53 AliEveEventManager* gAliEveEvent = 0;
55 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
56 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
57 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
59 TString AliEveEventManager::fgESDFileName("AliESDs.root");
60 TString AliEveEventManager::fgRawFileName("raw.root");
61 TString AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
63 AliMagF* AliEveEventManager::fgMagField = 0;
66 AliEveEventManager::AliEveEventManager() :
69 fPath ( ), fEventId (-1),
71 fESDFile (0), fESDTree (0), fESD (0),
72 fESDfriend (0), fESDfriendExists(kFALSE),
74 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
75 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
76 fExecutor (new AliEveMacroExecutor)
78 // Default constructor.
81 AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
82 TEveEventManager("AliEVE AliEveEventManager"),
84 fPath (path), fEventId(-1),
86 fESDFile (0), fESDTree (0), fESD (0),
87 fESDfriend (0), fESDfriendExists(kFALSE),
89 fAutoLoad (kFALSE), fAutoLoadTime (5.), fAutoLoadTimer(0),
90 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
91 fExecutor (new AliEveMacroExecutor)
93 // Constructor with event-directory URL and event-id.
96 if (ev >= 0) GotoEvent(ev);
99 AliEveEventManager::~AliEveEventManager()
108 if (fAutoLoadTimer) delete fAutoLoadTimer;
109 // Somewhat unclear what to do here.
110 // In principle should close all data sources and deregister from
114 /******************************************************************************/
116 void AliEveEventManager::SetESDFileName(const Text_t* esd)
118 // Set file-name for opening ESD, default "AliESDs.root".
120 if (esd) fgESDFileName = esd;
123 void AliEveEventManager::SetRawFileName(const Text_t* raw)
125 // Set file-name for opening of raw-data, default "raw.root"
126 if (raw) fgRawFileName = raw;
129 void AliEveEventManager::SetCdbUri(const Text_t* cdb)
131 // Set path to CDB, default "local://$ALICE_ROOT".
133 if (cdb) fgCdbUri = cdb;
136 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader,
140 // Set global flags that detrmine which parts of the event-data must
141 // be present when the event is opened.
143 fgAssertRunLoader = assertRunloader;
144 fgAssertESD = assertEsd;
145 fgAssertRaw = assertRaw;
148 /******************************************************************************/
150 void AliEveEventManager::Open()
152 // Open event-data from URL specified in fPath.
153 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
154 // Warning is reported if run-loader or ESD is not found.
155 // Global data-members fgAssertRunLoader and fgAssertESD can be set
156 // to throw exceptions instead.
158 static const TEveException kEH("AliEveEventManager::Open ");
162 throw (kEH + "Event-loop is under external control.");
166 throw (kEH + "Event-files already opened.");
169 gSystem->ExpandPathName(fPath);
170 // The following magick is required for ESDriends to be loaded properly
171 // from non-current directory.
172 if (fPath.IsNull() || fPath == ".")
174 fPath = gSystem->WorkingDirectory();
176 else if ( ! fPath.BeginsWith("file:/"))
178 TUrl url(fPath, kTRUE);
179 TString protocol(url.GetProtocol());
180 if (protocol == "file" && fPath[0] != '/')
181 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
186 // Open ESD and ESDfriends
188 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
189 if ((fESDFile = TFile::Open(esdPath)))
191 fESD = new AliESDEvent();
192 fESDTree = (TTree*) fESDFile->Get("esdTree");
195 // Check if ESDfriends exists and attach the branch
196 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
197 TFile *esdFriendFile = TFile::Open(p);
199 if (!esdFriendFile->IsZombie())
201 esdFriendFile->Close();
202 delete esdFriendFile;
203 fESDfriendExists = kTRUE;
204 fESDTree->SetBranchStatus ("ESDfriend*", 1);
205 fESDTree->SetBranchAddress("ESDfriend.", &fESDfriend);
209 esdFriendFile->Close();
210 delete esdFriendFile;
214 fESD->ReadFromTree(fESDTree);
215 if (!fESDfriendExists) fESDTree->SetBranchStatus ("ESDfriend*", 0);
216 if (fESDTree->GetEntry(0) <= 0)
218 delete fESDFile; fESDFile = 0;
219 delete fESD; fESD = 0;
220 Warning(kEH, "failed getting the first entry from esdTree.");
225 runNo = fESD->GetESDRun()->GetRunNumber();
230 delete fESDFile; fESDFile = 0;
231 delete fESD; fESD = 0;
232 Warning(kEH, "failed getting the esdTree.");
235 else // esd not readable
237 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
243 throw (kEH + "ESD not initialized. Its precence was requested.");
245 Warning(kEH, "ESD not initialized.");
249 // Open RunLoader from galice.root
251 TString gaPath(Form("%s/galice.root", fPath.Data()));
252 // If i use open directly, we get fatal.
253 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
254 if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
256 fRunLoader = AliRunLoader::Open(gaPath);
259 TString alicePath = fPath + "/";
260 fRunLoader->SetDirName(alicePath);
262 if (fRunLoader->LoadgAlice() != 0)
263 Warning(kEH, "failed loading gAlice via run-loader.");
265 if (fRunLoader->LoadHeader() == 0)
268 runNo = fRunLoader->GetHeader()->GetRun();
272 Warning(kEH, "failed loading run-loader's header.");
277 else // run-loader open failed
279 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
282 else // galice not readable
284 Warning(kEH, "can not read '%s'.", gaPath.Data());
288 if (fgAssertRunLoader)
289 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
291 Warning(kEH, "Bootstraping of run-loader failed.");
294 // Open raw-data file
296 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
297 // If i use open directly, raw-reader reports an error but i have
298 // no way to detect it.
299 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
300 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
302 fRawReader = AliRawReader::Create(rawPath);
306 fRawReader = AliRawReader::Create(fgRawFileName);
312 throw (kEH + "raw-data not initialized. Its precence was requested.");
314 Warning(kEH, "raw-data not initialized.");
322 fRawReader->NextEvent();
323 runNo = fRawReader->GetRunNumber();
324 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
325 fRawReader->RewindEvents();
327 throw (kEH + "unknown run number.");
332 AliCDBManager* cdb = AliCDBManager::Instance();
333 cdb->SetDefaultStorage(fgCdbUri);
334 if (cdb->IsDefaultStorageSet() == kFALSE)
335 throw (kEH + "CDB initialization failed.");
339 SetName(Form("Event %d", fEventId));
344 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd)
346 // Set an event from an external source
347 // The method is used in the online visualisation
349 static const TEveException kEH("AliEveEventManager::SetEvent ");
353 Warning(kEH, "Event-files were open. Closing and switching to external control.");
357 fRunLoader = runLoader;
358 fRawReader = rawReader;
363 fExternalCtrl = kTRUE;
365 SetTitle("Online event in memory");
366 SetName ("Online Event");
369 AfterNewEventLoaded();
372 Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
374 // Returns maximum available event id.
375 // If under external control or event is not opened -1 is returned.
376 // If raw-data is the only data-source this can not be known
377 // and 10,000,000 is returned.
378 // If neither data-source is initialised an exception is thrown.
379 // If refresh_esd is true and ESD is the primary event-data source
380 // its header is re-read from disk.
382 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
384 if (fExternalCtrl || fIsOpen == kFALSE)
391 // Refresh crashes with root-5.21.1-alice.
392 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
393 // when we move to a newer root.
395 // fESDTree->Refresh();
396 return fESDTree->GetEntries() - 1;
400 return fRunLoader->GetNumberOfEvents() - 1;
404 Int_t n = fRawReader->GetNumberOfEvents() - 1;
405 return n > -1 ? n : 10000000;
409 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
413 void AliEveEventManager::GotoEvent(Int_t event)
415 // Load data for specified event.
416 // If event is out of range an exception is thrown and old state
418 // After successful loading of event, the virtual function
419 // AfterNewEventLoaded() is called. This executes commands that
420 // were registered via TEveEventManager::AddNewEventCommand().
422 // If event is negative, it is subtracted from the number of
423 // available events, thus passing -1 will load the last event.
424 // This is not supported when raw-data is the only data-source
425 // as the number of events is not known.
427 static const TEveException kEH("AliEveEventManager::GotoEvent ");
431 throw (kEH + "Event-loop is under external control.");
435 throw (kEH + "Event-files not opened.");
443 // Refresh crashes with root-5.21.1-alice.
444 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
445 // when we move to a newer root.
446 // fESDTree->Refresh();
447 maxEvent = fESDTree->GetEntries() - 1;
449 event = fESDTree->GetEntries() + event;
453 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
455 event = fRunLoader->GetNumberOfEvents() + event;
459 maxEvent = fRawReader->GetNumberOfEvents() - 1;
464 Error(kEH, "current raw-data source does not support direct event access.");
467 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
472 event = fRawReader->GetNumberOfEvents() + event;
477 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
479 if (event < 0 || event > maxEvent)
481 throw (kEH + Form("event %d not present, available range [%d, %d].",
482 event, 0, maxEvent));
485 TEveManager::TRedrawDisabler rd(gEve);
486 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
488 // !!! MT this is somewhat brutal; at least optionally, one could be
489 // a bit gentler, checking for objs owning their external refs and having
490 // additinal parents.
494 if (fESDTree->GetEntry(event) <= 0)
495 throw (kEH + "failed getting required event from ESD.");
497 if (fESDfriendExists)
498 fESD->SetESDfriend(fESDfriend);
502 if (fRunLoader->GetEvent(event) != 0)
503 throw (kEH + "failed getting required event.");
508 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
509 if (fRawReader->GotoEvent(event) == kFALSE)
511 // Use fallback method - iteration with NextEvent().
512 Int_t rawEv = fEventId;
515 fRawReader->RewindEvents();
519 while (rawEv < event)
521 if ( ! fRawReader->NextEvent())
523 fRawReader->RewindEvents();
525 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
529 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
535 SetName(Form("Event %d", fEventId));
538 AfterNewEventLoaded();
541 void AliEveEventManager::NextEvent()
544 // Does magick needed for online display when under external event control.
548 if (fAutoLoadTimer) fAutoLoadTimer->Stop();
556 if (fEventId < GetMaxEventId(kTRUE))
557 GotoEvent(fEventId + 1);
560 StartStopAutoLoadTimer();
564 void AliEveEventManager::PrevEvent()
566 // Loads previous event.
568 static const TEveException kEH("AliEveEventManager::PrevEvent ");
572 throw (kEH + "Event-loop is under external control.");
576 throw (kEH + "Event-files not opened.");
579 GotoEvent(fEventId - 1);
580 StartStopAutoLoadTimer();
583 void AliEveEventManager::Close()
585 // Close the event data-files and delete ESD, ESDfriend, run-loader
588 static const TEveException kEH("AliEveEventManager::Close ");
592 throw (kEH + "Event-files not opened.");
596 delete fESD; fESD = 0;
597 delete fESDfriend; fESDfriend = 0;
599 delete fESDTree; fESDTree = 0;
600 delete fESDFile; fESDFile = 0;
604 delete fRunLoader; fRunLoader = 0;
608 delete fRawReader; fRawReader = 0;
617 //------------------------------------------------------------------------------
618 // Static convenience functions, mainly used from macros.
619 //------------------------------------------------------------------------------
621 Bool_t AliEveEventManager::HasRunLoader()
623 // Check if AliRunLoader is initialized.
625 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fRunLoader;
628 Bool_t AliEveEventManager::HasESD()
630 // Check if AliESDEvent is initialized.
632 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fESD;
635 Bool_t AliEveEventManager::HasESDfriend()
637 // Check if AliESDfriend is initialized.
639 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fESDfriend;
642 Bool_t AliEveEventManager::HasRawReader()
644 // Check if raw-reader is initialized.
646 return gAliEveEvent && gAliEveEvent->fHasEvent && gAliEveEvent->fRawReader;
649 AliRunLoader* AliEveEventManager::AssertRunLoader()
651 // Make sure AliRunLoader is initialized and return it.
652 // Throws exception in case run-loader is not available.
653 // Static utility for macros.
655 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
657 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
658 throw (kEH + "ALICE event not ready.");
659 if (gAliEveEvent->fRunLoader == 0)
660 throw (kEH + "AliRunLoader not initialised.");
661 return gAliEveEvent->fRunLoader;
664 AliESDEvent* AliEveEventManager::AssertESD()
666 // Make sure AliESDEvent is initialized and return it.
667 // Throws exception in case ESD is not available.
668 // Static utility for macros.
670 static const TEveException kEH("AliEveEventManager::AssertESD ");
672 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
673 throw (kEH + "ALICE event not ready.");
674 if (gAliEveEvent->fESD == 0)
675 throw (kEH + "AliESD not initialised.");
676 return gAliEveEvent->fESD;
679 AliESDfriend* AliEveEventManager::AssertESDfriend()
681 // Make sure AliESDfriend is initialized and return it.
682 // Throws exception in case ESDfriend-loader is not available.
683 // Static utility for macros.
685 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
687 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
688 throw (kEH + "ALICE event not ready.");
689 if (gAliEveEvent->fESDfriend == 0)
690 throw (kEH + "AliESDfriend not initialised.");
691 return gAliEveEvent->fESDfriend;
694 AliRawReader* AliEveEventManager::AssertRawReader()
696 // Make sure raw-reader is initialized and return it.
698 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
700 if (gAliEveEvent == 0 || gAliEveEvent->fHasEvent == kFALSE)
701 throw (kEH + "ALICE event not ready.");
702 if (gAliEveEvent->fRawReader == 0)
703 throw (kEH + "RawReader not ready.");
705 return gAliEveEvent->fRawReader;
708 AliMagF* AliEveEventManager::AssertMagField()
710 // Make sure AliMagF is initialized and returns it.
711 // Run-loader must be initialized to get the correct magnetic field!
712 // Throws exception in case magnetic field is not available.
713 // Static utility for macros.
715 // !!!! This should be fixed ... get field also in some other way,
716 // not only via run-loader.
720 if (gAliEveEvent && gAliEveEvent->fRunLoader && gAliEveEvent->fRunLoader->GetAliRun())
721 fgMagField = gAliEveEvent->fRunLoader->GetAliRun()->Field();
723 fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
728 TGeoManager* AliEveEventManager::AssertGeometry()
730 // Make sure AliGeomManager is initialized and returns the
731 // corresponding TGeoManger.
732 // gGeoManager is set to the return value.
733 // Throws exception if geometry can not be loaded or if it is not
734 // available and the TGeoManager is locked.
735 // Static utility for macros.
737 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
739 if (AliGeomManager::GetGeometry() == 0)
741 if (TGeoManager::IsLocked())
742 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
745 AliGeomManager::LoadGeometry();
746 if ( ! AliGeomManager::GetGeometry())
748 throw (kEH + "can not load geometry.");
750 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
752 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
753 // throw (kEH + "could not apply align objs.");
755 AliGeomManager::GetGeometry()->DefaultColors();
758 gGeoManager = AliGeomManager::GetGeometry();
763 //------------------------------------------------------------------------------
765 //------------------------------------------------------------------------------
767 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
769 // Set the automatic event loading mode
771 fAutoLoad = autoLoad;
772 StartStopAutoLoadTimer();
775 void AliEveEventManager::SetAutoLoadTime(Double_t time)
777 // Set the auto-load time in seconds
779 fAutoLoadTime = time;
780 StartStopAutoLoadTimer();
783 void AliEveEventManager::StartStopAutoLoadTimer()
785 // Create if needed and start
786 // the automatic event loading timer
792 fAutoLoadTimer = new TTimer;
793 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "NextEvent()");
795 fAutoLoadTimer->Start((Long_t)fAutoLoadTime*1000, kTRUE);
799 if (fAutoLoadTimer) fAutoLoadTimer->Stop();
804 //------------------------------------------------------------------------------
805 // Post event-loading functions
806 //------------------------------------------------------------------------------
808 void AliEveEventManager::AfterNewEventLoaded()
810 // Execute registered macros and commands.
811 // At the end emit NewEventLoaded signal.
813 // Virtual from TEveEventManager.
816 fExecutor->ExecMacros();
818 TEveEventManager::AfterNewEventLoaded();
823 void AliEveEventManager::NewEventLoaded()
825 // Emit NewEventLoaded signal.
827 Emit("NewEventLoaded()");
831 //------------------------------------------------------------------------------
832 // Event info dumpers
833 //------------------------------------------------------------------------------
835 TString AliEveEventManager::GetEventInfoHorizontal() const
837 // Dumps the event-header contents in vertical formatting.
839 TString rawInfo, esdInfo;
843 rawInfo = "No raw-data event info is available!\n";
847 const UInt_t* attr = fRawReader->GetAttributes();
848 TTimeStamp ts(fRawReader->GetTimestamp());
849 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
850 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
851 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
852 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
853 fRawReader->GetClassMask(),
854 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
855 attr[0],attr[1],attr[2], ts.AsString("s"));
860 esdInfo = "No ESD event info is available!";
864 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
865 TString firedtrclasses = fESD->GetFiredTriggerClasses();
866 TTimeStamp ts(fESD->GetTimeStamp());
867 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
868 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s",
869 fESD->GetRunNumber(),
870 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
871 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
873 fESD->GetTriggerMask(),firedtrclasses.Data(),
874 fESD->GetEventNumberInFile(), ts.AsString("s"));
877 return rawInfo + esdInfo;
880 TString AliEveEventManager::GetEventInfoVertical() const
882 // Dumps the event-header contents in vertical formatting.
884 TString rawInfo, esdInfo;
888 rawInfo = "No raw-data event info is available!\n";
892 const UInt_t* attr = fRawReader->GetAttributes();
893 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",
894 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
895 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
896 fRawReader->GetClassMask(),
897 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
898 attr[0],attr[1],attr[2],
899 fRawReader->GetTimestamp());
904 esdInfo = "No ESD event info is available!\n";
908 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
909 TString firedtrclasses = fESD->GetFiredTriggerClasses();
910 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",
911 fESD->GetRunNumber(),
913 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
914 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
915 fESD->GetTriggerMask(),firedtrclasses.Data(),
916 fESD->GetEventNumberInFile(),
917 fESD->GetTimeStamp());
920 return rawInfo + "\n" + esdInfo;