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"
13 #include "AliEveConfigManager.h"
14 #include "AliEveVSDCreator.h"
16 #include <THashList.h>
17 #include <TEveElement.h>
18 #include <TEveManager.h>
19 #include <TEveViewer.h>
22 #include <AliRunLoader.h>
24 #include <AliESDRun.h>
25 #include <AliESDEvent.h>
26 #include <AliESDfriend.h>
27 #include <AliAODEvent.h>
29 #include <AliRecoParam.h>
30 #include <AliCentralTrigger.h>
31 #include <AliCDBEntry.h>
32 #include <AliTriggerClass.h>
33 #include <AliTriggerConfiguration.h>
34 #include <AliTriggerCluster.h>
35 #include <AliDetectorRecoParam.h>
38 #include <AliRawEventHeaderBase.h>
39 #include <AliRawReaderRoot.h>
40 #include <AliRawReaderFile.h>
41 #include <AliRawReaderDate.h>
43 #include <AliCDBManager.h>
44 #include <AliCDBStorage.h>
45 #include <AliGRPObject.h>
46 #include <AliHeader.h>
47 #include <AliGeomManager.h>
48 #include <AliGRPManager.h>
49 #include <AliSysInfo.h>
53 #include <TGeoManager.h>
54 #include <TGeoGlobalMagField.h>
56 #include <TTimeStamp.h>
64 #include "AliStorageEventManager.h"
69 //==============================================================================
70 //==============================================================================
72 //==============================================================================
74 //______________________________________________________________________________
76 // Provides interface for loading and navigating standard AliRoot data
77 // (AliRunLoader), ESD, AOD and RAW.
79 // ESDfriend is attached automatically, if the file is found.
81 // AODfriends are not attached automatically as there are several
82 // possible files involved. To have a specific AODfriend attached, call
84 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
85 // before initializing the event-manager.
87 // Also provides interface to magnetic-field and geometry. Mostly
88 // intended as wrappers over standard AliRoot functionality for
89 // convenient use from visualizateion macros.
91 // There can be a single main event-manger, it is stored in private
92 // data member fgMaster and can be accessed via static member function
95 // For event overlaying and embedding one can instantiate additional
96 // event-managers via static method AddDependentManager(const TString& path).
97 // This interface is under development.
99 ClassImp(AliEveEventManager)
101 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
102 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
103 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
104 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
106 TString AliEveEventManager::fgESDFileName("AliESDs.root");
107 AliEveEventManager::EVisibleESDTrees AliEveEventManager::fgESDvisibleTrees(AliEveEventManager::kOfflineTree);
108 TString AliEveEventManager::fgESDfriendsFileName("AliESDfriends.root");
109 TString AliEveEventManager::fgAODFileName("AliAOD.root");
110 TString AliEveEventManager::fgGAliceFileName("galice.root");
111 TString AliEveEventManager::fgRawFileName("raw.root");
112 TString AliEveEventManager::fgCdbUri;
114 TList* AliEveEventManager::fgAODfriends = 0;
116 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
118 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
119 AliMagF* AliEveEventManager::fgMagField = 0;
120 AliRecoParam* AliEveEventManager::fgRecoParam = 0;
121 Bool_t AliEveEventManager::fgUniformField = kFALSE;
123 AliEveEventManager* AliEveEventManager::fgMaster = 0;
124 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
126 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
127 TEveEventManager(name, ""),
130 fESDFile (0), fESDTree (0), fHLTESDTree(0), fESD (0),
131 fESDfriend (0), fESDfriendExists(kFALSE),
132 fAODFile (0), fAODTree (0), fAOD (0),
133 fRawReader (0), fEventInfo(),
134 fAutoLoad (kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
135 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
136 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
137 fExecutor (0), fTransients(0), fTransientLists(0),
140 fAutoLoadTimerRunning(kFALSE),
141 fgSubSock(EVENTS_SERVER_SUB),
143 fWritingToEventIndex(0),
144 fIsNewEventAvaliable(false)
146 // Constructor with event-id.
157 cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
158 fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
159 fEventListenerThread->Run();
161 fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
162 fStorageManagerWatcherThread->Run();
164 cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
168 AliEveEventManager::~AliEveEventManager()
171 fAutoLoadTimer->Stop();
172 fAutoLoadTimer->Disconnect("Timeout");
181 fTransients->DecDenyDestroy();
182 fTransients->Destroy();
184 fTransientLists->DecDenyDestroy();
185 fTransientLists->Destroy();
190 void AliEveEventManager::GetNextEvent()
193 AliStorageEventManager *eventManager =
194 AliStorageEventManager::GetEventManagerInstance();
195 eventManager->CreateSocket(EVENTS_SERVER_SUB);
201 AliESDEvent *tmpEvent = NULL;
205 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB);
208 if(tmpEvent->GetRunNumber()>=0)
211 if(fEventInUse == 0){fWritingToEventIndex = 1;}
212 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
213 cout<<"Received new event"<<endl;
214 if(fCurrentEvent[fWritingToEventIndex])
216 delete fCurrentEvent[fWritingToEventIndex];
217 fCurrentEvent[fWritingToEventIndex]=0;
219 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
220 fIsNewEventAvaliable = true;
228 void AliEveEventManager::CheckStorageStatus()
231 AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
232 configManager->ConnectEventManagerSignals();
234 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
235 eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
237 struct clientRequestStruct *request = new struct clientRequestStruct;
238 request->messageType = REQUEST_CONNECTION;
242 if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
245 long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
249 StorageManagerDown();
250 cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
257 void AliEveEventManager::InitInternals()
259 // Initialize internal members.
261 static const TEveException kEH("AliEveEventManager::InitInternals ");
265 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
275 fAutoLoadTimer = new TTimer;
276 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
277 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
279 fExecutor = new AliEveMacroExecutor;
281 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
282 fTransients->IncDenyDestroy();
283 gEve->AddToListTree(fTransients, kFALSE);
285 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
286 fTransientLists->IncDenyDestroy();
287 gEve->AddToListTree(fTransientLists, kFALSE);
289 fPEventSelector = new AliEveEventSelector(this);
291 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
294 /******************************************************************************/
296 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
298 fgESDvisibleTrees = shown;
299 // Set file-name for opening ESD, default "AliESDs.root".
300 if (esd.IsNull()) return;
303 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
307 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
309 // Set file-name for opening ESD friend, default "AliESDfriends.root".
311 if (esdf.IsNull()) return;
312 fgESDfriendsFileName = esdf;
314 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
317 void AliEveEventManager::SetAODFileName(const TString& aod)
319 // Set file-name for opening AOD, default "AliAOD.root".
321 if (aod.IsNull()) return;
324 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
328 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
330 // Add new AOD friend file-name to be attached when opening AOD.
331 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
333 if (fgAODfriends == 0)
335 fgAODfriends = new TList;
336 fgAODfriends->SetOwner(kTRUE);
338 if (fgAODfriends->FindObject(friendFileName) == 0)
340 fgAODfriends->Add(new TObjString(friendFileName));
344 void AliEveEventManager::SetRawFileName(const TString& raw)
346 // Set file-name for opening of raw-data, default "raw.root"
347 if (raw.IsNull()) return;
352 void AliEveEventManager::SetCdbUri(const TString& cdb)
354 // Set path to CDB, there is no default.
355 if ( ! cdb.IsNull()) fgCdbUri = cdb;
358 void AliEveEventManager::SetGAliceFileName(const TString& galice)
360 // Set file-name for opening gAlice, default "galice.root".
362 if ( galice.IsNull()) return;
363 fgGAliceFileName = galice;
365 if (galice.EndsWith(".zip")) fgGAliceFileName.Form("%s#galice.root",galice.Data());
368 void AliEveEventManager::SetFilesPath(const TString& urlPath)
370 TString path = urlPath;
371 gSystem->ExpandPathName(path);
372 if (path.IsNull() || path == ".")
374 path = gSystem->WorkingDirectory();
378 if(path.EndsWith(".zip")) // if given a path to root_archive.zip
380 else if(!path.EndsWith("/"))
383 SetESDFileName( TString(Form("%s%sAliESDs.root", path.Data(), sep.Data())) );
384 SetESDfriendFileName( TString(Form("%s%sAliESDfriends.root", path.Data(), sep.Data())) );
385 SetAODFileName( TString(Form("%s%sAliAOD.root", path.Data(), sep.Data())) );
386 AddAODfriend( TString(Form("%s%sAliAOD.VertexingHF.root", path.Data(), sep.Data())) );
387 SetGAliceFileName( TString(Form("%s%sgalice.root", path.Data(), sep.Data())) );
388 SetRawFileName(TString(Form("%s%sraw.root", path.Data(), sep.Data())));
391 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
392 Bool_t assertAod, Bool_t assertRaw)
394 // Set global flags that detrmine which parts of the event-data must
395 // be present when the event is opened.
397 fgAssertRunLoader = assertRunloader;
398 fgAssertESD = assertEsd;
399 fgAssertAOD = assertAod;
400 fgAssertRaw = assertRaw;
403 void AliEveEventManager::SearchRawForCentralReconstruction()
405 // Enable searching of raw data in standard location. The path passed to
406 // Open() is expected to point to a centrally reconstructed run, e.g.:
407 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
409 fgRawFromStandardLoc = kTRUE;
412 /******************************************************************************/
414 void AliEveEventManager::Open()
416 // Open event-data from URL specified in path.
417 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
418 // Warning is reported if run-loader or ESD is not found.
419 // Global data-members fgAssertRunLoader and fgAssertESD can be set
420 // to throw exceptions instead.
422 static const TEveException kEH("AliEveEventManager::Open ");
426 throw (kEH + "Event-loop is under external control.");
430 throw (kEH + "Event-files already opened.");
435 // Open ESD and ESDfriends
437 if ((fESDFile = TFile::Open(fgESDFileName)))
439 fESD = new AliESDEvent();
441 switch(fgESDvisibleTrees){
442 case AliEveEventManager::kOfflineTree :
443 fESDTree = readESDTree("esdTree", runNo);
445 case AliEveEventManager::kHLTTree :
446 fHLTESDTree = readESDTree("HLTesdTree", runNo);
449 fESDTree = readESDTree("esdTree", runNo);
450 fHLTESDTree = readESDTree("HLTesdTree", runNo);
453 if(!fESDTree && !fHLTESDTree){
454 // both ESD trees are == 0
455 delete fESDFile; fESDFile = 0;
456 delete fESD; fESD = 0;
461 else // esd file not readable
463 Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());
465 if (fESDTree == 0 && fHLTESDTree==0)
469 throw (kEH + "ESD not initialized. Its precence was requested.");
471 Warning(kEH, "ESD not initialized.");
475 // Open AOD and registered friends
476 if ( (fAODFile = TFile::Open(fgAODFileName)) )
478 fAOD = new AliAODEvent();
479 fAODTree = (TTree*) fAODFile->Get("aodTree");
482 // Check if AODfriends exist and attach them.
483 TIter friends(fgAODfriends);
485 while ((name = (TObjString*) friends()) != 0)
487 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
488 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
489 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
491 fAODTree->AddFriend("aodTree", name->GetName());
495 fAOD->ReadFromTree(fAODTree);
497 if (fAODTree->GetEntry(0) <= 0)
499 delete fAODFile; fAODFile = 0;
500 delete fAOD; fAOD = 0;
501 Warning(kEH, "failed getting the first entry from addTree.");
506 runNo = fAOD->GetRunNumber();
511 delete fAODFile; fAODFile = 0;
512 delete fAOD; fAOD = 0;
513 Warning(kEH, "failed getting the aodTree.");
516 else // aod not readable
518 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
524 throw (kEH + "AOD not initialized. Its precence was requested.");
526 Warning(kEH, "AOD not initialized.");
530 // Open RunLoader from galice.root
531 // fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
533 TFile *gafile = TFile::Open(fgGAliceFileName);
534 cout<<"Opening galice"<<endl;
539 cout<<"SETTING RUN LOADER in Open()"<<endl;
540 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
543 TString alicePath(gSystem->DirName(fgGAliceFileName));
544 alicePath.Append("/");
545 fRunLoader->SetDirName(alicePath);
547 if (fRunLoader->LoadgAlice() != 0)
548 Warning(kEH, "failed loading gAlice via run-loader.");
550 if (fRunLoader->LoadHeader() == 0)
553 runNo = fRunLoader->GetHeader()->GetRun();
557 Warning(kEH, "failed loading run-loader's header.");
562 else // run-loader open failed
564 Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());
568 else // galice not readable
570 Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());
574 if (fgAssertRunLoader)
575 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
577 Warning(kEH, "Bootstraping of run-loader failed.");
580 // Open raw-data file
583 if (fgRawFromStandardLoc)
585 if (!fgRawFileName.BeginsWith("alien:"))
586 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
587 if (!fgRawFileName.Contains("/ESDs/"))
588 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
590 TPMERegexp chunk("/([\\d\\.])+/?$");
591 Int_t nm = chunk.Match(fgRawFileName);
593 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
595 TPMERegexp esdstrip("/ESDs/.*");
596 rawPath = fgRawFileName;
597 esdstrip.Substitute(rawPath, "/raw/");
601 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
605 rawPath = fgRawFileName;
607 // If i use open directly, raw-reader reports an error but i have
608 // no way to detect it.
609 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
610 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
611 if (fgAssertRaw == kFALSE)
613 AliLog::SetGlobalLogLevel(AliLog::kFatal);
615 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
617 fRawReader = AliRawReader::Create(rawPath);
621 fRawReader = AliRawReader::Create(fgRawFileName);
623 if (fgAssertRaw == kFALSE)
625 AliLog::SetGlobalLogLevel(oldLogLevel);
632 throw (kEH + "raw-data not initialized. Its precence was requested.");
636 Warning(kEH, "raw-data not initialized.");
644 if ( ! fRawReader->NextEvent())
646 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
648 runNo = fRawReader->GetRunNumber();
649 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
650 fRawReader->RewindEvents();
654 fExternalCtrl = kTRUE;
660 // Initialize OCDB ... only in master event-manager
668 void AliEveEventManager::InitOCDB(int runNo)
670 static const TEveException kEH("AliEveEventManager::InitOCDB ");
671 //if (this == fgMaster)
673 AliCDBManager* cdb = AliCDBManager::Instance();
674 if (cdb->IsDefaultStorageSet() == kTRUE)
676 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
677 cdb->GetDefaultStorage()->GetURI().Data());
681 if (fgCdbUri.IsNull())
683 gEnv->SetValue("Root.Stacktrace", "no");
684 Fatal("Open()", "OCDB path was not specified.");
687 // Handle some special cases for MC (should be in OCDBManager).
688 if (fgCdbUri == "mcideal://")
689 cdb->SetDefaultStorage("MC", "Ideal");
690 else if (fgCdbUri == "mcresidual://")
691 cdb->SetDefaultStorage("MC", "Residual");
692 else if (fgCdbUri == "mcfull://")
693 cdb->SetDefaultStorage("MC", "Full");
694 else if (fgCdbUri == "local://") {
695 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
696 cdb->SetDefaultStorage(fgCdbUri);
698 cdb->SetDefaultStorage(fgCdbUri);
702 if (cdb->IsDefaultStorageSet() == kFALSE)
703 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
706 if (fgCdbUri.BeginsWith("local://"))
708 TString curPath = gSystem->WorkingDirectory();
709 TString grp = "GRP/GRP/Data";
710 TString grppath = curPath + "/" + grp;
711 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
713 if (cdb->GetSpecificStorage(grp))
715 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
719 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
720 TString lpath("local://");
722 cdb->SetSpecificStorage(grp, lpath);
729 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
731 // Set an event from an external source.
732 // The method is used in the online visualisation.
733 // AOD is not supported.
735 static const TEveException kEH("AliEveEventManager::SetEvent ");
739 Warning(kEH, "Event-files were open. Closing and switching to external control.");
743 Info(kEH,"setting it!!! ============================");
745 fRunLoader = runLoader;
746 fRawReader = rawReader;
753 fExternalCtrl = kTRUE;
755 SetTitle("Online event in memory");
756 SetName ("Online Event");
759 AfterNewEventLoaded();
761 if (fAutoLoad) StartAutoLoadTimer();
765 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
767 // Returns maximum available event id.
768 // If under external control or event is not opened -1 is returned.
769 // If raw-data is the only data-source this can not be known
770 // and 10,000,000 is returned.
771 // If neither data-source is initialised an exception is thrown.
772 // If refresh_esd is true and ESD is the primary event-data source
773 // its header is re-read from disk.
775 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
777 if (fExternalCtrl || fIsOpen == kFALSE)
782 if ((fESDTree!=0) || (fHLTESDTree!=0))
786 if(fESDTree!=0) fESDTree->Refresh();
787 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
788 fPEventSelector->Update();
792 switch(fgESDvisibleTrees){
794 case AliEveEventManager::kOfflineTree :
795 maxEventId = fESDTree->GetEntries() - 1;
797 case AliEveEventManager::kHLTTree :
798 maxEventId = fHLTESDTree->GetEntries() - 1;
806 return fAODTree->GetEntries() - 1;
810 return fRunLoader->GetNumberOfEvents() - 1;
814 Int_t n = fRawReader->GetNumberOfEvents() - 1;
815 return n > -1 ? n : 10000000;
819 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
823 void AliEveEventManager::GotoEvent(Int_t event)
825 cout<<"Go to event:"<<event<<endl;
826 // Load data for specified event.
827 // If event is out of range an exception is thrown and old state
829 // After successful loading of event, the virtual function
830 // AfterNewEventLoaded() is called. This executes commands that
831 // were registered via TEveEventManager::AddNewEventCommand().
833 // If event is negative, it is subtracted from the number of
834 // available events, thus passing -1 will load the last event.
835 // This is not supported when raw-data is the only data-source
836 // as the number of events is not known.
838 static const TEveException kEH("AliEveEventManager::GotoEvent ");
840 if (fAutoLoadTimerRunning)
842 throw (kEH + "Event auto-load timer is running.");
846 // throw (kEH + "Event-loop is under external control.");
850 // create new server request:
851 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
854 if (event == -1) {requestMessage->messageType = REQUEST_GET_LAST_EVENT;}
855 else if (event == 0) {requestMessage->messageType = REQUEST_GET_FIRST_EVENT;}
856 else if (event == 1) {requestMessage->messageType = REQUEST_GET_PREV_EVENT;}
857 else if (event == 2) {requestMessage->messageType = REQUEST_GET_NEXT_EVENT;}
860 struct eventStruct eventToLoad;
861 eventToLoad.runNumber = fESD->GetRunNumber();
862 eventToLoad.eventNumber = fESD->GetEventNumberInFile();
863 requestMessage->event = eventToLoad;
865 // create event manager:
866 AliStorageEventManager *eventManager =
867 AliStorageEventManager::GetEventManagerInstance();
868 AliESDEvent *resultEvent = NULL;
870 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
873 // send request and receive event:
874 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
875 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
880 InitOCDB(resultEvent->GetRunNumber());
881 SetEvent(0,0,resultEvent,0);
885 if(event==-1){cout<<"\n\nWARNING -- No last event is avaliable.\n\n"<<endl;}
886 if(event==0){cout<<"\n\nWARNING -- No first event is avaliable.\n\n"<<endl;}
887 if(event==1){cout<<"\n\nWARNING -- No previous event is avaliable.\n\n"<<endl;}
888 if(event==2){cout<<"\n\nWARNING -- No next event is avaliable.\n\n"<<endl;}
895 cout<<"\n\nWARNING -- No event has been already loaded. Loading the most recent event...\n\n"<<endl;
897 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
898 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
900 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
901 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
902 AliESDEvent *resultEvent = NULL;
905 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
906 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
912 InitOCDB(resultEvent->GetRunNumber());
913 SetEvent(0,0,resultEvent,0);
915 else{cout<<"\n\nWARNING -- The most recent event is not avaliable.\n\n"<<endl;}
923 throw (kEH + "Event-files not opened.");
931 if ((fESDTree!=0) || (fHLTESDTree!=0))
934 if (event >= fESDTree->GetEntries())
936 maxEvent = fESDTree->GetEntries() - 1;
938 event = fESDTree->GetEntries() + event;
942 if (event >= fHLTESDTree->GetEntries())
943 fHLTESDTree->Refresh();
944 maxEvent = fHLTESDTree->GetEntries() - 1;
946 event = fHLTESDTree->GetEntries() + event;
952 maxEvent = fAODTree->GetEntries() - 1;
954 event = fAODTree->GetEntries() + event;
958 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
960 event = fRunLoader->GetNumberOfEvents() + event;
964 maxEvent = fRawReader->GetNumberOfEvents() - 1;
969 Error(kEH, "current raw-data source does not support direct event access.");
972 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
977 event = fRawReader->GetNumberOfEvents() + event;
982 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
984 if (event < 0 || event > maxEvent)
986 throw (kEH + Form("event %d not present, available range [%d, %d].",
987 event, 0, maxEvent));
990 TString sysInfoHeader;
991 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
992 AliSysInfo::AddStamp(sysInfoHeader + "Start");
994 TEveManager::TRedrawDisabler rd(gEve);
995 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
997 // !!! MT this is somewhat brutal; at least optionally, one could be
998 // a bit gentler, checking for objs owning their external refs and having
999 // additinal parents.
1000 gEve->GetViewers()->DeleteAnnotations();
1001 fTransients->DestroyElements();
1002 for (TEveElement::List_i i = fTransientLists->BeginChildren();
1003 i != fTransientLists->EndChildren(); ++i)
1005 (*i)->DestroyElements();
1009 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
1012 if (fESDTree->GetEntry(event) <= 0)
1013 throw (kEH + "failed getting required event from ESD.");
1015 if (fESDfriendExists)
1016 fESD->SetESDfriend(fESDfriend);
1020 if (fHLTESDTree->GetEntry(event) <= 0)
1021 throw (kEH + "failed getting required event from HLT ESD.");
1023 if (fESDfriendExists)
1024 fESD->SetESDfriend(fESDfriend);
1028 if (fAODTree->GetEntry(event) <= 0)
1029 throw (kEH + "failed getting required event from AOD.");
1033 if (fRunLoader->GetEvent(event) != 0)
1034 throw (kEH + "failed getting required event.");
1039 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
1040 if (fRawReader->GotoEvent(event) == kFALSE)
1042 // Use fallback method - iteration with NextEvent().
1043 Int_t rawEv = fEventId;
1046 fRawReader->RewindEvents();
1050 while (rawEv < event)
1052 if ( ! fRawReader->NextEvent())
1054 fRawReader->RewindEvents();
1056 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
1060 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
1066 if (this == fgMaster)
1068 SetName(Form("Event %d", fEventId));
1072 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
1074 AfterNewEventLoaded();
1076 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
1079 void AliEveEventManager::Timeout()
1084 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
1087 InitOCDB(event->GetRunNumber());
1088 printf("======================= setting event to %d\n", fEventId);
1089 SetEvent(0,0,event,0);
1092 void AliEveEventManager::NextEvent()
1094 // Loads next event.
1095 // Does magick needed for online display when under external event control.
1097 static const TEveException kEH("AliEveEventManager::NextEvent ");
1099 if (fAutoLoadTimerRunning){throw (kEH + "Event auto-load timer is running.");}
1104 if(fIsNewEventAvaliable)
1107 if(fWritingToEventIndex == 0) fEventInUse = 0;
1108 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1110 if(fCurrentEvent[fEventInUse])
1112 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1114 printf("======================= setting event to %d\n", fEventId);
1117 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1118 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1121 fIsNewEventAvaliable = false;
1124 else{cout<<"No new event is avaliable."<<endl;}
1127 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1130 if (fPEventSelector->FindNext(nextevent))
1132 GotoEvent(nextevent);
1135 else if (fEventId < GetMaxEventId(kTRUE))
1137 GotoEvent(fEventId + 1);
1140 gSystem->ProcessEvents();
1144 AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
1145 cout<<"contructor called"<<endl;
1146 vsdCreator->CreateVSD("myVSD.root");
1149 //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
1152 void AliEveEventManager::PrevEvent()
1154 // Loads previous event.
1156 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1158 if (fAutoLoadTimerRunning)
1160 throw (kEH + "Event auto-load timer is running.");
1164 throw (kEH + "Event-loop is under external control.");
1167 if ((fESDTree!=0) || (fHLTESDTree!=0))
1170 if (fPEventSelector->FindPrev(nextevent))
1172 GotoEvent(nextevent);
1175 else if (fEventId > 0)
1177 GotoEvent(fEventId - 1);
1181 void AliEveEventManager::MarkCurrentEvent()
1184 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1185 struct eventStruct mark;
1186 mark.runNumber = fESD->GetRunNumber();
1187 mark.eventNumber = fESD->GetEventNumberInFile();
1188 requestMessage->messageType = REQUEST_MARK_EVENT;
1189 requestMessage->event = mark;
1191 AliStorageEventManager *eventManager =
1192 AliStorageEventManager::GetEventManagerInstance();
1193 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1196 std::future<bool> unused = std::async([]()
1198 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1199 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1203 //fStatusLabel->SetText("Event marked");
1204 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1208 //fStatusLabel->SetText("Couldn't mark this event");
1209 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1214 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1215 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1220 //fStatusLabel->SetText("Event marked");
1221 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1225 //fStatusLabel->SetText("Couldn't mark this event");
1226 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1228 if(requestMessage){delete requestMessage;}
1232 void AliEveEventManager::Close()
1234 // Close the event data-files and delete ESD, ESDfriend, run-loader
1237 static const TEveException kEH("AliEveEventManager::Close ");
1241 throw (kEH + "Event-files not opened.");
1244 if (fAutoLoadTimerRunning)
1245 StopAutoLoadTimer();
1247 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1248 delete fESD; fESD = 0;
1249 // delete fESDfriend; // friend tree is deleted with the tree
1251 fESDfriendExists = kFALSE;
1253 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1254 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1255 delete fESDFile; fESDFile = 0;
1259 delete fAOD; fAOD = 0;
1261 delete fAODTree; fAODTree = 0;
1262 delete fAODFile; fAODFile = 0;
1266 delete fRunLoader; fRunLoader = 0;
1270 delete fRawReader; fRawReader = 0;
1279 //------------------------------------------------------------------------------
1280 // Static convenience functions, mainly used from macros.
1281 //------------------------------------------------------------------------------
1283 Int_t AliEveEventManager::CurrentEventId()
1285 // Return current event-id.
1287 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1289 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1290 throw (kEH + "ALICE event not ready.");
1291 return fgCurrent->GetEventId();
1294 Bool_t AliEveEventManager::HasRunLoader()
1296 // Check if AliRunLoader is initialized.
1298 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1301 Bool_t AliEveEventManager::HasESD()
1303 // Check if AliESDEvent is initialized.
1305 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1308 Bool_t AliEveEventManager::HasESDfriend()
1310 // Check if AliESDfriend is initialized.
1312 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1315 Bool_t AliEveEventManager::HasAOD()
1317 // Check if AliESDEvent is initialized.
1319 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1322 Bool_t AliEveEventManager::HasRawReader()
1324 // Check if raw-reader is initialized.
1326 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1329 AliRunLoader* AliEveEventManager::AssertRunLoader()
1331 // Make sure AliRunLoader is initialized and return it.
1332 // Throws exception in case run-loader is not available.
1333 // Static utility for macros.
1335 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1337 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1338 throw (kEH + "ALICE event not ready.");
1339 if (fgCurrent->fRunLoader == 0)
1340 throw (kEH + "AliRunLoader not initialised.");
1341 return fgCurrent->fRunLoader;
1344 AliESDEvent* AliEveEventManager::AssertESD()
1346 // Make sure AliESDEvent is initialized and return it.
1347 // Throws exception in case ESD is not available.
1348 // Static utility for macros.
1350 static const TEveException kEH("AliEveEventManager::AssertESD ");
1352 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1353 throw (kEH + "ALICE event not ready.");
1354 if (fgCurrent->fESD == 0)
1355 throw (kEH + "AliESD not initialised.");
1356 return fgCurrent->fESD;
1359 AliESDfriend* AliEveEventManager::AssertESDfriend()
1361 // Make sure AliESDfriend is initialized and return it.
1362 // Throws exception in case ESDfriend-loader is not available.
1363 // Static utility for macros.
1365 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1367 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1368 throw (kEH + "ALICE event not ready.");
1369 if (fgCurrent->fESDfriend == 0)
1370 throw (kEH + "AliESDfriend not initialised.");
1371 return fgCurrent->fESDfriend;
1374 AliAODEvent* AliEveEventManager::AssertAOD()
1376 // Make sure AliAODEvent is initialized and return it.
1377 // Throws exception in case AOD is not available.
1378 // Static utility for macros.
1380 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1382 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1383 throw (kEH + "ALICE event not ready.");
1384 if (fgCurrent->fAOD == 0)
1385 throw (kEH + "AliAOD not initialised.");
1386 return fgCurrent->fAOD;
1389 AliRawReader* AliEveEventManager::AssertRawReader()
1391 // Make sure raw-reader is initialized and return it.
1393 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1395 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1396 throw (kEH + "ALICE event not ready.");
1397 if (fgCurrent->fRawReader == 0)
1398 throw (kEH + "RawReader not ready.");
1400 return fgCurrent->fRawReader;
1403 //==============================================================================
1405 AliMagF* AliEveEventManager::AssertMagField()
1407 // Make sure AliMagF is initialized and returns it.
1408 // Throws exception in case magnetic field is not available.
1409 // Static utility for macros.
1411 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1416 if (TGeoGlobalMagField::Instance()->GetField())
1418 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1419 if (fgMagField == 0)
1420 throw kEH + "Global field set, but it is not AliMagF.";
1429 if (TGeoGlobalMagField::Instance()->GetField())
1431 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1432 if (fgMagField == 0)
1433 throw kEH + "Global field set, but it is not AliMagF.";
1437 throw kEH + "Could not initialize magnetic field.";
1443 TGeoManager* AliEveEventManager::AssertGeometry()
1445 // Make sure AliGeomManager is initialized and returns the
1446 // corresponding TGeoManger.
1447 // gGeoManager is set to the return value.
1448 // Throws exception if geometry can not be loaded or if it is not
1449 // available and the TGeoManager is locked.
1450 // Static utility for macros.
1452 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1454 if (AliGeomManager::GetGeometry() == 0)
1456 if (TGeoManager::IsLocked())
1457 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1460 AliGeomManager::LoadGeometry();
1461 if ( ! AliGeomManager::GetGeometry())
1463 throw (kEH + "can not load geometry.");
1465 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1467 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1468 // throw (kEH + "could not apply align objs.");
1470 AliGeomManager::GetGeometry()->DefaultColors();
1473 gGeoManager = AliGeomManager::GetGeometry();
1477 AliRecoParam* AliEveEventManager::AssertRecoParams()
1485 Bool_t AliEveEventManager::InitRecoParam()
1487 // This is mostly a reap-off from reconstruction
1488 // The method accesses OCDB and retrieves all
1489 // the available reco-param objects from there.
1491 fgRecoParam = new AliRecoParam;
1492 const Int_t kNDetectors = 14;
1494 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1496 Bool_t isOK = kTRUE;
1498 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1499 ::Info(kEH, "Using custom GRP reconstruction parameters");
1502 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1504 AliCDBPath path("GRP","Calib","RecoParam");
1505 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1507 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1511 TObject *recoParamObj = entry->GetObject();
1512 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1513 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1514 // Registering them in AliRecoParam
1515 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1517 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1518 // GRP has only onse set of reco parameters
1519 // Registering it in AliRecoParam
1520 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1521 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1522 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1525 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1532 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1535 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1537 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1538 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1542 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1544 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1545 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1547 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1551 TObject *recoParamObj = entry->GetObject();
1552 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1553 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1554 // Registering them in AliRecoParam
1555 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1557 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1558 // The detector has only onse set of reco parameters
1559 // Registering it in AliRecoParam
1560 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1561 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1562 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1565 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1581 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1583 if(!fESDFile && !fESD) return 0;
1585 static const TEveException kEH("AliEveEventManager::readESDTree ");
1587 TTree* tempTree = 0;
1589 tempTree =(TTree*) fESDFile->Get(treeName);
1592 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1595 if (!esdFriendFile->IsZombie())
1597 esdFriendFile->Close();
1598 fESDfriendExists = kTRUE;
1599 tempTree->SetBranchStatus ("ESDfriend*", 1);
1601 delete esdFriendFile;
1604 fESD->ReadFromTree(tempTree);
1605 if (fESDfriendExists)
1607 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1608 Info(kEH, "found and attached ESD friend.");
1612 Warning(kEH, "ESDfriend not found.");
1615 if (tempTree->GetEntry(0) <= 0)
1617 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1622 runNo = fESD->GetESDRun()->GetRunNumber();
1627 Warning(kEH, "failed getting the tree:%s", treeName);
1634 //------------------------------------------------------------------------------
1636 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1638 // Create and attach a dependent event-manager.
1639 // It is not added into eve list tree.
1641 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1644 throw(kEH + "Master event-manager must be instantiated first.");
1646 if (fgMaster->fSubManagers == 0)
1648 fgMaster->fSubManagers = new TList;
1649 fgMaster->fSubManagers->SetOwner(kTRUE);
1652 AliEveEventManager* new_mgr = 0;
1656 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1657 new_mgr->SetFilesPath(path);
1658 fgMaster->fSubManagers->Add(new_mgr);
1660 catch (TEveException& exc)
1662 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1664 fgCurrent = fgMaster;
1669 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1671 // Get a dependant manager by name.
1672 // This will not change the current manager, use helper class
1673 // AliEveEventManager::CurrentChanger for that.
1675 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1678 throw(kEH + "Master event-manager must be instantiated first.");
1680 if (fgMaster->fSubManagers == 0)
1683 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1686 AliEveEventManager* AliEveEventManager::GetMaster()
1688 // Get master event-manager.
1693 AliEveEventManager* AliEveEventManager::GetCurrent()
1695 // Get current event-manager.
1700 void AliEveEventManager::RegisterTransient(TEveElement* element)
1702 GetCurrent()->fTransients->AddElement(element);
1705 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1707 GetCurrent()->fTransientLists->AddElement(element);
1710 //------------------------------------------------------------------------------
1711 // Autoloading of events
1712 //------------------------------------------------------------------------------
1714 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1716 // Set the auto-load time in seconds
1718 fAutoLoadTime = time;
1721 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1723 // Set the automatic event loading mode
1725 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1727 if (fAutoLoad == autoLoad)
1729 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1733 fAutoLoad = autoLoad;
1736 StartAutoLoadTimer();
1740 StopAutoLoadTimer();
1744 void AliEveEventManager::SetTrigSel(Int_t trig)
1746 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1750 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1755 ULong64_t trigMask = 0;
1756 if (trig >= 0) trigMask = (1ull << trig);
1757 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1758 fRawReader->SelectEvents(-1,trigMask,NULL);
1762 void AliEveEventManager::StartAutoLoadTimer()
1764 // Start the auto-load timer.
1766 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1767 fAutoLoadTimer->Reset();
1768 fAutoLoadTimer->TurnOn();
1769 fAutoLoadTimerRunning = kTRUE;
1772 void AliEveEventManager::StopAutoLoadTimer()
1774 // Stop the auto-load timer.
1776 fAutoLoadTimerRunning = kFALSE;
1777 fAutoLoadTimer->TurnOff();
1780 void AliEveEventManager::AutoLoadNextEvent()
1782 // Called from auto-load timer, so it has to be public.
1783 // Do NOT call it directly.
1785 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1787 Info(kEH, "called!");
1789 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1791 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1795 StopAutoLoadTimer();
1798 StartAutoLoadTimer();
1801 //------------------------------------------------------------------------------
1802 // Post event-loading functions
1803 //------------------------------------------------------------------------------
1805 void AliEveEventManager::AfterNewEventLoaded()
1807 // Execute registered macros and commands.
1808 // At the end emit NewEventLoaded signal.
1810 // Virtual from TEveEventManager.
1812 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1814 Info(kEH, "------------------!!!------------");
1816 NewEventDataLoaded();
1817 if (fExecutor) fExecutor->ExecMacros();
1819 TEveEventManager::AfterNewEventLoaded();
1822 if (this == fgMaster && fSubManagers != 0)
1824 TIter next(fSubManagers);
1825 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1827 gEve->SetCurrentEvent(fgCurrent);
1830 fgCurrent->GotoEvent(fEventId);
1832 catch (TEveException& exc)
1834 // !!! Should somehow tag / disable / remove it?
1835 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1836 fEventId, fgCurrent->GetName(), exc.Data());
1838 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
1840 fgCurrent = fgMaster;
1841 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
1842 gEve->SetCurrentEvent(fgMaster);
1846 void AliEveEventManager::NewEventDataLoaded()
1848 // Emit NewEventDataLoaded signal.
1849 Emit("NewEventDataLoaded()");
1851 void AliEveEventManager::NewEventLoaded()
1853 // Emit NewEventLoaded signal.
1854 Emit("NewEventLoaded()");
1856 void AliEveEventManager::StorageManagerOk()
1858 // Emit StorageManagerOk signal.
1859 Emit("StorageManagerOk()");
1861 void AliEveEventManager::StorageManagerDown()
1863 // Emit StorageManagerOk signal.
1864 Emit("StorageManagerDown()");
1868 //------------------------------------------------------------------------------
1869 // Event info dumpers
1870 //------------------------------------------------------------------------------
1872 const AliEventInfo* AliEveEventManager::GetEventInfo()
1874 // Fill the event info object
1876 AliCentralTrigger *aCTP = NULL;
1878 fEventInfo.SetEventType(fRawReader->GetType());
1880 ULong64_t mask = fRawReader->GetClassMask();
1881 fEventInfo.SetTriggerMask(mask);
1882 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
1883 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
1885 aCTP = new AliCentralTrigger();
1886 TString configstr("");
1887 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
1888 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
1892 aCTP->SetClassMask(mask);
1893 aCTP->SetClusterMask(clmask);
1896 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
1898 rlCTP->SetClassMask(mask);
1899 rlCTP->SetClusterMask(clmask);
1904 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
1906 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
1907 aCTP = fRunLoader->GetTrigger();
1908 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
1909 // get inputs from actp - just get
1910 AliESDHeader* esdheader = fESD->GetHeader();
1911 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
1912 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
1913 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
1914 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
1917 AliWarning("No trigger can be loaded! The trigger information will not be used!");
1922 AliTriggerConfiguration *config = aCTP->GetConfiguration();
1924 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
1925 if (fRawReader) delete aCTP;
1929 TString declTriggerClasses;
1931 // Load trigger aliases and declare the trigger classes included in aliases
1932 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
1934 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
1936 lst->Sort(kSortDescending); // to avoid problems with substrings
1937 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
1938 // Now declare all the triggers present in the aliases
1941 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
1942 declTriggerClasses += " ";
1943 declTriggerClasses += nmd->GetName();
1947 AliError("Cannot cast the object with trigger aliases to THashList!");
1951 AliError("No OCDB entry for the trigger aliases!");
1954 // Load trigger classes for this run
1955 UChar_t clustmask = 0;
1957 ULong64_t trmask = fEventInfo.GetTriggerMask();
1958 const TObjArray& classesArray = config->GetClasses();
1959 Int_t nclasses = classesArray.GetEntriesFast();
1960 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
1961 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
1962 if (trclass && trclass->GetMask()>0) {
1963 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
1964 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
1965 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
1966 if (trmask & (1ull << trindex)) {
1968 trclasses += trclass->GetName();
1970 clustmask |= trclass->GetCluster()->GetClusterMask();
1974 fEventInfo.SetTriggerClasses(trclasses);
1976 if (!aCTP->CheckTriggeredDetectors()) {
1977 if (fRawReader) delete aCTP;
1981 if (fRawReader) delete aCTP;
1983 // everything went ok, return pointer
1984 return (&fEventInfo);
1988 TString AliEveEventManager::GetEventInfoHorizontal() const
1990 // Dumps the event-header contents in vertical formatting.
1992 TString rawInfo, esdInfo;
1996 rawInfo = "No raw-data event info is available!\n";
2000 const UInt_t* attr = fRawReader->GetAttributes();
2001 TTimeStamp ts(fRawReader->GetTimestamp());
2002 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2003 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
2004 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2005 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2006 fRawReader->GetClassMask(),
2007 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2008 attr[0],attr[1],attr[2], ts.AsString("s"));
2013 esdInfo = "No ESD event info is available!";
2017 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2018 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2019 TTimeStamp ts(fESD->GetTimeStamp());
2020 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2021 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
2022 fESD->GetRunNumber(),
2023 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2024 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2025 acttrclasses.Data(),
2026 fESD->GetTriggerMask(),firedtrclasses.Data(),
2027 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
2030 return rawInfo + esdInfo;
2033 TString AliEveEventManager::GetEventInfoVertical() const
2035 // Dumps the event-header contents in vertical formatting.
2037 TString rawInfo, esdInfo;
2041 rawInfo = "No raw-data event info is available!\n";
2045 const UInt_t* attr = fRawReader->GetAttributes();
2046 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",
2047 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2048 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2049 fRawReader->GetClassMask(),
2050 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2051 attr[0],attr[1],attr[2],
2052 fRawReader->GetTimestamp());
2057 esdInfo = "No ESD event info is available!\n";
2061 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2062 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2063 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",
2064 fESD->GetRunNumber(),
2065 acttrclasses.Data(),
2066 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2067 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2068 fESD->GetTriggerMask(),firedtrclasses.Data(),
2069 fESD->GetEventNumberInFile(),
2070 fESD->GetTimeStamp());
2073 return rawInfo + "\n" + esdInfo;
2077 //==============================================================================
2078 // Reading of GRP and MagneticField.
2079 // This is a reap-off from reconstruction ... should really be a common
2080 // code to do this somewhere in STEER.
2081 //==============================================================================
2083 Bool_t AliEveEventManager::InitGRP()
2085 //------------------------------------
2086 // Initialization of the GRP entry
2087 //------------------------------------
2089 static const TEveException kEH("AliEveEventManager::InitGRP ");
2091 AliGRPManager grpMgr;
2092 if (!grpMgr.ReadGRPEntry()) {
2095 fgGRPLoaded = kTRUE;
2096 if (!grpMgr.SetMagField()) {
2097 throw kEH + "Setting of field failed!";
2100 //*** Get the diamond profiles from OCDB
2101 // Eventually useful.
2104 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
2106 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
2108 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2111 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2113 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2115 ::Error(kEH, "No diamond profile found in OCDB!");
2118 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2120 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2122 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2129 //------------------------------------
2130 // Global variables management
2131 //------------------------------------
2133 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2135 // Insert a new visualization-parameter database entry with the default
2136 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2139 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2140 Bool_t replace, Bool_t update)
2142 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2147 model->IncDenyDestroy();
2148 model->SetRnrChildren(kFALSE);
2150 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2151 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2152 while (old_model->HasChildren())
2154 TEveElement *el = old_model->FirstChild();
2155 el->SetVizModel(model);
2158 el->CopyVizParams(model);
2159 el->PropagateVizParamsToProjecteds();
2162 old_model->DecDenyDestroy();
2164 pair->SetValue(dynamic_cast<TObject*>(model));
2174 model->IncDenyDestroy();
2175 model->SetRnrChildren(kFALSE);
2176 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2181 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2183 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));