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 TString gaPath(Form("%s/galice.root", fPath.Data()));
173 // If i use open directly, we get fatal.
174 // Is this (AccessPathName check) ok for xrootd / alien?
175 if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
177 fRunLoader = AliRunLoader::Open(gaPath);
180 TString alicePath = fPath + "/";
181 fRunLoader->SetDirName(alicePath);
183 if (fRunLoader->LoadgAlice() != 0)
184 Warning(kEH, "failed loading gAlice via run-loader.");
186 if (fRunLoader->LoadHeader() == 0)
188 runNo = fRunLoader->GetHeader()->GetRun();
192 Warning(kEH, "failed loading run-loader's header.");
197 else // run-loader open failed
199 Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
202 else // galice not readable
204 Warning(kEH, "can not read '%s'.", gaPath.Data());
208 if (fgAssertRunLoader)
209 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
211 Warning(kEH, "Bootstraping of run-loader failed.");
215 TString esdPath(Form("%s/%s", fPath.Data(), fgESDFileName.Data()));
216 if ((fESDFile = TFile::Open(esdPath)))
218 fESD = new AliESDEvent();
219 fESDTree = (TTree*) fESDFile->Get("esdTree");
222 fESD->ReadFromTree(fESDTree);
223 fESDTree->GetEntry(0);
224 runNo = fESD->GetESDRun()->GetRunNumber();
226 // Check if ESDfriends exists and attach the branch
227 TString p(Form("%s/AliESDfriends.root", fPath.Data()));
228 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
230 fESDfriendExists = kTRUE;
231 fESDTree->SetBranchStatus ("ESDfriend*", 1);
232 fESDTree->SetBranchAddress("ESDfriend.", &fESDfriend);
237 delete fESDFile; fESDFile = 0;
238 Warning(kEH, "failed getting the esdTree.");
241 else // esd not readable
243 Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
249 throw (kEH + "ESD not initialized. Its precence was requested.");
251 Warning(kEH, "ESD not initialized.");
255 TString rawPath(Form("%s/%s", fPath.Data(), fgRawFileName.Data()));
256 // If i use open directly, raw-reader reports an error but i have
257 // no way to detect it.
258 // Is this (AccessPathName check) ok for xrootd / alien?
259 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
261 if (fgRawFileName.EndsWith("/"))
263 fRawReader = new AliRawReaderFile(rawPath);
265 else if (fgRawFileName.EndsWith(".root"))
267 fRawReader = new AliRawReaderRoot(rawPath);
269 else if (!fgRawFileName.IsNull())
271 fRawReader = new AliRawReaderDate(rawPath);
279 throw (kEH + "raw-data not initialized. Its precence was requested.");
281 Warning(kEH, "raw-data not initialized.");
289 fRawReader->NextEvent();
290 runNo = fRawReader->GetRunNumber();
291 printf("Determining run-no from raw ... run=%d\n", runNo);
292 fRawReader->RewindEvents();
294 throw (kEH + "unknown run number.");
299 AliCDBManager* cdb = AliCDBManager::Instance();
300 cdb->SetDefaultStorage(fgCdbUri);
301 if (cdb->IsDefaultStorageSet() == kFALSE)
302 throw (kEH + "CDB initialization failed.");
306 SetName(Form("Event %d", fEventId));
310 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd)
312 // Set an event from an external source
313 // The method is used in the online visualisation
314 fRunLoader = runLoader;
315 fRawReader = rawReader;
318 SetTitle("Online event in memory");
319 SetName("Online Event");
322 AfterNewEventLoaded();
325 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
327 // Returns maximum available event id.
328 // If raw-data is the only data-source this can not be known
329 // and 10,000,000 is returned.
330 // If neither data-source is initialised an exception is thrown.
331 // If refresh_esd is true and ESD is the primary event-data source
332 // its header is re-read from disk.
334 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
338 return fRunLoader->GetNumberOfEvents() - 1;
344 return fESDTree->GetEntries() - 1;
352 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
356 void AliEveEventManager::GotoEvent(Int_t event)
358 // Load data for specified event.
359 // If event is out of range an exception is thrown and old state
361 // After successful loading of event, the virtual function
362 // AfterNewEventLoaded() is called. This executes commands that
363 // were registered via TEveEventManager::AddNewEventCommand().
365 // If event is negative, it is subtracted from the number of
366 // available events, thus passing -1 will load the last event.
367 // This is not supported when raw-data is the only data-source
368 // as the number of events is not known.
370 static const TEveException kEH("AliEveEventManager::GotoEvent ");
375 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
377 event = fRunLoader->GetNumberOfEvents() + event;
382 maxEvent = fESDTree->GetEntries() - 1;
384 event = fESDTree->GetEntries() + event;
390 Error(kEH, "negative event id passed for raw-data as source. Operation not supported.");
393 Info(kEH, "number of events unknown for raw-data, setting max-event id to 10M.");
397 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
399 if (event < 0 || event > maxEvent)
401 throw (kEH + Form("event %d not present, available range [%d, %d].",
402 event, 0, maxEvent));
405 TEveManager::TRedrawDisabler rd(gEve);
406 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
408 // !!! MT this is somewhat brutal; at least optionally, one could be
409 // a bit gentler, checking for objs owning their external refs and having
410 // additinal parents.
414 if (fRunLoader->GetEvent(event) != 0)
415 throw (kEH + "failed getting required event.");
419 if (fESDTree->GetEntry(event) <= 0)
420 throw (kEH + "failed getting required event from ESD.");
422 if (fESDfriendExists)
423 fESD->SetESDfriend(fESDfriend);
428 Int_t rawEv = fEventId;
431 fRawReader->RewindEvents();
435 while (rawEv < event)
437 if ( ! fRawReader->NextEvent())
439 fRawReader->RewindEvents();
441 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
446 printf ("Loaded raw-event %d.\n", rawEv);
450 SetName(Form("Event %d", fEventId));
453 AfterNewEventLoaded();
456 void AliEveEventManager::NextEvent()
459 // either in automatic (online) or
463 if (fAutoLoadTimer) fAutoLoadTimer->Stop();
470 if (fEventId < GetMaxEventId(kTRUE))
471 GotoEvent(fEventId + 1);
474 StartStopAutoLoadTimer();
478 void AliEveEventManager::PrevEvent()
480 // Loads previous event
481 // only in case of manual mode
483 GotoEvent(fEventId - 1);
484 StartStopAutoLoadTimer();
488 void AliEveEventManager::Close()
490 // Close the event files.
491 // For the moment only ESD is closed. Needs to be investigated for
492 // AliRunLoader and Raw.
495 delete fESD; fESD = 0;
496 delete fESDfriend; fESDfriend = 0;
498 delete fESDTree; fESDTree = 0;
499 delete fESDFile; fESDFile = 0;
504 /******************************************************************************/
505 // Static convenience functions, mainly used from macros.
506 /******************************************************************************/
508 AliRunLoader* AliEveEventManager::AssertRunLoader()
510 // Make sure AliRunLoader is initialized and return it.
511 // Throws exception in case run-loader is not available.
512 // Static utility for macros.
514 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
516 if (gAliEveEvent == 0)
517 throw (kEH + "ALICE event not ready.");
518 if (gAliEveEvent->fRunLoader == 0)
519 throw (kEH + "AliRunLoader not initialised.");
520 return gAliEveEvent->fRunLoader;
523 AliESDEvent* AliEveEventManager::AssertESD()
525 // Make sure AliESDEvent is initialized and return it.
526 // Throws exception in case ESD is not available.
527 // Static utility for macros.
529 static const TEveException kEH("AliEveEventManager::AssertESD ");
531 if (gAliEveEvent == 0)
532 throw (kEH + "ALICE event not ready.");
533 if (gAliEveEvent->fESD == 0)
534 throw (kEH + "AliESD not initialised.");
535 return gAliEveEvent->fESD;
538 AliESDfriend* AliEveEventManager::AssertESDfriend()
540 // Make sure AliESDfriend is initialized and return it.
541 // Throws exception in case ESDfriend-loader is not available.
542 // Static utility for macros.
544 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
546 if (gAliEveEvent == 0)
547 throw (kEH + "ALICE event not ready.");
548 if (gAliEveEvent->fESDfriend == 0)
549 throw (kEH + "AliESDfriend not initialised.");
550 return gAliEveEvent->fESDfriend;
553 AliRawReader* AliEveEventManager::AssertRawReader()
555 // Make sure raw-reader is initialized and return it.
557 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
559 if (gAliEveEvent == 0)
560 throw (kEH + "ALICE event not ready.");
561 if (gAliEveEvent->fRawReader == 0)
562 throw (kEH + "RawReader not ready.");
564 return gAliEveEvent->fRawReader;
567 AliMagF* AliEveEventManager::AssertMagField()
569 // Make sure AliMagF is initialized and return it.
570 // Throws exception in case magnetic field is not available.
571 // Static utility for macros.
575 if (gAliEveEvent && gAliEveEvent->fRunLoader && gAliEveEvent->fRunLoader->GetAliRun())
576 fgMagField = gAliEveEvent->fRunLoader->GetAliRun()->Field();
578 fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
583 TGeoManager* AliEveEventManager::AssertGeometry()
585 // Make sure AliGeomManager is initialized and returns the
586 // corresponding TGeoManger.
587 // gGeoManager is set to the return value.
588 // Throws exception if geometry can not be loaded or if it is not
589 // available and the TGeoManager is locked.
590 // Static utility for macros.
592 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
594 if (AliGeomManager::GetGeometry() == 0)
596 if (TGeoManager::IsLocked())
597 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
600 AliGeomManager::LoadGeometry();
601 if ( ! AliGeomManager::GetGeometry())
603 throw (kEH + "can not load geometry.");
605 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
607 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
608 // throw (kEH + "could not apply align objs.");
610 AliGeomManager::GetGeometry()->DefaultColors();
613 gGeoManager = AliGeomManager::GetGeometry();
617 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
619 // Set the automatic event loading mode
620 fAutoLoad = autoLoad;
621 StartStopAutoLoadTimer();
624 void AliEveEventManager::SetAutoLoadTime(Double_t time)
626 // Set the auto-load time in seconds
627 fAutoLoadTime = time;
628 StartStopAutoLoadTimer();
631 void AliEveEventManager::StartStopAutoLoadTimer()
633 // Create if needed and start
634 // the automatic event loading timer
636 if (!fAutoLoadTimer) {
637 fAutoLoadTimer = new TTimer;
638 fAutoLoadTimer->Connect("Timeout()","AliEveEventManager",this,"NextEvent()");
640 fAutoLoadTimer->Start((Long_t)fAutoLoadTime*1000,kTRUE);
643 if (fAutoLoadTimer) fAutoLoadTimer->Stop();
647 const char* AliEveEventManager::GetEventInfo() const
649 // Dumps the event-header contents
651 static TString eventInfo;
654 eventInfo.Form("No raw-data event info is available!\n");
657 const UInt_t* attr = fRawReader->GetAttributes();
658 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",
659 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
660 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
661 fRawReader->GetClassMask(),
662 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
663 attr[0],attr[1],attr[2],
664 fRawReader->GetTimestamp());
667 eventInfo.Append(Form("\nNo ESD event info is available!\n"));
670 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
671 TString firedtrclasses = fESD->GetFiredTriggerClasses();
672 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",
673 fESD->GetRunNumber(),
675 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
676 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
677 fESD->GetTriggerMask(),firedtrclasses.Data(),
678 fESD->GetEventNumberInFile(),
679 fESD->GetTimeStamp()));
682 return eventInfo.Data();