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 <TEveManager.h>
13 #include <AliRunLoader.h>
15 #include <AliESDEvent.h>
16 #include <AliESDfriend.h>
18 #include <AliRawEventHeaderBase.h>
19 #include <AliRawReaderRoot.h>
20 #include <AliRawReaderFile.h>
21 #include <AliRawReaderDate.h>
22 #include <AliMagFMaps.h>
23 #include <AliCDBManager.h>
24 #include <AliHeader.h>
25 #include <AliGeomManager.h>
29 #include <TGeoManager.h>
32 //==============================================================================
33 //==============================================================================
35 //==============================================================================
37 //______________________________________________________________________________
39 // Provide interface for loading and navigating standard AliRoot data
40 // (AliRunLoader) and ESDs.
42 // Missing support for raw-data. For now this is handled individually
43 // by each sub-detector.
45 // Also provides interface to magnetic-field and geometry. Mostly
46 // intended as wrappers over standard AliRoot functionality for
47 // convenient use from visualizateion macros.
49 ClassImp(AliEveEventManager)
51 AliEveEventManager* gAliEveEvent = 0;
53 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
54 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
55 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
57 TString AliEveEventManager::fgESDFileName("AliESDs.root");
58 TString AliEveEventManager::fgRawFileName("raw.root");
59 TString AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
61 AliMagF* AliEveEventManager::fgMagField = 0;
64 AliEveEventManager::AliEveEventManager() :
67 fPath ( ), fEventId (-1),
69 fESDFile (0), fESDTree (0), fESD (0),
70 fESDfriend (0), fESDfriendExists(kFALSE),
77 // Default constructor.
80 AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
81 TEveEventManager("AliEVE AliEveEventManager"),
83 fPath (path), fEventId(-1),
85 fESDFile (0), fESDTree (0), fESD (0),
86 fESDfriend (0), fESDfriendExists(kFALSE),
93 // Constructor with event-directory URL and event-id.
96 if (ev >= 0) GotoEvent(ev);
99 AliEveEventManager::~AliEveEventManager()
103 if (fAutoLoadTimer) delete fAutoLoadTimer;
104 // Somewhat unclear what to do here.
105 // In principle should close all data sources and deregister from
109 /******************************************************************************/
111 void AliEveEventManager::SetESDFileName(const Text_t* esd)
113 // Set file-name for opening ESD, default "AliESDs.root".
115 if (esd) fgESDFileName = esd;
118 void AliEveEventManager::SetRawFileName(const Text_t* raw)
120 // Set file-name for opening of raw-data, default "raw.root"
121 if (raw) fgRawFileName = raw;
124 void AliEveEventManager::SetCdbUri(const Text_t* cdb)
126 // Set path to CDB, default "local://$ALICE_ROOT".
128 if (cdb) fgCdbUri = cdb;
131 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader,
135 // Set global flags that detrmine which parts of the event-data must
136 // be present when the event is opened.
138 fgAssertRunLoader = assertRunloader;
139 fgAssertESD = assertEsd;
140 fgAssertRaw = assertRaw;
143 /******************************************************************************/
145 void AliEveEventManager::Open()
147 // Open event-data from URL specified in fPath.
148 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
149 // Warning is reported if run-loader or ESD is not found.
150 // Global data-members fgAssertRunLoader and fgAssertESD can be set
151 // to throw exceptions instead.
153 static const TEveException kEH("AliEveEventManager::Open ");
155 gSystem->ExpandPathName(fPath);
156 // The following magick is required for ESDriends to be loaded properly
157 // from non-current directory.
158 if (fPath.IsNull() || fPath == ".")
160 fPath = gSystem->WorkingDirectory();
162 else if ( ! fPath.BeginsWith("file:/"))
164 TUrl url(fPath, kTRUE);
165 TString protocol(url.GetProtocol());
166 if (protocol == "file" && fPath[0] != '/')
167 fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
172 // Open ESD and ESDfriends
174 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
175 if ((fESDFile = TFile::Open(esdPath)))
177 fESD = new AliESDEvent();
178 fESDTree = (TTree*) fESDFile->Get("esdTree");
181 fESD->ReadFromTree(fESDTree);
182 fESDTree->GetEntry(0);
184 runNo = fESD->GetESDRun()->GetRunNumber();
186 // Check if ESDfriends exists and attach the branch
187 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
188 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
190 fESDfriendExists = kTRUE;
191 fESDTree->SetBranchStatus ("ESDfriend*", 1);
192 fESDTree->SetBranchAddress("ESDfriend.", &fESDfriend);
197 delete fESDFile; fESDFile = 0;
198 Warning(kEH, "failed getting the esdTree.");
201 else // esd not readable
203 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
209 throw (kEH + "ESD not initialized. Its precence was requested.");
211 Warning(kEH, "ESD not initialized.");
215 // Open RunLoader from galice.root
217 TString gaPath(Form("%s/galice.root", fPath.Data()));
218 // If i use open directly, we get fatal.
219 // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
220 if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
222 fRunLoader = AliRunLoader::Open(gaPath);
225 TString alicePath = fPath + "/";
226 fRunLoader->SetDirName(alicePath);
228 if (fRunLoader->LoadgAlice() != 0)
229 Warning(kEH, "failed loading gAlice via run-loader.");
231 if (fRunLoader->LoadHeader() == 0)
234 runNo = fRunLoader->GetHeader()->GetRun();
238 Warning(kEH, "failed loading run-loader's header.");
243 else // run-loader open failed
245 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
248 else // galice not readable
250 Warning(kEH, "can not read '%s'.", gaPath.Data());
254 if (fgAssertRunLoader)
255 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
257 Warning(kEH, "Bootstraping of run-loader failed.");
260 // Open raw-data file
262 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
263 // If i use open directly, raw-reader reports an error but i have
264 // no way to detect it.
265 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
266 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
268 fRawReader = AliRawReader::Create(rawPath);
272 fRawReader = AliRawReader::Create(fgRawFileName);
278 throw (kEH + "raw-data not initialized. Its precence was requested.");
280 Warning(kEH, "raw-data not initialized.");
288 fRawReader->NextEvent();
289 runNo = fRawReader->GetRunNumber();
290 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
291 fRawReader->RewindEvents();
293 throw (kEH + "unknown run number.");
298 AliCDBManager* cdb = AliCDBManager::Instance();
299 cdb->SetDefaultStorage(fgCdbUri);
300 if (cdb->IsDefaultStorageSet() == kFALSE)
301 throw (kEH + "CDB initialization failed.");
305 SetName(Form("Event %d", fEventId));
309 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd)
311 // Set an event from an external source
312 // The method is used in the online visualisation
313 fRunLoader = runLoader;
314 fRawReader = rawReader;
317 SetTitle("Online event in memory");
318 SetName("Online Event");
321 AfterNewEventLoaded();
324 Int_t AliEveEventManager::GetMaxEventId(Bool_t /*refreshESD*/) const
326 // Returns maximum available event id.
327 // If raw-data is the only data-source this can not be known
328 // and 10,000,000 is returned.
329 // If neither data-source is initialised an exception is thrown.
330 // If refresh_esd is true and ESD is the primary event-data source
331 // its header is re-read from disk.
333 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
337 // Refresh crashes with root-5.21.1-alice.
338 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
339 // when we move to a newer root.
341 // fESDTree->Refresh();
342 return fESDTree->GetEntries() - 1;
346 return fRunLoader->GetNumberOfEvents() - 1;
350 Int_t n = fRawReader->GetNumberOfEvents() - 1;
351 return n > -1 ? n : 10000000;
355 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
359 void AliEveEventManager::GotoEvent(Int_t event)
361 // Load data for specified event.
362 // If event is out of range an exception is thrown and old state
364 // After successful loading of event, the virtual function
365 // AfterNewEventLoaded() is called. This executes commands that
366 // were registered via TEveEventManager::AddNewEventCommand().
368 // If event is negative, it is subtracted from the number of
369 // available events, thus passing -1 will load the last event.
370 // This is not supported when raw-data is the only data-source
371 // as the number of events is not known.
373 static const TEveException kEH("AliEveEventManager::GotoEvent ");
378 // Refresh crashes with root-5.21.1-alice.
379 // Fixed by Philippe 5.8.2008 r25053, can be reactivated
380 // when we move to a newer root.
381 // fESDTree->Refresh();
382 maxEvent = fESDTree->GetEntries() - 1;
384 event = fESDTree->GetEntries() + event;
388 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
390 event = fRunLoader->GetNumberOfEvents() + event;
394 maxEvent = fRawReader->GetNumberOfEvents() - 1;
399 Error(kEH, "current raw-data source does not support direct event access.");
402 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
407 event = fRawReader->GetNumberOfEvents() + event;
412 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
414 if (event < 0 || event > maxEvent)
416 throw (kEH + Form("event %d not present, available range [%d, %d].",
417 event, 0, maxEvent));
420 TEveManager::TRedrawDisabler rd(gEve);
421 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
423 // !!! MT this is somewhat brutal; at least optionally, one could be
424 // a bit gentler, checking for objs owning their external refs and having
425 // additinal parents.
429 if (fESDTree->GetEntry(event) <= 0)
430 throw (kEH + "failed getting required event from ESD.");
432 if (fESDfriendExists)
433 fESD->SetESDfriend(fESDfriend);
437 if (fRunLoader->GetEvent(event) != 0)
438 throw (kEH + "failed getting required event.");
443 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
444 if (fRawReader->GotoEvent(event) == kFALSE)
446 // Use fallback method - iteration with NextEvent().
447 Int_t rawEv = fEventId;
450 fRawReader->RewindEvents();
454 while (rawEv < event)
456 if ( ! fRawReader->NextEvent())
458 fRawReader->RewindEvents();
460 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
464 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
469 SetName(Form("Event %d", fEventId));
472 AfterNewEventLoaded();
476 void AliEveEventManager::NextEvent()
479 // either in automatic (online) or
484 if (fAutoLoadTimer) fAutoLoadTimer->Stop();
492 if (fEventId < GetMaxEventId(kTRUE))
493 GotoEvent(fEventId + 1);
496 StartStopAutoLoadTimer();
500 void AliEveEventManager::PrevEvent()
502 // Loads previous event
503 // only in case of manual mode
505 GotoEvent(fEventId - 1);
506 StartStopAutoLoadTimer();
510 void AliEveEventManager::Close()
512 // Close the event data-files and delete ESD, ESDfriend, run-loader
516 delete fESD; fESD = 0;
517 delete fESDfriend; fESDfriend = 0;
519 delete fESDTree; fESDTree = 0;
520 delete fESDFile; fESDFile = 0;
524 delete fRunLoader; fRunLoader = 0;
528 delete fRawReader; fRawReader = 0;
533 /******************************************************************************/
534 // Static convenience functions, mainly used from macros.
535 /******************************************************************************/
537 AliRunLoader* AliEveEventManager::AssertRunLoader()
539 // Make sure AliRunLoader is initialized and return it.
540 // Throws exception in case run-loader is not available.
541 // Static utility for macros.
543 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
545 if (gAliEveEvent == 0)
546 throw (kEH + "ALICE event not ready.");
547 if (gAliEveEvent->fRunLoader == 0)
548 throw (kEH + "AliRunLoader not initialised.");
549 return gAliEveEvent->fRunLoader;
552 AliESDEvent* AliEveEventManager::AssertESD()
554 // Make sure AliESDEvent is initialized and return it.
555 // Throws exception in case ESD is not available.
556 // Static utility for macros.
558 static const TEveException kEH("AliEveEventManager::AssertESD ");
560 if (gAliEveEvent == 0)
561 throw (kEH + "ALICE event not ready.");
562 if (gAliEveEvent->fESD == 0)
563 throw (kEH + "AliESD not initialised.");
564 return gAliEveEvent->fESD;
567 AliESDfriend* AliEveEventManager::AssertESDfriend()
569 // Make sure AliESDfriend is initialized and return it.
570 // Throws exception in case ESDfriend-loader is not available.
571 // Static utility for macros.
573 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
575 if (gAliEveEvent == 0)
576 throw (kEH + "ALICE event not ready.");
577 if (gAliEveEvent->fESDfriend == 0)
578 throw (kEH + "AliESDfriend not initialised.");
579 return gAliEveEvent->fESDfriend;
582 AliRawReader* AliEveEventManager::AssertRawReader()
584 // Make sure raw-reader is initialized and return it.
586 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
588 if (gAliEveEvent == 0)
589 throw (kEH + "ALICE event not ready.");
590 if (gAliEveEvent->fRawReader == 0)
591 throw (kEH + "RawReader not ready.");
593 return gAliEveEvent->fRawReader;
596 AliMagF* AliEveEventManager::AssertMagField()
598 // Make sure AliMagF is initialized and return it.
599 // Throws exception in case magnetic field is not available.
600 // Static utility for macros.
604 if (gAliEveEvent && gAliEveEvent->fRunLoader && gAliEveEvent->fRunLoader->GetAliRun())
605 fgMagField = gAliEveEvent->fRunLoader->GetAliRun()->Field();
607 fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
612 TGeoManager* AliEveEventManager::AssertGeometry()
614 // Make sure AliGeomManager is initialized and returns the
615 // corresponding TGeoManger.
616 // gGeoManager is set to the return value.
617 // Throws exception if geometry can not be loaded or if it is not
618 // available and the TGeoManager is locked.
619 // Static utility for macros.
621 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
623 if (AliGeomManager::GetGeometry() == 0)
625 if (TGeoManager::IsLocked())
626 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
629 AliGeomManager::LoadGeometry();
630 if ( ! AliGeomManager::GetGeometry())
632 throw (kEH + "can not load geometry.");
634 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
636 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
637 // throw (kEH + "could not apply align objs.");
639 AliGeomManager::GetGeometry()->DefaultColors();
642 gGeoManager = AliGeomManager::GetGeometry();
646 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
648 // Set the automatic event loading mode
649 fAutoLoad = autoLoad;
650 StartStopAutoLoadTimer();
653 void AliEveEventManager::SetAutoLoadTime(Double_t time)
655 // Set the auto-load time in seconds
656 fAutoLoadTime = time;
657 StartStopAutoLoadTimer();
660 void AliEveEventManager::StartStopAutoLoadTimer()
662 // Create if needed and start
663 // the automatic event loading timer
668 fAutoLoadTimer = new TTimer;
669 fAutoLoadTimer->Connect("Timeout()","AliEveEventManager",this,"NextEvent()");
671 fAutoLoadTimer->Start((Long_t)fAutoLoadTime*1000,kTRUE);
675 if (fAutoLoadTimer) fAutoLoadTimer->Stop();
679 void AliEveEventManager::NewEventLoaded()
681 // Emit NewEventLoaded signal.
683 Emit("NewEventLoaded()");
686 const char* AliEveEventManager::GetEventInfo() const
688 // Dumps the event-header contents
690 static TString eventInfo;
693 eventInfo.Form("No raw-data event info is available!\n");
696 const UInt_t* attr = fRawReader->GetAttributes();
697 eventInfo.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",
698 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
699 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
700 fRawReader->GetClassMask(),
701 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
702 attr[0],attr[1],attr[2],
703 fRawReader->GetTimestamp());
706 eventInfo.Append(Form("\nNo ESD event info is available!\n"));
709 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
710 TString firedtrclasses = fESD->GetFiredTriggerClasses();
711 eventInfo.Append(Form("\nESD 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",
712 fESD->GetRunNumber(),
714 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
715 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
716 fESD->GetTriggerMask(),firedtrclasses.Data(),
717 fESD->GetEventNumberInFile(),
718 fESD->GetTimeStamp()));
721 return eventInfo.Data();