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), fExternalCtrl (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;}
172 cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
173 fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
174 fEventListenerThread->Run();
176 // fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
177 //fStorageManagerWatcherThread->Run();
180 cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
184 AliEveEventManager::~AliEveEventManager()
189 if(fEventListenerThread)
191 fEventListenerThread->Join();
192 fEventListenerThread->Kill();
193 delete fEventListenerThread;
194 cout<<"listener thread killed and deleted"<<endl;
196 if(fStorageManagerWatcherThread)
198 fStorageManagerWatcherThread->Join();
199 fStorageManagerWatcherThread->Kill();
200 delete fStorageManagerWatcherThread;
201 cout<<"storage watcher thread killed and deleted"<<endl;
204 fAutoLoadTimer->Stop();
205 fAutoLoadTimer->Disconnect("Timeout");
206 fAutoLoadTimer->Disconnect("AutoLoadNextEvent");
208 if(fSubManagers){delete fSubManagers;}
209 if(fMutex){delete fMutex;}
210 if (fIsOpen){Close();}
212 // fTransients->DecDenyDestroy();
213 // fTransients->Destroy();
215 // fTransientLists->DecDenyDestroy();
216 // fTransientLists->Destroy();
221 void AliEveEventManager::GetNextEvent()
224 if(!fOnlineMode){return;}
225 cout<<"\n\nGet next event called\n\n"<<endl;
227 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
228 eventManager->CreateSocket(EVENTS_SERVER_SUB);
229 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
234 AliESDEvent *tmpEvent = NULL;
236 // get list of marked events:
237 struct listRequestStruct list;
240 list.runNumber[1]=999999;
241 list.eventNumber[0]=0;
242 list.eventNumber[1]=999999;
245 list.multiplicity[0]=0;
246 list.multiplicity[1]=999999;
247 strcpy(list.system[0],"p-p");
248 strcpy(list.system[1],"");
250 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
251 requestMessage->messageType = REQUEST_LIST_EVENTS;
252 requestMessage->list = list;
254 cout<<"Sending request for marked events list"<<endl;
255 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
256 cout<<"Waiting for response"<<endl;
257 vector<serverListStruct> receivedList = eventManager->GetServerListVector(SERVER_COMMUNICATION_REQ,3000);
258 cout<<"EVENT DISPLAY -- received list of marked events"<<endl;
260 for(int i=0;i<receivedList.size();i++)
262 cout<<"ev:"<<receivedList[i].eventNumber<<endl;
267 cout<<"Starting subscriber's loop"<<endl;
270 cout<<"not finished"<<endl;
271 if(!fLoopMarked || receivedList.size()<=0)
273 cout<<"taking event from reco server"<<endl;
274 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,5000);
275 cout<<"after get event"<<endl;
276 if(!tmpEvent){sleep(1);}
280 cout<<"taking event from storage manager"<<endl;
281 if(iter<receivedList.size())
283 cout<<"i:"<<iter<<endl;
284 struct eventStruct mark;
285 mark.runNumber = receivedList[iter].runNumber;
286 mark.eventNumber = receivedList[iter].eventNumber;
288 requestMessage->messageType = REQUEST_GET_EVENT;
289 requestMessage->event = mark;
291 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
292 tmpEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
302 cout<<"tmpEvent:"<<tmpEvent->GetRunNumber()<<endl;
303 if(tmpEvent->GetRunNumber()>=0)
306 if(fEventInUse == 0){fWritingToEventIndex = 1;}
307 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
308 cout<<"Received new event:"<<tmpEvent->GetEventNumberInFile()<<endl;
309 if(fCurrentEvent[fWritingToEventIndex])
311 delete fCurrentEvent[fWritingToEventIndex];
312 fCurrentEvent[fWritingToEventIndex]=0;
314 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
315 fIsNewEventAvaliable = true;
320 else{cout<<"didn't receive new event"<<endl;}
323 delete requestMessage;
328 void AliEveEventManager::CheckStorageStatus()
331 if(!fOnlineMode){return;}
333 AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
334 configManager->ConnectEventManagerSignals();
336 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
337 eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
339 struct clientRequestStruct *request = new struct clientRequestStruct;
340 request->messageType = REQUEST_CONNECTION;
344 if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
347 long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
348 fStorageDown = kFALSE;
352 StorageManagerDown();
353 cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
354 fStorageDown = kTRUE;
359 AliEveEventManager *manager = AliEveEventManager::GetCurrent();
360 manager->Disconnect("StorageManagerOk");
361 manager->Disconnect("StorageManagerDown");
366 void AliEveEventManager::InitInternals()
368 // Initialize internal members.
370 static const TEveException kEH("AliEveEventManager::InitInternals ");
374 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
384 fAutoLoadTimer = new TTimer;
385 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
386 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
388 fExecutor = new AliEveMacroExecutor;
390 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
391 fTransients->IncDenyDestroy();
392 gEve->AddToListTree(fTransients, kFALSE);
394 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
395 fTransientLists->IncDenyDestroy();
396 gEve->AddToListTree(fTransientLists, kFALSE);
398 fPEventSelector = new AliEveEventSelector(this);
400 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
403 /******************************************************************************/
405 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
407 fgESDvisibleTrees = shown;
408 // Set file-name for opening ESD, default "AliESDs.root".
409 if (esd.IsNull()) return;
412 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
416 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
418 // Set file-name for opening ESD friend, default "AliESDfriends.root".
420 if (esdf.IsNull()) return;
421 fgESDfriendsFileName = esdf;
423 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
426 void AliEveEventManager::SetAODFileName(const TString& aod)
428 // Set file-name for opening AOD, default "AliAOD.root".
430 if (aod.IsNull()) return;
433 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
437 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
439 // Add new AOD friend file-name to be attached when opening AOD.
440 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
442 if (fgAODfriends == 0)
444 fgAODfriends = new TList;
445 fgAODfriends->SetOwner(kTRUE);
447 if (fgAODfriends->FindObject(friendFileName) == 0)
449 fgAODfriends->Add(new TObjString(friendFileName));
453 void AliEveEventManager::SetRawFileName(const TString& raw)
455 // Set file-name for opening of raw-data, default "raw.root"
456 if (raw.IsNull()) return;
461 void AliEveEventManager::SetCdbUri(const TString& cdb)
463 // Set path to CDB, there is no default.
464 if ( ! cdb.IsNull()) fgCdbUri = cdb;
467 void AliEveEventManager::SetSpecificCdbUri(const TString& path,const TString& value)
469 // Set path to specific CDB object, there is no default.
470 if ( ! value.IsNull()) fgSpecificCdbUriValue = value;
471 if ( ! path.IsNull()) fgSpecificCdbUriPath = path;
474 void AliEveEventManager::SetGAliceFileName(const TString& galice)
476 // Set file-name for opening gAlice, default "galice.root".
478 if ( galice.IsNull()) return;
479 fgGAliceFileName = galice;
481 if (galice.EndsWith(".zip")) fgGAliceFileName.Form("%s#galice.root",galice.Data());
484 void AliEveEventManager::SetFilesPath(const TString& urlPath)
486 TString path = urlPath;
487 gSystem->ExpandPathName(path);
488 if (path.IsNull() || path == ".")
490 path = gSystem->WorkingDirectory();
494 if(path.EndsWith(".zip")) // if given a path to root_archive.zip
496 else if(!path.EndsWith("/"))
499 SetESDFileName( TString(Form("%s%sAliESDs.root", path.Data(), sep.Data())) );
500 SetESDfriendFileName( TString(Form("%s%sAliESDfriends.root", path.Data(), sep.Data())) );
501 SetAODFileName( TString(Form("%s%sAliAOD.root", path.Data(), sep.Data())) );
502 AddAODfriend( TString(Form("%s%sAliAOD.VertexingHF.root", path.Data(), sep.Data())) );
503 SetGAliceFileName( TString(Form("%s%sgalice.root", path.Data(), sep.Data())) );
504 SetRawFileName(TString(Form("%s%sraw.root", path.Data(), sep.Data())));
507 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
508 Bool_t assertAod, Bool_t assertRaw)
510 // Set global flags that detrmine which parts of the event-data must
511 // be present when the event is opened.
513 fgAssertRunLoader = assertRunloader;
514 fgAssertESD = assertEsd;
515 fgAssertAOD = assertAod;
516 fgAssertRaw = assertRaw;
519 void AliEveEventManager::SearchRawForCentralReconstruction()
521 // Enable searching of raw data in standard location. The path passed to
522 // Open() is expected to point to a centrally reconstructed run, e.g.:
523 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
525 fgRawFromStandardLoc = kTRUE;
528 /******************************************************************************/
530 void AliEveEventManager::Open()
532 // Open event-data from URL specified in path.
533 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
534 // Warning is reported if run-loader or ESD is not found.
535 // Global data-members fgAssertRunLoader and fgAssertESD can be set
536 // to throw exceptions instead.
538 static const TEveException kEH("AliEveEventManager::Open ");
542 throw (kEH + "Event-loop is under external control.");
546 throw (kEH + "Event-files already opened.");
551 // Open ESD and ESDfriends
554 if ((fESDFile = TFile::Open(fgESDFileName)))
556 fESD = new AliESDEvent();
558 switch(fgESDvisibleTrees){
559 case AliEveEventManager::kOfflineTree :
560 fESDTree = readESDTree("esdTree", runNo);
562 case AliEveEventManager::kHLTTree :
563 fHLTESDTree = readESDTree("HLTesdTree", runNo);
566 fESDTree = readESDTree("esdTree", runNo);
567 fHLTESDTree = readESDTree("HLTesdTree", runNo);
570 if(!fESDTree && !fHLTESDTree){
571 // both ESD trees are == 0
572 delete fESDFile; fESDFile = 0;
573 delete fESD; fESD = 0;
578 else // esd file not readable
580 Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());
582 if (fESDTree == 0 && fHLTESDTree==0)
586 throw (kEH + "ESD not initialized. Its precence was requested.");
588 Warning(kEH, "ESD not initialized.");
592 // Open AOD and registered friends
593 if ( (fAODFile = TFile::Open(fgAODFileName)) )
595 fAOD = new AliAODEvent();
596 fAODTree = (TTree*) fAODFile->Get("aodTree");
599 // Check if AODfriends exist and attach them.
600 TIter friends(fgAODfriends);
602 while ((name = (TObjString*) friends()) != 0)
604 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
605 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
606 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
608 fAODTree->AddFriend("aodTree", name->GetName());
612 fAOD->ReadFromTree(fAODTree);
614 if (fAODTree->GetEntry(0) <= 0)
616 delete fAODFile; fAODFile = 0;
617 delete fAOD; fAOD = 0;
618 Warning(kEH, "failed getting the first entry from addTree.");
623 runNo = fAOD->GetRunNumber();
628 delete fAODFile; fAODFile = 0;
629 delete fAOD; fAOD = 0;
630 Warning(kEH, "failed getting the aodTree.");
633 else // aod not readable
635 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
641 throw (kEH + "AOD not initialized. Its precence was requested.");
643 Warning(kEH, "AOD not initialized.");
647 // Open RunLoader from galice.root
648 // fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
650 TFile *gafile = TFile::Open(fgGAliceFileName);
651 cout<<"Opening galice"<<endl;
656 cout<<"SETTING RUN LOADER in Open()"<<endl;
657 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
660 TString alicePath(gSystem->DirName(fgGAliceFileName));
661 alicePath.Append("/");
662 fRunLoader->SetDirName(alicePath);
664 if (fRunLoader->LoadgAlice() != 0)
665 Warning(kEH, "failed loading gAlice via run-loader.");
667 if (fRunLoader->LoadHeader() == 0)
670 runNo = fRunLoader->GetHeader()->GetRun();
674 Warning(kEH, "failed loading run-loader's header.");
679 else // run-loader open failed
681 Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());
685 else // galice not readable
687 Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());
691 if (fgAssertRunLoader)
692 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
694 Warning(kEH, "Bootstraping of run-loader failed.");
697 // Open raw-data file
700 if (fgRawFromStandardLoc)
702 if (!fgRawFileName.BeginsWith("alien:"))
703 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
704 if (!fgRawFileName.Contains("/ESDs/"))
705 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
707 TPMERegexp chunk("/([\\d\\.])+/?$");
708 Int_t nm = chunk.Match(fgRawFileName);
710 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
712 TPMERegexp esdstrip("/ESDs/.*");
713 rawPath = fgRawFileName;
714 esdstrip.Substitute(rawPath, "/raw/");
718 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
722 rawPath = fgRawFileName;
724 // If i use open directly, raw-reader reports an error but i have
725 // no way to detect it.
726 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
727 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
728 if (fgAssertRaw == kFALSE)
730 AliLog::SetGlobalLogLevel(AliLog::kFatal);
732 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
734 fRawReader = AliRawReader::Create(rawPath);
738 fRawReader = AliRawReader::Create(fgRawFileName);
740 if (fgAssertRaw == kFALSE)
742 AliLog::SetGlobalLogLevel(oldLogLevel);
749 throw (kEH + "raw-data not initialized. Its precence was requested.");
753 Warning(kEH, "raw-data not initialized.");
761 if ( ! fRawReader->NextEvent())
763 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
765 runNo = fRawReader->GetRunNumber();
766 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
767 fRawReader->RewindEvents();
771 fExternalCtrl = kTRUE;
777 // Initialize OCDB ... only in master event-manager
785 void AliEveEventManager::InitOCDB(int runNo)
787 TString cdbPath = Form("local://%s/ed_ocdb_objects/",gSystem->Getenv("HOME"));
788 AliCDBManager* cdb = AliCDBManager::Instance();
792 if(runNo != fCurrentRun)
794 cout<<"Loading OCDB for new run:"<<runNo<<" in online mode."<<endl;
796 settings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
798 cout<<"config read"<<endl;
800 // Retrieve GRP entry for given run from aldaqdb.
801 TString dbHost = settings.GetValue("logbook.host", DEFAULT_LOGBOOK_HOST);
802 Int_t dbPort = settings.GetValue("logbook.port", DEFAULT_LOGBOOK_PORT);
803 TString dbName = settings.GetValue("logbook.db", DEFAULT_LOGBOOK_DB);
804 TString user = settings.GetValue("logbook.user", DEFAULT_LOGBOOK_USER);
805 TString password = settings.GetValue("logbook.pass", DEFAULT_LOGBOOK_PASS);
807 gSystem->cd(cdbPath.Data());
808 gSystem->Exec("rm -fr GRP/");
809 cout<<"CDB path for GRP:"<<cdbPath<<endl;
813 Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fCurrentRun, dbHost.Data(),
814 dbPort, dbName.Data(),
815 user.Data(), password.Data(),
816 Form("%s",cdbPath.Data()),
819 if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret);
820 else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found");
821 else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret);
824 cdb->SetDefaultStorage(settings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
825 cdb->SetSpecificStorage("GRP/GRP/Data",cdbPath.Data());
826 cdb->SetRun(fCurrentRun);
832 static const TEveException kEH("AliEveEventManager::InitOCDB ");
833 //if (this == fgMaster)
835 if (cdb->IsDefaultStorageSet() == kTRUE)
837 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
838 cdb->GetDefaultStorage()->GetURI().Data());
842 if (fgCdbUri.IsNull())
844 gEnv->SetValue("Root.Stacktrace", "no");
845 Fatal("Open()", "OCDB path was not specified.");
847 cout<<"Setting default storage:"<<fgCdbUri<<endl;
848 // Handle some special cases for MC (should be in OCDBManager).
849 if (fgCdbUri == "mcideal://")
850 cdb->SetDefaultStorage("MC", "Ideal");
851 else if (fgCdbUri == "mcresidual://")
852 cdb->SetDefaultStorage("MC", "Residual");
853 else if (fgCdbUri == "mcfull://")
854 cdb->SetDefaultStorage("MC", "Full");
855 else if (fgCdbUri == "local://"){
856 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
857 cdb->SetDefaultStorage(fgCdbUri);
860 cdb->SetDefaultStorage(fgCdbUri);
864 if (cdb->IsDefaultStorageSet() == kFALSE)
865 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
867 if (fgCdbUri.BeginsWith("local://"))
869 TString curPath = gSystem->WorkingDirectory();
870 TString grp = "GRP/GRP/Data";
871 TString grppath = curPath + "/" + grp;
872 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
874 if (cdb->GetSpecificStorage(grp))
876 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
880 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
881 TString lpath("local://");
883 cdb->SetSpecificStorage(grp, lpath);
890 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
892 // Set an event from an external source.
893 // The method is used in the online visualisation.
894 // AOD is not supported.
896 static const TEveException kEH("AliEveEventManager::SetEvent ");
900 Warning(kEH, "Event-files were open. Closing and switching to external control.");
904 Info(kEH,"setting it!!! ============================");
906 fRunLoader = runLoader;
907 fRawReader = rawReader;
914 //fExternalCtrl = kTRUE;
916 SetTitle("Online event in memory");
917 SetName ("Online Event");
920 AfterNewEventLoaded();
922 if (fAutoLoad || fLoopMarked) StartAutoLoadTimer();
926 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
928 // Returns maximum available event id.
929 // If under external control or event is not opened -1 is returned.
930 // If raw-data is the only data-source this can not be known
931 // and 10,000,000 is returned.
932 // If neither data-source is initialised an exception is thrown.
933 // If refresh_esd is true and ESD is the primary event-data source
934 // its header is re-read from disk.
936 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
938 if (fExternalCtrl || fIsOpen == kFALSE || fOnlineMode)
943 if ((fESDTree!=0) || (fHLTESDTree!=0))
947 if(fESDTree!=0) fESDTree->Refresh();
948 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
949 fPEventSelector->Update();
953 switch(fgESDvisibleTrees){
955 case AliEveEventManager::kOfflineTree :
956 maxEventId = fESDTree->GetEntries() - 1;
958 case AliEveEventManager::kHLTTree :
959 maxEventId = fHLTESDTree->GetEntries() - 1;
967 return fAODTree->GetEntries() - 1;
971 return fRunLoader->GetNumberOfEvents() - 1;
975 Int_t n = fRawReader->GetNumberOfEvents() - 1;
976 return n > -1 ? n : 10000000;
980 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
984 void AliEveEventManager::GotoEvent(Int_t event)
986 cout<<"Go to event:"<<event<<endl;
987 // Load data for specified event.
988 // If event is out of range an exception is thrown and old state
990 // After successful loading of event, the virtual function
991 // AfterNewEventLoaded() is called. This executes commands that
992 // were registered via TEveEventManager::AddNewEventCommand().
994 // If event is negative, it is subtracted from the number of
995 // available events, thus passing -1 will load the last event.
996 // This is not supported when raw-data is the only data-source
997 // as the number of events is not known.
999 static const TEveException kEH("AliEveEventManager::GotoEvent ");
1001 if (fAutoLoadTimerRunning)
1003 throw (kEH + "Event auto-load timer is running.");
1007 throw (kEH + "Event-loop is under external control.");
1011 throw (kEH + "Event-files not opened.");
1017 if (fStorageDown && -1 == event)
1025 // create new server request:
1026 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1028 // set request type:
1029 if (event == -1) {requestMessage->messageType = REQUEST_GET_LAST_EVENT;}
1030 else if (event == 0) {requestMessage->messageType = REQUEST_GET_FIRST_EVENT;}
1031 else if (event == 1) {requestMessage->messageType = REQUEST_GET_PREV_EVENT;}
1032 else if (event == 2) {requestMessage->messageType = REQUEST_GET_NEXT_EVENT;}
1034 // set event struct:
1035 struct eventStruct eventToLoad;
1036 eventToLoad.runNumber = fESD->GetRunNumber();
1037 eventToLoad.eventNumber = fESD->GetEventNumberInFile();
1038 requestMessage->event = eventToLoad;
1040 // create event manager:
1041 AliStorageEventManager *eventManager =
1042 AliStorageEventManager::GetEventManagerInstance();
1043 AliESDEvent *resultEvent = NULL;
1045 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1048 // send request and receive event:
1049 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1050 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1055 InitOCDB(resultEvent->GetRunNumber());
1056 SetEvent(0,0,resultEvent,0);
1060 if(event==-1){cout<<"\n\nWARNING -- No last event is avaliable.\n\n"<<endl;}
1061 if(event==0){cout<<"\n\nWARNING -- No first event is avaliable.\n\n"<<endl;}
1062 if(event==1){cout<<"\n\nWARNING -- No previous event is avaliable.\n\n"<<endl;}
1063 if(event==2){cout<<"\n\nWARNING -- No next event is avaliable.\n\n"<<endl;}
1070 cout<<"\n\nWARNING -- No event has been already loaded. Loading the most recent event...\n\n"<<endl;
1072 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1073 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
1075 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
1076 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1077 AliESDEvent *resultEvent = NULL;
1080 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1081 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1087 InitOCDB(resultEvent->GetRunNumber());
1088 SetEvent(0,0,resultEvent,0);
1090 else{cout<<"\n\nWARNING -- The most recent event is not avaliable.\n\n"<<endl;}
1103 if ((fESDTree!=0) || (fHLTESDTree!=0))
1106 if (event >= fESDTree->GetEntries())
1107 fESDTree->Refresh();
1108 maxEvent = fESDTree->GetEntries() - 1;
1110 event = fESDTree->GetEntries() + event;
1114 if (event >= fHLTESDTree->GetEntries())
1115 fHLTESDTree->Refresh();
1116 maxEvent = fHLTESDTree->GetEntries() - 1;
1118 event = fHLTESDTree->GetEntries() + event;
1124 maxEvent = fAODTree->GetEntries() - 1;
1126 event = fAODTree->GetEntries() + event;
1128 else if (fRunLoader)
1130 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
1132 event = fRunLoader->GetNumberOfEvents() + event;
1134 else if (fRawReader)
1136 maxEvent = fRawReader->GetNumberOfEvents() - 1;
1139 maxEvent = 10000000;
1141 Error(kEH, "current raw-data source does not support direct event access.");
1144 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
1149 event = fRawReader->GetNumberOfEvents() + event;
1154 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
1158 throw (kEH + Form("event %d not present, available range [%d, %d].",
1159 event, 0, maxEvent));
1161 if (event > maxEvent)
1164 cout<<"Event number out of range. Going to event 0"<<endl;
1167 TString sysInfoHeader;
1168 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
1169 AliSysInfo::AddStamp(sysInfoHeader + "Start");
1171 TEveManager::TRedrawDisabler rd(gEve);
1172 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
1174 // !!! MT this is somewhat brutal; at least optionally, one could be
1175 // a bit gentler, checking for objs owning their external refs and having
1176 // additinal parents.
1177 gEve->GetViewers()->DeleteAnnotations();
1178 fTransients->DestroyElements();
1179 for (TEveElement::List_i i = fTransientLists->BeginChildren();
1180 i != fTransientLists->EndChildren(); ++i)
1182 (*i)->DestroyElements();
1186 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
1189 if (fESDTree->GetEntry(event) <= 0)
1190 throw (kEH + "failed getting required event from ESD.");
1192 if (fESDfriendExists)
1193 fESD->SetESDfriend(fESDfriend);
1197 if (fHLTESDTree->GetEntry(event) <= 0)
1198 throw (kEH + "failed getting required event from HLT ESD.");
1200 if (fESDfriendExists)
1201 fESD->SetESDfriend(fESDfriend);
1205 if (fAODTree->GetEntry(event) <= 0)
1206 throw (kEH + "failed getting required event from AOD.");
1210 if (fRunLoader->GetEvent(event) != 0)
1211 throw (kEH + "failed getting required event.");
1216 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
1217 if (fRawReader->GotoEvent(event) == kFALSE)
1219 // Use fallback method - iteration with NextEvent().
1220 Int_t rawEv = fEventId;
1223 fRawReader->RewindEvents();
1227 while (rawEv < event)
1229 if ( ! fRawReader->NextEvent())
1231 fRawReader->RewindEvents();
1233 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
1237 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
1243 if (this == fgMaster)
1245 SetName(Form("Event %d", fEventId));
1249 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
1251 AfterNewEventLoaded();
1253 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
1256 void AliEveEventManager::Timeout()
1261 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
1264 InitOCDB(event->GetRunNumber());
1265 printf("======================= setting event to %d\n", fEventId);
1266 SetEvent(0,0,event,0);
1269 void AliEveEventManager::NextEvent()
1271 // Loads next event.
1272 // Does magick needed for online display when under external event control.
1274 static const TEveException kEH("AliEveEventManager::NextEvent ");
1276 if (fAutoLoadTimerRunning){throw (kEH + "Event auto-load timer is running.");}
1277 if (fExternalCtrl){throw (kEH + "External control");}
1283 if(fIsNewEventAvaliable)
1286 if(fWritingToEventIndex == 0) fEventInUse = 0;
1287 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1289 if(fCurrentEvent[fEventInUse])
1291 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1293 printf("======================= setting event to %d\n", fCurrentEvent[fEventInUse]->GetEventNumberInFile());
1296 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1297 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1301 fIsNewEventAvaliable = false;
1306 cout<<"No new event is avaliable."<<endl;
1311 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1313 cout<<"There is ESD or HLTESD tree"<<endl;
1315 if (fPEventSelector->FindNext(nextevent))
1317 cout<<"GotoEvent:"<<nextevent<<endl;
1318 GotoEvent(nextevent);
1321 else if (fEventId < GetMaxEventId(kTRUE))
1323 cout<<"GotoEvent:"<<fEventId+1<<endl;
1324 GotoEvent(fEventId + 1);
1328 cout<<"Going back to event 0"<<endl;
1332 gSystem->ProcessEvents();
1336 AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
1337 cout<<"contructor called"<<endl;
1338 vsdCreator->CreateVSD("myVSD.root");
1341 //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
1344 void AliEveEventManager::PrevEvent()
1346 // Loads previous event.
1348 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1350 if (fAutoLoadTimerRunning)
1352 throw (kEH + "Event auto-load timer is running.");
1356 throw (kEH + "Event-loop is under external control.");
1359 if ((fESDTree!=0) || (fHLTESDTree!=0))
1362 if (fPEventSelector->FindPrev(nextevent))
1364 GotoEvent(nextevent);
1367 else if (fEventId > 0)
1369 GotoEvent(fEventId - 1);
1373 void AliEveEventManager::MarkCurrentEvent()
1376 if(!fOnlineMode){return;}
1378 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1379 struct eventStruct mark;
1380 mark.runNumber = fESD->GetRunNumber();
1381 mark.eventNumber = fESD->GetEventNumberInFile();
1382 requestMessage->messageType = REQUEST_MARK_EVENT;
1383 requestMessage->event = mark;
1385 AliStorageEventManager *eventManager =
1386 AliStorageEventManager::GetEventManagerInstance();
1387 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1390 std::future<bool> unused = std::async([]()
1392 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1393 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1397 //fStatusLabel->SetText("Event marked");
1398 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1402 //fStatusLabel->SetText("Couldn't mark this event");
1403 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1408 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1409 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1414 //fStatusLabel->SetText("Event marked");
1415 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1419 //fStatusLabel->SetText("Couldn't mark this event");
1420 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1422 if(requestMessage){delete requestMessage;}
1426 void AliEveEventManager::Close()
1428 // Close the event data-files and delete ESD, ESDfriend, run-loader
1431 cout<<"\n\n\nClose() called!!\n\n\n"<<endl;
1433 static const TEveException kEH("AliEveEventManager::Close ");
1437 throw (kEH + "Event-files not opened.");
1440 if (fAutoLoadTimerRunning)
1441 StopAutoLoadTimer();
1443 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1444 delete fESD; fESD = 0;
1445 // delete fESDfriend; // friend tree is deleted with the tree
1447 fESDfriendExists = kFALSE;
1449 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1450 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1451 delete fESDFile; fESDFile = 0;
1455 delete fAOD; fAOD = 0;
1457 delete fAODTree; fAODTree = 0;
1458 delete fAODFile; fAODFile = 0;
1462 delete fRunLoader; fRunLoader = 0;
1466 delete fRawReader; fRawReader = 0;
1475 //------------------------------------------------------------------------------
1476 // Static convenience functions, mainly used from macros.
1477 //------------------------------------------------------------------------------
1479 Int_t AliEveEventManager::CurrentEventId()
1481 // Return current event-id.
1483 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1485 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1486 throw (kEH + "ALICE event not ready.");
1487 return fgCurrent->GetEventId();
1490 Bool_t AliEveEventManager::HasRunLoader()
1492 // Check if AliRunLoader is initialized.
1494 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1497 Bool_t AliEveEventManager::HasESD()
1499 // Check if AliESDEvent is initialized.
1501 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1504 Bool_t AliEveEventManager::HasESDfriend()
1506 // Check if AliESDfriend is initialized.
1508 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1511 Bool_t AliEveEventManager::HasAOD()
1513 // Check if AliESDEvent is initialized.
1515 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1518 Bool_t AliEveEventManager::HasRawReader()
1520 // Check if raw-reader is initialized.
1522 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1525 AliRunLoader* AliEveEventManager::AssertRunLoader()
1527 // Make sure AliRunLoader is initialized and return it.
1528 // Throws exception in case run-loader is not available.
1529 // Static utility for macros.
1531 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1533 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1534 throw (kEH + "ALICE event not ready.");
1535 if (fgCurrent->fRunLoader == 0)
1536 throw (kEH + "AliRunLoader not initialised.");
1537 return fgCurrent->fRunLoader;
1540 AliESDEvent* AliEveEventManager::AssertESD()
1542 // Make sure AliESDEvent is initialized and return it.
1543 // Throws exception in case ESD is not available.
1544 // Static utility for macros.
1546 static const TEveException kEH("AliEveEventManager::AssertESD ");
1548 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1549 throw (kEH + "ALICE event not ready.");
1550 if (fgCurrent->fESD == 0)
1551 throw (kEH + "AliESD not initialised.");
1552 return fgCurrent->fESD;
1555 AliESDfriend* AliEveEventManager::AssertESDfriend()
1557 // Make sure AliESDfriend is initialized and return it.
1558 // Throws exception in case ESDfriend-loader is not available.
1559 // Static utility for macros.
1561 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1563 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1564 throw (kEH + "ALICE event not ready.");
1565 if (fgCurrent->fESDfriend == 0)
1566 throw (kEH + "AliESDfriend not initialised.");
1567 return fgCurrent->fESDfriend;
1570 AliAODEvent* AliEveEventManager::AssertAOD()
1572 // Make sure AliAODEvent is initialized and return it.
1573 // Throws exception in case AOD is not available.
1574 // Static utility for macros.
1576 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1578 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1579 throw (kEH + "ALICE event not ready.");
1580 if (fgCurrent->fAOD == 0)
1581 throw (kEH + "AliAOD not initialised.");
1582 return fgCurrent->fAOD;
1585 AliRawReader* AliEveEventManager::AssertRawReader()
1587 // Make sure raw-reader is initialized and return it.
1589 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1591 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1592 throw (kEH + "ALICE event not ready.");
1593 if (fgCurrent->fRawReader == 0)
1594 throw (kEH + "RawReader not ready.");
1596 return fgCurrent->fRawReader;
1599 //==============================================================================
1601 AliMagF* AliEveEventManager::AssertMagField()
1603 // Make sure AliMagF is initialized and returns it.
1604 // Throws exception in case magnetic field is not available.
1605 // Static utility for macros.
1607 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1612 if (TGeoGlobalMagField::Instance()->GetField())
1614 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1615 if (fgMagField == 0)
1616 throw kEH + "Global field set, but it is not AliMagF.";
1625 if (TGeoGlobalMagField::Instance()->GetField())
1627 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1628 if (fgMagField == 0)
1629 throw kEH + "Global field set, but it is not AliMagF.";
1633 throw kEH + "Could not initialize magnetic field.";
1639 TGeoManager* AliEveEventManager::AssertGeometry()
1641 // Make sure AliGeomManager is initialized and returns the
1642 // corresponding TGeoManger.
1643 // gGeoManager is set to the return value.
1644 // Throws exception if geometry can not be loaded or if it is not
1645 // available and the TGeoManager is locked.
1646 // Static utility for macros.
1648 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1650 if (AliGeomManager::GetGeometry() == 0)
1652 if (TGeoManager::IsLocked())
1653 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1656 AliGeomManager::LoadGeometry();
1657 if ( ! AliGeomManager::GetGeometry())
1659 throw (kEH + "can not load geometry.");
1661 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1663 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1664 // throw (kEH + "could not apply align objs.");
1666 AliGeomManager::GetGeometry()->DefaultColors();
1669 gGeoManager = AliGeomManager::GetGeometry();
1673 AliRecoParam* AliEveEventManager::AssertRecoParams()
1681 Bool_t AliEveEventManager::InitRecoParam()
1683 // This is mostly a reap-off from reconstruction
1684 // The method accesses OCDB and retrieves all
1685 // the available reco-param objects from there.
1687 fgRecoParam = new AliRecoParam;
1688 const Int_t kNDetectors = 14;
1690 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1692 Bool_t isOK = kTRUE;
1694 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1695 ::Info(kEH, "Using custom GRP reconstruction parameters");
1698 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1700 AliCDBPath path("GRP","Calib","RecoParam");
1701 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1703 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1707 TObject *recoParamObj = entry->GetObject();
1708 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1709 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1710 // Registering them in AliRecoParam
1711 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1713 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1714 // GRP has only onse set of reco parameters
1715 // Registering it in AliRecoParam
1716 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1717 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1718 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1721 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1728 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1731 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1733 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1734 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1738 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1740 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1741 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1743 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1747 TObject *recoParamObj = entry->GetObject();
1748 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1749 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1750 // Registering them in AliRecoParam
1751 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1753 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1754 // The detector has only onse set of reco parameters
1755 // Registering it in AliRecoParam
1756 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1757 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1758 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1761 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1777 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1779 if(!fESDFile && !fESD) return 0;
1781 static const TEveException kEH("AliEveEventManager::readESDTree ");
1783 TTree* tempTree = 0;
1785 tempTree =(TTree*) fESDFile->Get(treeName);
1788 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1791 if (!esdFriendFile->IsZombie())
1793 esdFriendFile->Close();
1794 fESDfriendExists = kTRUE;
1795 tempTree->SetBranchStatus ("ESDfriend*", 1);
1797 delete esdFriendFile;
1800 fESD->ReadFromTree(tempTree);
1801 if (fESDfriendExists)
1803 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1804 Info(kEH, "found and attached ESD friend.");
1808 Warning(kEH, "ESDfriend not found.");
1811 if (tempTree->GetEntry(0) <= 0)
1813 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1818 runNo = fESD->GetESDRun()->GetRunNumber();
1823 Warning(kEH, "failed getting the tree:%s", treeName);
1830 //------------------------------------------------------------------------------
1832 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1834 // Create and attach a dependent event-manager.
1835 // It is not added into eve list tree.
1837 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1840 throw(kEH + "Master event-manager must be instantiated first.");
1842 if (fgMaster->fSubManagers == 0)
1844 fgMaster->fSubManagers = new TList;
1845 fgMaster->fSubManagers->SetOwner(kTRUE);
1848 AliEveEventManager* new_mgr = 0;
1852 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1853 new_mgr->SetFilesPath(path);
1854 fgMaster->fSubManagers->Add(new_mgr);
1856 catch (TEveException& exc)
1858 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1860 fgCurrent = fgMaster;
1865 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1867 // Get a dependant manager by name.
1868 // This will not change the current manager, use helper class
1869 // AliEveEventManager::CurrentChanger for that.
1871 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1874 throw(kEH + "Master event-manager must be instantiated first.");
1876 if (fgMaster->fSubManagers == 0)
1879 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1882 AliEveEventManager* AliEveEventManager::GetMaster()
1884 // Get master event-manager.
1889 AliEveEventManager* AliEveEventManager::GetCurrent()
1891 // Get current event-manager.
1896 void AliEveEventManager::RegisterTransient(TEveElement* element)
1898 GetCurrent()->fTransients->AddElement(element);
1901 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1903 GetCurrent()->fTransientLists->AddElement(element);
1906 //------------------------------------------------------------------------------
1907 // Autoloading of events
1908 //------------------------------------------------------------------------------
1910 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1912 // Set the auto-load time in seconds
1914 fAutoLoadTime = time;
1917 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1919 // Set the automatic event loading mode
1921 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1923 if (fAutoLoad == autoLoad)
1925 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1929 fAutoLoad = autoLoad;
1932 StartAutoLoadTimer();
1936 StopAutoLoadTimer();
1940 void AliEveEventManager::SetLoopMarked(Bool_t loopMarked)
1942 // Set the automatic event loading mode
1943 if(fLoopMarked == loopMarked)
1945 cout<<"loop marked has the same value - ignoring"<<endl;
1950 cout<<"Setting loof marked to:"<<loopMarked<<endl;
1951 fLoopMarked = loopMarked;
1952 if (fLoopMarked){StartAutoLoadTimer();}
1953 else{StopAutoLoadTimer();}
1957 void AliEveEventManager::SetTrigSel(Int_t trig)
1959 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1963 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1968 ULong64_t trigMask = 0;
1969 if (trig >= 0) trigMask = (1ull << trig);
1970 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1971 fRawReader->SelectEvents(-1,trigMask,NULL);
1975 void AliEveEventManager::StartAutoLoadTimer()
1977 // Start the auto-load timer.
1979 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1980 fAutoLoadTimer->Reset();
1981 fAutoLoadTimer->TurnOn();
1982 fAutoLoadTimerRunning = kTRUE;
1985 void AliEveEventManager::StopAutoLoadTimer()
1987 // Stop the auto-load timer.
1989 fAutoLoadTimerRunning = kFALSE;
1990 fAutoLoadTimer->TurnOff();
1993 void AliEveEventManager::AutoLoadNextEvent()
1995 // Called from auto-load timer, so it has to be public.
1996 // Do NOT call it directly.
1998 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
2000 Info(kEH, "called!");
2002 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
2004 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
2008 StopAutoLoadTimer();
2010 if (fAutoLoad || fLoopMarked){
2011 StartAutoLoadTimer();
2015 //------------------------------------------------------------------------------
2016 // Post event-loading functions
2017 //------------------------------------------------------------------------------
2019 void AliEveEventManager::AfterNewEventLoaded()
2021 // Execute registered macros and commands.
2022 // At the end emit NewEventLoaded signal.
2024 // Virtual from TEveEventManager.
2026 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
2028 Info(kEH, "------------------!!!------------");
2030 NewEventDataLoaded();
2031 if (fExecutor) fExecutor->ExecMacros();
2033 TEveEventManager::AfterNewEventLoaded();
2036 if (this == fgMaster && fSubManagers != 0)
2038 TIter next(fSubManagers);
2039 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
2041 gEve->SetCurrentEvent(fgCurrent);
2044 fgCurrent->GotoEvent(fEventId);
2046 catch (TEveException& exc)
2048 // !!! Should somehow tag / disable / remove it?
2049 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
2050 fEventId, fgCurrent->GetName(), exc.Data());
2052 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
2054 fgCurrent = fgMaster;
2055 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
2056 gEve->SetCurrentEvent(fgMaster);
2060 void AliEveEventManager::NewEventDataLoaded()
2062 // Emit NewEventDataLoaded signal.
2063 Emit("NewEventDataLoaded()");
2065 void AliEveEventManager::NewEventLoaded()
2067 // Emit NewEventLoaded signal.
2068 Emit("NewEventLoaded()");
2070 void AliEveEventManager::NoEventLoaded()
2072 // Emit NoEventLoaded signal.
2073 Emit("NoEventLoaded()");
2075 void AliEveEventManager::StorageManagerOk()
2077 // Emit StorageManagerOk signal.
2078 Emit("StorageManagerOk()");
2080 void AliEveEventManager::StorageManagerDown()
2082 // Emit StorageManagerOk signal.
2083 Emit("StorageManagerDown()");
2087 //------------------------------------------------------------------------------
2088 // Event info dumpers
2089 //------------------------------------------------------------------------------
2091 const AliEventInfo* AliEveEventManager::GetEventInfo()
2093 // Fill the event info object
2095 AliCentralTrigger *aCTP = NULL;
2097 fEventInfo.SetEventType(fRawReader->GetType());
2099 ULong64_t mask = fRawReader->GetClassMask();
2100 fEventInfo.SetTriggerMask(mask);
2101 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
2102 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
2104 aCTP = new AliCentralTrigger();
2105 TString configstr("");
2106 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
2107 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
2111 aCTP->SetClassMask(mask);
2112 aCTP->SetClusterMask(clmask);
2115 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
2117 rlCTP->SetClassMask(mask);
2118 rlCTP->SetClusterMask(clmask);
2123 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
2125 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
2126 aCTP = fRunLoader->GetTrigger();
2127 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
2128 // get inputs from actp - just get
2129 AliESDHeader* esdheader = fESD->GetHeader();
2130 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
2131 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
2132 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
2133 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
2136 AliWarning("No trigger can be loaded! The trigger information will not be used!");
2141 AliTriggerConfiguration *config = aCTP->GetConfiguration();
2143 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
2144 if (fRawReader) delete aCTP;
2148 TString declTriggerClasses;
2150 // Load trigger aliases and declare the trigger classes included in aliases
2151 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
2153 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
2155 lst->Sort(kSortDescending); // to avoid problems with substrings
2156 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
2157 // Now declare all the triggers present in the aliases
2160 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
2161 declTriggerClasses += " ";
2162 declTriggerClasses += nmd->GetName();
2166 AliError("Cannot cast the object with trigger aliases to THashList!");
2170 AliError("No OCDB entry for the trigger aliases!");
2173 // Load trigger classes for this run
2174 UChar_t clustmask = 0;
2176 ULong64_t trmask = fEventInfo.GetTriggerMask();
2177 const TObjArray& classesArray = config->GetClasses();
2178 Int_t nclasses = classesArray.GetEntriesFast();
2179 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
2180 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
2181 if (trclass && trclass->GetMask()>0) {
2182 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
2183 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
2184 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
2185 if (trmask & (1ull << trindex)) {
2187 trclasses += trclass->GetName();
2189 clustmask |= trclass->GetCluster()->GetClusterMask();
2193 fEventInfo.SetTriggerClasses(trclasses);
2195 if (!aCTP->CheckTriggeredDetectors()) {
2196 if (fRawReader) delete aCTP;
2200 if (fRawReader) delete aCTP;
2202 // everything went ok, return pointer
2203 return (&fEventInfo);
2207 TString AliEveEventManager::GetEventInfoHorizontal() const
2209 // Dumps the event-header contents in vertical formatting.
2211 TString rawInfo, esdInfo;
2215 rawInfo = "No raw-data event info is available!\n";
2219 const UInt_t* attr = fRawReader->GetAttributes();
2220 TTimeStamp ts(fRawReader->GetTimestamp());
2221 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2222 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
2223 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2224 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2225 fRawReader->GetClassMask(),
2226 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2227 attr[0],attr[1],attr[2], ts.AsString("s"));
2232 esdInfo = "No ESD event info is available!";
2236 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2237 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2238 TTimeStamp ts(fESD->GetTimeStamp());
2239 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2240 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
2241 fESD->GetRunNumber(),
2242 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2243 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2244 acttrclasses.Data(),
2245 fESD->GetTriggerMask(),firedtrclasses.Data(),
2246 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
2249 return rawInfo + esdInfo;
2252 TString AliEveEventManager::GetEventInfoVertical() const
2254 // Dumps the event-header contents in vertical formatting.
2256 TString rawInfo, esdInfo;
2260 rawInfo = "No raw-data event info is available!\n";
2264 const UInt_t* attr = fRawReader->GetAttributes();
2265 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",
2266 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2267 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2268 fRawReader->GetClassMask(),
2269 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2270 attr[0],attr[1],attr[2],
2271 fRawReader->GetTimestamp());
2276 esdInfo = "No ESD event info is available!\n";
2280 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2281 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2282 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",
2283 fESD->GetRunNumber(),
2284 acttrclasses.Data(),
2285 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2286 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2287 fESD->GetTriggerMask(),firedtrclasses.Data(),
2288 fESD->GetEventNumberInFile(),
2289 fESD->GetTimeStamp());
2292 return rawInfo + "\n" + esdInfo;
2296 //==============================================================================
2297 // Reading of GRP and MagneticField.
2298 // This is a reap-off from reconstruction ... should really be a common
2299 // code to do this somewhere in STEER.
2300 //==============================================================================
2302 Bool_t AliEveEventManager::InitGRP()
2304 //------------------------------------
2305 // Initialization of the GRP entry
2306 //------------------------------------
2308 static const TEveException kEH("AliEveEventManager::InitGRP ");
2310 AliGRPManager grpMgr;
2311 if (!grpMgr.ReadGRPEntry()) {
2314 fgGRPLoaded = kTRUE;
2315 if (!grpMgr.SetMagField()) {
2316 throw kEH + "Setting of field failed!";
2319 //*** Get the diamond profiles from OCDB
2320 // Eventually useful.
2323 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
2325 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
2327 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2330 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2332 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2334 ::Error(kEH, "No diamond profile found in OCDB!");
2337 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2339 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2341 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2348 //------------------------------------
2349 // Global variables management
2350 //------------------------------------
2352 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2354 // Insert a new visualization-parameter database entry with the default
2355 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2358 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2359 Bool_t replace, Bool_t update)
2361 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2366 model->IncDenyDestroy();
2367 model->SetRnrChildren(kFALSE);
2369 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2370 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2371 while (old_model->HasChildren())
2373 TEveElement *el = old_model->FirstChild();
2374 el->SetVizModel(model);
2377 el->CopyVizParams(model);
2378 el->PropagateVizParamsToProjecteds();
2381 old_model->DecDenyDestroy();
2383 pair->SetValue(dynamic_cast<TObject*>(model));
2393 model->IncDenyDestroy();
2394 model->SetRnrChildren(kFALSE);
2395 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2400 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2402 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));
2404 Int_t AliEveEventManager::NewEventAvailable()
2406 if (fIsNewEventAvaliable)