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 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
255 vector<serverListStruct> receivedList = eventManager->GetServerListVector(SERVER_COMMUNICATION_REQ,3000);
257 cout<<"EVENT DISPLAY -- received list of marked events"<<endl;
259 for(int i=0;i<receivedList.size();i++)
261 cout<<"ev:"<<receivedList[i].eventNumber<<endl;
267 cout<<"not finished"<<endl;
268 if(!fLoopMarked || receivedList.size()<=0)
270 cout<<"taking event from reco server"<<endl;
271 tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,5000);
272 cout<<"after get event"<<endl;
273 if(!tmpEvent){sleep(1);}
277 cout<<"taking event from storage manager"<<endl;
278 if(iter<receivedList.size())
280 cout<<"i:"<<iter<<endl;
281 struct eventStruct mark;
282 mark.runNumber = receivedList[iter].runNumber;
283 mark.eventNumber = receivedList[iter].eventNumber;
285 requestMessage->messageType = REQUEST_GET_EVENT;
286 requestMessage->event = mark;
288 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
289 tmpEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
299 cout<<"tmpEvent:"<<tmpEvent->GetRunNumber()<<endl;
300 if(tmpEvent->GetRunNumber()>=0)
303 if(fEventInUse == 0){fWritingToEventIndex = 1;}
304 else if(fEventInUse == 1){fWritingToEventIndex = 0;}
305 cout<<"Received new event:"<<tmpEvent->GetEventNumberInFile()<<endl;
306 if(fCurrentEvent[fWritingToEventIndex])
308 delete fCurrentEvent[fWritingToEventIndex];
309 fCurrentEvent[fWritingToEventIndex]=0;
311 fCurrentEvent[fWritingToEventIndex] = tmpEvent;
312 fIsNewEventAvaliable = true;
317 else{cout<<"didn't receive new event"<<endl;}
320 delete requestMessage;
325 void AliEveEventManager::CheckStorageStatus()
328 if(!fOnlineMode){return;}
330 AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
331 configManager->ConnectEventManagerSignals();
333 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
334 eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
336 struct clientRequestStruct *request = new struct clientRequestStruct;
337 request->messageType = REQUEST_CONNECTION;
341 if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
344 long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
345 fStorageDown = kFALSE;
349 StorageManagerDown();
350 cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
351 fStorageDown = kTRUE;
356 AliEveEventManager *manager = AliEveEventManager::GetCurrent();
357 manager->Disconnect("StorageManagerOk");
358 manager->Disconnect("StorageManagerDown");
363 void AliEveEventManager::InitInternals()
365 // Initialize internal members.
367 static const TEveException kEH("AliEveEventManager::InitInternals ");
371 throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
381 fAutoLoadTimer = new TTimer;
382 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
383 fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
385 fExecutor = new AliEveMacroExecutor;
387 fTransients = new TEveElementList("Transients", "Transient per-event elements.");
388 fTransients->IncDenyDestroy();
389 gEve->AddToListTree(fTransients, kFALSE);
391 fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
392 fTransientLists->IncDenyDestroy();
393 gEve->AddToListTree(fTransientLists, kFALSE);
395 fPEventSelector = new AliEveEventSelector(this);
397 fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
400 /******************************************************************************/
402 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
404 fgESDvisibleTrees = shown;
405 // Set file-name for opening ESD, default "AliESDs.root".
406 if (esd.IsNull()) return;
409 if (esd.EndsWith(".zip")) fgESDFileName.Form("%s#AliESDs.root",esd.Data());
413 void AliEveEventManager::SetESDfriendFileName(const TString& esdf)
415 // Set file-name for opening ESD friend, default "AliESDfriends.root".
417 if (esdf.IsNull()) return;
418 fgESDfriendsFileName = esdf;
420 if (esdf.EndsWith(".zip")) fgESDfriendsFileName.Form("%s#AliESDfriends.root",esdf.Data());
423 void AliEveEventManager::SetAODFileName(const TString& aod)
425 // Set file-name for opening AOD, default "AliAOD.root".
427 if (aod.IsNull()) return;
430 if (aod.EndsWith(".zip")) fgAODFileName.Form("%s#AliAOD.root",aod.Data());
434 void AliEveEventManager::AddAODfriend(const TString& friendFileName)
436 // Add new AOD friend file-name to be attached when opening AOD.
437 // This should include '.root', as in 'AliAOD.VertexingHF.root'.
439 if (fgAODfriends == 0)
441 fgAODfriends = new TList;
442 fgAODfriends->SetOwner(kTRUE);
444 if (fgAODfriends->FindObject(friendFileName) == 0)
446 fgAODfriends->Add(new TObjString(friendFileName));
450 void AliEveEventManager::SetRawFileName(const TString& raw)
452 // Set file-name for opening of raw-data, default "raw.root"
453 if (raw.IsNull()) return;
458 void AliEveEventManager::SetCdbUri(const TString& cdb)
460 // Set path to CDB, there is no default.
461 if ( ! cdb.IsNull()) fgCdbUri = cdb;
464 void AliEveEventManager::SetSpecificCdbUri(const TString& path,const TString& value)
466 // Set path to specific CDB object, there is no default.
467 if ( ! value.IsNull()) fgSpecificCdbUriValue = value;
468 if ( ! path.IsNull()) fgSpecificCdbUriPath = path;
471 void AliEveEventManager::SetGAliceFileName(const TString& galice)
473 // Set file-name for opening gAlice, default "galice.root".
475 if ( galice.IsNull()) return;
476 fgGAliceFileName = galice;
478 if (galice.EndsWith(".zip")) fgGAliceFileName.Form("%s#galice.root",galice.Data());
481 void AliEveEventManager::SetFilesPath(const TString& urlPath)
483 TString path = urlPath;
484 gSystem->ExpandPathName(path);
485 if (path.IsNull() || path == ".")
487 path = gSystem->WorkingDirectory();
491 if(path.EndsWith(".zip")) // if given a path to root_archive.zip
493 else if(!path.EndsWith("/"))
496 SetESDFileName( TString(Form("%s%sAliESDs.root", path.Data(), sep.Data())) );
497 SetESDfriendFileName( TString(Form("%s%sAliESDfriends.root", path.Data(), sep.Data())) );
498 SetAODFileName( TString(Form("%s%sAliAOD.root", path.Data(), sep.Data())) );
499 AddAODfriend( TString(Form("%s%sAliAOD.VertexingHF.root", path.Data(), sep.Data())) );
500 SetGAliceFileName( TString(Form("%s%sgalice.root", path.Data(), sep.Data())) );
501 SetRawFileName(TString(Form("%s%sraw.root", path.Data(), sep.Data())));
504 void AliEveEventManager::SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
505 Bool_t assertAod, Bool_t assertRaw)
507 // Set global flags that detrmine which parts of the event-data must
508 // be present when the event is opened.
510 fgAssertRunLoader = assertRunloader;
511 fgAssertESD = assertEsd;
512 fgAssertAOD = assertAod;
513 fgAssertRaw = assertRaw;
516 void AliEveEventManager::SearchRawForCentralReconstruction()
518 // Enable searching of raw data in standard location. The path passed to
519 // Open() is expected to point to a centrally reconstructed run, e.g.:
520 // "alien:///alice/data/2009/LHC09c/000101134/ESDs/pass1/09000101134018.10".
522 fgRawFromStandardLoc = kTRUE;
525 /******************************************************************************/
527 void AliEveEventManager::Open()
529 // Open event-data from URL specified in path.
530 // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
531 // Warning is reported if run-loader or ESD is not found.
532 // Global data-members fgAssertRunLoader and fgAssertESD can be set
533 // to throw exceptions instead.
535 static const TEveException kEH("AliEveEventManager::Open ");
539 throw (kEH + "Event-loop is under external control.");
543 throw (kEH + "Event-files already opened.");
548 // Open ESD and ESDfriends
550 if ((fESDFile = TFile::Open(fgESDFileName)))
552 fESD = new AliESDEvent();
554 switch(fgESDvisibleTrees){
555 case AliEveEventManager::kOfflineTree :
556 fESDTree = readESDTree("esdTree", runNo);
558 case AliEveEventManager::kHLTTree :
559 fHLTESDTree = readESDTree("HLTesdTree", runNo);
562 fESDTree = readESDTree("esdTree", runNo);
563 fHLTESDTree = readESDTree("HLTesdTree", runNo);
566 if(!fESDTree && !fHLTESDTree){
567 // both ESD trees are == 0
568 delete fESDFile; fESDFile = 0;
569 delete fESD; fESD = 0;
574 else // esd file not readable
576 Warning(kEH, "can not read ESD file '%s'.", fgESDFileName.Data());
578 if (fESDTree == 0 && fHLTESDTree==0)
582 throw (kEH + "ESD not initialized. Its precence was requested.");
584 Warning(kEH, "ESD not initialized.");
588 // Open AOD and registered friends
589 if ( (fAODFile = TFile::Open(fgAODFileName)) )
591 fAOD = new AliAODEvent();
592 fAODTree = (TTree*) fAODFile->Get("aodTree");
595 // Check if AODfriends exist and attach them.
596 TIter friends(fgAODfriends);
598 while ((name = (TObjString*) friends()) != 0)
600 TString p(Form("%s/%s", fgAODFileName.Data(), name->GetName()));
601 if (fgAODFileName.EndsWith(".zip")) p.Form("%s#%s",fgAODFileName.Data(),name->GetName());
602 if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
604 fAODTree->AddFriend("aodTree", name->GetName());
608 fAOD->ReadFromTree(fAODTree);
610 if (fAODTree->GetEntry(0) <= 0)
612 delete fAODFile; fAODFile = 0;
613 delete fAOD; fAOD = 0;
614 Warning(kEH, "failed getting the first entry from addTree.");
619 runNo = fAOD->GetRunNumber();
624 delete fAODFile; fAODFile = 0;
625 delete fAOD; fAOD = 0;
626 Warning(kEH, "failed getting the aodTree.");
629 else // aod not readable
631 Warning(kEH, "can not read AOD file '%s'.", fgAODFileName.Data());
637 throw (kEH + "AOD not initialized. Its precence was requested.");
639 Warning(kEH, "AOD not initialized.");
643 // Open RunLoader from galice.root
644 // fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
646 TFile *gafile = TFile::Open(fgGAliceFileName);
647 cout<<"Opening galice"<<endl;
652 cout<<"SETTING RUN LOADER in Open()"<<endl;
653 fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
656 TString alicePath(gSystem->DirName(fgGAliceFileName));
657 alicePath.Append("/");
658 fRunLoader->SetDirName(alicePath);
660 if (fRunLoader->LoadgAlice() != 0)
661 Warning(kEH, "failed loading gAlice via run-loader.");
663 if (fRunLoader->LoadHeader() == 0)
666 runNo = fRunLoader->GetHeader()->GetRun();
670 Warning(kEH, "failed loading run-loader's header.");
675 else // run-loader open failed
677 Warning(kEH, "failed opening ALICE run-loader from '%s'.", fgGAliceFileName.Data());
681 else // galice not readable
683 Warning(kEH, "can not read '%s'.", fgGAliceFileName.Data());
687 if (fgAssertRunLoader)
688 throw (kEH + "Bootstraping of run-loader failed. Its precence was requested.");
690 Warning(kEH, "Bootstraping of run-loader failed.");
693 // Open raw-data file
696 if (fgRawFromStandardLoc)
698 if (!fgRawFileName.BeginsWith("alien:"))
699 throw kEH + "Standard raw search requested, but the directory is not in AliEn.";
700 if (!fgRawFileName.Contains("/ESDs/"))
701 throw kEH + "Standard raw search requested, but does not contain 'ESDs' directory.";
703 TPMERegexp chunk("/([\\d\\.])+/?$");
704 Int_t nm = chunk.Match(fgRawFileName);
706 throw kEH + "Standard raw search requested, but the path does not end with chunk-id directory.";
708 TPMERegexp esdstrip("/ESDs/.*");
709 rawPath = fgRawFileName;
710 esdstrip.Substitute(rawPath, "/raw/");
714 Info(kEH, "Standard raw search requested, using the following path:\n %s\n", rawPath.Data());
718 rawPath = fgRawFileName;
720 // If i use open directly, raw-reader reports an error but i have
721 // no way to detect it.
722 // Is this (AccessPathName check) ok for xrootd / alien? Yes, not for http.
723 AliLog::EType_t oldLogLevel = (AliLog::EType_t) AliLog::GetGlobalLogLevel();
724 if (fgAssertRaw == kFALSE)
726 AliLog::SetGlobalLogLevel(AliLog::kFatal);
728 if (gSystem->AccessPathName(rawPath, kReadPermission) == kFALSE)
730 fRawReader = AliRawReader::Create(rawPath);
734 fRawReader = AliRawReader::Create(fgRawFileName);
736 if (fgAssertRaw == kFALSE)
738 AliLog::SetGlobalLogLevel(oldLogLevel);
745 throw (kEH + "raw-data not initialized. Its precence was requested.");
749 Warning(kEH, "raw-data not initialized.");
757 if ( ! fRawReader->NextEvent())
759 throw (kEH + "can not go to first event in raw-reader to determine run-id.");
761 runNo = fRawReader->GetRunNumber();
762 Info(kEH, "Determining run-no from raw ... run=%d.", runNo);
763 fRawReader->RewindEvents();
767 fExternalCtrl = kTRUE;
773 // Initialize OCDB ... only in master event-manager
781 void AliEveEventManager::InitOCDB(int runNo)
783 TString cdbPath = Form("local://%s/ed_ocdb_objects/",gSystem->Getenv("HOME"));
784 AliCDBManager* cdb = AliCDBManager::Instance();
788 if(runNo != fCurrentRun)
790 cout<<"Loading OCDB for new run:"<<runNo<<" in online mode."<<endl;
792 settings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
794 cout<<"config read"<<endl;
796 // Retrieve GRP entry for given run from aldaqdb.
797 TString dbHost = settings.GetValue("logbook.host", DEFAULT_LOGBOOK_HOST);
798 Int_t dbPort = settings.GetValue("logbook.port", DEFAULT_LOGBOOK_PORT);
799 TString dbName = settings.GetValue("logbook.db", DEFAULT_LOGBOOK_DB);
800 TString user = settings.GetValue("logbook.user", DEFAULT_LOGBOOK_USER);
801 TString password = settings.GetValue("logbook.pass", DEFAULT_LOGBOOK_PASS);
803 gSystem->cd(cdbPath.Data());
804 gSystem->Exec("rm -fr GRP/");
805 cout<<"CDB path for GRP:"<<cdbPath<<endl;
809 Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fCurrentRun, dbHost.Data(),
810 dbPort, dbName.Data(),
811 user.Data(), password.Data(),
812 Form("%s",cdbPath.Data()),
815 if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret);
816 else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found");
817 else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret);
820 cdb->SetDefaultStorage(settings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
821 cdb->SetSpecificStorage("GRP/GRP/Data",cdbPath.Data());
822 cdb->SetRun(fCurrentRun);
828 static const TEveException kEH("AliEveEventManager::InitOCDB ");
829 //if (this == fgMaster)
831 if (cdb->IsDefaultStorageSet() == kTRUE)
833 Warning(kEH, "CDB already set - using the old storage:\n '%s'",
834 cdb->GetDefaultStorage()->GetURI().Data());
838 if (fgCdbUri.IsNull())
840 gEnv->SetValue("Root.Stacktrace", "no");
841 Fatal("Open()", "OCDB path was not specified.");
843 cout<<"Setting default storage:"<<fgCdbUri<<endl;
844 // Handle some special cases for MC (should be in OCDBManager).
845 if (fgCdbUri == "mcideal://")
846 cdb->SetDefaultStorage("MC", "Ideal");
847 else if (fgCdbUri == "mcresidual://")
848 cdb->SetDefaultStorage("MC", "Residual");
849 else if (fgCdbUri == "mcfull://")
850 cdb->SetDefaultStorage("MC", "Full");
851 else if (fgCdbUri == "local://"){
852 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
853 cdb->SetDefaultStorage(fgCdbUri);
856 cdb->SetDefaultStorage(fgCdbUri);
860 if (cdb->IsDefaultStorageSet() == kFALSE)
861 throw kEH + "CDB initialization failed for '" + fgCdbUri + "'.";
863 if (fgCdbUri.BeginsWith("local://"))
865 TString curPath = gSystem->WorkingDirectory();
866 TString grp = "GRP/GRP/Data";
867 TString grppath = curPath + "/" + grp;
868 if (gSystem->AccessPathName(grppath, kReadPermission) == kFALSE)
870 if (cdb->GetSpecificStorage(grp))
872 Warning(kEH, "Local GRP exists, but the specific storage is already set.");
876 Info(kEH, "Setting CDB specific-storage for GRP from event directory.");
877 TString lpath("local://");
879 cdb->SetSpecificStorage(grp, lpath);
886 void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf)
888 // Set an event from an external source.
889 // The method is used in the online visualisation.
890 // AOD is not supported.
892 static const TEveException kEH("AliEveEventManager::SetEvent ");
896 Warning(kEH, "Event-files were open. Closing and switching to external control.");
900 Info(kEH,"setting it!!! ============================");
902 fRunLoader = runLoader;
903 fRawReader = rawReader;
910 fExternalCtrl = kTRUE;
912 SetTitle("Online event in memory");
913 SetName ("Online Event");
916 AfterNewEventLoaded();
918 if (fAutoLoad || fLoopMarked) StartAutoLoadTimer();
922 Int_t AliEveEventManager::GetMaxEventId(Bool_t refreshESD) const
924 // Returns maximum available event id.
925 // If under external control or event is not opened -1 is returned.
926 // If raw-data is the only data-source this can not be known
927 // and 10,000,000 is returned.
928 // If neither data-source is initialised an exception is thrown.
929 // If refresh_esd is true and ESD is the primary event-data source
930 // its header is re-read from disk.
932 static const TEveException kEH("AliEveEventManager::GetMaxEventId ");
934 if (fExternalCtrl || fIsOpen == kFALSE)
939 if ((fESDTree!=0) || (fHLTESDTree!=0))
943 if(fESDTree!=0) fESDTree->Refresh();
944 if(fHLTESDTree!=0) fHLTESDTree->Refresh();
945 fPEventSelector->Update();
949 switch(fgESDvisibleTrees){
951 case AliEveEventManager::kOfflineTree :
952 maxEventId = fESDTree->GetEntries() - 1;
954 case AliEveEventManager::kHLTTree :
955 maxEventId = fHLTESDTree->GetEntries() - 1;
963 return fAODTree->GetEntries() - 1;
967 return fRunLoader->GetNumberOfEvents() - 1;
971 Int_t n = fRawReader->GetNumberOfEvents() - 1;
972 return n > -1 ? n : 10000000;
976 throw (kEH + "neither ESD, AOD, RunLoader nor Raw loaded.");
980 void AliEveEventManager::GotoEvent(Int_t event)
982 cout<<"Go to event:"<<event<<endl;
983 // Load data for specified event.
984 // If event is out of range an exception is thrown and old state
986 // After successful loading of event, the virtual function
987 // AfterNewEventLoaded() is called. This executes commands that
988 // were registered via TEveEventManager::AddNewEventCommand().
990 // If event is negative, it is subtracted from the number of
991 // available events, thus passing -1 will load the last event.
992 // This is not supported when raw-data is the only data-source
993 // as the number of events is not known.
995 static const TEveException kEH("AliEveEventManager::GotoEvent ");
997 if (fAutoLoadTimerRunning)
999 throw (kEH + "Event auto-load timer is running.");
1003 // throw (kEH + "Event-loop is under external control.");
1007 if (fStorageDown && -1 == event)
1015 // create new server request:
1016 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1018 // set request type:
1019 if (event == -1) {requestMessage->messageType = REQUEST_GET_LAST_EVENT;}
1020 else if (event == 0) {requestMessage->messageType = REQUEST_GET_FIRST_EVENT;}
1021 else if (event == 1) {requestMessage->messageType = REQUEST_GET_PREV_EVENT;}
1022 else if (event == 2) {requestMessage->messageType = REQUEST_GET_NEXT_EVENT;}
1024 // set event struct:
1025 struct eventStruct eventToLoad;
1026 eventToLoad.runNumber = fESD->GetRunNumber();
1027 eventToLoad.eventNumber = fESD->GetEventNumberInFile();
1028 requestMessage->event = eventToLoad;
1030 // create event manager:
1031 AliStorageEventManager *eventManager =
1032 AliStorageEventManager::GetEventManagerInstance();
1033 AliESDEvent *resultEvent = NULL;
1035 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1038 // send request and receive event:
1039 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1040 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1045 InitOCDB(resultEvent->GetRunNumber());
1046 SetEvent(0,0,resultEvent,0);
1050 if(event==-1){cout<<"\n\nWARNING -- No last event is avaliable.\n\n"<<endl;}
1051 if(event==0){cout<<"\n\nWARNING -- No first event is avaliable.\n\n"<<endl;}
1052 if(event==1){cout<<"\n\nWARNING -- No previous event is avaliable.\n\n"<<endl;}
1053 if(event==2){cout<<"\n\nWARNING -- No next event is avaliable.\n\n"<<endl;}
1060 cout<<"\n\nWARNING -- No event has been already loaded. Loading the most recent event...\n\n"<<endl;
1062 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1063 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
1065 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
1066 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1067 AliESDEvent *resultEvent = NULL;
1070 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1071 resultEvent = eventManager->GetEvent(SERVER_COMMUNICATION_REQ);
1077 InitOCDB(resultEvent->GetRunNumber());
1078 SetEvent(0,0,resultEvent,0);
1080 else{cout<<"\n\nWARNING -- The most recent event is not avaliable.\n\n"<<endl;}
1089 throw (kEH + "Event-files not opened.");
1097 if ((fESDTree!=0) || (fHLTESDTree!=0))
1100 if (event >= fESDTree->GetEntries())
1101 fESDTree->Refresh();
1102 maxEvent = fESDTree->GetEntries() - 1;
1104 event = fESDTree->GetEntries() + event;
1108 if (event >= fHLTESDTree->GetEntries())
1109 fHLTESDTree->Refresh();
1110 maxEvent = fHLTESDTree->GetEntries() - 1;
1112 event = fHLTESDTree->GetEntries() + event;
1118 maxEvent = fAODTree->GetEntries() - 1;
1120 event = fAODTree->GetEntries() + event;
1122 else if (fRunLoader)
1124 maxEvent = fRunLoader->GetNumberOfEvents() - 1;
1126 event = fRunLoader->GetNumberOfEvents() + event;
1128 else if (fRawReader)
1130 maxEvent = fRawReader->GetNumberOfEvents() - 1;
1133 maxEvent = 10000000;
1135 Error(kEH, "current raw-data source does not support direct event access.");
1138 Info(kEH, "number of events unknown for current raw-data source, setting max-event id to 10M.");
1143 event = fRawReader->GetNumberOfEvents() + event;
1148 throw (kEH + "neither RunLoader, ESD nor Raw loaded.");
1152 throw (kEH + Form("event %d not present, available range [%d, %d].",
1153 event, 0, maxEvent));
1155 if (event > maxEvent)
1158 cout<<"Event number out of range. Going to event 0"<<endl;
1161 TString sysInfoHeader;
1162 sysInfoHeader.Form("AliEveEventManager::GotoEvent(%d) - ", event);
1163 AliSysInfo::AddStamp(sysInfoHeader + "Start");
1165 TEveManager::TRedrawDisabler rd(gEve);
1166 gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
1168 // !!! MT this is somewhat brutal; at least optionally, one could be
1169 // a bit gentler, checking for objs owning their external refs and having
1170 // additinal parents.
1171 gEve->GetViewers()->DeleteAnnotations();
1172 fTransients->DestroyElements();
1173 for (TEveElement::List_i i = fTransientLists->BeginChildren();
1174 i != fTransientLists->EndChildren(); ++i)
1176 (*i)->DestroyElements();
1180 AliSysInfo::AddStamp(sysInfoHeader + "PostDestroy");
1183 if (fESDTree->GetEntry(event) <= 0)
1184 throw (kEH + "failed getting required event from ESD.");
1186 if (fESDfriendExists)
1187 fESD->SetESDfriend(fESDfriend);
1191 if (fHLTESDTree->GetEntry(event) <= 0)
1192 throw (kEH + "failed getting required event from HLT ESD.");
1194 if (fESDfriendExists)
1195 fESD->SetESDfriend(fESDfriend);
1199 if (fAODTree->GetEntry(event) <= 0)
1200 throw (kEH + "failed getting required event from AOD.");
1204 if (fRunLoader->GetEvent(event) != 0)
1205 throw (kEH + "failed getting required event.");
1210 // AliRawReader::GotoEvent(Int_t) works for AliRawReaderRoot/Chain.
1211 if (fRawReader->GotoEvent(event) == kFALSE)
1213 // Use fallback method - iteration with NextEvent().
1214 Int_t rawEv = fEventId;
1217 fRawReader->RewindEvents();
1221 while (rawEv < event)
1223 if ( ! fRawReader->NextEvent())
1225 fRawReader->RewindEvents();
1227 throw (kEH + Form("Error going to next raw-event from event %d.", rawEv));
1231 Warning(kEH, "Loaded raw-event %d with fallback method.\n", rawEv);
1237 if (this == fgMaster)
1239 SetName(Form("Event %d", fEventId));
1243 AliSysInfo::AddStamp(sysInfoHeader + "PostLoadEvent");
1245 AfterNewEventLoaded();
1247 AliSysInfo::AddStamp(sysInfoHeader + "PostUserActions");
1250 void AliEveEventManager::Timeout()
1255 void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
1258 InitOCDB(event->GetRunNumber());
1259 printf("======================= setting event to %d\n", fEventId);
1260 SetEvent(0,0,event,0);
1263 void AliEveEventManager::NextEvent()
1265 // Loads next event.
1266 // Does magick needed for online display when under external event control.
1268 static const TEveException kEH("AliEveEventManager::NextEvent ");
1270 if (fAutoLoadTimerRunning){throw (kEH + "Event auto-load timer is running.");}
1277 if(fIsNewEventAvaliable)
1280 if(fWritingToEventIndex == 0) fEventInUse = 0;
1281 else if(fWritingToEventIndex == 1) fEventInUse = 1;
1283 if(fCurrentEvent[fEventInUse])
1285 if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
1287 printf("======================= setting event to %d\n", fCurrentEvent[fEventInUse]->GetEventNumberInFile());
1290 InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
1291 SetEvent(0,0,fCurrentEvent[fEventInUse],0);
1295 fIsNewEventAvaliable = false;
1300 cout<<"No new event is avaliable."<<endl;
1306 else if ((fESDTree!=0) || (fHLTESDTree!=0))
1309 if (fPEventSelector->FindNext(nextevent))
1311 GotoEvent(nextevent);
1314 else if (fEventId < GetMaxEventId(kTRUE))
1316 GotoEvent(fEventId + 1);
1319 gSystem->ProcessEvents();
1323 AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
1324 cout<<"contructor called"<<endl;
1325 vsdCreator->CreateVSD("myVSD.root");
1328 //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
1331 void AliEveEventManager::PrevEvent()
1333 // Loads previous event.
1335 static const TEveException kEH("AliEveEventManager::PrevEvent ");
1337 if (fAutoLoadTimerRunning)
1339 throw (kEH + "Event auto-load timer is running.");
1343 throw (kEH + "Event-loop is under external control.");
1346 if ((fESDTree!=0) || (fHLTESDTree!=0))
1349 if (fPEventSelector->FindPrev(nextevent))
1351 GotoEvent(nextevent);
1354 else if (fEventId > 0)
1356 GotoEvent(fEventId - 1);
1360 void AliEveEventManager::MarkCurrentEvent()
1363 if(!fOnlineMode){return;}
1365 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
1366 struct eventStruct mark;
1367 mark.runNumber = fESD->GetRunNumber();
1368 mark.eventNumber = fESD->GetEventNumberInFile();
1369 requestMessage->messageType = REQUEST_MARK_EVENT;
1370 requestMessage->event = mark;
1372 AliStorageEventManager *eventManager =
1373 AliStorageEventManager::GetEventManagerInstance();
1374 eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
1377 std::future<bool> unused = std::async([]()
1379 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1380 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1384 //fStatusLabel->SetText("Event marked");
1385 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1389 //fStatusLabel->SetText("Couldn't mark this event");
1390 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1395 eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
1396 bool response = eventManager->GetBool(SERVER_COMMUNICATION_REQ);
1401 //fStatusLabel->SetText("Event marked");
1402 cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
1406 //fStatusLabel->SetText("Couldn't mark this event");
1407 cout<<"ADMIN PANEL -- Could not matk event"<<endl;
1409 if(requestMessage){delete requestMessage;}
1413 void AliEveEventManager::Close()
1415 // Close the event data-files and delete ESD, ESDfriend, run-loader
1418 cout<<"\n\n\nClose() called!!\n\n\n"<<endl;
1420 static const TEveException kEH("AliEveEventManager::Close ");
1424 throw (kEH + "Event-files not opened.");
1427 if (fAutoLoadTimerRunning)
1428 StopAutoLoadTimer();
1430 if ((fESDTree!=0) || (fHLTESDTree!=0)) {
1431 delete fESD; fESD = 0;
1432 // delete fESDfriend; // friend tree is deleted with the tree
1434 fESDfriendExists = kFALSE;
1436 if(fESDTree) { delete fESDTree; fESDTree = 0; }
1437 if(fHLTESDTree) { delete fHLTESDTree; fHLTESDTree = 0; }
1438 delete fESDFile; fESDFile = 0;
1442 delete fAOD; fAOD = 0;
1444 delete fAODTree; fAODTree = 0;
1445 delete fAODFile; fAODFile = 0;
1449 delete fRunLoader; fRunLoader = 0;
1453 delete fRawReader; fRawReader = 0;
1462 //------------------------------------------------------------------------------
1463 // Static convenience functions, mainly used from macros.
1464 //------------------------------------------------------------------------------
1466 Int_t AliEveEventManager::CurrentEventId()
1468 // Return current event-id.
1470 static const TEveException kEH("AliEveEventManager::CurrentEventId ");
1472 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1473 throw (kEH + "ALICE event not ready.");
1474 return fgCurrent->GetEventId();
1477 Bool_t AliEveEventManager::HasRunLoader()
1479 // Check if AliRunLoader is initialized.
1481 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRunLoader;
1484 Bool_t AliEveEventManager::HasESD()
1486 // Check if AliESDEvent is initialized.
1488 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESD;
1491 Bool_t AliEveEventManager::HasESDfriend()
1493 // Check if AliESDfriend is initialized.
1495 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fESDfriend;
1498 Bool_t AliEveEventManager::HasAOD()
1500 // Check if AliESDEvent is initialized.
1502 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fAOD;
1505 Bool_t AliEveEventManager::HasRawReader()
1507 // Check if raw-reader is initialized.
1509 return fgCurrent && fgCurrent->fHasEvent && fgCurrent->fRawReader;
1512 AliRunLoader* AliEveEventManager::AssertRunLoader()
1514 // Make sure AliRunLoader is initialized and return it.
1515 // Throws exception in case run-loader is not available.
1516 // Static utility for macros.
1518 static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
1520 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1521 throw (kEH + "ALICE event not ready.");
1522 if (fgCurrent->fRunLoader == 0)
1523 throw (kEH + "AliRunLoader not initialised.");
1524 return fgCurrent->fRunLoader;
1527 AliESDEvent* AliEveEventManager::AssertESD()
1529 // Make sure AliESDEvent is initialized and return it.
1530 // Throws exception in case ESD is not available.
1531 // Static utility for macros.
1533 static const TEveException kEH("AliEveEventManager::AssertESD ");
1535 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1536 throw (kEH + "ALICE event not ready.");
1537 if (fgCurrent->fESD == 0)
1538 throw (kEH + "AliESD not initialised.");
1539 return fgCurrent->fESD;
1542 AliESDfriend* AliEveEventManager::AssertESDfriend()
1544 // Make sure AliESDfriend is initialized and return it.
1545 // Throws exception in case ESDfriend-loader is not available.
1546 // Static utility for macros.
1548 static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
1550 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1551 throw (kEH + "ALICE event not ready.");
1552 if (fgCurrent->fESDfriend == 0)
1553 throw (kEH + "AliESDfriend not initialised.");
1554 return fgCurrent->fESDfriend;
1557 AliAODEvent* AliEveEventManager::AssertAOD()
1559 // Make sure AliAODEvent is initialized and return it.
1560 // Throws exception in case AOD is not available.
1561 // Static utility for macros.
1563 static const TEveException kEH("AliEveEventManager::AssertAOD ");
1565 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1566 throw (kEH + "ALICE event not ready.");
1567 if (fgCurrent->fAOD == 0)
1568 throw (kEH + "AliAOD not initialised.");
1569 return fgCurrent->fAOD;
1572 AliRawReader* AliEveEventManager::AssertRawReader()
1574 // Make sure raw-reader is initialized and return it.
1576 static const TEveException kEH("AliEveEventManager::AssertRawReader ");
1578 if (fgCurrent == 0 || fgCurrent->fHasEvent == kFALSE)
1579 throw (kEH + "ALICE event not ready.");
1580 if (fgCurrent->fRawReader == 0)
1581 throw (kEH + "RawReader not ready.");
1583 return fgCurrent->fRawReader;
1586 //==============================================================================
1588 AliMagF* AliEveEventManager::AssertMagField()
1590 // Make sure AliMagF is initialized and returns it.
1591 // Throws exception in case magnetic field is not available.
1592 // Static utility for macros.
1594 static const TEveException kEH("AliEveEventManager::AssertMagField ");
1599 if (TGeoGlobalMagField::Instance()->GetField())
1601 fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
1602 if (fgMagField == 0)
1603 throw kEH + "Global field set, but it is not AliMagF.";
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.";
1620 throw kEH + "Could not initialize magnetic field.";
1626 TGeoManager* AliEveEventManager::AssertGeometry()
1628 // Make sure AliGeomManager is initialized and returns the
1629 // corresponding TGeoManger.
1630 // gGeoManager is set to the return value.
1631 // Throws exception if geometry can not be loaded or if it is not
1632 // available and the TGeoManager is locked.
1633 // Static utility for macros.
1635 static const TEveException kEH("AliEveEventManager::AssertGeometry ");
1637 if (AliGeomManager::GetGeometry() == 0)
1639 if (TGeoManager::IsLocked())
1640 throw (kEH + "geometry is not loaded but TGeoManager is locked.");
1643 AliGeomManager::LoadGeometry();
1644 if ( ! AliGeomManager::GetGeometry())
1646 throw (kEH + "can not load geometry.");
1648 if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
1650 ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
1651 // throw (kEH + "could not apply align objs.");
1653 AliGeomManager::GetGeometry()->DefaultColors();
1656 gGeoManager = AliGeomManager::GetGeometry();
1660 AliRecoParam* AliEveEventManager::AssertRecoParams()
1668 Bool_t AliEveEventManager::InitRecoParam()
1670 // This is mostly a reap-off from reconstruction
1671 // The method accesses OCDB and retrieves all
1672 // the available reco-param objects from there.
1674 fgRecoParam = new AliRecoParam;
1675 const Int_t kNDetectors = 14;
1677 static const TEveException kEH("AliEveEventManager::InitRecoParam");
1679 Bool_t isOK = kTRUE;
1681 if (fgRecoParam->GetDetRecoParamArray(kNDetectors)) {
1682 ::Info(kEH, "Using custom GRP reconstruction parameters");
1685 ::Info(kEH, "Loading GRP reconstruction parameter objects");
1687 AliCDBPath path("GRP","Calib","RecoParam");
1688 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1690 ::Warning(kEH, "Couldn't find GRP RecoParam entry in OCDB");
1694 TObject *recoParamObj = entry->GetObject();
1695 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1696 // GRP has a normal TobjArray of AliDetectorRecoParam objects
1697 // Registering them in AliRecoParam
1698 fgRecoParam->AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
1700 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1701 // GRP has only onse set of reco parameters
1702 // Registering it in AliRecoParam
1703 ::Info(kEH, "Single set of GRP reconstruction parameters found");
1704 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1705 fgRecoParam->AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1708 ::Error(kEH, "No valid GRP RecoParam object found in the OCDB");
1715 const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE" };
1718 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1720 if (fgRecoParam->GetDetRecoParamArray(iDet)) {
1721 ::Info(kEH, "Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]);
1725 ::Info(kEH, "Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]);
1727 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
1728 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
1730 ::Warning(kEH, "Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]);
1734 TObject *recoParamObj = entry->GetObject();
1735 if (dynamic_cast<TObjArray*>(recoParamObj)) {
1736 // The detector has a normal TobjArray of AliDetectorRecoParam objects
1737 // Registering them in AliRecoParam
1738 fgRecoParam->AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
1740 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
1741 // The detector has only onse set of reco parameters
1742 // Registering it in AliRecoParam
1743 ::Info(kEH, "Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]);
1744 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
1745 fgRecoParam->AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
1748 ::Error(kEH, "No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]);
1764 TTree *AliEveEventManager::readESDTree(const char *treeName, int &runNo)
1766 if(!fESDFile && !fESD) return 0;
1768 static const TEveException kEH("AliEveEventManager::readESDTree ");
1770 TTree* tempTree = 0;
1772 tempTree =(TTree*) fESDFile->Get(treeName);
1775 TFile *esdFriendFile = TFile::Open(fgESDfriendsFileName);
1778 if (!esdFriendFile->IsZombie())
1780 esdFriendFile->Close();
1781 fESDfriendExists = kTRUE;
1782 tempTree->SetBranchStatus ("ESDfriend*", 1);
1784 delete esdFriendFile;
1787 fESD->ReadFromTree(tempTree);
1788 if (fESDfriendExists)
1790 fESDfriend = (AliESDfriend*) fESD->FindListObject("AliESDfriend");
1791 Info(kEH, "found and attached ESD friend.");
1795 Warning(kEH, "ESDfriend not found.");
1798 if (tempTree->GetEntry(0) <= 0)
1800 Warning(kEH, "failed getting the first entry from tree: %s", treeName);
1805 runNo = fESD->GetESDRun()->GetRunNumber();
1810 Warning(kEH, "failed getting the tree:%s", treeName);
1817 //------------------------------------------------------------------------------
1819 AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
1821 // Create and attach a dependent event-manager.
1822 // It is not added into eve list tree.
1824 static const TEveException kEH("AliEveEventManager::AddDependentManager ");
1827 throw(kEH + "Master event-manager must be instantiated first.");
1829 if (fgMaster->fSubManagers == 0)
1831 fgMaster->fSubManagers = new TList;
1832 fgMaster->fSubManagers->SetOwner(kTRUE);
1835 AliEveEventManager* new_mgr = 0;
1839 new_mgr = new AliEveEventManager(name, fgMaster->fEventId);
1840 new_mgr->SetFilesPath(path);
1841 fgMaster->fSubManagers->Add(new_mgr);
1843 catch (TEveException& exc)
1845 ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
1847 fgCurrent = fgMaster;
1852 AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
1854 // Get a dependant manager by name.
1855 // This will not change the current manager, use helper class
1856 // AliEveEventManager::CurrentChanger for that.
1858 static const TEveException kEH("AliEveEventManager::GetDependentManager ");
1861 throw(kEH + "Master event-manager must be instantiated first.");
1863 if (fgMaster->fSubManagers == 0)
1866 return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
1869 AliEveEventManager* AliEveEventManager::GetMaster()
1871 // Get master event-manager.
1876 AliEveEventManager* AliEveEventManager::GetCurrent()
1878 // Get current event-manager.
1883 void AliEveEventManager::RegisterTransient(TEveElement* element)
1885 GetCurrent()->fTransients->AddElement(element);
1888 void AliEveEventManager::RegisterTransientList(TEveElement* element)
1890 GetCurrent()->fTransientLists->AddElement(element);
1893 //------------------------------------------------------------------------------
1894 // Autoloading of events
1895 //------------------------------------------------------------------------------
1897 void AliEveEventManager::SetAutoLoadTime(Float_t time)
1899 // Set the auto-load time in seconds
1901 fAutoLoadTime = time;
1904 void AliEveEventManager::SetAutoLoad(Bool_t autoLoad)
1906 // Set the automatic event loading mode
1908 static const TEveException kEH("AliEveEventManager::SetAutoLoad ");
1910 if (fAutoLoad == autoLoad)
1912 Warning(kEH, "Setting autoload to the same value as before - %s. Ignoring.", fAutoLoad ? "true" : "false");
1916 fAutoLoad = autoLoad;
1919 StartAutoLoadTimer();
1923 StopAutoLoadTimer();
1927 void AliEveEventManager::SetLoopMarked(Bool_t loopMarked)
1929 // Set the automatic event loading mode
1930 if(fLoopMarked == loopMarked)
1932 cout<<"loop marked has the same value - ignoring"<<endl;
1937 cout<<"Setting loof marked to:"<<loopMarked<<endl;
1938 fLoopMarked = loopMarked;
1939 if (fLoopMarked){StartAutoLoadTimer();}
1940 else{StopAutoLoadTimer();}
1944 void AliEveEventManager::SetTrigSel(Int_t trig)
1946 static const TEveException kEH("AliEveEventManager::SetTrigSel ");
1950 Warning(kEH, "No Raw-reader exists. Ignoring the call.");
1955 ULong64_t trigMask = 0;
1956 if (trig >= 0) trigMask = (1ull << trig);
1957 Info(kEH,"Trigger selection: 0x%llx",trigMask);
1958 fRawReader->SelectEvents(-1,trigMask,NULL);
1962 void AliEveEventManager::StartAutoLoadTimer()
1964 // Start the auto-load timer.
1966 fAutoLoadTimer->SetTime((Long_t)(1000*fAutoLoadTime));
1967 fAutoLoadTimer->Reset();
1968 fAutoLoadTimer->TurnOn();
1969 fAutoLoadTimerRunning = kTRUE;
1972 void AliEveEventManager::StopAutoLoadTimer()
1974 // Stop the auto-load timer.
1976 fAutoLoadTimerRunning = kFALSE;
1977 fAutoLoadTimer->TurnOff();
1980 void AliEveEventManager::AutoLoadNextEvent()
1982 // Called from auto-load timer, so it has to be public.
1983 // Do NOT call it directly.
1985 static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
1987 Info(kEH, "called!");
1989 if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
1991 Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
1995 StopAutoLoadTimer();
1997 if (fAutoLoad || fLoopMarked)
1998 StartAutoLoadTimer();
2001 //------------------------------------------------------------------------------
2002 // Post event-loading functions
2003 //------------------------------------------------------------------------------
2005 void AliEveEventManager::AfterNewEventLoaded()
2007 // Execute registered macros and commands.
2008 // At the end emit NewEventLoaded signal.
2010 // Virtual from TEveEventManager.
2012 static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
2014 Info(kEH, "------------------!!!------------");
2016 NewEventDataLoaded();
2017 if (fExecutor) fExecutor->ExecMacros();
2019 TEveEventManager::AfterNewEventLoaded();
2022 if (this == fgMaster && fSubManagers != 0)
2024 TIter next(fSubManagers);
2025 while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
2027 gEve->SetCurrentEvent(fgCurrent);
2030 fgCurrent->GotoEvent(fEventId);
2032 catch (TEveException& exc)
2034 // !!! Should somehow tag / disable / remove it?
2035 Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
2036 fEventId, fgCurrent->GetName(), exc.Data());
2038 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
2040 fgCurrent = fgMaster;
2041 Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
2042 gEve->SetCurrentEvent(fgMaster);
2046 void AliEveEventManager::NewEventDataLoaded()
2048 // Emit NewEventDataLoaded signal.
2049 Emit("NewEventDataLoaded()");
2051 void AliEveEventManager::NewEventLoaded()
2053 // Emit NewEventLoaded signal.
2054 Emit("NewEventLoaded()");
2056 void AliEveEventManager::NoEventLoaded()
2058 // Emit NoEventLoaded signal.
2059 Emit("NoEventLoaded()");
2061 void AliEveEventManager::StorageManagerOk()
2063 // Emit StorageManagerOk signal.
2064 Emit("StorageManagerOk()");
2066 void AliEveEventManager::StorageManagerDown()
2068 // Emit StorageManagerOk signal.
2069 Emit("StorageManagerDown()");
2073 //------------------------------------------------------------------------------
2074 // Event info dumpers
2075 //------------------------------------------------------------------------------
2077 const AliEventInfo* AliEveEventManager::GetEventInfo()
2079 // Fill the event info object
2081 AliCentralTrigger *aCTP = NULL;
2083 fEventInfo.SetEventType(fRawReader->GetType());
2085 ULong64_t mask = fRawReader->GetClassMask();
2086 fEventInfo.SetTriggerMask(mask);
2087 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
2088 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
2090 aCTP = new AliCentralTrigger();
2091 TString configstr("");
2092 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
2093 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
2097 aCTP->SetClassMask(mask);
2098 aCTP->SetClusterMask(clmask);
2101 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
2103 rlCTP->SetClassMask(mask);
2104 rlCTP->SetClusterMask(clmask);
2109 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
2111 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
2112 aCTP = fRunLoader->GetTrigger();
2113 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
2114 // get inputs from actp - just get
2115 AliESDHeader* esdheader = fESD->GetHeader();
2116 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
2117 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
2118 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
2119 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
2122 AliWarning("No trigger can be loaded! The trigger information will not be used!");
2127 AliTriggerConfiguration *config = aCTP->GetConfiguration();
2129 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
2130 if (fRawReader) delete aCTP;
2134 TString declTriggerClasses;
2136 // Load trigger aliases and declare the trigger classes included in aliases
2137 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
2139 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
2141 lst->Sort(kSortDescending); // to avoid problems with substrings
2142 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
2143 // Now declare all the triggers present in the aliases
2146 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
2147 declTriggerClasses += " ";
2148 declTriggerClasses += nmd->GetName();
2152 AliError("Cannot cast the object with trigger aliases to THashList!");
2156 AliError("No OCDB entry for the trigger aliases!");
2159 // Load trigger classes for this run
2160 UChar_t clustmask = 0;
2162 ULong64_t trmask = fEventInfo.GetTriggerMask();
2163 const TObjArray& classesArray = config->GetClasses();
2164 Int_t nclasses = classesArray.GetEntriesFast();
2165 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
2166 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
2167 if (trclass && trclass->GetMask()>0) {
2168 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
2169 if (fESD) fESD->SetTriggerClass(trclass->GetName(),trindex);
2170 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
2171 if (trmask & (1ull << trindex)) {
2173 trclasses += trclass->GetName();
2175 clustmask |= trclass->GetCluster()->GetClusterMask();
2179 fEventInfo.SetTriggerClasses(trclasses);
2181 if (!aCTP->CheckTriggeredDetectors()) {
2182 if (fRawReader) delete aCTP;
2186 if (fRawReader) delete aCTP;
2188 // everything went ok, return pointer
2189 return (&fEventInfo);
2193 TString AliEveEventManager::GetEventInfoHorizontal() const
2195 // Dumps the event-header contents in vertical formatting.
2197 TString rawInfo, esdInfo;
2201 rawInfo = "No raw-data event info is available!\n";
2205 const UInt_t* attr = fRawReader->GetAttributes();
2206 TTimeStamp ts(fRawReader->GetTimestamp());
2207 rawInfo.Form("RAW event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2208 "Trigger: %llx\nDetectors: %x (%s)\nAttributes:%x-%x-%x Timestamp: %s\n",
2209 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2210 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2211 fRawReader->GetClassMask(),
2212 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2213 attr[0],attr[1],attr[2], ts.AsString("s"));
2218 esdInfo = "No ESD event info is available!";
2222 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2223 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2224 TTimeStamp ts(fESD->GetTimeStamp());
2225 esdInfo.Form("ESD event info: Run#: %d Event type: %d (%s) Period: %x Orbit: %x BC: %x\n"
2226 "Active trigger classes: %s\nTrigger: %llx (%s)\nEvent# in file: %d Timestamp: %s, MagField: %.2e",
2227 fESD->GetRunNumber(),
2228 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2229 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2230 acttrclasses.Data(),
2231 fESD->GetTriggerMask(),firedtrclasses.Data(),
2232 fESD->GetEventNumberInFile(), ts.AsString("s"), fESD->GetMagneticField());
2235 return rawInfo + esdInfo;
2238 TString AliEveEventManager::GetEventInfoVertical() const
2240 // Dumps the event-header contents in vertical formatting.
2242 TString rawInfo, esdInfo;
2246 rawInfo = "No raw-data event info is available!\n";
2250 const UInt_t* attr = fRawReader->GetAttributes();
2251 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",
2252 fRawReader->GetRunNumber(),fRawReader->GetType(),AliRawEventHeaderBase::GetTypeName(fRawReader->GetType()),
2253 fRawReader->GetPeriod(),fRawReader->GetOrbitID(),fRawReader->GetBCID(),
2254 fRawReader->GetClassMask(),
2255 *fRawReader->GetDetectorPattern(),AliDAQ::ListOfTriggeredDetectors(*fRawReader->GetDetectorPattern()),
2256 attr[0],attr[1],attr[2],
2257 fRawReader->GetTimestamp());
2262 esdInfo = "No ESD event info is available!\n";
2266 TString acttrclasses = fESD->GetESDRun()->GetActiveTriggerClasses();
2267 TString firedtrclasses = fESD->GetFiredTriggerClasses();
2268 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",
2269 fESD->GetRunNumber(),
2270 acttrclasses.Data(),
2271 fESD->GetEventType(),AliRawEventHeaderBase::GetTypeName(fESD->GetEventType()),
2272 fESD->GetPeriodNumber(),fESD->GetOrbitNumber(),fESD->GetBunchCrossNumber(),
2273 fESD->GetTriggerMask(),firedtrclasses.Data(),
2274 fESD->GetEventNumberInFile(),
2275 fESD->GetTimeStamp());
2278 return rawInfo + "\n" + esdInfo;
2282 //==============================================================================
2283 // Reading of GRP and MagneticField.
2284 // This is a reap-off from reconstruction ... should really be a common
2285 // code to do this somewhere in STEER.
2286 //==============================================================================
2288 Bool_t AliEveEventManager::InitGRP()
2290 //------------------------------------
2291 // Initialization of the GRP entry
2292 //------------------------------------
2294 static const TEveException kEH("AliEveEventManager::InitGRP ");
2296 AliGRPManager grpMgr;
2297 if (!grpMgr.ReadGRPEntry()) {
2300 fgGRPLoaded = kTRUE;
2301 if (!grpMgr.SetMagField()) {
2302 throw kEH + "Setting of field failed!";
2305 //*** Get the diamond profiles from OCDB
2306 // Eventually useful.
2309 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
2311 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
2313 ::Error(kEH, "No SPD diamond profile found in OCDB!");
2316 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
2318 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
2320 ::Error(kEH, "No diamond profile found in OCDB!");
2323 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
2325 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
2327 ::Error(kEH, "No TPC diamond profile found in OCDB!");
2334 //------------------------------------
2335 // Global variables management
2336 //------------------------------------
2338 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model)
2340 // Insert a new visualization-parameter database entry with the default
2341 return InsertGlobal(tag, model, fGlobalReplace, fGlobalUpdate);
2344 Bool_t AliEveEventManager::InsertGlobal(const TString& tag, TEveElement* model,
2345 Bool_t replace, Bool_t update)
2347 TPair* pair = (TPair*) fGlobal->FindObject(tag);
2352 model->IncDenyDestroy();
2353 model->SetRnrChildren(kFALSE);
2355 TEveElement* old_model = dynamic_cast<TEveElement*>(pair->Value());
2356 if(!old_model) AliFatal("old_model == 0, dynamic cast failed\n");
2357 while (old_model->HasChildren())
2359 TEveElement *el = old_model->FirstChild();
2360 el->SetVizModel(model);
2363 el->CopyVizParams(model);
2364 el->PropagateVizParamsToProjecteds();
2367 old_model->DecDenyDestroy();
2369 pair->SetValue(dynamic_cast<TObject*>(model));
2379 model->IncDenyDestroy();
2380 model->SetRnrChildren(kFALSE);
2381 fGlobal->Add(new TObjString(tag), dynamic_cast<TObject*>(model));
2386 TEveElement* AliEveEventManager::FindGlobal(const TString& tag)
2388 return dynamic_cast<TEveElement*>(fGlobal->GetValue(tag));
2390 Int_t AliEveEventManager::NewEventAvailable()
2392 if (fIsNewEventAvaliable)