12#include "Gaudi/Interfaces/IOptionsSvc.h"
13#include "GaudiKernel/IAlgTool.h"
14#include "GaudiKernel/IEvtSelector.h"
15#include "GaudiKernel/IIncidentSvc.h"
16#include "GaudiKernel/IIoComponentMgr.h"
17#include "GaudiKernel/IOpaqueAddress.h"
18#include "GaudiKernel/FileIncident.h"
19#include "GaudiKernel/System.h"
42 bool leftString(std::string& s,
char sc) {
43 if (
const auto pos =
s.find(
sc); pos != std::string::npos) {
54 : base_class( name, pSvcLocator )
91 m_incSvc->addListener(
this,
"FirstInputFile", 80,
true);
92 m_incSvc->addListener(
this,
"BeginInputFile", 80,
true);
93 m_incSvc->addListener(
this,
"EndInputFile", 10,
true);
94 m_incSvc->addListener(
this,
"BeginInputMemFile", 80,
true);
95 m_incSvc->addListener(
this,
"EndInputMemFile", 10,
true);
103 if (!joSvc.retrieve().isSuccess()) {
106 if (joSvc->has(
"EventSelector.InputCollections")) {
109 if (!evtsel.retrieve().isSuccess()) {
117 return(StatusCode::SUCCESS);
122 if (!
m_incSvc.release().isSuccess()) {
144 return(StatusCode::SUCCESS);
151 Incident metaDataStopIncident(name(),
"MetaDataStop");
152 m_incSvc->fireIncident(metaDataStopIncident);
153 return(StatusCode::SUCCESS);
159 return(StatusCode::SUCCESS);
162 return(StatusCode::SUCCESS);
167 const CLID clid = dhe.getPrimaryClassID();
172 return(StatusCode::SUCCESS);
177 const FileIncident* fileInc =
dynamic_cast<const FileIncident*
>(&inc);
178 if (fileInc ==
nullptr) {
179 ATH_MSG_ERROR(
"Unable to get FileName from EndInputFile incident");
180 return StatusCode::FAILURE;
182 const std::string guid = fileInc->fileGuid();
183 const std::string fileName = fileInc->fileName();
186 if (!fileName.starts_with(
"BSF:")) {
196 StatusCode
rc{StatusCode::SUCCESS};
198 ATH_MSG_DEBUG(
" calling beginInputFile on {} for GUID \"{}\"",
200 if (tool->beginInputFile(guid).isFailure()) {
201 ATH_MSG_ERROR(
"Unable to call beginInputFile for {}", tool->name());
202 rc = StatusCode::FAILURE;
210 const FileIncident* fileInc =
dynamic_cast<const FileIncident*
>(&inc);
211 if (fileInc ==
nullptr) {
212 ATH_MSG_ERROR(
"Unable to get FileName from EndInputFile incident");
213 return StatusCode::FAILURE;
215 const std::string guid = fileInc->fileGuid();
216 ATH_MSG_DEBUG(
"retireMetadataSource: {}", fileInc->fileName());
223 return StatusCode::SUCCESS;
229 return StatusCode::SUCCESS;
232 StatusCode
rc{StatusCode::SUCCESS};
235 if (tool->metaDataStop().isFailure()) {
236 ATH_MSG_ERROR(
"Unable to call metaDataStop for {}", tool->name());
237 rc = StatusCode::FAILURE;
252 if( outputName.empty() ) {
257 StatusCode
rc{StatusCode::SUCCESS};
261 if (tool->metaDataStop().isFailure()) {
262 ATH_MSG_ERROR(
"Unable to call metaDataStop for {}", tool->name());
263 rc = StatusCode::FAILURE;
273 if (
m_addrCrtr.name() !=
"AthenaPoolSharedIOCnvSvc") {
275 return StatusCode::FAILURE;
288 return StatusCode::SUCCESS;
293 const FileIncident* fileInc =
dynamic_cast<const FileIncident*
>(&inc);
294 if (fileInc ==
nullptr) {
295 ATH_MSG_ERROR(
"Unable to get FileName from EndInputFile incident");
298 const std::string fileName = fileInc->fileName();
301 if (inc.type() ==
"FirstInputFile") {
303 using namespace std::placeholders;
305 if (
m_fileMgr->regAction(std::move(boa), Io::OPEN).isFailure()) {
306 ATH_MSG_FATAL(
"Cannot register ROOT file open action with FileMgr.");
311 }
else if (inc.type() ==
"BeginInputFile" || inc.type() ==
"BeginInputMemFile") {
313 ATH_MSG_ERROR(
"Could not process new metadata source {}", fileName);
315 }
else if (inc.type() ==
"EndInputFile" || inc.type() ==
"EndInputMemFile") {
317 ATH_MSG_ERROR(
"Could not retire metadata source {}", fileName);
329 FileIncident inc(
"transitionMetaDataFile",
"EndInputFile",
"dummyMetaInputFileName",
"");
335 Incident metaDataStopIncident(name(),
"MetaDataStop");
336 m_incSvc->fireIncident(metaDataStopIncident);
347 return(StatusCode::SUCCESS);
356 ATH_MSG_INFO(
"Attached MetaDataTool: {}", tool->name());
359 return(StatusCode::SUCCESS);
363 return(StatusCode::SUCCESS);
370 if( pos==std::string::npos )
return "";
371 size_t epos = key.find(
']', pos);
373 std::string stream = key.substr( spos, epos - spos );
375 key = key.substr(0, pos) + key.substr(epos+1);
389 std::string fileName = tokenStr.substr(tokenStr.find(
"[FILE=") + 6);
390 leftString(fileName,
']');
391 std::string className = tokenStr.substr(tokenStr.find(
"[PNAME=") + 7);
392 leftString(className,
']');
393 std::string contName = tokenStr.substr(tokenStr.find(
"[CONT=") + 6);
394 leftString(contName,
']');
395 std::size_t pos1 = contName.find(
'(');
396 std::string keyName = contName.substr(pos1 + 1, contName.size() - pos1 - 2);
397 std::size_t pos2 = keyName.find(
'/');
398 if (pos2 != std::string::npos) keyName = keyName.substr(pos2 + 1);
399 std::string numName = tokenStr.substr(tokenStr.find(
"[NUM=") + 5);
400 leftString(numName,
']');
401 unsigned long num = 0;
402 std::istringstream iss(numName);
410 CLID clid = CLID_NULL;
411 if (
m_classIDSvc->getIDOfTypeInfoName(className, clid).isFailure()) {
412 const std::size_t ppos = className.rfind(
"_p");
413 const bool isTP = ppos != std::string::npos && ppos + 2 < className.size()
414 && std::all_of(className.begin() + ppos + 2, className.end(), [](
unsigned char c) { return std::isdigit(c); });
415 if (!isTP ||
m_classIDSvc->getIDOfTypeName(className.substr(0, ppos), clid).isFailure()) {
416 ATH_MSG_ERROR(
"addProxyToInputMetaDataStore: no CLID for persistent class {} in {}", className, tokenStr);
417 return StatusCode::FAILURE;
423 if( clid == 178309087 ) {
424 std::string newName = std::format(
"{}{}{}{}", keyName,
m_streamInKeyMark, fileName,
"]");
427 keyName = std::move(newName);
429 if( clid == 73252552 ) {
430 std::string newName = std::format(
"{}{}{}]{}",
437 keyName = std::move(newName);
439 const std::string par[3] = {
"SHM" , keyName , std::move(className) };
440 const unsigned long ipar[2] = { num , 0 };
441 IOpaqueAddress* opqAddr =
nullptr;
444 ATH_MSG_DEBUG(
"Resetting duplicate proxy for: {}#{} from file: {}",
445 clid, keyName, fileName);
449 ATH_MSG_FATAL(
"addProxyToInputMetaDataStore: Cannot create address for {}", tokenStr);
450 return(StatusCode::FAILURE);
453 ATH_MSG_FATAL(
"addProxyToInputMetaDataStore: Cannot create proxy for {}", tokenStr);
454 return(StatusCode::FAILURE);
457 ATH_MSG_FATAL(
"addProxyToInputMetaDataStore: Cannot access data for {}", tokenStr);
458 return(StatusCode::FAILURE);
462 ATH_MSG_WARNING(
"addProxyToInputMetaDataStore: Cannot symlink to AuxStore for {}", tokenStr);
464 return(StatusCode::SUCCESS);
468 ATH_MSG_DEBUG(
"initInputMetaDataStore: file name {}", fileName);
472 ATH_MSG_DEBUG(
"MetaDataSvc called without MetaDataContainer set.");
473 return(StatusCode::SUCCESS);
475 if (fileName.starts_with(
"BSF:")) {
477 }
else if (fileName.compare(0, 3,
"SHM")==0) {
480 const std::string par[2] = {
484 const std::string parOld[2] = {
489 ATH_MSG_DEBUG(
"initInputMetaDataStore: MetaData Store already contains DataHeader, key = {}", name());
491 const unsigned long ipar[2] = { 0 , 0 };
492 IOpaqueAddress* opqAddr =
nullptr;
496 ATH_MSG_WARNING(
"initInputMetaDataStore: Cannot create proxy for DataHeader, key = {}", name());
500 std::list<SG::TransientAddress*> tList;
503 CLID clid = tad->clID();
504 ATH_MSG_VERBOSE(
"initInputMetaDataStore: add proxy for clid = {}, key = {}",
507 ATH_MSG_DEBUG(
"initInputMetaDataStore: MetaData Store already contains clid = {}, key = {}",
511 ATH_MSG_ERROR(
"initInputMetaDataStore: Cannot create proxy for clid = {}, key = {}",
513 return StatusCode::FAILURE;
517 for (
CLID tclid : tad->transientID()) {
521 clid, tad->name(), tclid);
530 return(StatusCode::SUCCESS);
536 const EventContext& ctx = Gaudi::Hive::currentContext();
544 ATH_MSG_DEBUG(
"Not translating metadata item ID #{}", itemID);
548 std::string itemName;
550 if (
m_classIDSvc->getTypeNameOfID(itemID, itemName).isSuccess()) {
551 const std::string contName = std::format(
"MetaCont<{}>", itemName);
554 if (
m_classIDSvc->getIDOfTypeName(contName, contID).isSuccess())
562 const std::string& typeName = System::typeinfoName(typeInfo);
566 if (
m_classIDSvc->getIDOfTypeInfoName(typeName, itemID).isSuccess()) {
569 ATH_MSG_DEBUG(
"MetaDataSvc will handle {} ClassID: {}", typeName, itemID);
574 const std::string& typeName = System::typeinfoName(typeInfo);
578 if (
m_classIDSvc->getIDOfTypeInfoName(typeName, itemID).isSuccess()) {
580 ATH_MSG_DEBUG(
"MetaDataSvc will no longer handle {} ClassID: {}",
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
uint32_t CLID
The Class ID type.
This file contains the class definition for the OutputStreamSequencerSvc class.
Base class for all conversion services.
virtual long repSvcType() const override
Retrieve the class type of the data store the converter uses.
virtual StatusCode disconnectOutput(const std::string &output)
Disconnect output files from the service.
std::list< SG::TransientAddress * > tadList
virtual StatusCode shmProxy(const std::string &tokenStr) override
Loads file metadata from memory shared between streams in SharedWriter This function clears the input...
constexpr char AUX_POSTFIX[]
Common post-fix for the names of auxiliary containers in StoreGate.
static constexpr CLID ID()