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"
66 #include "AliOnlineReconstructionUtil.h"
67 #include "AliGRPPreprocessor.h"
73 //==============================================================================
74 //==============================================================================
76 //==============================================================================
78 //______________________________________________________________________________
80 // Provides interface for loading and navigating standard AliRoot data
81 // (AliRunLoader), ESD, AOD and RAW.
83 // ESDfriend is attached automatically, if the file is found.
85 // AODfriends are not attached automatically as there are several
86 // possible files involved. To have a specific AODfriend attached, call
88 // AliEveEventManager::AddAODfriend("AliAOD.VertexingHF.root");
89 // before initializing the event-manager.
91 // Also provides interface to magnetic-field and geometry. Mostly
92 // intended as wrappers over standard AliRoot functionality for
93 // convenient use from visualizateion macros.
95 // There can be a single main event-manger, it is stored in private
96 // data member fgMaster and can be accessed via static member function
99 // For event overlaying and embedding one can instantiate additional
100 // event-managers via static method AddDependentManager(const TString& path).
101 // This interface is under development.
103 ClassImp(AliEveEventManager)
105 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
106 Bool_t AliEveEventManager::fgAssertESD = kFALSE;
107 Bool_t AliEveEventManager::fgAssertAOD = kFALSE;
108 Bool_t AliEveEventManager::fgAssertRaw = kFALSE;
110 TString AliEveEventManager::fgESDFileName("AliESDs.root");
111 AliEveEventManager::EVisibleESDTrees AliEveEventManager::fgESDvisibleTrees(AliEveEventManager::kOfflineTree);
112 TString AliEveEventManager::fgESDfriendsFileName("AliESDfriends.root");
113 TString AliEveEventManager::fgAODFileName("AliAOD.root");
114 TString AliEveEventManager::fgGAliceFileName("galice.root");
115 TString AliEveEventManager::fgRawFileName("raw.root");
116 TString AliEveEventManager::fgCdbUri;
117 TString AliEveEventManager::fgSpecificCdbUriValue;
118 TString AliEveEventManager::fgSpecificCdbUriPath;
120 TList* AliEveEventManager::fgAODfriends = 0;
122 Bool_t AliEveEventManager::fgRawFromStandardLoc = kFALSE;
124 Bool_t AliEveEventManager::fgGRPLoaded = kFALSE;
125 AliMagF* AliEveEventManager::fgMagField = 0;
126 AliRecoParam* AliEveEventManager::fgRecoParam = 0;
127 Bool_t AliEveEventManager::fgUniformField = kFALSE;
129 AliEveEventManager* AliEveEventManager::fgMaster = 0;
130 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
132 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
133 TEveEventManager(name, ""),
136 fESDFile (0), fESDTree (0), fHLTESDTree(0), fESD (0),
137 fESDfriend (0), fESDfriendExists(kFALSE),
138 fAODFile (0), fAODTree (0), fAOD (0),
139 fRawReader (0), fEventInfo(),
140 fAutoLoad (kFALSE),fLoopMarked(kFALSE), fAutoLoadTime (5),fAutoLoadTimer(0),
141 fIsOpen (kFALSE), fHasEvent(kFALSE),
142 fGlobal (0), fGlobalReplace (kTRUE), fGlobalUpdate (kTRUE),
143 fExecutor (0), fTransients(0), fTransientLists(0),
146 fAutoLoadTimerRunning(kFALSE),
147 fMutex(new TMutex()),
148 fgSubSock(EVENTS_SERVER_SUB),
151 fWritingToEventIndex(0),
152 fIsNewEventAvaliable(false),
157 // Constructor with event-id.
158 if (0 == name.CompareTo("online")) {fOnlineMode = kTRUE;}
159 else{fOnlineMode = kFALSE;}
164 if (ev >= 0){GotoEvent(ev);}
169 cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
170 fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
171 fEventListenerThread->Run();
173 // fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
174 //fStorageManagerWatcherThread->Run();
177 cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
181 AliEveEventManager::~AliEveEventManager()
186 if(fEventListenerThread)
188 fEventListenerThread->Join();
189 fEventListenerThread->Kill();
190 delete fEventListenerThread;
191 cout<<"listener thread killed and deleted"<<endl;
193 if(fStorageManagerWatcherThread)
195 fStorageManagerWatcherThread->Join();
196 fStorageManagerWatcherThread->Kill();
197 delete fStorageManagerWatcherThread;
198 cout<<"storage watcher thread killed and deleted"<<endl;
201 fAutoLoadTimer->Stop();
202 fAutoLoadTimer->Disconnect("Timeout");
203 fAutoLoadTimer->Disconnect("AutoLoadNextEvent");
205 if(fSubManagers){delete fSubManagers;}
206 if(fMutex){delete fMutex;}
207 if (fIsOpen){Close();}
209 // fTransients->DecDenyDestroy();
210 // fTransients->Destroy();
212 // fTransientLists->DecDenyDestroy();
213 // fTransientLists->Destroy();
218 void AliEveEventManager::GetNextEvent()
221 if(!fOnlineMode){return;}
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]=0;
243 list.multiplicity[1]=999999;
244 strcpy(list.system[0],"p-p");
245 strcpy(list.system[1],"");
247 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
248 requestMessage->messageType = REQUEST_LIST_EVENTS;
249 requestMessage->list = list;
251 cout<<"Sending request for marked events list"<<endl;
252 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
253 cout<<"Waiting for response"<<endl;
254 vector<serverListStruct> receivedList = eventManager->GetServerListVector(SERVER_COMMUNICATION_REQ,3000);
255 cout<<"EVENT DISPLAY -- received list of marked events"<<endl;
257 for(int i=0;i<receivedList.size();i++){cout<<"ev:"<<receivedList[i].eventNumber<<endl;}
260 cout<<"Starting subscriber's loop"<<endl;
263 if(!fLoopMarked || receivedList.size()<=0)
265 cout<<"Waiting for event from online reconstruction...";
266 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,5000);
268 if(!tmpEvent){sleep(1);}
272 if(iter<receivedList.size())
274 cout<<"i:"<<iter<<endl;
275 struct eventStruct mark;
276 mark.runNumber = receivedList[iter].runNumber;
277 mark.eventNumber = receivedList[iter].eventNumber;
279 requestMessage->messageType = REQUEST_GET_EVENT;
280 requestMessage->event = mark;
281 cout<<"Waiting for event from Storage Manager...";
282 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
283 tmpEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
293 cout<<" ("<<tmpEvent->GetRunNumber();
294 if(tmpEvent->GetRunNumber()>=0)
297 if(fEventInUse == 0){fWritingToEventIndex = 1;}
298 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
299 cout<<","<<tmpEvent->GetEventNumberInFile()<<")"<<endl;
300 if(fCurrentEvent[fWritingToEventIndex])
302 delete fCurrentEvent[fWritingToEventIndex];
303 fCurrentEvent[fWritingToEventIndex]=0;
305 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
306 fIsNewEventAvaliable = true;
311 else{cout<<"Did not receive new event."<<endl;}
314 delete requestMessage;
319 void AliEveEventManager::CheckStorageStatus()
322 if(!fOnlineMode){return;}
324 AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
325 configManager->ConnectEventManagerSignals();
327 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
328 eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
330 struct clientRequestStruct *request = new struct clientRequestStruct;
331 request->messageType = REQUEST_CONNECTION;
335 if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
338 long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
339 fStorageDown = kFALSE;
343 StorageManagerDown();
344 cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
345 fStorageDown = kTRUE;
350 AliEveEventManager *manager = AliEveEventManager::GetCurrent();
351 manager->Disconnect("StorageManagerOk");
352 manager->Disconnect("StorageManagerDown");
357 void AliEveEventManager::InitInternals()
359 // Initialize internal members.
361 static const TEveException kEH("AliEveEventManager::InitInternals ");
364 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
367 if (fgMaster == 0){fgMaster = this;}
370 fAutoLoadTimer = new TTimer;
371 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
372 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
374 fExecutor = new AliEveMacroExecutor;
376 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
377 fTransients->IncDenyDestroy();
378 gEve->AddToListTree(fTransients, kFALSE);
380 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
381 fTransientLists->IncDenyDestroy();
382 gEve->AddToListTree(fTransientLists, kFALSE);
384 fPEventSelector = new AliEveEventSelector(this);
386 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
389 /******************************************************************************/
391 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
393 fgESDvisibleTrees = shown;
394 // Set file-name for opening ESD, default "AliESDs.root".
395 if (esd.IsNull()) return;
398 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
401 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
403 // Set file-name for opening ESD friend, default "AliESDfriends.root".
404 if (esdf.IsNull()) return;
405 fgESDfriendsFileName = esdf;
407 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
410 void AliEveEventManager::SetAODFileName(const TString& aod)
412 // Set file-name for opening AOD, default "AliAOD.root".
413 if (aod.IsNull()) return;
416 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
419 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
421 // Add new AOD friend file-name to be attached when opening AOD.
422 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
424 if (fgAODfriends == 0)
426 fgAODfriends = new TList;
427 fgAODfriends->SetOwner(kTRUE);
429 if (fgAODfriends->FindObject(friendFileName) == 0)
431 fgAODfriends->Add(new TObjString(friendFileName));
435 void AliEveEventManager::SetRawFileName(const TString& raw)
437 // Set file-name for opening of raw-data, default "raw.root"
438 if (raw.IsNull()) return;
443 void AliEveEventManager::SetCdbUri(const TString& cdb)
445 // Set path to CDB, there is no default.
446 if ( ! cdb.IsNull()) fgCdbUri = cdb;
449 void AliEveEventManager::SetSpecificCdbUri(const TString& path,const TString& value)
451 // Set path to specific CDB object, there is no default.
452 if ( ! value.IsNull()) fgSpecificCdbUriValue = value;
453 if ( ! path.IsNull()) fgSpecificCdbUriPath = path;
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 ");
521 if (fIsOpen){throw (kEH + "Event-files already opened.");}
525 // Open ESD and ESDfriends
533 if ((fESDFile = TFile::Open(fgESDFileName)))
535 fESD = new AliESDEvent();
537 switch(fgESDvisibleTrees){
538 case AliEveEventManager::kOfflineTree :
539 fESDTree = readESDTree("esdTree", runNo);
541 case AliEveEventManager::kHLTTree :
542 fHLTESDTree = readESDTree("HLTesdTree", runNo);
545 fESDTree = readESDTree("esdTree", runNo);
546 fHLTESDTree = readESDTree("HLTesdTree", runNo);
549 if(!fESDTree && !fHLTESDTree){
550 // both ESD trees are == 0
551 delete fESDFile; fESDFile = 0;
552 delete fESD; fESD = 0;
557 else{Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());}
558 if (fESDTree == 0 && fHLTESDTree==0)
560 if (fgAssertESD){throw (kEH + "ESD not initialized. Its precence was requested.");}
561 else {Warning(kEH, "ESD not initialized.");}
564 // Open AOD and registered friends
565 if ( (fAODFile = TFile::Open(fgAODFileName)) )
567 fAOD = new AliAODEvent();
568 fAODTree = (TTree*) fAODFile->Get("aodTree");
571 // Check if AODfriends exist and attach them.
572 TIter friends(fgAODfriends);
574 while ((name = (TObjString*) friends()) != 0)
576 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
577 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
578 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
580 fAODTree->AddFriend("aodTree", name->GetName());
584 fAOD->ReadFromTree(fAODTree);
586 if (fAODTree->GetEntry(0) <= 0)
588 delete fAODFile; fAODFile = 0;
589 delete fAOD; fAOD = 0;
590 Warning(kEH, "failed getting the first entry from addTree.");
592 else if (runNo < 0){runNo = fAOD->GetRunNumber();}
596 delete fAODFile; fAODFile = 0;
597 delete fAOD; fAOD = 0;
598 Warning(kEH, "failed getting the aodTree.");
601 else // aod not readable
603 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
607 if (fgAssertAOD){throw (kEH + "AOD not initialized. Its precence was requested.");}
608 else {Warning(kEH, "AOD not initialized.");}
611 // Open RunLoader from galice.root
612 // fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
614 TFile *gafile = TFile::Open(fgGAliceFileName);
615 cout<<"Opening galice"<<endl;
620 cout<<"SETTING RUN LOADER in Open()"<<endl;
621 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
624 TString alicePath(gSystem->DirName(fgGAliceFileName));
625 alicePath.Append("/");
626 fRunLoader->SetDirName(alicePath);
628 if (fRunLoader->LoadgAlice() != 0){Warning(kEH, "failed loading gAlice via run-loader.");}
630 if (fRunLoader->LoadHeader() == 0 && runNo < 0){
631 runNo = fRunLoader->GetHeader()->GetRun();
634 Warning(kEH, "failed loading run-loader's header.");
639 else{Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());}
641 else{Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());}
645 if (fgAssertRunLoader){throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");}
646 else{Warning(kEH, "Bootstraping of run-loader failed.");}
649 // Open raw-data file
651 if (fgRawFromStandardLoc)
653 if (!fgRawFileName.BeginsWith("alien:")){
654 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
656 if (!fgRawFileName.Contains("/ESDs/")){
657 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
660 TPMERegexp chunk("/([\\d\\.])+/?$");
661 Int_t nm = chunk.Match(fgRawFileName);
663 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
666 TPMERegexp esdstrip("/ESDs/.*");
667 rawPath = fgRawFileName;
668 esdstrip.Substitute(rawPath, "/raw/");
672 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
676 rawPath = fgRawFileName;
679 // If i use open directly, raw-reader reports an error but i have
680 // no way to detect it.
681 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
682 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
683 if (fgAssertRaw == kFALSE){AliLog::SetGlobalLogLevel(AliLog::kFatal);}
685 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE){
686 fRawReader = AliRawReader::Create(rawPath);
689 fRawReader = AliRawReader::Create(fgRawFileName);
692 if (fgAssertRaw == kFALSE){AliLog::SetGlobalLogLevel(oldLogLevel);}
696 if (fgAssertRaw){throw (kEH + "raw-data not initialized. Its precence was requested.");}
697 else{Warning(kEH, "raw-data not initialized.");}
704 if (!fRawReader->NextEvent()){throw (kEH + "can not go to first event in raw-reader to determine run-id.");}
705 runNo = fRawReader->GetRunNumber();
706 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
707 fRawReader->RewindEvents();
716 // Initialize OCDB ... only in master event-manager
721 void AliEveEventManager::InitOCDB(int runNo)
723 TString cdbPath = Form("local://%s/ed_ocdb_objects/",gSystem->Getenv("HOME"));
724 AliCDBManager* cdb = AliCDBManager::Instance();
728 if(runNo != fCurrentRun)
730 cout<<"Loading OCDB for new run:"<<runNo<<" in online mode."<<endl;
732 settings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
734 cout<<"config read"<<endl;
736 // Retrieve GRP entry for given run from aldaqdb.
737 TString dbHost = settings.GetValue("logbook.host", DEFAULT_LOGBOOK_HOST);
738 Int_t dbPort = settings.GetValue("logbook.port", DEFAULT_LOGBOOK_PORT);
739 TString dbName = settings.GetValue("logbook.db", DEFAULT_LOGBOOK_DB);
740 TString user = settings.GetValue("logbook.user", DEFAULT_LOGBOOK_USER);
741 TString password = settings.GetValue("logbook.pass", DEFAULT_LOGBOOK_PASS);
743 gSystem->cd(cdbPath.Data());
744 gSystem->Exec("rm -fr GRP/");
745 cout<<"CDB path for GRP:"<<cdbPath<<endl;
749 Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fCurrentRun, dbHost.Data(),
750 dbPort, dbName.Data(),
751 user.Data(), password.Data(),
752 Form("%s",cdbPath.Data()),
755 if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret);
756 else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found");
757 else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret);
760 cdb->SetDefaultStorage(settings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
761 cdb->SetSpecificStorage("GRP/GRP/Data",cdbPath.Data());
762 cdb->SetRun(fCurrentRun);
768 static const TEveException kEH("AliEveEventManager::InitOCDB ");
769 //if (this == fgMaster)
771 if (cdb->IsDefaultStorageSet() == kTRUE)
773 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
774 cdb->GetDefaultStorage()->GetURI().Data());
778 if (fgCdbUri.IsNull())
780 gEnv->SetValue("Root.Stacktrace", "no");
781 Fatal("Open()", "OCDB path was not specified.");
783 cout<<"Setting default storage:"<<fgCdbUri<<endl;
784 // Handle some special cases for MC (should be in OCDBManager).
785 if (fgCdbUri == "mcideal://")
786 cdb->SetDefaultStorage("MC", "Ideal");
787 else if (fgCdbUri == "mcresidual://")
788 cdb->SetDefaultStorage("MC", "Residual");
789 else if (fgCdbUri == "mcfull://")
790 cdb->SetDefaultStorage("MC", "Full");
791 else if (fgCdbUri == "local://"){
792 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
793 cdb->SetDefaultStorage(fgCdbUri);
796 cdb->SetDefaultStorage(fgCdbUri);
800 if (cdb->IsDefaultStorageSet() == kFALSE){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)){
811 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
814 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
815 TString lpath("local://");
817 cdb->SetSpecificStorage(grp, lpath);
825 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
827 // Set an event from an external source.
828 // The method is used in the online visualisation.
829 // AOD is not supported.
831 static const TEveException kEH("AliEveEventManager::SetEvent ");
835 Warning(kEH, "Event-files were open. Closing and switching to external control.");
839 Info(kEH,"setting it!!! ============================");
841 fRunLoader = runLoader;
842 fRawReader = rawReader;
850 SetTitle("Online event in memory");
851 SetName ("Online Event");
854 AfterNewEventLoaded();
856 if (fAutoLoad || fLoopMarked) StartAutoLoadTimer();
860 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
862 // Returns maximum available event id.
863 // If under external control or event is not opened -1 is returned.
864 // If raw-data is the only data-source this can not be known
865 // and 10,000,000 is returned.
866 // If neither data-source is initialised an exception is thrown.
867 // If refresh_esd is true and ESD is the primary event-data source
868 // its header is re-read from disk.
870 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
872 if (fIsOpen == kFALSE || fOnlineMode)
877 if ((fESDTree!=0) || (fHLTESDTree!=0))
881 if(fESDTree!=0) fESDTree->Refresh();
882 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
883 fPEventSelector->Update();
887 switch(fgESDvisibleTrees){
889 case AliEveEventManager::kOfflineTree :
890 maxEventId = fESDTree->GetEntries() - 1;
892 case AliEveEventManager::kHLTTree :
893 maxEventId = fHLTESDTree->GetEntries() - 1;
901 return fAODTree->GetEntries() - 1;
905 return fRunLoader->GetNumberOfEvents() - 1;
909 Int_t n = fRawReader->GetNumberOfEvents() - 1;
910 return n > -1 ? n : 10000000;
914 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
918 void AliEveEventManager::GotoEvent(Int_t event)
920 cout<<"Go to event:"<<event<<endl;
921 // Load data for specified event.
922 // If event is out of range an exception is thrown and old state
924 // After successful loading of event, the virtual function
925 // AfterNewEventLoaded() is called. This executes commands that
926 // were registered via TEveEventManager::AddNewEventCommand().
928 // If event is negative, it is subtracted from the number of
929 // available events, thus passing -1 will load the last event.
930 // This is not supported when raw-data is the only data-source
931 // as the number of events is not known.
933 static const TEveException kEH("AliEveEventManager::GotoEvent ");
935 if (fAutoLoadTimerRunning)
937 throw (kEH + "Event auto-load timer is running.");
941 throw (kEH + "Event-files not opened.");
947 if (fStorageDown && -1 == event)
955 // create new server request:
956 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
959 if (event == -1) {requestMessage->messageType = REQUEST_GET_LAST_EVENT;}
960 else if (event == 0) {requestMessage->messageType = REQUEST_GET_FIRST_EVENT;}
961 else if (event == 1) {requestMessage->messageType = REQUEST_GET_PREV_EVENT;}
962 else if (event == 2) {requestMessage->messageType = REQUEST_GET_NEXT_EVENT;}
965 struct eventStruct eventToLoad;
966 eventToLoad.runNumber = fESD->GetRunNumber();
967 eventToLoad.eventNumber = fESD->GetEventNumberInFile();
968 requestMessage->event = eventToLoad;
970 // create event manager:
971 AliStorageEventManager *eventManager =
972 AliStorageEventManager::GetEventManagerInstance();
973 AliESDEvent *resultEvent = NULL;
975 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
978 // send request and receive event:
979 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
980 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
985 InitOCDB(resultEvent->GetRunNumber());
986 SetEvent(0,0,resultEvent,0);
990 if(event==-1){cout<<"\n\nWARNING -- No last event is avaliable.\n\n"<<endl;}
991 if(event==0){cout<<"\n\nWARNING -- No first event is avaliable.\n\n"<<endl;}
992 if(event==1){cout<<"\n\nWARNING -- No previous event is avaliable.\n\n"<<endl;}
993 if(event==2){cout<<"\n\nWARNING -- No next event is avaliable.\n\n"<<endl;}
1000 cout<<"\n\nWARNING -- No event has been already loaded. Loading the most recent event...\n\n"<<endl;
1002 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1003 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
1005 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
1006 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1007 AliESDEvent *resultEvent = NULL;
1010 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1011 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1017 InitOCDB(resultEvent->GetRunNumber());
1018 SetEvent(0,0,resultEvent,0);
1020 else{cout<<"\n\nWARNING -- The most recent event is not avaliable.\n\n"<<endl;}
1033 if ((fESDTree!=0) || (fHLTESDTree!=0))
1036 if (event >= fESDTree->GetEntries())
1037 fESDTree->Refresh();
1038 maxEvent = fESDTree->GetEntries() - 1;
1040 event = fESDTree->GetEntries() + event;
1044 if (event >= fHLTESDTree->GetEntries())
1045 fHLTESDTree->Refresh();
1046 maxEvent = fHLTESDTree->GetEntries() - 1;
1048 event = fHLTESDTree->GetEntries() + event;
1054 maxEvent = fAODTree->GetEntries() - 1;
1056 event = fAODTree->GetEntries() + event;
1058 else if (fRunLoader)
1060 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
1062 event = fRunLoader->GetNumberOfEvents() + event;
1064 else if (fRawReader)
1066 maxEvent = fRawReader->GetNumberOfEvents() - 1;
1069 maxEvent = 10000000;
1071 Error(kEH, "current raw-data source does not support direct event access.");
1074 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
1079 event = fRawReader->GetNumberOfEvents() + event;
1084 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
1088 throw (kEH + Form("event %d not present, available range [%d, %d].",
1089 event, 0, maxEvent));
1091 if (event > maxEvent)
1094 cout<<"Event number out of range. Going to event 0"<<endl;
1097 TString sysInfoHeader;
1098 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
1099 AliSysInfo::AddStamp(sysInfoHeader + "Start");
1101 TEveManager::TRedrawDisabler rd(gEve);
1102 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
1104 // !!! MT this is somewhat brutal; at least optionally, one could be
1105 // a bit gentler, checking for objs owning their external refs and having
1106 // additinal parents.
1107 gEve->GetViewers()->DeleteAnnotations();
1108 fTransients->DestroyElements();
1109 for (TEveElement::List_i i = fTransientLists->BeginChildren();
1110 i != fTransientLists->EndChildren(); ++i)
1112 (*i)->DestroyElements();
1116 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
1119 if (fESDTree->GetEntry(event) <= 0)
1120 throw (kEH + "failed getting required event from ESD.");
1122 if (fESDfriendExists)
1123 fESD->SetESDfriend(fESDfriend);
1127 if (fHLTESDTree->GetEntry(event) <= 0)
1128 throw (kEH + "failed getting required event from HLT ESD.");
1130 if (fESDfriendExists)
1131 fESD->SetESDfriend(fESDfriend);
1135 if (fAODTree->GetEntry(event) <= 0)
1136 throw (kEH + "failed getting required event from AOD.");
1140 if (fRunLoader->GetEvent(event) != 0)
1141 throw (kEH + "failed getting required event.");
1146 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
1147 if (fRawReader->GotoEvent(event) == kFALSE)
1149 // Use fallback method - iteration with NextEvent().
1150 Int_t rawEv = fEventId;
1153 fRawReader->RewindEvents();
1157 while (rawEv < event)
1159 if ( ! fRawReader->NextEvent())
1161 fRawReader->RewindEvents();
1163 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
1167 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
1173 if (this == fgMaster)
1175 SetName(Form("Event %d", fEventId));
1179 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
1181 AfterNewEventLoaded();
1183 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
1186 void AliEveEventManager::Timeout()
1191 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
1194 InitOCDB(event->GetRunNumber());
1195 printf("======================= setting event to %d\n", fEventId);
1196 SetEvent(0,0,event,0);
1199 void AliEveEventManager::NextEvent()
1201 // Loads next event.
1202 // Does magick needed for online display when under external event control.
1204 static const TEveException kEH("AliEveEventManager::NextEvent ");
1206 if (fAutoLoadTimerRunning){throw (kEH + "Event auto-load timer is running.");}
1212 if(fIsNewEventAvaliable)
1215 if(fWritingToEventIndex == 0) fEventInUse = 0;
1216 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1218 if(fCurrentEvent[fEventInUse])
1220 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1222 printf("======================= setting event to %d\n", fCurrentEvent[fEventInUse]->GetEventNumberInFile());
1225 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1226 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1230 fIsNewEventAvaliable = false;
1235 cout<<"No new event is avaliable."<<endl;
1240 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1242 cout<<"There is ESD or HLTESD tree"<<endl;
1244 if (fPEventSelector->FindNext(nextevent))
1246 cout<<"GotoEvent:"<<nextevent<<endl;
1247 GotoEvent(nextevent);
1250 else if (fEventId < GetMaxEventId(kTRUE))
1252 cout<<"GotoEvent:"<<fEventId+1<<endl;
1253 GotoEvent(fEventId + 1);
1257 cout<<"Going back to event 0"<<endl;
1261 gSystem->ProcessEvents();
1263 //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
1266 void AliEveEventManager::PrevEvent()
1268 // Loads previous event.
1270 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1272 if (fAutoLoadTimerRunning)
1274 throw (kEH + "Event auto-load timer is running.");
1277 if ((fESDTree!=0) || (fHLTESDTree!=0))
1280 if (fPEventSelector->FindPrev(nextevent))
1282 GotoEvent(nextevent);
1285 else if (fEventId > 0)
1287 GotoEvent(fEventId - 1);
1291 void AliEveEventManager::MarkCurrentEvent()
1294 if(!fOnlineMode){return;}
1296 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1297 struct eventStruct mark;
1298 mark.runNumber = fESD->GetRunNumber();
1299 mark.eventNumber = fESD->GetEventNumberInFile();
1300 requestMessage->messageType = REQUEST_MARK_EVENT;
1301 requestMessage->event = mark;
1303 AliStorageEventManager *eventManager =
1304 AliStorageEventManager::GetEventManagerInstance();
1305 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1308 std::future<bool> unused = std::async([]()
1310 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1311 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1315 //fStatusLabel->SetText("Event marked");
1316 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1320 //fStatusLabel->SetText("Couldn't mark this event");
1321 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1326 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1327 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1332 //fStatusLabel->SetText("Event marked");
1333 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1337 //fStatusLabel->SetText("Couldn't mark this event");
1338 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1340 if(requestMessage){delete requestMessage;}
1344 void AliEveEventManager::Close()
1346 // Close the event data-files and delete ESD, ESDfriend, run-loader
1349 cout<<"\n\n\nClose() called!!\n\n\n"<<endl;
1351 static const TEveException kEH("AliEveEventManager::Close ");
1355 throw (kEH + "Event-files not opened.");
1358 if (fAutoLoadTimerRunning)
1359 StopAutoLoadTimer();
1361 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1362 delete fESD; fESD = 0;
1363 // delete fESDfriend; // friend tree is deleted with the tree
1365 fESDfriendExists = kFALSE;
1367 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1368 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1369 delete fESDFile; fESDFile = 0;
1373 delete fAOD; fAOD = 0;
1375 delete fAODTree; fAODTree = 0;
1376 delete fAODFile; fAODFile = 0;
1380 delete fRunLoader; fRunLoader = 0;
1384 delete fRawReader; fRawReader = 0;
1393 //------------------------------------------------------------------------------
1394 // Static convenience functions, mainly used from macros.
1395 //------------------------------------------------------------------------------
1397 Int_t AliEveEventManager::CurrentEventId()
1399 // Return current event-id.
1401 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1403 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1404 throw (kEH + "ALICE event not ready.");
1405 return fgCurrent->GetEventId();
1408 Bool_t AliEveEventManager::HasRunLoader()
1410 // Check if AliRunLoader is initialized.
1412 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1415 Bool_t AliEveEventManager::HasESD()
1417 // Check if AliESDEvent is initialized.
1419 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1422 Bool_t AliEveEventManager::HasESDfriend()
1424 // Check if AliESDfriend is initialized.
1426 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1429 Bool_t AliEveEventManager::HasAOD()
1431 // Check if AliESDEvent is initialized.
1433 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1436 Bool_t AliEveEventManager::HasRawReader()
1438 // Check if raw-reader is initialized.
1440 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1443 AliRunLoader* AliEveEventManager::AssertRunLoader()
1445 // Make sure AliRunLoader is initialized and return it.
1446 // Throws exception in case run-loader is not available.
1447 // Static utility for macros.
1449 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1451 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1452 throw (kEH + "ALICE event not ready.");
1453 if (fgCurrent->fRunLoader == 0)
1454 throw (kEH + "AliRunLoader not initialised.");
1455 return fgCurrent->fRunLoader;
1458 AliESDEvent* AliEveEventManager::AssertESD()
1460 // Make sure AliESDEvent is initialized and return it.
1461 // Throws exception in case ESD is not available.
1462 // Static utility for macros.
1464 static const TEveException kEH("AliEveEventManager::AssertESD ");
1466 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1467 throw (kEH + "ALICE event not ready.");
1468 if (fgCurrent->fESD == 0)
1469 throw (kEH + "AliESD not initialised.");
1470 return fgCurrent->fESD;
1473 AliESDfriend* AliEveEventManager::AssertESDfriend()
1475 // Make sure AliESDfriend is initialized and return it.
1476 // Throws exception in case ESDfriend-loader is not available.
1477 // Static utility for macros.
1479 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1481 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1482 throw (kEH + "ALICE event not ready.");
1483 if (fgCurrent->fESDfriend == 0)
1484 throw (kEH + "AliESDfriend not initialised.");
1485 return fgCurrent->fESDfriend;
1488 AliAODEvent* AliEveEventManager::AssertAOD()
1490 // Make sure AliAODEvent is initialized and return it.
1491 // Throws exception in case AOD is not available.
1492 // Static utility for macros.
1494 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1496 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1497 throw (kEH + "ALICE event not ready.");
1498 if (fgCurrent->fAOD == 0)
1499 throw (kEH + "AliAOD not initialised.");
1500 return fgCurrent->fAOD;
1503 AliRawReader* AliEveEventManager::AssertRawReader()
1505 // Make sure raw-reader is initialized and return it.
1507 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1509 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1510 throw (kEH + "ALICE event not ready.");
1511 if (fgCurrent->fRawReader == 0)
1512 throw (kEH + "RawReader not ready.");
1514 return fgCurrent->fRawReader;
1517 //==============================================================================
1519 AliMagF* AliEveEventManager::AssertMagField()
1521 // Make sure AliMagF is initialized and returns it.
1522 // Throws exception in case magnetic field is not available.
1523 // Static utility for macros.
1525 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1530 if (TGeoGlobalMagField::Instance()->GetField())
1532 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1533 if (fgMagField == 0)
1534 throw kEH + "Global field set, but it is not AliMagF.";
1543 if (TGeoGlobalMagField::Instance()->GetField())
1545 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1546 if (fgMagField == 0)
1547 throw kEH + "Global field set, but it is not AliMagF.";
1551 throw kEH + "Could not initialize magnetic field.";
1557 TGeoManager* AliEveEventManager::AssertGeometry()
1559 // Make sure AliGeomManager is initialized and returns the
1560 // corresponding TGeoManger.
1561 // gGeoManager is set to the return value.
1562 // Throws exception if geometry can not be loaded or if it is not
1563 // available and the TGeoManager is locked.
1564 // Static utility for macros.
1566 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1568 if (AliGeomManager::GetGeometry() == 0)
1570 if (TGeoManager::IsLocked())
1571 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1574 AliGeomManager::LoadGeometry();
1575 if ( ! AliGeomManager::GetGeometry())
1577 throw (kEH + "can not load geometry.");
1579 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1581 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1582 // throw (kEH + "could not apply align objs.");
1584 AliGeomManager::GetGeometry()->DefaultColors();
1587 gGeoManager = AliGeomManager::GetGeometry();
1591 AliRecoParam* AliEveEventManager::AssertRecoParams()
1599 Bool_t AliEveEventManager::InitRecoParam()
1601 // This is mostly a reap-off from reconstruction
1602 // The method accesses OCDB and retrieves all
1603 // the available reco-param objects from there.
1605 fgRecoParam = new AliRecoParam;
1606 const Int_t kNDetectors = 14;
1608 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1610 Bool_t isOK = kTRUE;
1612 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1613 ::Info(kEH, "Using custom GRP reconstruction parameters");
1616 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1618 AliCDBPath path("GRP","Calib","RecoParam");
1619 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1621 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1625 TObject *recoParamObj = entry->GetObject();
1626 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1627 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1628 // Registering them in AliRecoParam
1629 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1631 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1632 // GRP has only onse set of reco parameters
1633 // Registering it in AliRecoParam
1634 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1635 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1636 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1639 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1646 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1649 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1651 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1652 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1656 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1658 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1659 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1661 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1665 TObject *recoParamObj = entry->GetObject();
1666 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1667 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1668 // Registering them in AliRecoParam
1669 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1671 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1672 // The detector has only onse set of reco parameters
1673 // Registering it in AliRecoParam
1674 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1675 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1676 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1679 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1695 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1697 if(!fESDFile && !fESD) return 0;
1699 static const TEveException kEH("AliEveEventManager::readESDTree ");
1701 TTree* tempTree = 0;
1703 tempTree =(TTree*) fESDFile->Get(treeName);
1706 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1709 if (!esdFriendFile->IsZombie())
1711 esdFriendFile->Close();
1712 fESDfriendExists = kTRUE;
1713 tempTree->SetBranchStatus ("ESDfriend*", 1);
1715 delete esdFriendFile;
1718 fESD->ReadFromTree(tempTree);
1719 if (fESDfriendExists)
1721 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1722 Info(kEH, "found and attached ESD friend.");
1726 Warning(kEH, "ESDfriend not found.");
1729 if (tempTree->GetEntry(0) <= 0)
1731 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1736 runNo = fESD->GetESDRun()->GetRunNumber();
1741 Warning(kEH, "failed getting the tree:%s", treeName);
1748 //------------------------------------------------------------------------------
1750 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1752 // Create and attach a dependent event-manager.
1753 // It is not added into eve list tree.
1755 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1758 throw(kEH + "Master event-manager must be instantiated first.");
1760 if (fgMaster->fSubManagers == 0)
1762 fgMaster->fSubManagers = new TList;
1763 fgMaster->fSubManagers->SetOwner(kTRUE);
1766 AliEveEventManager* new_mgr = 0;
1770 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1771 new_mgr->SetFilesPath(path);
1772 fgMaster->fSubManagers->Add(new_mgr);
1774 catch (TEveException& exc)
1776 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1778 fgCurrent = fgMaster;
1783 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1785 // Get a dependant manager by name.
1786 // This will not change the current manager, use helper class
1787 // AliEveEventManager::CurrentChanger for that.
1789 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1792 throw(kEH + "Master event-manager must be instantiated first.");
1794 if (fgMaster->fSubManagers == 0)
1797 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1800 AliEveEventManager* AliEveEventManager::GetMaster()
1802 // Get master event-manager.
1807 AliEveEventManager* AliEveEventManager::GetCurrent()
1809 // Get current event-manager.
1814 void AliEveEventManager::RegisterTransient(TEveElement* element)
1816 GetCurrent()->fTransients->AddElement(element);
1819 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1821 GetCurrent()->fTransientLists->AddElement(element);
1824 //------------------------------------------------------------------------------
1825 // Autoloading of events
1826 //------------------------------------------------------------------------------
1828 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1830 // Set the auto-load time in seconds
1832 fAutoLoadTime = time;
1835 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1837 // Set the automatic event loading mode
1839 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1841 if (fAutoLoad == autoLoad)
1843 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1847 fAutoLoad = autoLoad;
1850 StartAutoLoadTimer();
1854 StopAutoLoadTimer();
1858 void AliEveEventManager::SetLoopMarked(Bool_t loopMarked)
1860 // Set the automatic event loading mode
1861 if(fLoopMarked == loopMarked)
1863 cout<<"loop marked has the same value - ignoring"<<endl;
1868 cout<<"Setting loof marked to:"<<loopMarked<<endl;
1869 fLoopMarked = loopMarked;
1870 if (fLoopMarked){StartAutoLoadTimer();}
1871 else{StopAutoLoadTimer();}
1875 void AliEveEventManager::SetTrigSel(Int_t trig)
1877 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1881 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1886 ULong64_t trigMask = 0;
1887 if (trig >= 0) trigMask = (1ull << trig);
1888 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1889 fRawReader->SelectEvents(-1,trigMask,NULL);
1893 void AliEveEventManager::StartAutoLoadTimer()
1895 // Start the auto-load timer.
1897 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1898 fAutoLoadTimer->Reset();
1899 fAutoLoadTimer->TurnOn();
1900 fAutoLoadTimerRunning = kTRUE;
1903 void AliEveEventManager::StopAutoLoadTimer()
1905 // Stop the auto-load timer.
1907 fAutoLoadTimerRunning = kFALSE;
1908 fAutoLoadTimer->TurnOff();
1911 void AliEveEventManager::AutoLoadNextEvent()
1913 // Called from auto-load timer, so it has to be public.
1914 // Do NOT call it directly.
1916 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1918 Info(kEH, "called!");
1920 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1922 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1926 StopAutoLoadTimer();
1928 if (fAutoLoad || fLoopMarked){
1929 StartAutoLoadTimer();
1933 //------------------------------------------------------------------------------
1934 // Post event-loading functions
1935 //------------------------------------------------------------------------------
1937 void AliEveEventManager::AfterNewEventLoaded()
1939 // Execute registered macros and commands.
1940 // At the end emit NewEventLoaded signal.
1942 // Virtual from TEveEventManager.
1944 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
1946 Info(kEH, "------------------!!!------------");
1948 NewEventDataLoaded();
1949 if (fExecutor) fExecutor->ExecMacros();
1951 TEveEventManager::AfterNewEventLoaded();
1954 if (this == fgMaster && fSubManagers != 0)
1956 TIter next(fSubManagers);
1957 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
1959 gEve->SetCurrentEvent(fgCurrent);
1962 fgCurrent->GotoEvent(fEventId);
1964 catch (TEveException& exc)
1966 // !!! Should somehow tag / disable / remove it?
1967 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
1968 fEventId, fgCurrent->GetName(), exc.Data());
1970 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
1972 fgCurrent = fgMaster;
1973 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
1974 gEve->SetCurrentEvent(fgMaster);
1978 void AliEveEventManager::NewEventDataLoaded()
1980 // Emit NewEventDataLoaded signal.
1981 Emit("NewEventDataLoaded()");
1983 void AliEveEventManager::NewEventLoaded()
1985 // Emit NewEventLoaded signal.
1986 Emit("NewEventLoaded()");
1988 void AliEveEventManager::NoEventLoaded()
1990 // Emit NoEventLoaded signal.
1991 Emit("NoEventLoaded()");
1993 void AliEveEventManager::StorageManagerOk()
1995 // Emit StorageManagerOk signal.
1996 Emit("StorageManagerOk()");
1998 void AliEveEventManager::StorageManagerDown()
2000 // Emit StorageManagerOk signal.
2001 Emit("StorageManagerDown()");
2005 //------------------------------------------------------------------------------
2006 // Event info dumpers
2007 //------------------------------------------------------------------------------
2009 const AliEventInfo* AliEveEventManager::GetEventInfo()
2011 // Fill the event info object
2013 AliCentralTrigger *aCTP = NULL;
2015 fEventInfo.SetEventType(fRawReader->GetType());
2017 ULong64_t mask = fRawReader->GetClassMask();
2018 fEventInfo.SetTriggerMask(mask);
2019 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
2020 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
2022 aCTP = new AliCentralTrigger();
2023 TString configstr("");
2024 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
2025 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
2029 aCTP->SetClassMask(mask);
2030 aCTP->SetClusterMask(clmask);
2033 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
2035 rlCTP->SetClassMask(mask);
2036 rlCTP->SetClusterMask(clmask);
2041 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
2043 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
2044 aCTP = fRunLoader->GetTrigger();
2045 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
2046 // get inputs from actp - just get
2047 AliESDHeader* esdheader = fESD->GetHeader();
2048 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
2049 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
2050 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
2051 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
2054 AliWarning("No trigger can be loaded! The trigger information will not be used!");
2059 AliTriggerConfiguration *config = aCTP->GetConfiguration();
2061 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
2062 if (fRawReader) delete aCTP;
2066 TString declTriggerClasses;
2068 // Load trigger aliases and declare the trigger classes included in aliases
2069 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
2071 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
2073 lst->Sort(kSortDescending); // to avoid problems with substrings
2074 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
2075 // Now declare all the triggers present in the aliases
2078 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
2079 declTriggerClasses += " ";
2080 declTriggerClasses += nmd->GetName();
2084 AliError("Cannot cast the object with trigger aliases to THashList!");
2088 AliError("No OCDB entry for the trigger aliases!");
2091 // Load trigger classes for this run
2092 UChar_t clustmask = 0;
2094 ULong64_t trmask = fEventInfo.GetTriggerMask();
2095 const TObjArray& classesArray = config->GetClasses();
2096 Int_t nclasses = classesArray.GetEntriesFast();
2097 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
2098 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
2099 if (trclass && trclass->GetMask()>0) {
2100 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
2101 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
2102 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
2103 if (trmask & (1ull << trindex)) {
2105 trclasses += trclass->GetName();
2107 clustmask |= trclass->GetCluster()->GetClusterMask();
2111 fEventInfo.SetTriggerClasses(trclasses);
2113 if (!aCTP->CheckTriggeredDetectors()) {
2114 if (fRawReader) delete aCTP;
2118 if (fRawReader) delete aCTP;
2120 // everything went ok, return pointer
2121 return (&fEventInfo);
2125 TString AliEveEventManager::GetEventInfoHorizontal() const
2127 // Dumps the event-header contents in vertical formatting.
2129 TString rawInfo, esdInfo;
2133 rawInfo = "No raw-data event info is available!\n";
2137 const UInt_t* attr = fRawReader->GetAttributes();
2138 TTimeStamp ts(fRawReader->GetTimestamp());
2139 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2140 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
2141 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2142 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2143 fRawReader->GetClassMask(),
2144 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2145 attr[0],attr[1],attr[2], ts.AsString("s"));
2150 esdInfo = "No ESD event info is available!";
2154 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2155 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2156 TTimeStamp ts(fESD->GetTimeStamp());
2157 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2158 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
2159 fESD->GetRunNumber(),
2160 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2161 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2162 acttrclasses.Data(),
2163 fESD->GetTriggerMask(),firedtrclasses.Data(),
2164 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
2167 return rawInfo + esdInfo;
2170 TString AliEveEventManager::GetEventInfoVertical() const
2172 // Dumps the event-header contents in vertical formatting.
2174 TString rawInfo, esdInfo;
2178 rawInfo = "No raw-data event info is available!\n";
2182 const UInt_t* attr = fRawReader->GetAttributes();
2183 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",
2184 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2185 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2186 fRawReader->GetClassMask(),
2187 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2188 attr[0],attr[1],attr[2],
2189 fRawReader->GetTimestamp());
2194 esdInfo = "No ESD event info is available!\n";
2198 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2199 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2200 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",
2201 fESD->GetRunNumber(),
2202 acttrclasses.Data(),
2203 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2204 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2205 fESD->GetTriggerMask(),firedtrclasses.Data(),
2206 fESD->GetEventNumberInFile(),
2207 fESD->GetTimeStamp());
2210 return rawInfo + "\n" + esdInfo;
2214 //==============================================================================
2215 // Reading of GRP and MagneticField.
2216 // This is a reap-off from reconstruction ... should really be a common
2217 // code to do this somewhere in STEER.
2218 //==============================================================================
2220 Bool_t AliEveEventManager::InitGRP()
2222 //------------------------------------
2223 // Initialization of the GRP entry
2224 //------------------------------------
2226 static const TEveException kEH("AliEveEventManager::InitGRP ");
2228 AliGRPManager grpMgr;
2229 if (!grpMgr.ReadGRPEntry()) {
2232 fgGRPLoaded = kTRUE;
2233 if (!grpMgr.SetMagField()) {
2234 throw kEH + "Setting of field failed!";
2237 //*** Get the diamond profiles from OCDB
2238 // Eventually useful.
2241 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
2243 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
2245 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2248 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2250 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2252 ::Error(kEH, "No diamond profile found in OCDB!");
2255 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2257 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2259 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2266 //------------------------------------
2267 // Global variables management
2268 //------------------------------------
2270 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2272 // Insert a new visualization-parameter database entry with the default
2273 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2276 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2277 Bool_t replace, Bool_t update)
2279 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2284 model->IncDenyDestroy();
2285 model->SetRnrChildren(kFALSE);
2287 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2288 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2289 while (old_model->HasChildren())
2291 TEveElement *el = old_model->FirstChild();
2292 el->SetVizModel(model);
2295 el->CopyVizParams(model);
2296 el->PropagateVizParamsToProjecteds();
2299 old_model->DecDenyDestroy();
2301 pair->SetValue(dynamic_cast<TObject*>(model));
2311 model->IncDenyDestroy();
2312 model->SetRnrChildren(kFALSE);
2313 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2318 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2320 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));
2322 Int_t AliEveEventManager::NewEventAvailable()
2324 if (fIsNewEventAvaliable)