12 #include "Gaudi/Interfaces/IOptionsSvc.h"
13 #include "GaudiKernel/IAddressCreator.h"
14 #include "GaudiKernel/IAlgTool.h"
15 #include "GaudiKernel/IEvtSelector.h"
16 #include "GaudiKernel/IIncidentSvc.h"
17 #include "GaudiKernel/IIoComponentMgr.h"
18 #include "GaudiKernel/IOpaqueAddress.h"
19 #include "GaudiKernel/FileIncident.h"
20 #include "GaudiKernel/System.h"
33 #include "boost/bind/bind.hpp"
38 leftString(std::string &
s,
char sc){
39 bool truncated{
false};
41 if (
n!=std::string::npos){
53 m_inputDataStore(
"StoreGateSvc/InputMetaDataStore",
name),
54 m_outputDataStore(
"StoreGateSvc/MetaDataStore",
name),
55 m_addrCrtr(
"AthenaPoolCnvSvc",
name),
56 m_fileMgr(
"FileMgr",
name),
57 m_incSvc(
"IncidentSvc",
name),
58 m_outSeqSvc(
"OutputStreamSequencerSvc",
name),
60 m_clearedInputDataStore(true),
61 m_clearedOutputDataStore(false),
62 m_allowMetaDataStop(false),
63 m_outputPrepared(false),
71 m_persToClid.insert(std::pair<std::string, CLID>(
"DataHeader_p5", 222376821));
72 m_persToClid.insert(std::pair<std::string, CLID>(
"EventStreamInfo_p3", 167728019));
73 m_persToClid.insert(std::pair<std::string, CLID>(
"ByteStreamMetadataContainer_p1", 1076128893));
74 m_persToClid.insert(std::pair<std::string, CLID>(
"IOVMetaDataContainer_p1", 1316383046));
75 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::EventFormat_v1", 243004407));
76 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::CutBookkeeperContainer_v1", 1234982351));
77 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::CutBookkeeperAuxContainer_v1", 1147935274));
78 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::TriggerMenuContainer_v1", 1107011239));
79 m_persToClid.insert(std::pair<std::string, CLID>(
"DataVector<xAOD::TriggerMenu_v1>", 1107011239));
80 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::TriggerMenuAuxContainer_v1", 1212409402));
81 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::TriggerMenuJsonContainer_v1", 1221262614));
82 m_persToClid.insert(std::pair<std::string, CLID>(
"DataVector<xAOD::TriggerMenuJson_v1>", 1221262614));
83 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::TriggerMenuJsonAuxContainer_v1", 373045213));
84 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::LumiBlockRangeContainer_v1", 1115934851));
85 m_persToClid.insert(std::pair<std::string, CLID>(
"DataVector<xAOD::LumiBlockRange_v1>", 1115934851));
86 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::LumiBlockRangeAuxContainer_v1", 1251061086));
87 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::FileMetaData_v1", 178309087));
88 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::FileMetaDataAuxInfo_v1", 73252552));
89 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::RingSetConfContainer_v1", 1157997427));
90 m_persToClid.insert(std::pair<std::string, CLID>(
"DataVector<xAOD::RingSetConf_v1>", 1157997427));
91 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::RingSetConfAuxContainer_v1", 1307745126));
92 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::TruthMetaDataContainer_v1", 1188015687));
93 m_persToClid.insert(std::pair<std::string, CLID>(
"DataVector<xAOD::TruthMetaData_v1>", 1188015687));
94 m_persToClid.insert(std::pair<std::string, CLID>(
"xAOD::TruthMetaDataAuxContainer_v1", 1094306618));
96 m_toolForClid.insert(std::pair<CLID, std::string>(167728019,
"CopyEventStreamInfo"));
97 m_toolForClid.insert(std::pair<CLID, std::string>(243004407,
"xAODMaker::EventFormatMetaDataTool"));
98 m_toolForClid.insert(std::pair<CLID, std::string>(1234982351,
"BookkeeperTool"));
99 m_toolForClid.insert(std::pair<CLID, std::string>(1107011239,
"xAODMaker::TriggerMenuMetaDataTool"));
100 m_toolForClid.insert(std::pair<CLID, std::string>(1221262614,
"xAODMaker::TriggerMenuMetaDataTool"));
101 m_toolForClid.insert(std::pair<CLID, std::string>(1115934851,
"LumiBlockMetaDataTool"));
102 m_toolForClid.insert(std::pair<CLID, std::string>(178309087,
"xAODMaker::FileMetaDataTool"));
103 m_toolForClid.insert(std::pair<CLID, std::string>(1188015687,
"xAODMaker::TruthMetaDataTool"));
134 m_incSvc->addListener(
this,
"FirstInputFile", 80,
true);
135 m_incSvc->addListener(
this,
"BeginInputFile", 80,
true);
136 m_incSvc->addListener(
this,
"EndInputFile", 10,
true);
144 if (!joSvc.retrieve().isSuccess()) {
147 if (joSvc->has(
"EventSelector.InputCollections")) {
150 if (!evtsel.retrieve().isSuccess()) {
158 return(StatusCode::SUCCESS);
163 if (!
m_incSvc.release().isSuccess()) {
182 return(StatusCode::SUCCESS);
189 Incident metaDataStopIncident(
name(),
"MetaDataStop");
190 m_incSvc->fireIncident(metaDataStopIncident);
191 return(StatusCode::SUCCESS);
197 *ppvInterface =
this;
200 return(base_class::queryInterface(riid, ppvInterface));
203 return(StatusCode::SUCCESS);
208 return(StatusCode::SUCCESS);
211 std::list<SG::ObjectWithVersion<DataHeader> > allVersions;
213 if (!
sc.isSuccess()) {
214 ATH_MSG_WARNING(
"Could not retrieve all versions for DataHeader, will not read Metadata");
220 if (dataHeader ==
nullptr) {
221 ATH_MSG_ERROR(
"Could not get DataHeader, will not read Metadata");
222 return(StatusCode::FAILURE);
225 const CLID clid = dhe.getPrimaryClassID();
228 std::string
key = dhe.getKey();
229 if (verNumber != 0)
key = myVersObjKey;
230 tads.push_back(dhe.getAddress(
key));
235 return(StatusCode::SUCCESS);
240 const FileIncident* fileInc =
dynamic_cast<const FileIncident*
>(&inc);
241 if (fileInc ==
nullptr) {
242 ATH_MSG_ERROR(
"Unable to get FileName from EndInputFile incident");
243 return StatusCode::FAILURE;
245 const std::string
guid = fileInc->fileGuid();
246 const std::string
fileName = fileInc->fileName();
248 if (!
fileName.starts_with(
"BSF:")) {
258 return StatusCode::FAILURE;
263 ATH_MSG_DEBUG(
" calling beginInputFile on " << (*it)->name() <<
" for GUID \"" <<
guid <<
"\"");
264 if ( (*it)->beginInputFile(
guid).isFailure() ) {
265 ATH_MSG_ERROR(
"Unable to call beginInputFile for " << (*it)->name());
266 rc = StatusCode::FAILURE;
274 const FileIncident* fileInc =
dynamic_cast<const FileIncident*
>(&inc);
275 if (fileInc ==
nullptr) {
276 ATH_MSG_ERROR(
"Unable to get FileName from EndInputFile incident");
277 return StatusCode::FAILURE;
279 const std::string
guid = fileInc->fileGuid();
280 ATH_MSG_DEBUG(
"retireMetadataSource: " << fileInc->fileName());
282 ATH_MSG_DEBUG(
" calling endInputFile on " << (*it)->name() <<
" for GUID \"" <<
guid <<
"\"");
283 if ( (*it)->endInputFile(
guid).isFailure() ) {
284 ATH_MSG_ERROR(
"Unable to call endInputFile for " << (*it)->name());
285 return StatusCode::FAILURE;
289 return StatusCode::SUCCESS;
298 ATH_MSG_DEBUG(
" calling metaDataStop for " << (*it)->name());
299 if ( (*it)->metaDataStop().isFailure() ) {
300 ATH_MSG_ERROR(
"Unable to call metaDataStop for " << (*it)->name());
301 rc = StatusCode::FAILURE;
321 ATH_MSG_DEBUG(
" calling metaDataStop for " << (*it)->name());
323 if ( (*it)->metaDataStop().isFailure() ) {
324 ATH_MSG_ERROR(
"Unable to call metaDataStop for " << (*it)->name());
325 rc = StatusCode::FAILURE;
338 return StatusCode::FAILURE;
345 return StatusCode::FAILURE;
351 return StatusCode::FAILURE;
353 return StatusCode::SUCCESS;
358 const FileIncident* fileInc =
dynamic_cast<const FileIncident*
>(&inc);
359 if (fileInc ==
nullptr) {
360 ATH_MSG_ERROR(
"Unable to get FileName from EndInputFile incident");
363 const std::string
fileName = fileInc->fileName();
366 if (inc.type() ==
"FirstInputFile") {
368 using namespace boost::placeholders;
370 if (
m_fileMgr->regAction(boa, Io::OPEN).isFailure()) {
371 ATH_MSG_FATAL(
"Cannot register ROOT file open action with FileMgr.");
376 }
else if (inc.type() ==
"BeginInputFile") {
380 }
else if (inc.type() ==
"EndInputFile") {
394 FileIncident inc(
"transitionMetaDataFile",
"EndInputFile",
"dummyMetaInputFileName",
"");
400 Incident metaDataStopIncident(
name(),
"MetaDataStop");
401 m_incSvc->fireIncident(metaDataStopIncident);
412 return(StatusCode::SUCCESS);
422 ATH_MSG_INFO(
"Attached MetaDataTool: " << (*iter)->name());
425 return(StatusCode::SUCCESS);
429 return(StatusCode::SUCCESS);
436 if(
pos==std::string::npos )
return "";
448 return std::set<std::string>( {
key} );
454 std::string
fileName = tokenStr.substr(tokenStr.find(
"[FILE=") + 6);
456 std::string
className = tokenStr.substr(tokenStr.find(
"[PNAME=") + 7);
458 std::string contName = tokenStr.substr(tokenStr.find(
"[CONT=") + 6);
459 leftString(contName,
']');
460 std::size_t pos1 = contName.find(
'(');
461 std::string
keyName = contName.substr(pos1 + 1, contName.size() - pos1 - 2);
462 std::size_t pos2 =
keyName.find(
'/');
463 if (pos2 != std::string::npos)
keyName =
keyName.substr(pos2 + 1);
464 std::string numName = tokenStr.substr(tokenStr.find(
"[NUM=") + 5);
465 leftString(numName,
']');
466 unsigned long num = 0;
467 std::istringstream iss(numName);
470 if (clid == 167728019) {
471 bool foundTool =
false;
473 if ((*iter)->name() ==
"ToolSvc.CopyEventStreamInfo") foundTool =
true;
476 if (serviceLocator()->existsService(
"CutFlowSvc")) {
478 if (cfSvc.retrieve().isSuccess()) {
479 ATH_MSG_INFO(
"Disabling incidents for: " << cfSvc.name());
480 m_incSvc->removeListener(cfSvc.get(), IncidentType::BeginInputFile);
481 m_incSvc->removeListener(cfSvc.get(),
"MetaDataStop");
482 cfSvc.release().ignore();
485 if (serviceLocator()->existsService(
"xAODConfigSvc")) {
487 if (xcSvc.retrieve().isSuccess()) {
488 ATH_MSG_INFO(
"Disabling incidents for: " << xcSvc.name());
489 m_incSvc->removeListener(xcSvc.get(), IncidentType::BeginInputFile);
490 m_incSvc->removeListener(xcSvc.get(), IncidentType::BeginEvent);
491 xcSvc.release().ignore();
497 if (!toolName.empty()) {
498 std::string toolInstName;
499 std::size_t
pos = toolName.find(
"::");
500 if (
pos != std::string::npos) {
501 toolInstName = toolName.substr(
pos + 2);
503 toolInstName = toolName;
505 bool foundTool =
false;
507 if ((*iter)->name() ==
"ToolSvc." + toolInstName) foundTool =
true;
510 if (toolInstName != toolName) {
511 toolInstName = toolName +
"/" + toolInstName;
513 ToolHandle<IMetaDataTool> metadataTool(toolInstName);
515 ATH_MSG_DEBUG(
"Added new MetaDataTool: " << metadataTool->name());
516 if (!metadataTool.retrieve().isSuccess()) {
518 return(StatusCode::FAILURE);
524 if( clid == 178309087 ) {
530 if( clid == 73252552 ) {
538 const unsigned long ipar[2] = {
num , 0 };
539 IOpaqueAddress* opqAddr =
nullptr;
546 ATH_MSG_FATAL(
"addProxyToInputMetaDataStore: Cannot create address for " << tokenStr);
547 return(StatusCode::FAILURE);
550 delete opqAddr; opqAddr =
nullptr;
551 ATH_MSG_FATAL(
"addProxyToInputMetaDataStore: Cannot create proxy for " << tokenStr);
552 return(StatusCode::FAILURE);
555 ATH_MSG_FATAL(
"addProxyToInputMetaDataStore: Cannot access data for " << tokenStr);
556 return(StatusCode::FAILURE);
560 ATH_MSG_WARNING(
"addProxyToInputMetaDataStore: Cannot symlink to AuxStore for " << tokenStr);
562 return(StatusCode::SUCCESS);
570 ATH_MSG_DEBUG(
"MetaDataSvc called without MetaDataContainer set.");
571 return(StatusCode::SUCCESS);
573 if (
fileName.starts_with(
"BSF:")) {
575 }
else if (
fileName.compare(0, 3,
"SHM")==0) {
580 for (
int verNumber = 0; verNumber < 100; verNumber++) {
583 ATH_MSG_DEBUG(
"initInputMetaDataStore: MetaData Store already contains DataHeader, key = " << myVersKey);
585 const unsigned long ipar[2] = { (
unsigned long)verNumber , 0 };
586 IOpaqueAddress* opqAddr =
nullptr;
593 delete opqAddr; opqAddr =
nullptr;
594 ATH_MSG_WARNING(
"initInputMetaDataStore: Cannot create proxy for DataHeader, key = " << myVersKey);
598 std::list<SG::TransientAddress*> tList;
601 return StatusCode::FAILURE;
604 CLID clid = tad->clID();
605 ATH_MSG_VERBOSE(
"initInputMetaDataStore: add proxy for clid = " << clid <<
", key = " << tad->name());
607 ATH_MSG_DEBUG(
"initInputMetaDataStore: MetaData Store already contains clid = " << clid <<
", key = " << tad->name());
610 ATH_MSG_ERROR(
"initInputMetaDataStore: Cannot create proxy for clid = " << clid <<
", key = " << tad->name());
611 return StatusCode::FAILURE;
615 for (
CLID tclid : tad->transientID()) {
619 clid <<
"/" << tad->name() <<
" to " << tclid);
628 return(StatusCode::SUCCESS);
642 ATH_MSG_DEBUG(
"Not translating metadata item ID #" << itemID);
646 std::string itemName;
648 if (
m_classIDSvc->getTypeNameOfID(itemID, itemName).isSuccess()) {
649 const std::string contName =
"MetaCont<" + itemName +
">";
650 ATH_MSG_DEBUG(
"Transforming " << contName <<
" to " << itemName
652 if (
m_classIDSvc->getIDOfTypeName(contName, contID).isSuccess())
660 const std::string&
typeName = System::typeinfoName(typeInfo);
668 <<
" ClassID: " << itemID);
673 const std::string&
typeName = System::typeinfoName(typeInfo);
680 <<
" ClassID: " << itemID);