1 // $Id: AliEveEventManager.cxx 64557 2013-10-16 20:03:08Z hristov $
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"
14 #include <THashList.h>
15 #include <TEveElement.h>
16 #include <TEveManager.h>
17 #include <TEveViewer.h>
20 #include <AliRunLoader.h>
22 #include <AliESDRun.h>
23 #include <AliESDEvent.h>
24 #include <AliESDfriend.h>
25 #include <AliAODEvent.h>
27 #include <AliRecoParam.h>
28 #include <AliCentralTrigger.h>
29 #include <AliCDBEntry.h>
30 #include <AliTriggerClass.h>
31 #include <AliTriggerConfiguration.h>
32 #include <AliTriggerCluster.h>
33 #include <AliDetectorRecoParam.h>
36 #include <AliRawEventHeaderBase.h>
37 #include <AliRawReaderRoot.h>
38 #include <AliRawReaderFile.h>
39 #include <AliRawReaderDate.h>
41 #include <AliCDBManager.h>
42 #include <AliCDBStorage.h>
43 #include <AliGRPObject.h>
44 #include <AliHeader.h>
45 #include <AliGeomManager.h>
46 #include <AliGRPManager.h>
47 #include <AliSysInfo.h>
51 #include <TGeoManager.h>
52 #include <TGeoGlobalMagField.h>
54 #include <TTimeStamp.h>
62 #include "AliStorageEventManager.h"
65 //==============================================================================
66 //==============================================================================
68 //==============================================================================
70 //______________________________________________________________________________
72 // Provides interface for loading and navigating standard AliRoot data
73 // (AliRunLoader), ESD, AOD and RAW.
75 // ESDfriend is attached automatically, if the file is found.
77 // AODfriends are not attached automatically as there are several
78 // possible files involved. To have a specific AODfriend attached, call
80 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
81 // before initializing the event-manager.
83 // Also provides interface to magnetic-field and geometry. Mostly
84 // intended as wrappers over standard AliRoot functionality for
85 // convenient use from visualizateion macros.
87 // There can be a single main event-manger, it is stored in private
88 // data member fgMaster and can be accessed via static member function
91 // For event overlaying and embedding one can instantiate additional
92 // event-managers via static method AddDependentManager(const TString& path).
93 // This interface is under development.
95 ClassImp(AliEveEventManager)
97 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
98 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
99 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
100 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
102 TString AliEveEventManager::fgESDFileName("AliESDs.root");
103 AliEveEventManager::EVisibleESDTrees AliEveEventManager::fgESDvisibleTrees(AliEveEventManager::kOfflineTree);
104 TString AliEveEventManager::fgESDfriendsFileName("AliESDfriends.root");
105 TString AliEveEventManager::fgAODFileName("AliAOD.root");
106 TString AliEveEventManager::fgGAliceFileName("galice.root");
107 TString AliEveEventManager::fgRawFileName("raw.root");
108 TString AliEveEventManager::fgCdbUri;
110 TList* AliEveEventManager::fgAODfriends = 0;
112 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
114 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
115 AliMagF* AliEveEventManager::fgMagField = 0;
116 AliRecoParam* AliEveEventManager::fgRecoParam = 0;
117 Bool_t AliEveEventManager::fgUniformField = kFALSE;
119 AliEveEventManager* AliEveEventManager::fgMaster = 0;
120 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
122 void AliEveEventManager::GetNextEvent()
125 AliStorageEventManager *eventManager =
126 AliStorageEventManager::GetEventManagerInstance();
127 eventManager->CreateSocket(EVENTS_SERVER_SUB);
133 AliESDEvent *tmpEvent = NULL;
134 TTree *tmpTree = NULL;
138 //if(tmpEvent){delete tmpEvent;tmpEvent=0;}
139 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,-1,&tmpTree);
143 if(tmpEvent->GetRunNumber()>=0)
146 if(fEventInUse == 0){fWritingToEventIndex = 1;}
147 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
148 cout<<"Writing to:"<<fWritingToEventIndex<<endl;
149 if(fCurrentEvent[fWritingToEventIndex])
151 cout<<"DELETING:"<<fCurrentEvent[fWritingToEventIndex]<<endl;
152 delete fCurrentEvent[fWritingToEventIndex];
153 fCurrentEvent[fWritingToEventIndex]=0;
154 delete fCurrentTree[fWritingToEventIndex];
156 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
157 fCurrentTree[fWritingToEventIndex] = tmpTree;
158 fIsNewEventAvaliable = true;
166 void AliEveEventManager::InitInternals()
168 // Initialize internal members.
170 static const TEveException kEH("AliEveEventManager::InitInternals ");
174 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
184 fAutoLoadTimer = new TTimer;
185 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
186 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
188 fExecutor = new AliEveMacroExecutor;
190 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
191 fTransients->IncDenyDestroy();
192 gEve->AddToListTree(fTransients, kFALSE);
194 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
195 fTransientLists->IncDenyDestroy();
196 gEve->AddToListTree(fTransientLists, kFALSE);
198 fPEventSelector = new AliEveEventSelector(this);
200 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
203 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
204 TEveEventManager(name, ""),
207 fESDFile (0), fESDTree (0), fHLTESDTree(0), fESD (0),
208 fESDfriend (0), fESDfriendExists(kFALSE),
209 fAODFile (0), fAODTree (0), fAOD (0),
210 fRawReader (0), fEventInfo(),
211 fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
212 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
213 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
214 fExecutor (0), fTransients(0), fTransientLists(0),
217 fAutoLoadTimerRunning(kFALSE),
218 fgSubSock(EVENTS_SERVER_SUB),
220 fWritingToEventIndex(0),
221 fIsNewEventAvaliable(false)
223 // Constructor with event-id.
234 cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
235 fGetEventThread = new TThread("fGetEventThread",Dispatch,(void*)this);
236 fGetEventThread->Run();
238 cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
242 AliEveEventManager::~AliEveEventManager()
245 fAutoLoadTimer->Stop();
246 fAutoLoadTimer->Disconnect("Timeout");
255 fTransients->DecDenyDestroy();
256 fTransients->Destroy();
258 fTransientLists->DecDenyDestroy();
259 fTransientLists->Destroy();
264 /******************************************************************************/
266 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
268 fgESDvisibleTrees = shown;
269 // Set file-name for opening ESD, default "AliESDs.root".
270 if (esd.IsNull()) return;
273 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
277 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
279 // Set file-name for opening ESD friend, default "AliESDfriends.root".
281 if (esdf.IsNull()) return;
282 fgESDfriendsFileName = esdf;
284 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
287 void AliEveEventManager::SetAODFileName(const TString& aod)
289 // Set file-name for opening AOD, default "AliAOD.root".
291 if (aod.IsNull()) return;
294 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
298 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
300 // Add new AOD friend file-name to be attached when opening AOD.
301 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
303 if (fgAODfriends == 0)
305 fgAODfriends = new TList;
306 fgAODfriends->SetOwner(kTRUE);
308 if (fgAODfriends->FindObject(friendFileName) == 0)
310 fgAODfriends->Add(new TObjString(friendFileName));
314 void AliEveEventManager::SetRawFileName(const TString& raw)
316 // Set file-name for opening of raw-data, default "raw.root"
317 if (raw.IsNull()) return;
322 void AliEveEventManager::SetCdbUri(const TString& cdb)
324 // Set path to CDB, there is no default.
325 if ( ! cdb.IsNull()) fgCdbUri = cdb;
328 void AliEveEventManager::SetGAliceFileName(const TString& galice)
330 // Set file-name for opening gAlice, default "galice.root".
332 if ( galice.IsNull()) return;
333 fgGAliceFileName = galice;
335 if (galice.EndsWith(".zip")) fgGAliceFileName.Form("%s#galice.root",galice.Data());
338 void AliEveEventManager::SetFilesPath(const TString& urlPath)
340 TString path = urlPath;
341 gSystem->ExpandPathName(path);
342 if (path.IsNull() || path == ".")
344 path = gSystem->WorkingDirectory();
348 if(path.EndsWith(".zip")) // if given a path to root_archive.zip
350 else if(!path.EndsWith("/"))
353 SetESDFileName( TString(Form("%s%sAliESDs.root", path.Data(), sep.Data())) );
354 SetESDfriendFileName( TString(Form("%s%sAliESDfriends.root", path.Data(), sep.Data())) );
355 SetAODFileName( TString(Form("%s%sAliAOD.root", path.Data(), sep.Data())) );
356 AddAODfriend( TString(Form("%s%sAliAOD.VertexingHF.root", path.Data(), sep.Data())) );
357 SetGAliceFileName( TString(Form("%s%sgalice.root", path.Data(), sep.Data())) );
358 SetRawFileName(TString(Form("%s%sraw.root", path.Data(), sep.Data())));
361 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
362 Bool_t assertAod, Bool_t assertRaw)
364 // Set global flags that detrmine which parts of the event-data must
365 // be present when the event is opened.
367 fgAssertRunLoader = assertRunloader;
368 fgAssertESD = assertEsd;
369 fgAssertAOD = assertAod;
370 fgAssertRaw = assertRaw;
373 void AliEveEventManager::SearchRawForCentralReconstruction()
375 // Enable searching of raw data in standard location. The path passed to
376 // Open() is expected to point to a centrally reconstructed run, e.g.:
377 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
379 fgRawFromStandardLoc = kTRUE;
382 /******************************************************************************/
384 void AliEveEventManager::Open()
386 // Open event-data from URL specified in path.
387 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
388 // Warning is reported if run-loader or ESD is not found.
389 // Global data-members fgAssertRunLoader and fgAssertESD can be set
390 // to throw exceptions instead.
392 static const TEveException kEH("AliEveEventManager::Open ");
396 throw (kEH + "Event-loop is under external control.");
400 throw (kEH + "Event-files already opened.");
405 // Open ESD and ESDfriends
407 if ((fESDFile = TFile::Open(fgESDFileName)))
409 fESD = new AliESDEvent();
411 switch(fgESDvisibleTrees){
412 case AliEveEventManager::kOfflineTree :
413 fESDTree = readESDTree("esdTree", runNo);
415 case AliEveEventManager::kHLTTree :
416 fHLTESDTree = readESDTree("HLTesdTree", runNo);
419 fESDTree = readESDTree("esdTree", runNo);
420 fHLTESDTree = readESDTree("HLTesdTree", runNo);
423 if(!fESDTree && !fHLTESDTree){
424 // both ESD trees are == 0
425 delete fESDFile; fESDFile = 0;
426 delete fESD; fESD = 0;
431 else // esd file not readable
433 Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());
435 if (fESDTree == 0 && fHLTESDTree==0)
439 throw (kEH + "ESD not initialized. Its precence was requested.");
441 Warning(kEH, "ESD not initialized.");
445 // Open AOD and registered friends
446 if ( (fAODFile = TFile::Open(fgAODFileName)) )
448 fAOD = new AliAODEvent();
449 fAODTree = (TTree*) fAODFile->Get("aodTree");
452 // Check if AODfriends exist and attach them.
453 TIter friends(fgAODfriends);
455 while ((name = (TObjString*) friends()) != 0)
457 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
458 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
459 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
461 fAODTree->AddFriend("aodTree", name->GetName());
465 fAOD->ReadFromTree(fAODTree);
467 if (fAODTree->GetEntry(0) <= 0)
469 delete fAODFile; fAODFile = 0;
470 delete fAOD; fAOD = 0;
471 Warning(kEH, "failed getting the first entry from addTree.");
476 runNo = fAOD->GetRunNumber();
481 delete fAODFile; fAODFile = 0;
482 delete fAOD; fAOD = 0;
483 Warning(kEH, "failed getting the aodTree.");
486 else // aod not readable
488 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
494 throw (kEH + "AOD not initialized. Its precence was requested.");
496 Warning(kEH, "AOD not initialized.");
500 // Open RunLoader from galice.root
501 TFile *gafile = TFile::Open(fgGAliceFileName);
506 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
509 TString alicePath(gSystem->DirName(fgGAliceFileName));
510 alicePath.Append("/");
511 fRunLoader->SetDirName(alicePath);
513 if (fRunLoader->LoadgAlice() != 0)
514 Warning(kEH, "failed loading gAlice via run-loader.");
516 if (fRunLoader->LoadHeader() == 0)
519 runNo = fRunLoader->GetHeader()->GetRun();
523 Warning(kEH, "failed loading run-loader's header.");
528 else // run-loader open failed
530 Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());
534 else // galice not readable
536 Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());
540 if (fgAssertRunLoader)
541 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
543 Warning(kEH, "Bootstraping of run-loader failed.");
546 // Open raw-data file
549 if (fgRawFromStandardLoc)
551 if (!fgRawFileName.BeginsWith("alien:"))
552 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
553 if (!fgRawFileName.Contains("/ESDs/"))
554 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
556 TPMERegexp chunk("/([\\d\\.])+/?$");
557 Int_t nm = chunk.Match(fgRawFileName);
559 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
561 TPMERegexp esdstrip("/ESDs/.*");
562 rawPath = fgRawFileName;
563 esdstrip.Substitute(rawPath, "/raw/");
567 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
571 rawPath = fgRawFileName;
573 // If i use open directly, raw-reader reports an error but i have
574 // no way to detect it.
575 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
576 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
577 if (fgAssertRaw == kFALSE)
579 AliLog::SetGlobalLogLevel(AliLog::kFatal);
581 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
583 fRawReader = AliRawReader::Create(rawPath);
587 fRawReader = AliRawReader::Create(fgRawFileName);
589 if (fgAssertRaw == kFALSE)
591 AliLog::SetGlobalLogLevel(oldLogLevel);
598 throw (kEH + "raw-data not initialized. Its precence was requested.");
602 Warning(kEH, "raw-data not initialized.");
610 if ( ! fRawReader->NextEvent())
612 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
614 runNo = fRawReader->GetRunNumber();
615 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
616 fRawReader->RewindEvents();
620 fExternalCtrl = kTRUE;
626 // Initialize OCDB ... only in master event-manager
634 void AliEveEventManager::InitOCDB(int runNo)
636 static const TEveException kEH("AliEveEventManager::InitOCDB ");
637 //if (this == fgMaster)
639 AliCDBManager* cdb = AliCDBManager::Instance();
640 if (cdb->IsDefaultStorageSet() == kTRUE)
642 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
643 cdb->GetDefaultStorage()->GetURI().Data());
647 if (fgCdbUri.IsNull())
649 gEnv->SetValue("Root.Stacktrace", "no");
650 Fatal("Open()", "OCDB path was not specified.");
653 // Handle some special cases for MC (should be in OCDBManager).
654 if (fgCdbUri == "mcideal://")
655 cdb->SetDefaultStorage("MC", "Ideal");
656 else if (fgCdbUri == "mcresidual://")
657 cdb->SetDefaultStorage("MC", "Residual");
658 else if (fgCdbUri == "mcfull://")
659 cdb->SetDefaultStorage("MC", "Full");
660 else if (fgCdbUri == "local://") {
661 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
662 cdb->SetDefaultStorage(fgCdbUri);
664 cdb->SetDefaultStorage(fgCdbUri);
668 if (cdb->IsDefaultStorageSet() == kFALSE)
669 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
672 if (fgCdbUri.BeginsWith("local://"))
674 TString curPath = gSystem->WorkingDirectory();
675 TString grp = "GRP/GRP/Data";
676 TString grppath = curPath + "/" + grp;
677 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
679 if (cdb->GetSpecificStorage(grp))
681 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
685 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
686 TString lpath("local://");
688 cdb->SetSpecificStorage(grp, lpath);
695 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
697 // Set an event from an external source.
698 // The method is used in the online visualisation.
699 // AOD is not supported.
701 static const TEveException kEH("AliEveEventManager::SetEvent ");
705 Warning(kEH, "Event-files were open. Closing and switching to external control.");
709 Info(kEH,"setting it!!! ============================");
711 fRunLoader = runLoader;
712 fRawReader = rawReader;
719 fExternalCtrl = kTRUE;
721 SetTitle("Online event in memory");
722 SetName ("Online Event");
725 AfterNewEventLoaded();
727 if (fAutoLoad) StartAutoLoadTimer();
731 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
733 // Returns maximum available event id.
734 // If under external control or event is not opened -1 is returned.
735 // If raw-data is the only data-source this can not be known
736 // and 10,000,000 is returned.
737 // If neither data-source is initialised an exception is thrown.
738 // If refresh_esd is true and ESD is the primary event-data source
739 // its header is re-read from disk.
741 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
743 if (fExternalCtrl || fIsOpen == kFALSE)
748 if ((fESDTree!=0) || (fHLTESDTree!=0))
752 if(fESDTree!=0) fESDTree->Refresh();
753 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
754 fPEventSelector->Update();
758 switch(fgESDvisibleTrees){
760 case AliEveEventManager::kOfflineTree :
761 maxEventId = fESDTree->GetEntries() - 1;
763 case AliEveEventManager::kHLTTree :
764 maxEventId = fHLTESDTree->GetEntries() - 1;
772 return fAODTree->GetEntries() - 1;
776 return fRunLoader->GetNumberOfEvents() - 1;
780 Int_t n = fRawReader->GetNumberOfEvents() - 1;
781 return n > -1 ? n : 10000000;
785 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
789 void AliEveEventManager::GotoEvent(Int_t event)
791 // Load data for specified event.
792 // If event is out of range an exception is thrown and old state
794 // After successful loading of event, the virtual function
795 // AfterNewEventLoaded() is called. This executes commands that
796 // were registered via TEveEventManager::AddNewEventCommand().
798 // If event is negative, it is subtracted from the number of
799 // available events, thus passing -1 will load the last event.
800 // This is not supported when raw-data is the only data-source
801 // as the number of events is not known.
803 static const TEveException kEH("AliEveEventManager::GotoEvent ");
805 if (fAutoLoadTimerRunning)
807 throw (kEH + "Event auto-load timer is running.");
811 throw (kEH + "Event-loop is under external control.");
815 throw (kEH + "Event-files not opened.");
823 if ((fESDTree!=0) || (fHLTESDTree!=0))
826 if (event >= fESDTree->GetEntries())
828 maxEvent = fESDTree->GetEntries() - 1;
830 event = fESDTree->GetEntries() + event;
834 if (event >= fHLTESDTree->GetEntries())
835 fHLTESDTree->Refresh();
836 maxEvent = fHLTESDTree->GetEntries() - 1;
838 event = fHLTESDTree->GetEntries() + event;
844 maxEvent = fAODTree->GetEntries() - 1;
846 event = fAODTree->GetEntries() + event;
850 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
852 event = fRunLoader->GetNumberOfEvents() + event;
856 maxEvent = fRawReader->GetNumberOfEvents() - 1;
861 Error(kEH, "current raw-data source does not support direct event access.");
864 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
869 event = fRawReader->GetNumberOfEvents() + event;
874 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
876 if (event < 0 || event > maxEvent)
878 throw (kEH + Form("event %d not present, available range [%d, %d].",
879 event, 0, maxEvent));
882 TString sysInfoHeader;
883 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
884 AliSysInfo::AddStamp(sysInfoHeader + "Start");
886 TEveManager::TRedrawDisabler rd(gEve);
887 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
889 // !!! MT this is somewhat brutal; at least optionally, one could be
890 // a bit gentler, checking for objs owning their external refs and having
891 // additinal parents.
892 gEve->GetViewers()->DeleteAnnotations();
893 fTransients->DestroyElements();
894 for (TEveElement::List_i i = fTransientLists->BeginChildren();
895 i != fTransientLists->EndChildren(); ++i)
897 (*i)->DestroyElements();
901 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
904 if (fESDTree->GetEntry(event) <= 0)
905 throw (kEH + "failed getting required event from ESD.");
907 if (fESDfriendExists)
908 fESD->SetESDfriend(fESDfriend);
912 if (fHLTESDTree->GetEntry(event) <= 0)
913 throw (kEH + "failed getting required event from HLT ESD.");
915 if (fESDfriendExists)
916 fESD->SetESDfriend(fESDfriend);
920 if (fAODTree->GetEntry(event) <= 0)
921 throw (kEH + "failed getting required event from AOD.");
925 if (fRunLoader->GetEvent(event) != 0)
926 throw (kEH + "failed getting required event.");
931 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
932 if (fRawReader->GotoEvent(event) == kFALSE)
934 // Use fallback method - iteration with NextEvent().
935 Int_t rawEv = fEventId;
938 fRawReader->RewindEvents();
942 while (rawEv < event)
944 if ( ! fRawReader->NextEvent())
946 fRawReader->RewindEvents();
948 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
952 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
958 if (this == fgMaster)
960 SetName(Form("Event %d", fEventId));
964 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
966 AfterNewEventLoaded();
968 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
971 void AliEveEventManager::Timeout()
976 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
980 InitOCDB(event->GetRunNumber());
982 printf("======================= setting event to %d\n", fEventId);
983 SetEvent(0,0,event,0);
986 void AliEveEventManager::NextEvent()
989 // Does magick needed for online display when under external event control.
991 static const TEveException kEH("AliEveEventManager::NextEvent ");
993 if (fAutoLoadTimerRunning)
995 throw (kEH + "Event auto-load timer is running.");
1002 cout<<fIsNewEventAvaliable<<"\t"<<"\t"<<fWritingToEventIndex<<endl;
1004 if(fIsNewEventAvaliable)
1006 cout<<"new event"<<endl;
1008 if(fWritingToEventIndex == 0) fEventInUse = 0;
1009 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1010 cout<<"Using:"<<fEventInUse<<endl;
1012 if(fCurrentEvent[fEventInUse])
1014 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1016 printf("======================= setting event to %d\n", fEventId);
1019 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1020 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1023 fIsNewEventAvaliable = false;
1026 else{cout<<"No new event is avaliable."<<endl;}
1030 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1033 if (fPEventSelector->FindNext(nextevent))
1035 GotoEvent(nextevent);
1038 else if (fEventId < GetMaxEventId(kTRUE))
1040 GotoEvent(fEventId + 1);
1043 gSystem->ProcessEvents();
1045 //if(fGetEventThread){delete fGetEventThread;fGetEventThread=0;}
1048 void AliEveEventManager::PrevEvent()
1050 // Loads previous event.
1052 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1054 if (fAutoLoadTimerRunning)
1056 throw (kEH + "Event auto-load timer is running.");
1060 throw (kEH + "Event-loop is under external control.");
1063 if ((fESDTree!=0) || (fHLTESDTree!=0))
1066 if (fPEventSelector->FindPrev(nextevent))
1068 GotoEvent(nextevent);
1071 else if (fEventId > 0)
1073 GotoEvent(fEventId - 1);
1077 void AliEveEventManager::MarkCurrentEvent()
1080 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1081 struct eventStruct mark;
1082 mark.runNumber = fESD->GetRunNumber();
1083 mark.eventNumber = fESD->GetEventNumberInFile();
1084 requestMessage->messageType = REQUEST_MARK_EVENT;
1085 requestMessage->event = mark;
1087 AliStorageEventManager *eventManager =
1088 AliStorageEventManager::GetEventManagerInstance();
1089 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1092 std::future<bool> unused = std::async([]()
1094 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1095 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1099 //fStatusLabel->SetText("Event marked");
1100 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1104 //fStatusLabel->SetText("Couldn't mark this event");
1105 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1110 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1111 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1116 //fStatusLabel->SetText("Event marked");
1117 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1121 //fStatusLabel->SetText("Couldn't mark this event");
1122 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1124 if(requestMessage){delete requestMessage;}
1128 void AliEveEventManager::Close()
1130 // Close the event data-files and delete ESD, ESDfriend, run-loader
1133 static const TEveException kEH("AliEveEventManager::Close ");
1137 throw (kEH + "Event-files not opened.");
1140 if (fAutoLoadTimerRunning)
1141 StopAutoLoadTimer();
1143 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1144 delete fESD; fESD = 0;
1145 // delete fESDfriend; // friend tree is deleted with the tree
1147 fESDfriendExists = kFALSE;
1149 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1150 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1151 delete fESDFile; fESDFile = 0;
1155 delete fAOD; fAOD = 0;
1157 delete fAODTree; fAODTree = 0;
1158 delete fAODFile; fAODFile = 0;
1162 delete fRunLoader; fRunLoader = 0;
1166 delete fRawReader; fRawReader = 0;
1175 //------------------------------------------------------------------------------
1176 // Static convenience functions, mainly used from macros.
1177 //------------------------------------------------------------------------------
1179 Int_t AliEveEventManager::CurrentEventId()
1181 // Return current event-id.
1183 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1185 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1186 throw (kEH + "ALICE event not ready.");
1187 return fgCurrent->GetEventId();
1190 Bool_t AliEveEventManager::HasRunLoader()
1192 // Check if AliRunLoader is initialized.
1194 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1197 Bool_t AliEveEventManager::HasESD()
1199 // Check if AliESDEvent is initialized.
1201 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1204 Bool_t AliEveEventManager::HasESDfriend()
1206 // Check if AliESDfriend is initialized.
1208 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1211 Bool_t AliEveEventManager::HasAOD()
1213 // Check if AliESDEvent is initialized.
1215 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1218 Bool_t AliEveEventManager::HasRawReader()
1220 // Check if raw-reader is initialized.
1222 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1225 AliRunLoader* AliEveEventManager::AssertRunLoader()
1227 // Make sure AliRunLoader is initialized and return it.
1228 // Throws exception in case run-loader is not available.
1229 // Static utility for macros.
1231 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1233 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1234 throw (kEH + "ALICE event not ready.");
1235 if (fgCurrent->fRunLoader == 0)
1236 throw (kEH + "AliRunLoader not initialised.");
1237 return fgCurrent->fRunLoader;
1240 AliESDEvent* AliEveEventManager::AssertESD()
1242 // Make sure AliESDEvent is initialized and return it.
1243 // Throws exception in case ESD is not available.
1244 // Static utility for macros.
1246 static const TEveException kEH("AliEveEventManager::AssertESD ");
1248 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1249 throw (kEH + "ALICE event not ready.");
1250 if (fgCurrent->fESD == 0)
1251 throw (kEH + "AliESD not initialised.");
1252 return fgCurrent->fESD;
1255 AliESDfriend* AliEveEventManager::AssertESDfriend()
1257 // Make sure AliESDfriend is initialized and return it.
1258 // Throws exception in case ESDfriend-loader is not available.
1259 // Static utility for macros.
1261 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1263 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1264 throw (kEH + "ALICE event not ready.");
1265 if (fgCurrent->fESDfriend == 0)
1266 throw (kEH + "AliESDfriend not initialised.");
1267 return fgCurrent->fESDfriend;
1270 AliAODEvent* AliEveEventManager::AssertAOD()
1272 // Make sure AliAODEvent is initialized and return it.
1273 // Throws exception in case AOD is not available.
1274 // Static utility for macros.
1276 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1278 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1279 throw (kEH + "ALICE event not ready.");
1280 if (fgCurrent->fAOD == 0)
1281 throw (kEH + "AliAOD not initialised.");
1282 return fgCurrent->fAOD;
1285 AliRawReader* AliEveEventManager::AssertRawReader()
1287 // Make sure raw-reader is initialized and return it.
1289 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1291 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1292 throw (kEH + "ALICE event not ready.");
1293 if (fgCurrent->fRawReader == 0)
1294 throw (kEH + "RawReader not ready.");
1296 return fgCurrent->fRawReader;
1299 //==============================================================================
1301 AliMagF* AliEveEventManager::AssertMagField()
1303 // Make sure AliMagF is initialized and returns it.
1304 // Throws exception in case magnetic field is not available.
1305 // Static utility for macros.
1307 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1312 if (TGeoGlobalMagField::Instance()->GetField())
1314 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1315 if (fgMagField == 0)
1316 throw kEH + "Global field set, but it is not AliMagF.";
1325 if (TGeoGlobalMagField::Instance()->GetField())
1327 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1328 if (fgMagField == 0)
1329 throw kEH + "Global field set, but it is not AliMagF.";
1333 throw kEH + "Could not initialize magnetic field.";
1339 TGeoManager* AliEveEventManager::AssertGeometry()
1341 // Make sure AliGeomManager is initialized and returns the
1342 // corresponding TGeoManger.
1343 // gGeoManager is set to the return value.
1344 // Throws exception if geometry can not be loaded or if it is not
1345 // available and the TGeoManager is locked.
1346 // Static utility for macros.
1348 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1350 if (AliGeomManager::GetGeometry() == 0)
1352 if (TGeoManager::IsLocked())
1353 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1356 AliGeomManager::LoadGeometry();
1357 if ( ! AliGeomManager::GetGeometry())
1359 throw (kEH + "can not load geometry.");
1361 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1363 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1364 // throw (kEH + "could not apply align objs.");
1366 AliGeomManager::GetGeometry()->DefaultColors();
1369 gGeoManager = AliGeomManager::GetGeometry();
1373 AliRecoParam* AliEveEventManager::AssertRecoParams()
1381 Bool_t AliEveEventManager::InitRecoParam()
1383 // This is mostly a reap-off from reconstruction
1384 // The method accesses OCDB and retrieves all
1385 // the available reco-param objects from there.
1387 fgRecoParam = new AliRecoParam;
1388 const Int_t kNDetectors = 14;
1390 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1392 Bool_t isOK = kTRUE;
1394 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1395 ::Info(kEH, "Using custom GRP reconstruction parameters");
1398 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1400 AliCDBPath path("GRP","Calib","RecoParam");
1401 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1403 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1407 TObject *recoParamObj = entry->GetObject();
1408 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1409 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1410 // Registering them in AliRecoParam
1411 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1413 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1414 // GRP has only onse set of reco parameters
1415 // Registering it in AliRecoParam
1416 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1417 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1418 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1421 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1428 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1431 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1433 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1434 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1438 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1440 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1441 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1443 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1447 TObject *recoParamObj = entry->GetObject();
1448 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1449 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1450 // Registering them in AliRecoParam
1451 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1453 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1454 // The detector has only onse set of reco parameters
1455 // Registering it in AliRecoParam
1456 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1457 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1458 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1461 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1477 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1479 if(!fESDFile && !fESD) return 0;
1481 static const TEveException kEH("AliEveEventManager::readESDTree ");
1483 TTree* tempTree = 0;
1485 tempTree =(TTree*) fESDFile->Get(treeName);
1488 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1491 if (!esdFriendFile->IsZombie())
1493 esdFriendFile->Close();
1494 fESDfriendExists = kTRUE;
1495 tempTree->SetBranchStatus ("ESDfriend*", 1);
1497 delete esdFriendFile;
1500 fESD->ReadFromTree(tempTree);
1501 if (fESDfriendExists)
1503 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1504 Info(kEH, "found and attached ESD friend.");
1508 Warning(kEH, "ESDfriend not found.");
1511 if (tempTree->GetEntry(0) <= 0)
1513 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1518 runNo = fESD->GetESDRun()->GetRunNumber();
1523 Warning(kEH, "failed getting the tree:%s", treeName);
1530 //------------------------------------------------------------------------------
1532 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1534 // Create and attach a dependent event-manager.
1535 // It is not added into eve list tree.
1537 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1540 throw(kEH + "Master event-manager must be instantiated first.");
1542 if (fgMaster->fSubManagers == 0)
1544 fgMaster->fSubManagers = new TList;
1545 fgMaster->fSubManagers->SetOwner(kTRUE);
1548 AliEveEventManager* new_mgr = 0;
1552 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1553 new_mgr->SetFilesPath(path);
1554 fgMaster->fSubManagers->Add(new_mgr);
1556 catch (TEveException& exc)
1558 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1560 fgCurrent = fgMaster;
1565 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1567 // Get a dependant manager by name.
1568 // This will not change the current manager, use helper class
1569 // AliEveEventManager::CurrentChanger for that.
1571 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1574 throw(kEH + "Master event-manager must be instantiated first.");
1576 if (fgMaster->fSubManagers == 0)
1579 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1582 AliEveEventManager* AliEveEventManager::GetMaster()
1584 // Get master event-manager.
1589 AliEveEventManager* AliEveEventManager::GetCurrent()
1591 // Get current event-manager.
1596 void AliEveEventManager::RegisterTransient(TEveElement* element)
1598 GetCurrent()->fTransients->AddElement(element);
1601 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1603 GetCurrent()->fTransientLists->AddElement(element);
1606 //------------------------------------------------------------------------------
1607 // Autoloading of events
1608 //------------------------------------------------------------------------------
1610 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1612 // Set the auto-load time in seconds
1614 fAutoLoadTime = time;
1617 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1619 // Set the automatic event loading mode
1621 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1623 if (fAutoLoad == autoLoad)
1625 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1629 fAutoLoad = autoLoad;
1632 StartAutoLoadTimer();
1636 StopAutoLoadTimer();
1640 void AliEveEventManager::SetTrigSel(Int_t trig)
1642 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1646 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1651 ULong64_t trigMask = 0;
1652 if (trig >= 0) trigMask = (1ull << trig);
1653 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1654 fRawReader->SelectEvents(-1,trigMask,NULL);
1658 void AliEveEventManager::StartAutoLoadTimer()
1660 // Start the auto-load timer.
1662 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1663 fAutoLoadTimer->Reset();
1664 fAutoLoadTimer->TurnOn();
1665 fAutoLoadTimerRunning = kTRUE;
1668 void AliEveEventManager::StopAutoLoadTimer()
1670 // Stop the auto-load timer.
1672 fAutoLoadTimerRunning = kFALSE;
1673 fAutoLoadTimer->TurnOff();
1676 void AliEveEventManager::AutoLoadNextEvent()
1678 // Called from auto-load timer, so it has to be public.
1679 // Do NOT call it directly.
1681 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1683 Info(kEH, "called!");
1685 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1687 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1691 StopAutoLoadTimer();
1694 StartAutoLoadTimer();
1697 //------------------------------------------------------------------------------
1698 // Post event-loading functions
1699 //------------------------------------------------------------------------------
1701 void AliEveEventManager::AfterNewEventLoaded()
1703 // Execute registered macros and commands.
1704 // At the end emit NewEventLoaded signal.
1706 // Virtual from TEveEventManager.
1708 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1710 Info(kEH, "------------------!!!------------");
1712 NewEventDataLoaded();
1713 if (fExecutor) fExecutor->ExecMacros();
1715 TEveEventManager::AfterNewEventLoaded();
1718 if (this == fgMaster && fSubManagers != 0)
1720 TIter next(fSubManagers);
1721 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1723 gEve->SetCurrentEvent(fgCurrent);
1726 fgCurrent->GotoEvent(fEventId);
1728 catch (TEveException& exc)
1730 // !!! Should somehow tag / disable / remove it?
1731 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1732 fEventId, fgCurrent->GetName(), exc.Data());
1734 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
1736 fgCurrent = fgMaster;
1737 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
1738 gEve->SetCurrentEvent(fgMaster);
1742 void AliEveEventManager::NewEventDataLoaded()
1744 // Emit NewEventDataLoaded signal.
1746 Emit("NewEventDataLoaded()");
1749 void AliEveEventManager::NewEventLoaded()
1751 // Emit NewEventLoaded signal.
1753 Emit("NewEventLoaded()");
1757 //------------------------------------------------------------------------------
1758 // Event info dumpers
1759 //------------------------------------------------------------------------------
1761 const AliEventInfo* AliEveEventManager::GetEventInfo()
1763 // Fill the event info object
1765 AliCentralTrigger *aCTP = NULL;
1767 fEventInfo.SetEventType(fRawReader->GetType());
1769 ULong64_t mask = fRawReader->GetClassMask();
1770 fEventInfo.SetTriggerMask(mask);
1771 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
1772 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
1774 aCTP = new AliCentralTrigger();
1775 TString configstr("");
1776 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
1777 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
1781 aCTP->SetClassMask(mask);
1782 aCTP->SetClusterMask(clmask);
1785 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
1787 rlCTP->SetClassMask(mask);
1788 rlCTP->SetClusterMask(clmask);
1793 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
1795 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
1796 aCTP = fRunLoader->GetTrigger();
1797 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
1798 // get inputs from actp - just get
1799 AliESDHeader* esdheader = fESD->GetHeader();
1800 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
1801 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
1802 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
1803 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
1806 AliWarning("No trigger can be loaded! The trigger information will not be used!");
1811 AliTriggerConfiguration *config = aCTP->GetConfiguration();
1813 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
1814 if (fRawReader) delete aCTP;
1818 TString declTriggerClasses;
1820 // Load trigger aliases and declare the trigger classes included in aliases
1821 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
1823 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
1825 lst->Sort(kSortDescending); // to avoid problems with substrings
1826 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
1827 // Now declare all the triggers present in the aliases
1830 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
1831 declTriggerClasses += " ";
1832 declTriggerClasses += nmd->GetName();
1836 AliError("Cannot cast the object with trigger aliases to THashList!");
1840 AliError("No OCDB entry for the trigger aliases!");
1843 // Load trigger classes for this run
1844 UChar_t clustmask = 0;
1846 ULong64_t trmask = fEventInfo.GetTriggerMask();
1847 const TObjArray& classesArray = config->GetClasses();
1848 Int_t nclasses = classesArray.GetEntriesFast();
1849 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
1850 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
1851 if (trclass && trclass->GetMask()>0) {
1852 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
1853 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
1854 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
1855 if (trmask & (1ull << trindex)) {
1857 trclasses += trclass->GetName();
1859 clustmask |= trclass->GetCluster()->GetClusterMask();
1863 fEventInfo.SetTriggerClasses(trclasses);
1865 if (!aCTP->CheckTriggeredDetectors()) {
1866 if (fRawReader) delete aCTP;
1870 if (fRawReader) delete aCTP;
1872 // everything went ok, return pointer
1873 return (&fEventInfo);
1877 TString AliEveEventManager::GetEventInfoHorizontal() const
1879 // Dumps the event-header contents in vertical formatting.
1881 TString rawInfo, esdInfo;
1885 rawInfo = "No raw-data event info is available!\n";
1889 const UInt_t* attr = fRawReader->GetAttributes();
1890 TTimeStamp ts(fRawReader->GetTimestamp());
1891 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1892 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
1893 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1894 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1895 fRawReader->GetClassMask(),
1896 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1897 attr[0],attr[1],attr[2], ts.AsString("s"));
1902 esdInfo = "No ESD event info is available!";
1906 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1907 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1908 TTimeStamp ts(fESD->GetTimeStamp());
1909 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
1910 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
1911 fESD->GetRunNumber(),
1912 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1913 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1914 acttrclasses.Data(),
1915 fESD->GetTriggerMask(),firedtrclasses.Data(),
1916 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
1919 return rawInfo + esdInfo;
1922 TString AliEveEventManager::GetEventInfoVertical() const
1924 // Dumps the event-header contents in vertical formatting.
1926 TString rawInfo, esdInfo;
1930 rawInfo = "No raw-data event info is available!\n";
1934 const UInt_t* attr = fRawReader->GetAttributes();
1935 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",
1936 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
1937 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
1938 fRawReader->GetClassMask(),
1939 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
1940 attr[0],attr[1],attr[2],
1941 fRawReader->GetTimestamp());
1946 esdInfo = "No ESD event info is available!\n";
1950 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
1951 TString firedtrclasses = fESD->GetFiredTriggerClasses();
1952 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",
1953 fESD->GetRunNumber(),
1954 acttrclasses.Data(),
1955 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
1956 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
1957 fESD->GetTriggerMask(),firedtrclasses.Data(),
1958 fESD->GetEventNumberInFile(),
1959 fESD->GetTimeStamp());
1962 return rawInfo + "\n" + esdInfo;
1966 //==============================================================================
1967 // Reading of GRP and MagneticField.
1968 // This is a reap-off from reconstruction ... should really be a common
1969 // code to do this somewhere in STEER.
1970 //==============================================================================
1972 Bool_t AliEveEventManager::InitGRP()
1974 //------------------------------------
1975 // Initialization of the GRP entry
1976 //------------------------------------
1978 static const TEveException kEH("AliEveEventManager::InitGRP ");
1980 AliGRPManager grpMgr;
1981 if (!grpMgr.ReadGRPEntry()) {
1984 fgGRPLoaded = kTRUE;
1985 if (!grpMgr.SetMagField()) {
1986 throw kEH + "Setting of field failed!";
1989 //*** Get the diamond profiles from OCDB
1990 // Eventually useful.
1993 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1995 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1997 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2000 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2002 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2004 ::Error(kEH, "No diamond profile found in OCDB!");
2007 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2009 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2011 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2018 //------------------------------------
2019 // Global variables management
2020 //------------------------------------
2022 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2024 // Insert a new visualization-parameter database entry with the default
2025 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2028 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2029 Bool_t replace, Bool_t update)
2031 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2036 model->IncDenyDestroy();
2037 model->SetRnrChildren(kFALSE);
2039 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2040 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2041 while (old_model->HasChildren())
2043 TEveElement *el = old_model->FirstChild();
2044 el->SetVizModel(model);
2047 el->CopyVizParams(model);
2048 el->PropagateVizParamsToProjecteds();
2051 old_model->DecDenyDestroy();
2053 pair->SetValue(dynamic_cast<TObject*>(model));
2063 model->IncDenyDestroy();
2064 model->SetRnrChildren(kFALSE);
2065 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2070 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2072 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));