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>
65 #include "AliStorageEventManager.h"
71 //==============================================================================
72 //==============================================================================
74 //==============================================================================
76 //______________________________________________________________________________
78 // Provides interface for loading and navigating standard AliRoot data
79 // (AliRunLoader), ESD, AOD and RAW.
81 // ESDfriend is attached automatically, if the file is found.
83 // AODfriends are not attached automatically as there are several
84 // possible files involved. To have a specific AODfriend attached, call
86 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
87 // before initializing the event-manager.
89 // Also provides interface to magnetic-field and geometry. Mostly
90 // intended as wrappers over standard AliRoot functionality for
91 // convenient use from visualizateion macros.
93 // There can be a single main event-manger, it is stored in private
94 // data member fgMaster and can be accessed via static member function
97 // For event overlaying and embedding one can instantiate additional
98 // event-managers via static method AddDependentManager(const TString& path).
99 // This interface is under development.
101 ClassImp(AliEveEventManager)
103 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
104 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
105 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
106 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
108 TString AliEveEventManager::fgESDFileName("AliESDs.root");
109 AliEveEventManager::EVisibleESDTrees AliEveEventManager::fgESDvisibleTrees(AliEveEventManager::kOfflineTree);
110 TString AliEveEventManager::fgESDfriendsFileName("AliESDfriends.root");
111 TString AliEveEventManager::fgAODFileName("AliAOD.root");
112 TString AliEveEventManager::fgGAliceFileName("galice.root");
113 TString AliEveEventManager::fgRawFileName("raw.root");
114 TString AliEveEventManager::fgCdbUri;
116 TList* AliEveEventManager::fgAODfriends = 0;
118 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
120 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
121 AliMagF* AliEveEventManager::fgMagField = 0;
122 AliRecoParam* AliEveEventManager::fgRecoParam = 0;
123 Bool_t AliEveEventManager::fgUniformField = kFALSE;
125 AliEveEventManager* AliEveEventManager::fgMaster = 0;
126 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
128 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
129 TEveEventManager(name, ""),
132 fESDFile (0), fESDTree (0), fHLTESDTree(0), fESD (0),
133 fESDfriend (0), fESDfriendExists(kFALSE),
134 fAODFile (0), fAODTree (0), fAOD (0),
135 fRawReader (0), fEventInfo(),
136 fAutoLoad (kFALSE),fLoopMarked(kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
137 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
138 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
139 fExecutor (0), fTransients(0), fTransientLists(0),
142 fAutoLoadTimerRunning(kFALSE),
143 fMutex(new TMutex()),
144 fgSubSock(EVENTS_SERVER_SUB),
146 fWritingToEventIndex(0),
147 fIsNewEventAvaliable(false),
152 // Constructor with event-id.
162 if (0 == name.CompareTo("online")) {
166 fOnlineMode = kFALSE;
171 cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
172 fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
173 fEventListenerThread->Run();
175 fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
176 fStorageManagerWatcherThread->Run();
178 cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
182 AliEveEventManager::~AliEveEventManager()
187 if(fEventListenerThread)
189 fEventListenerThread->Join();
190 fEventListenerThread->Kill();
191 delete fEventListenerThread;
192 cout<<"listener thread killed and deleted"<<endl;
194 if(fStorageManagerWatcherThread)
196 fStorageManagerWatcherThread->Join();
197 fStorageManagerWatcherThread->Kill();
198 delete fStorageManagerWatcherThread;
199 cout<<"storage watcher thread killed and deleted"<<endl;
202 fAutoLoadTimer->Stop();
203 fAutoLoadTimer->Disconnect("Timeout");
204 fAutoLoadTimer->Disconnect("AutoLoadNextEvent");
206 if(fSubManagers){delete fSubManagers;}
207 if(fMutex){delete fMutex;}
208 if (fIsOpen){Close();}
210 // fTransients->DecDenyDestroy();
211 // fTransients->Destroy();
213 // fTransientLists->DecDenyDestroy();
214 // fTransientLists->Destroy();
219 void AliEveEventManager::GetNextEvent()
222 cout<<"\n\nGet next event called\n\n"<<endl;
224 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
225 eventManager->CreateSocket(EVENTS_SERVER_SUB);
226 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
231 AliESDEvent *tmpEvent = NULL;
233 // get list of marked events:
234 struct listRequestStruct list;
237 list.runNumber[1]=999999;
238 list.eventNumber[0]=0;
239 list.eventNumber[1]=999999;
242 list.multiplicity[0]=1;
243 list.multiplicity[1]=999999;
244 strcpy(list.system[0],"p-p");
245 strcpy(list.system[1],"A-A");
247 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
248 requestMessage->messageType = REQUEST_LIST_EVENTS;
249 requestMessage->list = list;
251 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
252 vector<serverListStruct> receivedList = eventManager->GetServerListVector(SERVER_COMMUNICATION_REQ,3000);
254 cout<<"EVENT DISPLAY -- received list of marked events"<<endl;
256 for(int i=0;i<receivedList.size();i++)
258 cout<<"ev:"<<receivedList[i].eventNumber<<endl;
264 if(!fLoopMarked || receivedList.size()<=0)
266 cout<<"taking event from reco server"<<endl;
267 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,5000);
268 if(!tmpEvent){sleep(1);}
272 cout<<"taking event from storage manager"<<endl;
273 if(iter<receivedList.size())
275 cout<<"i:"<<iter<<endl;
276 struct eventStruct mark;
277 mark.runNumber = receivedList[iter].runNumber;
278 mark.eventNumber = receivedList[iter].eventNumber;
280 requestMessage->messageType = REQUEST_GET_EVENT;
281 requestMessage->event = mark;
283 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
284 tmpEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
294 cout<<"tmpEvent:"<<tmpEvent->GetRunNumber()<<endl;
295 if(tmpEvent->GetRunNumber()>=0)
298 if(fEventInUse == 0){fWritingToEventIndex = 1;}
299 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
300 cout<<"Received new event:"<<tmpEvent->GetEventNumberInFile()<<endl;
301 if(fCurrentEvent[fWritingToEventIndex])
303 delete fCurrentEvent[fWritingToEventIndex];
304 fCurrentEvent[fWritingToEventIndex]=0;
306 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
307 fIsNewEventAvaliable = true;
312 else{cout<<"didn't receive new event"<<endl;}
314 delete requestMessage;
319 void AliEveEventManager::CheckStorageStatus()
322 AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
323 configManager->ConnectEventManagerSignals();
325 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
326 eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
328 struct clientRequestStruct *request = new struct clientRequestStruct;
329 request->messageType = REQUEST_CONNECTION;
333 if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
336 long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
337 fStorageDown = kFALSE;
341 StorageManagerDown();
342 cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
343 fStorageDown = kTRUE;
348 AliEveEventManager *manager = AliEveEventManager::GetCurrent();
349 manager->Disconnect("StorageManagerOk");
350 manager->Disconnect("StorageManagerDown");
355 void AliEveEventManager::InitInternals()
357 // Initialize internal members.
359 static const TEveException kEH("AliEveEventManager::InitInternals ");
363 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
373 fAutoLoadTimer = new TTimer;
374 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
375 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
377 fExecutor = new AliEveMacroExecutor;
379 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
380 fTransients->IncDenyDestroy();
381 gEve->AddToListTree(fTransients, kFALSE);
383 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
384 fTransientLists->IncDenyDestroy();
385 gEve->AddToListTree(fTransientLists, kFALSE);
387 fPEventSelector = new AliEveEventSelector(this);
389 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
392 /******************************************************************************/
394 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
396 fgESDvisibleTrees = shown;
397 // Set file-name for opening ESD, default "AliESDs.root".
398 if (esd.IsNull()) return;
401 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
405 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
407 // Set file-name for opening ESD friend, default "AliESDfriends.root".
409 if (esdf.IsNull()) return;
410 fgESDfriendsFileName = esdf;
412 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
415 void AliEveEventManager::SetAODFileName(const TString& aod)
417 // Set file-name for opening AOD, default "AliAOD.root".
419 if (aod.IsNull()) return;
422 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
426 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
428 // Add new AOD friend file-name to be attached when opening AOD.
429 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
431 if (fgAODfriends == 0)
433 fgAODfriends = new TList;
434 fgAODfriends->SetOwner(kTRUE);
436 if (fgAODfriends->FindObject(friendFileName) == 0)
438 fgAODfriends->Add(new TObjString(friendFileName));
442 void AliEveEventManager::SetRawFileName(const TString& raw)
444 // Set file-name for opening of raw-data, default "raw.root"
445 if (raw.IsNull()) return;
450 void AliEveEventManager::SetCdbUri(const TString& cdb)
452 // Set path to CDB, there is no default.
453 if ( ! cdb.IsNull()) fgCdbUri = cdb;
456 void AliEveEventManager::SetGAliceFileName(const TString& galice)
458 // Set file-name for opening gAlice, default "galice.root".
460 if ( galice.IsNull()) return;
461 fgGAliceFileName = galice;
463 if (galice.EndsWith(".zip")) fgGAliceFileName.Form("%s#galice.root",galice.Data());
466 void AliEveEventManager::SetFilesPath(const TString& urlPath)
468 TString path = urlPath;
469 gSystem->ExpandPathName(path);
470 if (path.IsNull() || path == ".")
472 path = gSystem->WorkingDirectory();
476 if(path.EndsWith(".zip")) // if given a path to root_archive.zip
478 else if(!path.EndsWith("/"))
481 SetESDFileName( TString(Form("%s%sAliESDs.root", path.Data(), sep.Data())) );
482 SetESDfriendFileName( TString(Form("%s%sAliESDfriends.root", path.Data(), sep.Data())) );
483 SetAODFileName( TString(Form("%s%sAliAOD.root", path.Data(), sep.Data())) );
484 AddAODfriend( TString(Form("%s%sAliAOD.VertexingHF.root", path.Data(), sep.Data())) );
485 SetGAliceFileName( TString(Form("%s%sgalice.root", path.Data(), sep.Data())) );
486 SetRawFileName(TString(Form("%s%sraw.root", path.Data(), sep.Data())));
489 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
490 Bool_t assertAod, Bool_t assertRaw)
492 // Set global flags that detrmine which parts of the event-data must
493 // be present when the event is opened.
495 fgAssertRunLoader = assertRunloader;
496 fgAssertESD = assertEsd;
497 fgAssertAOD = assertAod;
498 fgAssertRaw = assertRaw;
501 void AliEveEventManager::SearchRawForCentralReconstruction()
503 // Enable searching of raw data in standard location. The path passed to
504 // Open() is expected to point to a centrally reconstructed run, e.g.:
505 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
507 fgRawFromStandardLoc = kTRUE;
510 /******************************************************************************/
512 void AliEveEventManager::Open()
514 // Open event-data from URL specified in path.
515 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
516 // Warning is reported if run-loader or ESD is not found.
517 // Global data-members fgAssertRunLoader and fgAssertESD can be set
518 // to throw exceptions instead.
520 static const TEveException kEH("AliEveEventManager::Open ");
524 throw (kEH + "Event-loop is under external control.");
528 throw (kEH + "Event-files already opened.");
533 // Open ESD and ESDfriends
535 if ((fESDFile = TFile::Open(fgESDFileName)))
537 fESD = new AliESDEvent();
539 switch(fgESDvisibleTrees){
540 case AliEveEventManager::kOfflineTree :
541 fESDTree = readESDTree("esdTree", runNo);
543 case AliEveEventManager::kHLTTree :
544 fHLTESDTree = readESDTree("HLTesdTree", runNo);
547 fESDTree = readESDTree("esdTree", runNo);
548 fHLTESDTree = readESDTree("HLTesdTree", runNo);
551 if(!fESDTree && !fHLTESDTree){
552 // both ESD trees are == 0
553 delete fESDFile; fESDFile = 0;
554 delete fESD; fESD = 0;
559 else // esd file not readable
561 Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());
563 if (fESDTree == 0 && fHLTESDTree==0)
567 throw (kEH + "ESD not initialized. Its precence was requested.");
569 Warning(kEH, "ESD not initialized.");
573 // Open AOD and registered friends
574 if ( (fAODFile = TFile::Open(fgAODFileName)) )
576 fAOD = new AliAODEvent();
577 fAODTree = (TTree*) fAODFile->Get("aodTree");
580 // Check if AODfriends exist and attach them.
581 TIter friends(fgAODfriends);
583 while ((name = (TObjString*) friends()) != 0)
585 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
586 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
587 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
589 fAODTree->AddFriend("aodTree", name->GetName());
593 fAOD->ReadFromTree(fAODTree);
595 if (fAODTree->GetEntry(0) <= 0)
597 delete fAODFile; fAODFile = 0;
598 delete fAOD; fAOD = 0;
599 Warning(kEH, "failed getting the first entry from addTree.");
604 runNo = fAOD->GetRunNumber();
609 delete fAODFile; fAODFile = 0;
610 delete fAOD; fAOD = 0;
611 Warning(kEH, "failed getting the aodTree.");
614 else // aod not readable
616 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
622 throw (kEH + "AOD not initialized. Its precence was requested.");
624 Warning(kEH, "AOD not initialized.");
628 // Open RunLoader from galice.root
629 // fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
631 TFile *gafile = TFile::Open(fgGAliceFileName);
632 cout<<"Opening galice"<<endl;
637 cout<<"SETTING RUN LOADER in Open()"<<endl;
638 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
641 TString alicePath(gSystem->DirName(fgGAliceFileName));
642 alicePath.Append("/");
643 fRunLoader->SetDirName(alicePath);
645 if (fRunLoader->LoadgAlice() != 0)
646 Warning(kEH, "failed loading gAlice via run-loader.");
648 if (fRunLoader->LoadHeader() == 0)
651 runNo = fRunLoader->GetHeader()->GetRun();
655 Warning(kEH, "failed loading run-loader's header.");
660 else // run-loader open failed
662 Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());
666 else // galice not readable
668 Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());
672 if (fgAssertRunLoader)
673 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
675 Warning(kEH, "Bootstraping of run-loader failed.");
678 // Open raw-data file
681 if (fgRawFromStandardLoc)
683 if (!fgRawFileName.BeginsWith("alien:"))
684 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
685 if (!fgRawFileName.Contains("/ESDs/"))
686 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
688 TPMERegexp chunk("/([\\d\\.])+/?$");
689 Int_t nm = chunk.Match(fgRawFileName);
691 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
693 TPMERegexp esdstrip("/ESDs/.*");
694 rawPath = fgRawFileName;
695 esdstrip.Substitute(rawPath, "/raw/");
699 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
703 rawPath = fgRawFileName;
705 // If i use open directly, raw-reader reports an error but i have
706 // no way to detect it.
707 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
708 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
709 if (fgAssertRaw == kFALSE)
711 AliLog::SetGlobalLogLevel(AliLog::kFatal);
713 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
715 fRawReader = AliRawReader::Create(rawPath);
719 fRawReader = AliRawReader::Create(fgRawFileName);
721 if (fgAssertRaw == kFALSE)
723 AliLog::SetGlobalLogLevel(oldLogLevel);
730 throw (kEH + "raw-data not initialized. Its precence was requested.");
734 Warning(kEH, "raw-data not initialized.");
742 if ( ! fRawReader->NextEvent())
744 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
746 runNo = fRawReader->GetRunNumber();
747 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
748 fRawReader->RewindEvents();
752 fExternalCtrl = kTRUE;
758 // Initialize OCDB ... only in master event-manager
766 void AliEveEventManager::InitOCDB(int runNo)
768 static const TEveException kEH("AliEveEventManager::InitOCDB ");
769 //if (this == fgMaster)
771 AliCDBManager* cdb = AliCDBManager::Instance();
772 if (cdb->IsDefaultStorageSet() == kTRUE)
774 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
775 cdb->GetDefaultStorage()->GetURI().Data());
779 if (fgCdbUri.IsNull())
781 gEnv->SetValue("Root.Stacktrace", "no");
782 Fatal("Open()", "OCDB path was not specified.");
785 // Handle some special cases for MC (should be in OCDBManager).
786 if (fgCdbUri == "mcideal://")
787 cdb->SetDefaultStorage("MC", "Ideal");
788 else if (fgCdbUri == "mcresidual://")
789 cdb->SetDefaultStorage("MC", "Residual");
790 else if (fgCdbUri == "mcfull://")
791 cdb->SetDefaultStorage("MC", "Full");
792 else if (fgCdbUri == "local://") {
793 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
794 cdb->SetDefaultStorage(fgCdbUri);
796 cdb->SetDefaultStorage(fgCdbUri);
800 if (cdb->IsDefaultStorageSet() == kFALSE)
801 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
803 if (fgCdbUri.BeginsWith("local://"))
805 TString curPath = gSystem->WorkingDirectory();
806 TString grp = "GRP/GRP/Data";
807 TString grppath = curPath + "/" + grp;
808 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
810 if (cdb->GetSpecificStorage(grp))
812 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
816 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
817 TString lpath("local://");
819 cdb->SetSpecificStorage(grp, lpath);
826 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
828 // Set an event from an external source.
829 // The method is used in the online visualisation.
830 // AOD is not supported.
832 static const TEveException kEH("AliEveEventManager::SetEvent ");
836 Warning(kEH, "Event-files were open. Closing and switching to external control.");
840 Info(kEH,"setting it!!! ============================");
842 fRunLoader = runLoader;
843 fRawReader = rawReader;
850 fExternalCtrl = kTRUE;
852 SetTitle("Online event in memory");
853 SetName ("Online Event");
856 AfterNewEventLoaded();
858 if (fAutoLoad || fLoopMarked) StartAutoLoadTimer();
862 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
864 // Returns maximum available event id.
865 // If under external control or event is not opened -1 is returned.
866 // If raw-data is the only data-source this can not be known
867 // and 10,000,000 is returned.
868 // If neither data-source is initialised an exception is thrown.
869 // If refresh_esd is true and ESD is the primary event-data source
870 // its header is re-read from disk.
872 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
874 if (fExternalCtrl || fIsOpen == kFALSE)
879 if ((fESDTree!=0) || (fHLTESDTree!=0))
883 if(fESDTree!=0) fESDTree->Refresh();
884 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
885 fPEventSelector->Update();
889 switch(fgESDvisibleTrees){
891 case AliEveEventManager::kOfflineTree :
892 maxEventId = fESDTree->GetEntries() - 1;
894 case AliEveEventManager::kHLTTree :
895 maxEventId = fHLTESDTree->GetEntries() - 1;
903 return fAODTree->GetEntries() - 1;
907 return fRunLoader->GetNumberOfEvents() - 1;
911 Int_t n = fRawReader->GetNumberOfEvents() - 1;
912 return n > -1 ? n : 10000000;
916 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
920 void AliEveEventManager::GotoEvent(Int_t event)
922 cout<<"Go to event:"<<event<<endl;
923 // Load data for specified event.
924 // If event is out of range an exception is thrown and old state
926 // After successful loading of event, the virtual function
927 // AfterNewEventLoaded() is called. This executes commands that
928 // were registered via TEveEventManager::AddNewEventCommand().
930 // If event is negative, it is subtracted from the number of
931 // available events, thus passing -1 will load the last event.
932 // This is not supported when raw-data is the only data-source
933 // as the number of events is not known.
935 static const TEveException kEH("AliEveEventManager::GotoEvent ");
937 if (fAutoLoadTimerRunning)
939 throw (kEH + "Event auto-load timer is running.");
943 // throw (kEH + "Event-loop is under external control.");
945 if (fStorageDown && -1 == event)
953 // create new server request:
954 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
957 if (event == -1) {requestMessage->messageType = REQUEST_GET_LAST_EVENT;}
958 else if (event == 0) {requestMessage->messageType = REQUEST_GET_FIRST_EVENT;}
959 else if (event == 1) {requestMessage->messageType = REQUEST_GET_PREV_EVENT;}
960 else if (event == 2) {requestMessage->messageType = REQUEST_GET_NEXT_EVENT;}
963 struct eventStruct eventToLoad;
964 eventToLoad.runNumber = fESD->GetRunNumber();
965 eventToLoad.eventNumber = fESD->GetEventNumberInFile();
966 requestMessage->event = eventToLoad;
968 // create event manager:
969 AliStorageEventManager *eventManager =
970 AliStorageEventManager::GetEventManagerInstance();
971 AliESDEvent *resultEvent = NULL;
973 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
976 // send request and receive event:
977 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
978 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
983 InitOCDB(resultEvent->GetRunNumber());
984 SetEvent(0,0,resultEvent,0);
988 if(event==-1){cout<<"\n\nWARNING -- No last event is avaliable.\n\n"<<endl;}
989 if(event==0){cout<<"\n\nWARNING -- No first event is avaliable.\n\n"<<endl;}
990 if(event==1){cout<<"\n\nWARNING -- No previous event is avaliable.\n\n"<<endl;}
991 if(event==2){cout<<"\n\nWARNING -- No next event is avaliable.\n\n"<<endl;}
998 cout<<"\n\nWARNING -- No event has been already loaded. Loading the most recent event...\n\n"<<endl;
1000 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1001 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
1003 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
1004 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1005 AliESDEvent *resultEvent = NULL;
1008 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1009 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1015 InitOCDB(resultEvent->GetRunNumber());
1016 SetEvent(0,0,resultEvent,0);
1018 else{cout<<"\n\nWARNING -- The most recent event is not avaliable.\n\n"<<endl;}
1026 throw (kEH + "Event-files not opened.");
1034 if ((fESDTree!=0) || (fHLTESDTree!=0))
1037 if (event >= fESDTree->GetEntries())
1038 fESDTree->Refresh();
1039 maxEvent = fESDTree->GetEntries() - 1;
1041 event = fESDTree->GetEntries() + event;
1045 if (event >= fHLTESDTree->GetEntries())
1046 fHLTESDTree->Refresh();
1047 maxEvent = fHLTESDTree->GetEntries() - 1;
1049 event = fHLTESDTree->GetEntries() + event;
1055 maxEvent = fAODTree->GetEntries() - 1;
1057 event = fAODTree->GetEntries() + event;
1059 else if (fRunLoader)
1061 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
1063 event = fRunLoader->GetNumberOfEvents() + event;
1065 else if (fRawReader)
1067 maxEvent = fRawReader->GetNumberOfEvents() - 1;
1070 maxEvent = 10000000;
1072 Error(kEH, "current raw-data source does not support direct event access.");
1075 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
1080 event = fRawReader->GetNumberOfEvents() + event;
1085 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
1087 if (event < 0 || event > maxEvent)
1089 throw (kEH + Form("event %d not present, available range [%d, %d].",
1090 event, 0, maxEvent));
1093 TString sysInfoHeader;
1094 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
1095 AliSysInfo::AddStamp(sysInfoHeader + "Start");
1097 TEveManager::TRedrawDisabler rd(gEve);
1098 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
1100 // !!! MT this is somewhat brutal; at least optionally, one could be
1101 // a bit gentler, checking for objs owning their external refs and having
1102 // additinal parents.
1103 gEve->GetViewers()->DeleteAnnotations();
1104 fTransients->DestroyElements();
1105 for (TEveElement::List_i i = fTransientLists->BeginChildren();
1106 i != fTransientLists->EndChildren(); ++i)
1108 (*i)->DestroyElements();
1112 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
1115 if (fESDTree->GetEntry(event) <= 0)
1116 throw (kEH + "failed getting required event from ESD.");
1118 if (fESDfriendExists)
1119 fESD->SetESDfriend(fESDfriend);
1123 if (fHLTESDTree->GetEntry(event) <= 0)
1124 throw (kEH + "failed getting required event from HLT ESD.");
1126 if (fESDfriendExists)
1127 fESD->SetESDfriend(fESDfriend);
1131 if (fAODTree->GetEntry(event) <= 0)
1132 throw (kEH + "failed getting required event from AOD.");
1136 if (fRunLoader->GetEvent(event) != 0)
1137 throw (kEH + "failed getting required event.");
1142 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
1143 if (fRawReader->GotoEvent(event) == kFALSE)
1145 // Use fallback method - iteration with NextEvent().
1146 Int_t rawEv = fEventId;
1149 fRawReader->RewindEvents();
1153 while (rawEv < event)
1155 if ( ! fRawReader->NextEvent())
1157 fRawReader->RewindEvents();
1159 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
1163 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
1169 if (this == fgMaster)
1171 SetName(Form("Event %d", fEventId));
1175 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
1177 AfterNewEventLoaded();
1179 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
1182 void AliEveEventManager::Timeout()
1187 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
1190 InitOCDB(event->GetRunNumber());
1191 printf("======================= setting event to %d\n", fEventId);
1192 SetEvent(0,0,event,0);
1195 void AliEveEventManager::NextEvent()
1197 // Loads next event.
1198 // Does magick needed for online display when under external event control.
1200 static const TEveException kEH("AliEveEventManager::NextEvent ");
1202 if (fAutoLoadTimerRunning){throw (kEH + "Event auto-load timer is running.");}
1207 if(fIsNewEventAvaliable)
1210 if(fWritingToEventIndex == 0) fEventInUse = 0;
1211 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1213 if(fCurrentEvent[fEventInUse])
1215 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1217 printf("======================= setting event to %d\n", fCurrentEvent[fEventInUse]->GetEventNumberInFile());
1220 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1221 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1225 fIsNewEventAvaliable = false;
1230 cout<<"No new event is avaliable."<<endl;
1235 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1238 if (fPEventSelector->FindNext(nextevent))
1240 GotoEvent(nextevent);
1243 else if (fEventId < GetMaxEventId(kTRUE))
1245 GotoEvent(fEventId + 1);
1248 gSystem->ProcessEvents();
1252 AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
1253 cout<<"contructor called"<<endl;
1254 vsdCreator->CreateVSD("myVSD.root");
1257 //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
1260 void AliEveEventManager::PrevEvent()
1262 // Loads previous event.
1264 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1266 if (fAutoLoadTimerRunning)
1268 throw (kEH + "Event auto-load timer is running.");
1272 throw (kEH + "Event-loop is under external control.");
1275 if ((fESDTree!=0) || (fHLTESDTree!=0))
1278 if (fPEventSelector->FindPrev(nextevent))
1280 GotoEvent(nextevent);
1283 else if (fEventId > 0)
1285 GotoEvent(fEventId - 1);
1289 void AliEveEventManager::MarkCurrentEvent()
1292 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1293 struct eventStruct mark;
1294 mark.runNumber = fESD->GetRunNumber();
1295 mark.eventNumber = fESD->GetEventNumberInFile();
1296 requestMessage->messageType = REQUEST_MARK_EVENT;
1297 requestMessage->event = mark;
1299 AliStorageEventManager *eventManager =
1300 AliStorageEventManager::GetEventManagerInstance();
1301 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1304 std::future<bool> unused = std::async([]()
1306 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1307 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1311 //fStatusLabel->SetText("Event marked");
1312 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1316 //fStatusLabel->SetText("Couldn't mark this event");
1317 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1322 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1323 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1328 //fStatusLabel->SetText("Event marked");
1329 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1333 //fStatusLabel->SetText("Couldn't mark this event");
1334 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1336 if(requestMessage){delete requestMessage;}
1340 void AliEveEventManager::Close()
1342 // Close the event data-files and delete ESD, ESDfriend, run-loader
1345 cout<<"\n\n\nClose() called!!\n\n\n"<<endl;
1347 static const TEveException kEH("AliEveEventManager::Close ");
1351 throw (kEH + "Event-files not opened.");
1354 if (fAutoLoadTimerRunning)
1355 StopAutoLoadTimer();
1357 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1358 delete fESD; fESD = 0;
1359 // delete fESDfriend; // friend tree is deleted with the tree
1361 fESDfriendExists = kFALSE;
1363 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1364 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1365 delete fESDFile; fESDFile = 0;
1369 delete fAOD; fAOD = 0;
1371 delete fAODTree; fAODTree = 0;
1372 delete fAODFile; fAODFile = 0;
1376 delete fRunLoader; fRunLoader = 0;
1380 delete fRawReader; fRawReader = 0;
1389 //------------------------------------------------------------------------------
1390 // Static convenience functions, mainly used from macros.
1391 //------------------------------------------------------------------------------
1393 Int_t AliEveEventManager::CurrentEventId()
1395 // Return current event-id.
1397 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1399 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1400 throw (kEH + "ALICE event not ready.");
1401 return fgCurrent->GetEventId();
1404 Bool_t AliEveEventManager::HasRunLoader()
1406 // Check if AliRunLoader is initialized.
1408 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1411 Bool_t AliEveEventManager::HasESD()
1413 // Check if AliESDEvent is initialized.
1415 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1418 Bool_t AliEveEventManager::HasESDfriend()
1420 // Check if AliESDfriend is initialized.
1422 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1425 Bool_t AliEveEventManager::HasAOD()
1427 // Check if AliESDEvent is initialized.
1429 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1432 Bool_t AliEveEventManager::HasRawReader()
1434 // Check if raw-reader is initialized.
1436 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1439 AliRunLoader* AliEveEventManager::AssertRunLoader()
1441 // Make sure AliRunLoader is initialized and return it.
1442 // Throws exception in case run-loader is not available.
1443 // Static utility for macros.
1445 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1447 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1448 throw (kEH + "ALICE event not ready.");
1449 if (fgCurrent->fRunLoader == 0)
1450 throw (kEH + "AliRunLoader not initialised.");
1451 return fgCurrent->fRunLoader;
1454 AliESDEvent* AliEveEventManager::AssertESD()
1456 // Make sure AliESDEvent is initialized and return it.
1457 // Throws exception in case ESD is not available.
1458 // Static utility for macros.
1460 static const TEveException kEH("AliEveEventManager::AssertESD ");
1462 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1463 throw (kEH + "ALICE event not ready.");
1464 if (fgCurrent->fESD == 0)
1465 throw (kEH + "AliESD not initialised.");
1466 return fgCurrent->fESD;
1469 AliESDfriend* AliEveEventManager::AssertESDfriend()
1471 // Make sure AliESDfriend is initialized and return it.
1472 // Throws exception in case ESDfriend-loader is not available.
1473 // Static utility for macros.
1475 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1477 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1478 throw (kEH + "ALICE event not ready.");
1479 if (fgCurrent->fESDfriend == 0)
1480 throw (kEH + "AliESDfriend not initialised.");
1481 return fgCurrent->fESDfriend;
1484 AliAODEvent* AliEveEventManager::AssertAOD()
1486 // Make sure AliAODEvent is initialized and return it.
1487 // Throws exception in case AOD is not available.
1488 // Static utility for macros.
1490 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1492 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1493 throw (kEH + "ALICE event not ready.");
1494 if (fgCurrent->fAOD == 0)
1495 throw (kEH + "AliAOD not initialised.");
1496 return fgCurrent->fAOD;
1499 AliRawReader* AliEveEventManager::AssertRawReader()
1501 // Make sure raw-reader is initialized and return it.
1503 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1505 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1506 throw (kEH + "ALICE event not ready.");
1507 if (fgCurrent->fRawReader == 0)
1508 throw (kEH + "RawReader not ready.");
1510 return fgCurrent->fRawReader;
1513 //==============================================================================
1515 AliMagF* AliEveEventManager::AssertMagField()
1517 // Make sure AliMagF is initialized and returns it.
1518 // Throws exception in case magnetic field is not available.
1519 // Static utility for macros.
1521 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1526 if (TGeoGlobalMagField::Instance()->GetField())
1528 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1529 if (fgMagField == 0)
1530 throw kEH + "Global field set, but it is not AliMagF.";
1539 if (TGeoGlobalMagField::Instance()->GetField())
1541 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1542 if (fgMagField == 0)
1543 throw kEH + "Global field set, but it is not AliMagF.";
1547 throw kEH + "Could not initialize magnetic field.";
1553 TGeoManager* AliEveEventManager::AssertGeometry()
1555 // Make sure AliGeomManager is initialized and returns the
1556 // corresponding TGeoManger.
1557 // gGeoManager is set to the return value.
1558 // Throws exception if geometry can not be loaded or if it is not
1559 // available and the TGeoManager is locked.
1560 // Static utility for macros.
1562 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1564 if (AliGeomManager::GetGeometry() == 0)
1566 if (TGeoManager::IsLocked())
1567 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1570 AliGeomManager::LoadGeometry();
1571 if ( ! AliGeomManager::GetGeometry())
1573 throw (kEH + "can not load geometry.");
1575 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1577 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1578 // throw (kEH + "could not apply align objs.");
1580 AliGeomManager::GetGeometry()->DefaultColors();
1583 gGeoManager = AliGeomManager::GetGeometry();
1587 AliRecoParam* AliEveEventManager::AssertRecoParams()
1595 Bool_t AliEveEventManager::InitRecoParam()
1597 // This is mostly a reap-off from reconstruction
1598 // The method accesses OCDB and retrieves all
1599 // the available reco-param objects from there.
1601 fgRecoParam = new AliRecoParam;
1602 const Int_t kNDetectors = 14;
1604 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1606 Bool_t isOK = kTRUE;
1608 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1609 ::Info(kEH, "Using custom GRP reconstruction parameters");
1612 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1614 AliCDBPath path("GRP","Calib","RecoParam");
1615 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1617 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1621 TObject *recoParamObj = entry->GetObject();
1622 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1623 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1624 // Registering them in AliRecoParam
1625 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1627 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1628 // GRP has only onse set of reco parameters
1629 // Registering it in AliRecoParam
1630 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1631 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1632 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1635 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1642 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1645 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1647 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1648 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1652 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1654 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1655 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1657 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1661 TObject *recoParamObj = entry->GetObject();
1662 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1663 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1664 // Registering them in AliRecoParam
1665 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1667 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1668 // The detector has only onse set of reco parameters
1669 // Registering it in AliRecoParam
1670 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1671 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1672 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1675 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1691 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1693 if(!fESDFile && !fESD) return 0;
1695 static const TEveException kEH("AliEveEventManager::readESDTree ");
1697 TTree* tempTree = 0;
1699 tempTree =(TTree*) fESDFile->Get(treeName);
1702 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1705 if (!esdFriendFile->IsZombie())
1707 esdFriendFile->Close();
1708 fESDfriendExists = kTRUE;
1709 tempTree->SetBranchStatus ("ESDfriend*", 1);
1711 delete esdFriendFile;
1714 fESD->ReadFromTree(tempTree);
1715 if (fESDfriendExists)
1717 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1718 Info(kEH, "found and attached ESD friend.");
1722 Warning(kEH, "ESDfriend not found.");
1725 if (tempTree->GetEntry(0) <= 0)
1727 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1732 runNo = fESD->GetESDRun()->GetRunNumber();
1737 Warning(kEH, "failed getting the tree:%s", treeName);
1744 //------------------------------------------------------------------------------
1746 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1748 // Create and attach a dependent event-manager.
1749 // It is not added into eve list tree.
1751 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1754 throw(kEH + "Master event-manager must be instantiated first.");
1756 if (fgMaster->fSubManagers == 0)
1758 fgMaster->fSubManagers = new TList;
1759 fgMaster->fSubManagers->SetOwner(kTRUE);
1762 AliEveEventManager* new_mgr = 0;
1766 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1767 new_mgr->SetFilesPath(path);
1768 fgMaster->fSubManagers->Add(new_mgr);
1770 catch (TEveException& exc)
1772 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1774 fgCurrent = fgMaster;
1779 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1781 // Get a dependant manager by name.
1782 // This will not change the current manager, use helper class
1783 // AliEveEventManager::CurrentChanger for that.
1785 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1788 throw(kEH + "Master event-manager must be instantiated first.");
1790 if (fgMaster->fSubManagers == 0)
1793 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1796 AliEveEventManager* AliEveEventManager::GetMaster()
1798 // Get master event-manager.
1803 AliEveEventManager* AliEveEventManager::GetCurrent()
1805 // Get current event-manager.
1810 void AliEveEventManager::RegisterTransient(TEveElement* element)
1812 GetCurrent()->fTransients->AddElement(element);
1815 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1817 GetCurrent()->fTransientLists->AddElement(element);
1820 //------------------------------------------------------------------------------
1821 // Autoloading of events
1822 //------------------------------------------------------------------------------
1824 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1826 // Set the auto-load time in seconds
1828 fAutoLoadTime = time;
1831 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1833 // Set the automatic event loading mode
1835 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1837 if (fAutoLoad == autoLoad)
1839 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1843 fAutoLoad = autoLoad;
1846 StartAutoLoadTimer();
1850 StopAutoLoadTimer();
1854 void AliEveEventManager::SetLoopMarked(Bool_t loopMarked)
1856 // Set the automatic event loading mode
1857 fLoopMarked = loopMarked;
1858 if (fLoopMarked){StartAutoLoadTimer();}
1859 else{StopAutoLoadTimer();}
1862 void AliEveEventManager::SetTrigSel(Int_t trig)
1864 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1868 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1873 ULong64_t trigMask = 0;
1874 if (trig >= 0) trigMask = (1ull << trig);
1875 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1876 fRawReader->SelectEvents(-1,trigMask,NULL);
1880 void AliEveEventManager::StartAutoLoadTimer()
1882 // Start the auto-load timer.
1884 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1885 fAutoLoadTimer->Reset();
1886 fAutoLoadTimer->TurnOn();
1887 fAutoLoadTimerRunning = kTRUE;
1890 void AliEveEventManager::StopAutoLoadTimer()
1892 // Stop the auto-load timer.
1894 fAutoLoadTimerRunning = kFALSE;
1895 fAutoLoadTimer->TurnOff();
1898 void AliEveEventManager::AutoLoadNextEvent()
1900 // Called from auto-load timer, so it has to be public.
1901 // Do NOT call it directly.
1903 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1905 Info(kEH, "called!");
1907 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1909 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1913 StopAutoLoadTimer();
1915 if (fAutoLoad || fLoopMarked)
1916 StartAutoLoadTimer();
1919 //------------------------------------------------------------------------------
1920 // Post event-loading functions
1921 //------------------------------------------------------------------------------
1923 void AliEveEventManager::AfterNewEventLoaded()
1925 // Execute registered macros and commands.
1926 // At the end emit NewEventLoaded signal.
1928 // Virtual from TEveEventManager.
1930 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1932 Info(kEH, "------------------!!!------------");
1934 NewEventDataLoaded();
1935 if (fExecutor) fExecutor->ExecMacros();
1937 TEveEventManager::AfterNewEventLoaded();
1940 if (this == fgMaster && fSubManagers != 0)
1942 TIter next(fSubManagers);
1943 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1945 gEve->SetCurrentEvent(fgCurrent);
1948 fgCurrent->GotoEvent(fEventId);
1950 catch (TEveException& exc)
1952 // !!! Should somehow tag / disable / remove it?
1953 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1954 fEventId, fgCurrent->GetName(), exc.Data());
1956 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
1958 fgCurrent = fgMaster;
1959 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
1960 gEve->SetCurrentEvent(fgMaster);
1964 void AliEveEventManager::NewEventDataLoaded()
1966 // Emit NewEventDataLoaded signal.
1967 Emit("NewEventDataLoaded()");
1969 void AliEveEventManager::NewEventLoaded()
1971 // Emit NewEventLoaded signal.
1972 Emit("NewEventLoaded()");
1974 void AliEveEventManager::NoEventLoaded()
1976 // Emit NoEventLoaded signal.
1977 Emit("NoEventLoaded()");
1979 void AliEveEventManager::StorageManagerOk()
1981 // Emit StorageManagerOk signal.
1982 Emit("StorageManagerOk()");
1984 void AliEveEventManager::StorageManagerDown()
1986 // Emit StorageManagerOk signal.
1987 Emit("StorageManagerDown()");
1991 //------------------------------------------------------------------------------
1992 // Event info dumpers
1993 //------------------------------------------------------------------------------
1995 const AliEventInfo* AliEveEventManager::GetEventInfo()
1997 // Fill the event info object
1999 AliCentralTrigger *aCTP = NULL;
2001 fEventInfo.SetEventType(fRawReader->GetType());
2003 ULong64_t mask = fRawReader->GetClassMask();
2004 fEventInfo.SetTriggerMask(mask);
2005 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
2006 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
2008 aCTP = new AliCentralTrigger();
2009 TString configstr("");
2010 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
2011 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
2015 aCTP->SetClassMask(mask);
2016 aCTP->SetClusterMask(clmask);
2019 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
2021 rlCTP->SetClassMask(mask);
2022 rlCTP->SetClusterMask(clmask);
2027 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
2029 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
2030 aCTP = fRunLoader->GetTrigger();
2031 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
2032 // get inputs from actp - just get
2033 AliESDHeader* esdheader = fESD->GetHeader();
2034 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
2035 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
2036 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
2037 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
2040 AliWarning("No trigger can be loaded! The trigger information will not be used!");
2045 AliTriggerConfiguration *config = aCTP->GetConfiguration();
2047 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
2048 if (fRawReader) delete aCTP;
2052 TString declTriggerClasses;
2054 // Load trigger aliases and declare the trigger classes included in aliases
2055 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
2057 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
2059 lst->Sort(kSortDescending); // to avoid problems with substrings
2060 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
2061 // Now declare all the triggers present in the aliases
2064 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
2065 declTriggerClasses += " ";
2066 declTriggerClasses += nmd->GetName();
2070 AliError("Cannot cast the object with trigger aliases to THashList!");
2074 AliError("No OCDB entry for the trigger aliases!");
2077 // Load trigger classes for this run
2078 UChar_t clustmask = 0;
2080 ULong64_t trmask = fEventInfo.GetTriggerMask();
2081 const TObjArray& classesArray = config->GetClasses();
2082 Int_t nclasses = classesArray.GetEntriesFast();
2083 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
2084 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
2085 if (trclass && trclass->GetMask()>0) {
2086 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
2087 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
2088 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
2089 if (trmask & (1ull << trindex)) {
2091 trclasses += trclass->GetName();
2093 clustmask |= trclass->GetCluster()->GetClusterMask();
2097 fEventInfo.SetTriggerClasses(trclasses);
2099 if (!aCTP->CheckTriggeredDetectors()) {
2100 if (fRawReader) delete aCTP;
2104 if (fRawReader) delete aCTP;
2106 // everything went ok, return pointer
2107 return (&fEventInfo);
2111 TString AliEveEventManager::GetEventInfoHorizontal() const
2113 // Dumps the event-header contents in vertical formatting.
2115 TString rawInfo, esdInfo;
2119 rawInfo = "No raw-data event info is available!\n";
2123 const UInt_t* attr = fRawReader->GetAttributes();
2124 TTimeStamp ts(fRawReader->GetTimestamp());
2125 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2126 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
2127 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2128 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2129 fRawReader->GetClassMask(),
2130 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2131 attr[0],attr[1],attr[2], ts.AsString("s"));
2136 esdInfo = "No ESD event info is available!";
2140 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2141 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2142 TTimeStamp ts(fESD->GetTimeStamp());
2143 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2144 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
2145 fESD->GetRunNumber(),
2146 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2147 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2148 acttrclasses.Data(),
2149 fESD->GetTriggerMask(),firedtrclasses.Data(),
2150 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
2153 return rawInfo + esdInfo;
2156 TString AliEveEventManager::GetEventInfoVertical() const
2158 // Dumps the event-header contents in vertical formatting.
2160 TString rawInfo, esdInfo;
2164 rawInfo = "No raw-data event info is available!\n";
2168 const UInt_t* attr = fRawReader->GetAttributes();
2169 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",
2170 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2171 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2172 fRawReader->GetClassMask(),
2173 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2174 attr[0],attr[1],attr[2],
2175 fRawReader->GetTimestamp());
2180 esdInfo = "No ESD event info is available!\n";
2184 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2185 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2186 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",
2187 fESD->GetRunNumber(),
2188 acttrclasses.Data(),
2189 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2190 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2191 fESD->GetTriggerMask(),firedtrclasses.Data(),
2192 fESD->GetEventNumberInFile(),
2193 fESD->GetTimeStamp());
2196 return rawInfo + "\n" + esdInfo;
2200 //==============================================================================
2201 // Reading of GRP and MagneticField.
2202 // This is a reap-off from reconstruction ... should really be a common
2203 // code to do this somewhere in STEER.
2204 //==============================================================================
2206 Bool_t AliEveEventManager::InitGRP()
2208 //------------------------------------
2209 // Initialization of the GRP entry
2210 //------------------------------------
2212 static const TEveException kEH("AliEveEventManager::InitGRP ");
2214 AliGRPManager grpMgr;
2215 if (!grpMgr.ReadGRPEntry()) {
2218 fgGRPLoaded = kTRUE;
2219 if (!grpMgr.SetMagField()) {
2220 throw kEH + "Setting of field failed!";
2223 //*** Get the diamond profiles from OCDB
2224 // Eventually useful.
2227 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
2229 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
2231 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2234 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2236 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2238 ::Error(kEH, "No diamond profile found in OCDB!");
2241 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2243 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2245 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2252 //------------------------------------
2253 // Global variables management
2254 //------------------------------------
2256 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2258 // Insert a new visualization-parameter database entry with the default
2259 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2262 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2263 Bool_t replace, Bool_t update)
2265 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2270 model->IncDenyDestroy();
2271 model->SetRnrChildren(kFALSE);
2273 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2274 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2275 while (old_model->HasChildren())
2277 TEveElement *el = old_model->FirstChild();
2278 el->SetVizModel(model);
2281 el->CopyVizParams(model);
2282 el->PropagateVizParamsToProjecteds();
2285 old_model->DecDenyDestroy();
2287 pair->SetValue(dynamic_cast<TObject*>(model));
2297 model->IncDenyDestroy();
2298 model->SetRnrChildren(kFALSE);
2299 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2304 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2306 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));
2308 Int_t AliEveEventManager::NewEventAvailable()
2310 if (fIsNewEventAvaliable)