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;
115 TString AliEveEventManager::fgSpecificCdbUriValue;
116 TString AliEveEventManager::fgSpecificCdbUriPath;
118 TList* AliEveEventManager::fgAODfriends = 0;
120 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
122 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
123 AliMagF* AliEveEventManager::fgMagField = 0;
124 AliRecoParam* AliEveEventManager::fgRecoParam = 0;
125 Bool_t AliEveEventManager::fgUniformField = kFALSE;
127 AliEveEventManager* AliEveEventManager::fgMaster = 0;
128 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
130 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
131 TEveEventManager(name, ""),
134 fESDFile (0), fESDTree (0), fHLTESDTree(0), fESD (0),
135 fESDfriend (0), fESDfriendExists(kFALSE),
136 fAODFile (0), fAODTree (0), fAOD (0),
137 fRawReader (0), fEventInfo(),
138 fAutoLoad (kFALSE),fLoopMarked(kFALSE), fAutoLoadTime (5), fAutoLoadTimer(0),
139 fIsOpen (kFALSE), fHasEvent (kFALSE), fExternalCtrl (kFALSE),
140 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
141 fExecutor (0), fTransients(0), fTransientLists(0),
144 fAutoLoadTimerRunning(kFALSE),
145 fMutex(new TMutex()),
146 fgSubSock(EVENTS_SERVER_SUB),
148 fWritingToEventIndex(0),
149 fIsNewEventAvaliable(false),
154 // Constructor with event-id.
164 if (0 == name.CompareTo("online")) {
168 fOnlineMode = kFALSE;
175 cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
176 fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
177 fEventListenerThread->Run();
179 // fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
180 //fStorageManagerWatcherThread->Run();
183 cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
187 AliEveEventManager::~AliEveEventManager()
192 if(fEventListenerThread)
194 fEventListenerThread->Join();
195 fEventListenerThread->Kill();
196 delete fEventListenerThread;
197 cout<<"listener thread killed and deleted"<<endl;
199 if(fStorageManagerWatcherThread)
201 fStorageManagerWatcherThread->Join();
202 fStorageManagerWatcherThread->Kill();
203 delete fStorageManagerWatcherThread;
204 cout<<"storage watcher thread killed and deleted"<<endl;
207 fAutoLoadTimer->Stop();
208 fAutoLoadTimer->Disconnect("Timeout");
209 fAutoLoadTimer->Disconnect("AutoLoadNextEvent");
211 if(fSubManagers){delete fSubManagers;}
212 if(fMutex){delete fMutex;}
213 if (fIsOpen){Close();}
215 // fTransients->DecDenyDestroy();
216 // fTransients->Destroy();
218 // fTransientLists->DecDenyDestroy();
219 // fTransientLists->Destroy();
224 void AliEveEventManager::GetNextEvent()
227 if(!fOnlineMode){return;}
228 cout<<"\n\nGet next event called\n\n"<<endl;
230 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
231 eventManager->CreateSocket(EVENTS_SERVER_SUB);
232 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
237 AliESDEvent *tmpEvent = NULL;
239 // get list of marked events:
240 struct listRequestStruct list;
243 list.runNumber[1]=999999;
244 list.eventNumber[0]=0;
245 list.eventNumber[1]=999999;
248 list.multiplicity[0]=1;
249 list.multiplicity[1]=999999;
250 strcpy(list.system[0],"p-p");
251 strcpy(list.system[1],"A-A");
253 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
254 requestMessage->messageType = REQUEST_LIST_EVENTS;
255 requestMessage->list = list;
257 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
258 vector<serverListStruct> receivedList = eventManager->GetServerListVector(SERVER_COMMUNICATION_REQ,3000);
260 cout<<"EVENT DISPLAY -- received list of marked events"<<endl;
262 for(int i=0;i<receivedList.size();i++)
264 cout<<"ev:"<<receivedList[i].eventNumber<<endl;
270 if(!fLoopMarked || receivedList.size()<=0)
272 cout<<"taking event from reco server"<<endl;
273 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,5000);
274 if(!tmpEvent){sleep(1);}
278 cout<<"taking event from storage manager"<<endl;
279 if(iter<receivedList.size())
281 cout<<"i:"<<iter<<endl;
282 struct eventStruct mark;
283 mark.runNumber = receivedList[iter].runNumber;
284 mark.eventNumber = receivedList[iter].eventNumber;
286 requestMessage->messageType = REQUEST_GET_EVENT;
287 requestMessage->event = mark;
289 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
290 tmpEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
300 cout<<"tmpEvent:"<<tmpEvent->GetRunNumber()<<endl;
301 if(tmpEvent->GetRunNumber()>=0)
304 if(fEventInUse == 0){fWritingToEventIndex = 1;}
305 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
306 cout<<"Received new event:"<<tmpEvent->GetEventNumberInFile()<<endl;
307 if(fCurrentEvent[fWritingToEventIndex])
309 delete fCurrentEvent[fWritingToEventIndex];
310 fCurrentEvent[fWritingToEventIndex]=0;
312 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
313 fIsNewEventAvaliable = true;
318 else{cout<<"didn't receive new event"<<endl;}
320 delete requestMessage;
325 void AliEveEventManager::CheckStorageStatus()
328 if(!fOnlineMode){return;}
330 AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
331 configManager->ConnectEventManagerSignals();
333 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
334 eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
336 struct clientRequestStruct *request = new struct clientRequestStruct;
337 request->messageType = REQUEST_CONNECTION;
341 if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
344 long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
345 fStorageDown = kFALSE;
349 StorageManagerDown();
350 cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
351 fStorageDown = kTRUE;
356 AliEveEventManager *manager = AliEveEventManager::GetCurrent();
357 manager->Disconnect("StorageManagerOk");
358 manager->Disconnect("StorageManagerDown");
363 void AliEveEventManager::InitInternals()
365 // Initialize internal members.
367 static const TEveException kEH("AliEveEventManager::InitInternals ");
371 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
381 fAutoLoadTimer = new TTimer;
382 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
383 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
385 fExecutor = new AliEveMacroExecutor;
387 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
388 fTransients->IncDenyDestroy();
389 gEve->AddToListTree(fTransients, kFALSE);
391 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
392 fTransientLists->IncDenyDestroy();
393 gEve->AddToListTree(fTransientLists, kFALSE);
395 fPEventSelector = new AliEveEventSelector(this);
397 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
400 /******************************************************************************/
402 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
404 fgESDvisibleTrees = shown;
405 // Set file-name for opening ESD, default "AliESDs.root".
406 if (esd.IsNull()) return;
409 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
413 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
415 // Set file-name for opening ESD friend, default "AliESDfriends.root".
417 if (esdf.IsNull()) return;
418 fgESDfriendsFileName = esdf;
420 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
423 void AliEveEventManager::SetAODFileName(const TString& aod)
425 // Set file-name for opening AOD, default "AliAOD.root".
427 if (aod.IsNull()) return;
430 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
434 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
436 // Add new AOD friend file-name to be attached when opening AOD.
437 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
439 if (fgAODfriends == 0)
441 fgAODfriends = new TList;
442 fgAODfriends->SetOwner(kTRUE);
444 if (fgAODfriends->FindObject(friendFileName) == 0)
446 fgAODfriends->Add(new TObjString(friendFileName));
450 void AliEveEventManager::SetRawFileName(const TString& raw)
452 // Set file-name for opening of raw-data, default "raw.root"
453 if (raw.IsNull()) return;
458 void AliEveEventManager::SetCdbUri(const TString& cdb)
460 // Set path to CDB, there is no default.
461 if ( ! cdb.IsNull()) fgCdbUri = cdb;
464 void AliEveEventManager::SetSpecificCdbUri(const TString& path,const TString& value)
466 // Set path to specific CDB object, there is no default.
467 if ( ! value.IsNull()) fgSpecificCdbUriValue = value;
468 if ( ! path.IsNull()) fgSpecificCdbUriPath = path;
471 void AliEveEventManager::SetGAliceFileName(const TString& galice)
473 // Set file-name for opening gAlice, default "galice.root".
475 if ( galice.IsNull()) return;
476 fgGAliceFileName = galice;
478 if (galice.EndsWith(".zip")) fgGAliceFileName.Form("%s#galice.root",galice.Data());
481 void AliEveEventManager::SetFilesPath(const TString& urlPath)
483 TString path = urlPath;
484 gSystem->ExpandPathName(path);
485 if (path.IsNull() || path == ".")
487 path = gSystem->WorkingDirectory();
491 if(path.EndsWith(".zip")) // if given a path to root_archive.zip
493 else if(!path.EndsWith("/"))
496 SetESDFileName( TString(Form("%s%sAliESDs.root", path.Data(), sep.Data())) );
497 SetESDfriendFileName( TString(Form("%s%sAliESDfriends.root", path.Data(), sep.Data())) );
498 SetAODFileName( TString(Form("%s%sAliAOD.root", path.Data(), sep.Data())) );
499 AddAODfriend( TString(Form("%s%sAliAOD.VertexingHF.root", path.Data(), sep.Data())) );
500 SetGAliceFileName( TString(Form("%s%sgalice.root", path.Data(), sep.Data())) );
501 SetRawFileName(TString(Form("%s%sraw.root", path.Data(), sep.Data())));
504 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
505 Bool_t assertAod, Bool_t assertRaw)
507 // Set global flags that detrmine which parts of the event-data must
508 // be present when the event is opened.
510 fgAssertRunLoader = assertRunloader;
511 fgAssertESD = assertEsd;
512 fgAssertAOD = assertAod;
513 fgAssertRaw = assertRaw;
516 void AliEveEventManager::SearchRawForCentralReconstruction()
518 // Enable searching of raw data in standard location. The path passed to
519 // Open() is expected to point to a centrally reconstructed run, e.g.:
520 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
522 fgRawFromStandardLoc = kTRUE;
525 /******************************************************************************/
527 void AliEveEventManager::Open()
529 // Open event-data from URL specified in path.
530 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
531 // Warning is reported if run-loader or ESD is not found.
532 // Global data-members fgAssertRunLoader and fgAssertESD can be set
533 // to throw exceptions instead.
535 static const TEveException kEH("AliEveEventManager::Open ");
539 throw (kEH + "Event-loop is under external control.");
543 throw (kEH + "Event-files already opened.");
548 // Open ESD and ESDfriends
550 if ((fESDFile = TFile::Open(fgESDFileName)))
552 fESD = new AliESDEvent();
554 switch(fgESDvisibleTrees){
555 case AliEveEventManager::kOfflineTree :
556 fESDTree = readESDTree("esdTree", runNo);
558 case AliEveEventManager::kHLTTree :
559 fHLTESDTree = readESDTree("HLTesdTree", runNo);
562 fESDTree = readESDTree("esdTree", runNo);
563 fHLTESDTree = readESDTree("HLTesdTree", runNo);
566 if(!fESDTree && !fHLTESDTree){
567 // both ESD trees are == 0
568 delete fESDFile; fESDFile = 0;
569 delete fESD; fESD = 0;
574 else // esd file not readable
576 Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());
578 if (fESDTree == 0 && fHLTESDTree==0)
582 throw (kEH + "ESD not initialized. Its precence was requested.");
584 Warning(kEH, "ESD not initialized.");
588 // Open AOD and registered friends
589 if ( (fAODFile = TFile::Open(fgAODFileName)) )
591 fAOD = new AliAODEvent();
592 fAODTree = (TTree*) fAODFile->Get("aodTree");
595 // Check if AODfriends exist and attach them.
596 TIter friends(fgAODfriends);
598 while ((name = (TObjString*) friends()) != 0)
600 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
601 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
602 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
604 fAODTree->AddFriend("aodTree", name->GetName());
608 fAOD->ReadFromTree(fAODTree);
610 if (fAODTree->GetEntry(0) <= 0)
612 delete fAODFile; fAODFile = 0;
613 delete fAOD; fAOD = 0;
614 Warning(kEH, "failed getting the first entry from addTree.");
619 runNo = fAOD->GetRunNumber();
624 delete fAODFile; fAODFile = 0;
625 delete fAOD; fAOD = 0;
626 Warning(kEH, "failed getting the aodTree.");
629 else // aod not readable
631 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
637 throw (kEH + "AOD not initialized. Its precence was requested.");
639 Warning(kEH, "AOD not initialized.");
643 // Open RunLoader from galice.root
644 // fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
646 TFile *gafile = TFile::Open(fgGAliceFileName);
647 cout<<"Opening galice"<<endl;
652 cout<<"SETTING RUN LOADER in Open()"<<endl;
653 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
656 TString alicePath(gSystem->DirName(fgGAliceFileName));
657 alicePath.Append("/");
658 fRunLoader->SetDirName(alicePath);
660 if (fRunLoader->LoadgAlice() != 0)
661 Warning(kEH, "failed loading gAlice via run-loader.");
663 if (fRunLoader->LoadHeader() == 0)
666 runNo = fRunLoader->GetHeader()->GetRun();
670 Warning(kEH, "failed loading run-loader's header.");
675 else // run-loader open failed
677 Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());
681 else // galice not readable
683 Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());
687 if (fgAssertRunLoader)
688 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
690 Warning(kEH, "Bootstraping of run-loader failed.");
693 // Open raw-data file
696 if (fgRawFromStandardLoc)
698 if (!fgRawFileName.BeginsWith("alien:"))
699 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
700 if (!fgRawFileName.Contains("/ESDs/"))
701 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
703 TPMERegexp chunk("/([\\d\\.])+/?$");
704 Int_t nm = chunk.Match(fgRawFileName);
706 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
708 TPMERegexp esdstrip("/ESDs/.*");
709 rawPath = fgRawFileName;
710 esdstrip.Substitute(rawPath, "/raw/");
714 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
718 rawPath = fgRawFileName;
720 // If i use open directly, raw-reader reports an error but i have
721 // no way to detect it.
722 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
723 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
724 if (fgAssertRaw == kFALSE)
726 AliLog::SetGlobalLogLevel(AliLog::kFatal);
728 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
730 fRawReader = AliRawReader::Create(rawPath);
734 fRawReader = AliRawReader::Create(fgRawFileName);
736 if (fgAssertRaw == kFALSE)
738 AliLog::SetGlobalLogLevel(oldLogLevel);
745 throw (kEH + "raw-data not initialized. Its precence was requested.");
749 Warning(kEH, "raw-data not initialized.");
757 if ( ! fRawReader->NextEvent())
759 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
761 runNo = fRawReader->GetRunNumber();
762 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
763 fRawReader->RewindEvents();
767 fExternalCtrl = kTRUE;
773 // Initialize OCDB ... only in master event-manager
781 void AliEveEventManager::InitOCDB(int runNo)
783 static const TEveException kEH("AliEveEventManager::InitOCDB ");
784 //if (this == fgMaster)
786 AliCDBManager* cdb = AliCDBManager::Instance();
787 if (cdb->IsDefaultStorageSet() == kTRUE)
789 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
790 cdb->GetDefaultStorage()->GetURI().Data());
794 if (fgCdbUri.IsNull())
796 gEnv->SetValue("Root.Stacktrace", "no");
797 Fatal("Open()", "OCDB path was not specified.");
800 // Handle some special cases for MC (should be in OCDBManager).
801 if (fgCdbUri == "mcideal://")
802 cdb->SetDefaultStorage("MC", "Ideal");
803 else if (fgCdbUri == "mcresidual://")
804 cdb->SetDefaultStorage("MC", "Residual");
805 else if (fgCdbUri == "mcfull://")
806 cdb->SetDefaultStorage("MC", "Full");
807 else if (fgCdbUri == "local://"){
808 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
809 cdb->SetDefaultStorage(fgCdbUri);
812 cdb->SetDefaultStorage(fgCdbUri);
813 cdb->SetSpecificStorage(fgSpecificCdbUriPath,fgSpecificCdbUriValue);
817 if (cdb->IsDefaultStorageSet() == kFALSE)
818 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
820 if (fgCdbUri.BeginsWith("local://"))
822 TString curPath = gSystem->WorkingDirectory();
823 TString grp = "GRP/GRP/Data";
824 TString grppath = curPath + "/" + grp;
825 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
827 if (cdb->GetSpecificStorage(grp))
829 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
833 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
834 TString lpath("local://");
836 cdb->SetSpecificStorage(grp, lpath);
843 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
845 // Set an event from an external source.
846 // The method is used in the online visualisation.
847 // AOD is not supported.
849 static const TEveException kEH("AliEveEventManager::SetEvent ");
853 Warning(kEH, "Event-files were open. Closing and switching to external control.");
857 Info(kEH,"setting it!!! ============================");
859 fRunLoader = runLoader;
860 fRawReader = rawReader;
867 fExternalCtrl = kTRUE;
869 SetTitle("Online event in memory");
870 SetName ("Online Event");
873 AfterNewEventLoaded();
875 if (fAutoLoad || fLoopMarked) StartAutoLoadTimer();
879 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
881 // Returns maximum available event id.
882 // If under external control or event is not opened -1 is returned.
883 // If raw-data is the only data-source this can not be known
884 // and 10,000,000 is returned.
885 // If neither data-source is initialised an exception is thrown.
886 // If refresh_esd is true and ESD is the primary event-data source
887 // its header is re-read from disk.
889 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
891 if (fExternalCtrl || fIsOpen == kFALSE)
896 if ((fESDTree!=0) || (fHLTESDTree!=0))
900 if(fESDTree!=0) fESDTree->Refresh();
901 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
902 fPEventSelector->Update();
906 switch(fgESDvisibleTrees){
908 case AliEveEventManager::kOfflineTree :
909 maxEventId = fESDTree->GetEntries() - 1;
911 case AliEveEventManager::kHLTTree :
912 maxEventId = fHLTESDTree->GetEntries() - 1;
920 return fAODTree->GetEntries() - 1;
924 return fRunLoader->GetNumberOfEvents() - 1;
928 Int_t n = fRawReader->GetNumberOfEvents() - 1;
929 return n > -1 ? n : 10000000;
933 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
937 void AliEveEventManager::GotoEvent(Int_t event)
939 cout<<"Go to event:"<<event<<endl;
940 // Load data for specified event.
941 // If event is out of range an exception is thrown and old state
943 // After successful loading of event, the virtual function
944 // AfterNewEventLoaded() is called. This executes commands that
945 // were registered via TEveEventManager::AddNewEventCommand().
947 // If event is negative, it is subtracted from the number of
948 // available events, thus passing -1 will load the last event.
949 // This is not supported when raw-data is the only data-source
950 // as the number of events is not known.
952 static const TEveException kEH("AliEveEventManager::GotoEvent ");
954 if (fAutoLoadTimerRunning)
956 throw (kEH + "Event auto-load timer is running.");
960 // throw (kEH + "Event-loop is under external control.");
964 if (fStorageDown && -1 == event)
972 // create new server request:
973 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
976 if (event == -1) {requestMessage->messageType = REQUEST_GET_LAST_EVENT;}
977 else if (event == 0) {requestMessage->messageType = REQUEST_GET_FIRST_EVENT;}
978 else if (event == 1) {requestMessage->messageType = REQUEST_GET_PREV_EVENT;}
979 else if (event == 2) {requestMessage->messageType = REQUEST_GET_NEXT_EVENT;}
982 struct eventStruct eventToLoad;
983 eventToLoad.runNumber = fESD->GetRunNumber();
984 eventToLoad.eventNumber = fESD->GetEventNumberInFile();
985 requestMessage->event = eventToLoad;
987 // create event manager:
988 AliStorageEventManager *eventManager =
989 AliStorageEventManager::GetEventManagerInstance();
990 AliESDEvent *resultEvent = NULL;
992 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
995 // send request and receive event:
996 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
997 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1002 InitOCDB(resultEvent->GetRunNumber());
1003 SetEvent(0,0,resultEvent,0);
1007 if(event==-1){cout<<"\n\nWARNING -- No last event is avaliable.\n\n"<<endl;}
1008 if(event==0){cout<<"\n\nWARNING -- No first event is avaliable.\n\n"<<endl;}
1009 if(event==1){cout<<"\n\nWARNING -- No previous event is avaliable.\n\n"<<endl;}
1010 if(event==2){cout<<"\n\nWARNING -- No next event is avaliable.\n\n"<<endl;}
1017 cout<<"\n\nWARNING -- No event has been already loaded. Loading the most recent event...\n\n"<<endl;
1019 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1020 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
1022 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
1023 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1024 AliESDEvent *resultEvent = NULL;
1027 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1028 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1034 InitOCDB(resultEvent->GetRunNumber());
1035 SetEvent(0,0,resultEvent,0);
1037 else{cout<<"\n\nWARNING -- The most recent event is not avaliable.\n\n"<<endl;}
1046 throw (kEH + "Event-files not opened.");
1054 if ((fESDTree!=0) || (fHLTESDTree!=0))
1057 if (event >= fESDTree->GetEntries())
1058 fESDTree->Refresh();
1059 maxEvent = fESDTree->GetEntries() - 1;
1061 event = fESDTree->GetEntries() + event;
1065 if (event >= fHLTESDTree->GetEntries())
1066 fHLTESDTree->Refresh();
1067 maxEvent = fHLTESDTree->GetEntries() - 1;
1069 event = fHLTESDTree->GetEntries() + event;
1075 maxEvent = fAODTree->GetEntries() - 1;
1077 event = fAODTree->GetEntries() + event;
1079 else if (fRunLoader)
1081 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
1083 event = fRunLoader->GetNumberOfEvents() + event;
1085 else if (fRawReader)
1087 maxEvent = fRawReader->GetNumberOfEvents() - 1;
1090 maxEvent = 10000000;
1092 Error(kEH, "current raw-data source does not support direct event access.");
1095 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
1100 event = fRawReader->GetNumberOfEvents() + event;
1105 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
1107 if (event < 0 || event > maxEvent)
1109 throw (kEH + Form("event %d not present, available range [%d, %d].",
1110 event, 0, maxEvent));
1113 TString sysInfoHeader;
1114 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
1115 AliSysInfo::AddStamp(sysInfoHeader + "Start");
1117 TEveManager::TRedrawDisabler rd(gEve);
1118 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
1120 // !!! MT this is somewhat brutal; at least optionally, one could be
1121 // a bit gentler, checking for objs owning their external refs and having
1122 // additinal parents.
1123 gEve->GetViewers()->DeleteAnnotations();
1124 fTransients->DestroyElements();
1125 for (TEveElement::List_i i = fTransientLists->BeginChildren();
1126 i != fTransientLists->EndChildren(); ++i)
1128 (*i)->DestroyElements();
1132 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
1135 if (fESDTree->GetEntry(event) <= 0)
1136 throw (kEH + "failed getting required event from ESD.");
1138 if (fESDfriendExists)
1139 fESD->SetESDfriend(fESDfriend);
1143 if (fHLTESDTree->GetEntry(event) <= 0)
1144 throw (kEH + "failed getting required event from HLT ESD.");
1146 if (fESDfriendExists)
1147 fESD->SetESDfriend(fESDfriend);
1151 if (fAODTree->GetEntry(event) <= 0)
1152 throw (kEH + "failed getting required event from AOD.");
1156 if (fRunLoader->GetEvent(event) != 0)
1157 throw (kEH + "failed getting required event.");
1162 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
1163 if (fRawReader->GotoEvent(event) == kFALSE)
1165 // Use fallback method - iteration with NextEvent().
1166 Int_t rawEv = fEventId;
1169 fRawReader->RewindEvents();
1173 while (rawEv < event)
1175 if ( ! fRawReader->NextEvent())
1177 fRawReader->RewindEvents();
1179 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
1183 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
1189 if (this == fgMaster)
1191 SetName(Form("Event %d", fEventId));
1195 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
1197 AfterNewEventLoaded();
1199 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
1202 void AliEveEventManager::Timeout()
1207 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
1210 InitOCDB(event->GetRunNumber());
1211 printf("======================= setting event to %d\n", fEventId);
1212 SetEvent(0,0,event,0);
1215 void AliEveEventManager::NextEvent()
1217 // Loads next event.
1218 // Does magick needed for online display when under external event control.
1220 static const TEveException kEH("AliEveEventManager::NextEvent ");
1222 if (fAutoLoadTimerRunning){throw (kEH + "Event auto-load timer is running.");}
1229 if(fIsNewEventAvaliable)
1232 if(fWritingToEventIndex == 0) fEventInUse = 0;
1233 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1235 if(fCurrentEvent[fEventInUse])
1237 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1239 printf("======================= setting event to %d\n", fCurrentEvent[fEventInUse]->GetEventNumberInFile());
1242 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1243 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1247 fIsNewEventAvaliable = false;
1252 cout<<"No new event is avaliable."<<endl;
1258 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1261 if (fPEventSelector->FindNext(nextevent))
1263 GotoEvent(nextevent);
1266 else if (fEventId < GetMaxEventId(kTRUE))
1268 GotoEvent(fEventId + 1);
1271 gSystem->ProcessEvents();
1275 AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
1276 cout<<"contructor called"<<endl;
1277 vsdCreator->CreateVSD("myVSD.root");
1280 //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
1283 void AliEveEventManager::PrevEvent()
1285 // Loads previous event.
1287 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1289 if (fAutoLoadTimerRunning)
1291 throw (kEH + "Event auto-load timer is running.");
1295 throw (kEH + "Event-loop is under external control.");
1298 if ((fESDTree!=0) || (fHLTESDTree!=0))
1301 if (fPEventSelector->FindPrev(nextevent))
1303 GotoEvent(nextevent);
1306 else if (fEventId > 0)
1308 GotoEvent(fEventId - 1);
1312 void AliEveEventManager::MarkCurrentEvent()
1315 if(!fOnlineMode){return;}
1317 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1318 struct eventStruct mark;
1319 mark.runNumber = fESD->GetRunNumber();
1320 mark.eventNumber = fESD->GetEventNumberInFile();
1321 requestMessage->messageType = REQUEST_MARK_EVENT;
1322 requestMessage->event = mark;
1324 AliStorageEventManager *eventManager =
1325 AliStorageEventManager::GetEventManagerInstance();
1326 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1329 std::future<bool> unused = std::async([]()
1331 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1332 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1336 //fStatusLabel->SetText("Event marked");
1337 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1341 //fStatusLabel->SetText("Couldn't mark this event");
1342 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1347 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1348 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1353 //fStatusLabel->SetText("Event marked");
1354 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1358 //fStatusLabel->SetText("Couldn't mark this event");
1359 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1361 if(requestMessage){delete requestMessage;}
1365 void AliEveEventManager::Close()
1367 // Close the event data-files and delete ESD, ESDfriend, run-loader
1370 cout<<"\n\n\nClose() called!!\n\n\n"<<endl;
1372 static const TEveException kEH("AliEveEventManager::Close ");
1376 throw (kEH + "Event-files not opened.");
1379 if (fAutoLoadTimerRunning)
1380 StopAutoLoadTimer();
1382 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1383 delete fESD; fESD = 0;
1384 // delete fESDfriend; // friend tree is deleted with the tree
1386 fESDfriendExists = kFALSE;
1388 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1389 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1390 delete fESDFile; fESDFile = 0;
1394 delete fAOD; fAOD = 0;
1396 delete fAODTree; fAODTree = 0;
1397 delete fAODFile; fAODFile = 0;
1401 delete fRunLoader; fRunLoader = 0;
1405 delete fRawReader; fRawReader = 0;
1414 //------------------------------------------------------------------------------
1415 // Static convenience functions, mainly used from macros.
1416 //------------------------------------------------------------------------------
1418 Int_t AliEveEventManager::CurrentEventId()
1420 // Return current event-id.
1422 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1424 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1425 throw (kEH + "ALICE event not ready.");
1426 return fgCurrent->GetEventId();
1429 Bool_t AliEveEventManager::HasRunLoader()
1431 // Check if AliRunLoader is initialized.
1433 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1436 Bool_t AliEveEventManager::HasESD()
1438 // Check if AliESDEvent is initialized.
1440 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1443 Bool_t AliEveEventManager::HasESDfriend()
1445 // Check if AliESDfriend is initialized.
1447 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1450 Bool_t AliEveEventManager::HasAOD()
1452 // Check if AliESDEvent is initialized.
1454 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1457 Bool_t AliEveEventManager::HasRawReader()
1459 // Check if raw-reader is initialized.
1461 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1464 AliRunLoader* AliEveEventManager::AssertRunLoader()
1466 // Make sure AliRunLoader is initialized and return it.
1467 // Throws exception in case run-loader is not available.
1468 // Static utility for macros.
1470 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1472 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1473 throw (kEH + "ALICE event not ready.");
1474 if (fgCurrent->fRunLoader == 0)
1475 throw (kEH + "AliRunLoader not initialised.");
1476 return fgCurrent->fRunLoader;
1479 AliESDEvent* AliEveEventManager::AssertESD()
1481 // Make sure AliESDEvent is initialized and return it.
1482 // Throws exception in case ESD is not available.
1483 // Static utility for macros.
1485 static const TEveException kEH("AliEveEventManager::AssertESD ");
1487 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1488 throw (kEH + "ALICE event not ready.");
1489 if (fgCurrent->fESD == 0)
1490 throw (kEH + "AliESD not initialised.");
1491 return fgCurrent->fESD;
1494 AliESDfriend* AliEveEventManager::AssertESDfriend()
1496 // Make sure AliESDfriend is initialized and return it.
1497 // Throws exception in case ESDfriend-loader is not available.
1498 // Static utility for macros.
1500 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1502 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1503 throw (kEH + "ALICE event not ready.");
1504 if (fgCurrent->fESDfriend == 0)
1505 throw (kEH + "AliESDfriend not initialised.");
1506 return fgCurrent->fESDfriend;
1509 AliAODEvent* AliEveEventManager::AssertAOD()
1511 // Make sure AliAODEvent is initialized and return it.
1512 // Throws exception in case AOD is not available.
1513 // Static utility for macros.
1515 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1517 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1518 throw (kEH + "ALICE event not ready.");
1519 if (fgCurrent->fAOD == 0)
1520 throw (kEH + "AliAOD not initialised.");
1521 return fgCurrent->fAOD;
1524 AliRawReader* AliEveEventManager::AssertRawReader()
1526 // Make sure raw-reader is initialized and return it.
1528 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1530 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1531 throw (kEH + "ALICE event not ready.");
1532 if (fgCurrent->fRawReader == 0)
1533 throw (kEH + "RawReader not ready.");
1535 return fgCurrent->fRawReader;
1538 //==============================================================================
1540 AliMagF* AliEveEventManager::AssertMagField()
1542 // Make sure AliMagF is initialized and returns it.
1543 // Throws exception in case magnetic field is not available.
1544 // Static utility for macros.
1546 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1551 if (TGeoGlobalMagField::Instance()->GetField())
1553 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1554 if (fgMagField == 0)
1555 throw kEH + "Global field set, but it is not AliMagF.";
1564 if (TGeoGlobalMagField::Instance()->GetField())
1566 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1567 if (fgMagField == 0)
1568 throw kEH + "Global field set, but it is not AliMagF.";
1572 throw kEH + "Could not initialize magnetic field.";
1578 TGeoManager* AliEveEventManager::AssertGeometry()
1580 // Make sure AliGeomManager is initialized and returns the
1581 // corresponding TGeoManger.
1582 // gGeoManager is set to the return value.
1583 // Throws exception if geometry can not be loaded or if it is not
1584 // available and the TGeoManager is locked.
1585 // Static utility for macros.
1587 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1589 if (AliGeomManager::GetGeometry() == 0)
1591 if (TGeoManager::IsLocked())
1592 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1595 AliGeomManager::LoadGeometry();
1596 if ( ! AliGeomManager::GetGeometry())
1598 throw (kEH + "can not load geometry.");
1600 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1602 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1603 // throw (kEH + "could not apply align objs.");
1605 AliGeomManager::GetGeometry()->DefaultColors();
1608 gGeoManager = AliGeomManager::GetGeometry();
1612 AliRecoParam* AliEveEventManager::AssertRecoParams()
1620 Bool_t AliEveEventManager::InitRecoParam()
1622 // This is mostly a reap-off from reconstruction
1623 // The method accesses OCDB and retrieves all
1624 // the available reco-param objects from there.
1626 fgRecoParam = new AliRecoParam;
1627 const Int_t kNDetectors = 14;
1629 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1631 Bool_t isOK = kTRUE;
1633 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1634 ::Info(kEH, "Using custom GRP reconstruction parameters");
1637 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1639 AliCDBPath path("GRP","Calib","RecoParam");
1640 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1642 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1646 TObject *recoParamObj = entry->GetObject();
1647 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1648 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1649 // Registering them in AliRecoParam
1650 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1652 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1653 // GRP has only onse set of reco parameters
1654 // Registering it in AliRecoParam
1655 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1656 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1657 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1660 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1667 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1670 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1672 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1673 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1677 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1679 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1680 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1682 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1686 TObject *recoParamObj = entry->GetObject();
1687 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1688 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1689 // Registering them in AliRecoParam
1690 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1692 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1693 // The detector has only onse set of reco parameters
1694 // Registering it in AliRecoParam
1695 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1696 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1697 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1700 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1716 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1718 if(!fESDFile && !fESD) return 0;
1720 static const TEveException kEH("AliEveEventManager::readESDTree ");
1722 TTree* tempTree = 0;
1724 tempTree =(TTree*) fESDFile->Get(treeName);
1727 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1730 if (!esdFriendFile->IsZombie())
1732 esdFriendFile->Close();
1733 fESDfriendExists = kTRUE;
1734 tempTree->SetBranchStatus ("ESDfriend*", 1);
1736 delete esdFriendFile;
1739 fESD->ReadFromTree(tempTree);
1740 if (fESDfriendExists)
1742 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1743 Info(kEH, "found and attached ESD friend.");
1747 Warning(kEH, "ESDfriend not found.");
1750 if (tempTree->GetEntry(0) <= 0)
1752 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1757 runNo = fESD->GetESDRun()->GetRunNumber();
1762 Warning(kEH, "failed getting the tree:%s", treeName);
1769 //------------------------------------------------------------------------------
1771 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1773 // Create and attach a dependent event-manager.
1774 // It is not added into eve list tree.
1776 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1779 throw(kEH + "Master event-manager must be instantiated first.");
1781 if (fgMaster->fSubManagers == 0)
1783 fgMaster->fSubManagers = new TList;
1784 fgMaster->fSubManagers->SetOwner(kTRUE);
1787 AliEveEventManager* new_mgr = 0;
1791 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1792 new_mgr->SetFilesPath(path);
1793 fgMaster->fSubManagers->Add(new_mgr);
1795 catch (TEveException& exc)
1797 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1799 fgCurrent = fgMaster;
1804 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1806 // Get a dependant manager by name.
1807 // This will not change the current manager, use helper class
1808 // AliEveEventManager::CurrentChanger for that.
1810 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1813 throw(kEH + "Master event-manager must be instantiated first.");
1815 if (fgMaster->fSubManagers == 0)
1818 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1821 AliEveEventManager* AliEveEventManager::GetMaster()
1823 // Get master event-manager.
1828 AliEveEventManager* AliEveEventManager::GetCurrent()
1830 // Get current event-manager.
1835 void AliEveEventManager::RegisterTransient(TEveElement* element)
1837 GetCurrent()->fTransients->AddElement(element);
1840 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1842 GetCurrent()->fTransientLists->AddElement(element);
1845 //------------------------------------------------------------------------------
1846 // Autoloading of events
1847 //------------------------------------------------------------------------------
1849 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1851 // Set the auto-load time in seconds
1853 fAutoLoadTime = time;
1856 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1858 // Set the automatic event loading mode
1860 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1862 if (fAutoLoad == autoLoad)
1864 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1868 fAutoLoad = autoLoad;
1871 StartAutoLoadTimer();
1875 StopAutoLoadTimer();
1879 void AliEveEventManager::SetLoopMarked(Bool_t loopMarked)
1881 // Set the automatic event loading mode
1882 fLoopMarked = loopMarked;
1883 if (fLoopMarked){StartAutoLoadTimer();}
1884 else{StopAutoLoadTimer();}
1887 void AliEveEventManager::SetTrigSel(Int_t trig)
1889 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1893 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1898 ULong64_t trigMask = 0;
1899 if (trig >= 0) trigMask = (1ull << trig);
1900 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1901 fRawReader->SelectEvents(-1,trigMask,NULL);
1905 void AliEveEventManager::StartAutoLoadTimer()
1907 // Start the auto-load timer.
1909 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1910 fAutoLoadTimer->Reset();
1911 fAutoLoadTimer->TurnOn();
1912 fAutoLoadTimerRunning = kTRUE;
1915 void AliEveEventManager::StopAutoLoadTimer()
1917 // Stop the auto-load timer.
1919 fAutoLoadTimerRunning = kFALSE;
1920 fAutoLoadTimer->TurnOff();
1923 void AliEveEventManager::AutoLoadNextEvent()
1925 // Called from auto-load timer, so it has to be public.
1926 // Do NOT call it directly.
1928 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1930 Info(kEH, "called!");
1932 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1934 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1938 StopAutoLoadTimer();
1940 if (fAutoLoad || fLoopMarked)
1941 StartAutoLoadTimer();
1944 //------------------------------------------------------------------------------
1945 // Post event-loading functions
1946 //------------------------------------------------------------------------------
1948 void AliEveEventManager::AfterNewEventLoaded()
1950 // Execute registered macros and commands.
1951 // At the end emit NewEventLoaded signal.
1953 // Virtual from TEveEventManager.
1955 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1957 Info(kEH, "------------------!!!------------");
1959 NewEventDataLoaded();
1960 if (fExecutor) fExecutor->ExecMacros();
1962 TEveEventManager::AfterNewEventLoaded();
1965 if (this == fgMaster && fSubManagers != 0)
1967 TIter next(fSubManagers);
1968 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1970 gEve->SetCurrentEvent(fgCurrent);
1973 fgCurrent->GotoEvent(fEventId);
1975 catch (TEveException& exc)
1977 // !!! Should somehow tag / disable / remove it?
1978 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1979 fEventId, fgCurrent->GetName(), exc.Data());
1981 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
1983 fgCurrent = fgMaster;
1984 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
1985 gEve->SetCurrentEvent(fgMaster);
1989 void AliEveEventManager::NewEventDataLoaded()
1991 // Emit NewEventDataLoaded signal.
1992 Emit("NewEventDataLoaded()");
1994 void AliEveEventManager::NewEventLoaded()
1996 // Emit NewEventLoaded signal.
1997 Emit("NewEventLoaded()");
1999 void AliEveEventManager::NoEventLoaded()
2001 // Emit NoEventLoaded signal.
2002 Emit("NoEventLoaded()");
2004 void AliEveEventManager::StorageManagerOk()
2006 // Emit StorageManagerOk signal.
2007 Emit("StorageManagerOk()");
2009 void AliEveEventManager::StorageManagerDown()
2011 // Emit StorageManagerOk signal.
2012 Emit("StorageManagerDown()");
2016 //------------------------------------------------------------------------------
2017 // Event info dumpers
2018 //------------------------------------------------------------------------------
2020 const AliEventInfo* AliEveEventManager::GetEventInfo()
2022 // Fill the event info object
2024 AliCentralTrigger *aCTP = NULL;
2026 fEventInfo.SetEventType(fRawReader->GetType());
2028 ULong64_t mask = fRawReader->GetClassMask();
2029 fEventInfo.SetTriggerMask(mask);
2030 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
2031 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
2033 aCTP = new AliCentralTrigger();
2034 TString configstr("");
2035 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
2036 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
2040 aCTP->SetClassMask(mask);
2041 aCTP->SetClusterMask(clmask);
2044 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
2046 rlCTP->SetClassMask(mask);
2047 rlCTP->SetClusterMask(clmask);
2052 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
2054 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
2055 aCTP = fRunLoader->GetTrigger();
2056 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
2057 // get inputs from actp - just get
2058 AliESDHeader* esdheader = fESD->GetHeader();
2059 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
2060 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
2061 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
2062 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
2065 AliWarning("No trigger can be loaded! The trigger information will not be used!");
2070 AliTriggerConfiguration *config = aCTP->GetConfiguration();
2072 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
2073 if (fRawReader) delete aCTP;
2077 TString declTriggerClasses;
2079 // Load trigger aliases and declare the trigger classes included in aliases
2080 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
2082 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
2084 lst->Sort(kSortDescending); // to avoid problems with substrings
2085 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
2086 // Now declare all the triggers present in the aliases
2089 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
2090 declTriggerClasses += " ";
2091 declTriggerClasses += nmd->GetName();
2095 AliError("Cannot cast the object with trigger aliases to THashList!");
2099 AliError("No OCDB entry for the trigger aliases!");
2102 // Load trigger classes for this run
2103 UChar_t clustmask = 0;
2105 ULong64_t trmask = fEventInfo.GetTriggerMask();
2106 const TObjArray& classesArray = config->GetClasses();
2107 Int_t nclasses = classesArray.GetEntriesFast();
2108 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
2109 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
2110 if (trclass && trclass->GetMask()>0) {
2111 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
2112 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
2113 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
2114 if (trmask & (1ull << trindex)) {
2116 trclasses += trclass->GetName();
2118 clustmask |= trclass->GetCluster()->GetClusterMask();
2122 fEventInfo.SetTriggerClasses(trclasses);
2124 if (!aCTP->CheckTriggeredDetectors()) {
2125 if (fRawReader) delete aCTP;
2129 if (fRawReader) delete aCTP;
2131 // everything went ok, return pointer
2132 return (&fEventInfo);
2136 TString AliEveEventManager::GetEventInfoHorizontal() const
2138 // Dumps the event-header contents in vertical formatting.
2140 TString rawInfo, esdInfo;
2144 rawInfo = "No raw-data event info is available!\n";
2148 const UInt_t* attr = fRawReader->GetAttributes();
2149 TTimeStamp ts(fRawReader->GetTimestamp());
2150 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2151 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
2152 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2153 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2154 fRawReader->GetClassMask(),
2155 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2156 attr[0],attr[1],attr[2], ts.AsString("s"));
2161 esdInfo = "No ESD event info is available!";
2165 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2166 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2167 TTimeStamp ts(fESD->GetTimeStamp());
2168 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2169 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
2170 fESD->GetRunNumber(),
2171 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2172 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2173 acttrclasses.Data(),
2174 fESD->GetTriggerMask(),firedtrclasses.Data(),
2175 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
2178 return rawInfo + esdInfo;
2181 TString AliEveEventManager::GetEventInfoVertical() const
2183 // Dumps the event-header contents in vertical formatting.
2185 TString rawInfo, esdInfo;
2189 rawInfo = "No raw-data event info is available!\n";
2193 const UInt_t* attr = fRawReader->GetAttributes();
2194 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",
2195 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2196 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2197 fRawReader->GetClassMask(),
2198 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2199 attr[0],attr[1],attr[2],
2200 fRawReader->GetTimestamp());
2205 esdInfo = "No ESD event info is available!\n";
2209 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2210 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2211 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",
2212 fESD->GetRunNumber(),
2213 acttrclasses.Data(),
2214 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2215 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2216 fESD->GetTriggerMask(),firedtrclasses.Data(),
2217 fESD->GetEventNumberInFile(),
2218 fESD->GetTimeStamp());
2221 return rawInfo + "\n" + esdInfo;
2225 //==============================================================================
2226 // Reading of GRP and MagneticField.
2227 // This is a reap-off from reconstruction ... should really be a common
2228 // code to do this somewhere in STEER.
2229 //==============================================================================
2231 Bool_t AliEveEventManager::InitGRP()
2233 //------------------------------------
2234 // Initialization of the GRP entry
2235 //------------------------------------
2237 static const TEveException kEH("AliEveEventManager::InitGRP ");
2239 AliGRPManager grpMgr;
2240 if (!grpMgr.ReadGRPEntry()) {
2243 fgGRPLoaded = kTRUE;
2244 if (!grpMgr.SetMagField()) {
2245 throw kEH + "Setting of field failed!";
2248 //*** Get the diamond profiles from OCDB
2249 // Eventually useful.
2252 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
2254 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
2256 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2259 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2261 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2263 ::Error(kEH, "No diamond profile found in OCDB!");
2266 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2268 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2270 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2277 //------------------------------------
2278 // Global variables management
2279 //------------------------------------
2281 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2283 // Insert a new visualization-parameter database entry with the default
2284 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2287 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2288 Bool_t replace, Bool_t update)
2290 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2295 model->IncDenyDestroy();
2296 model->SetRnrChildren(kFALSE);
2298 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2299 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2300 while (old_model->HasChildren())
2302 TEveElement *el = old_model->FirstChild();
2303 el->SetVizModel(model);
2306 el->CopyVizParams(model);
2307 el->PropagateVizParamsToProjecteds();
2310 old_model->DecDenyDestroy();
2312 pair->SetValue(dynamic_cast<TObject*>(model));
2322 model->IncDenyDestroy();
2323 model->SetRnrChildren(kFALSE);
2324 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2329 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2331 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));
2333 Int_t AliEveEventManager::NewEventAvailable()
2335 if (fIsNewEventAvaliable)