13#include "GaudiKernel/IOpaqueAddress.h"
14#include "GaudiKernel/INamedInterface.h"
15#include "GaudiKernel/IClassIDSvc.h"
16#include "GaudiKernel/ThreadLocalContext.h"
35 std::string inputName =
dp.name() +
"_Input";
36 return dp.hasAlias (inputName);
44 const std::string& name,
45 const IInterface* parent) : base_class(
type, name, parent),
47 m_decSvc(
"DecisionSvc/DecisionSvc", name) {
67 const INamedInterface* parentAlg =
dynamic_cast<const INamedInterface*
>(parent());
78 const std::string keyword =
"[AttributeListKey=";
79 std::string::size_type pos =
m_outputName.value().find(keyword);
80 if( (pos != std::string::npos) ) {
82 const std::string attrListKey =
m_outputName.value().substr(pos + keyword.size(),
83 m_outputName.value().find(
']', pos + keyword.size()) - pos - keyword.size());
113 return(StatusCode::SUCCESS);
117 const std::string& cnvSvc,
118 bool extendProvenenceRecord) {
121 if (
m_store.release().isFailure()) {
126 if (cnvSvc !=
m_conversionSvc.type() && cnvSvc !=
"EventPersistencySvc") {
133 return(StatusCode::FAILURE);
137 auto pprop =
dynamic_cast<const IProperty*
>(parent());
140 return(StatusCode::FAILURE);
142 auto keep =
dynamic_cast<const StringProperty&
>( pprop->getProperty(
"KeepProvenanceTagsRegEx") );
154 return(StatusCode::FAILURE);
156 return(StatusCode::SUCCESS);
163 if (!outputName.empty()) {
168 return(StatusCode::FAILURE);
177 return(StatusCode::FAILURE);
186 if (
m_store->removeDataAndProxy(preDh).isFailure()) {
188 return(StatusCode::FAILURE);
200 std::vector<std::string> dhKeys;
203 const std::string boolTypeStr{
"bool"};
204 for (
const std::string& dhKey : dhKeys) {
205 bool primaryDH =
false;
207 if (dhKey ==
"EventSelector") primaryDH =
true;
208 ATH_MSG_DEBUG(
"No transientContains DataHeader with key " << dhKey);
210 if (
m_store->retrieve(dh, dhKey).isFailure()) {
211 ATH_MSG_DEBUG(
"Unable to retrieve the DataHeader with key " << dhKey);
213 if (dh->
isInput() || hasInputAlias(*
m_store->proxy(dh)) || primaryDH) {
221 if (!attrListHandle.isValid()) {
232 newone->copyData(*attlist);
235 auto streams =
m_decSvc->getStreams();
236 for (
auto it = streams.begin();
237 it != streams.end(); ++it) {
238 newone->extend(*it,boolTypeStr);
239 (*newone)[*it].data<
bool>() =
m_decSvc->isEventAccepted(*it,Gaudi::Hive::currentContext());
249 ATH_MSG_DEBUG(
"Decisions already added by a different stream");
262 if (wh.record(std::unique_ptr<DataHeader>(
m_dataHeader)).isFailure()) {
264 return(StatusCode::FAILURE);
271 return(StatusCode::SUCCESS);
278 std::set<std::string> insertedTags{};
282 std::unique_ptr<SG::TransientAddress> dhTransAddr;
290 if(
auto dhProxy=
m_store->proxy(&src_dh); dhProxy && dhProxy->address() ) {
293 insertedTags.insert(std::move(pTag));
295 else if( dhTransAddr ) {
298 insertedTags.insert(std::move(pTag));
310 const auto & currentKey = (*iter).getKey();
311 if( insertedTags.insert(currentKey).second ) {
335 return(StatusCode::FAILURE);
339 return(StatusCode::SUCCESS);
344 if (athConversionSvc != 0) {
347 return(StatusCode::FAILURE);
350 return(StatusCode::SUCCESS);
357 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
358 return(StatusCode::FAILURE);
361 if (!outputName.empty()) {
366 return(StatusCode::FAILURE);
369 std::vector<DataObject*> dataObjects;
370 for (TypeKeyPairs::const_iterator first = typeKeys.begin(), last = typeKeys.end();
371 first != last; ++first) {
372 const std::string&
type = (*first).first;
373 const std::string& key = (*first).second;
378 return(StatusCode::FAILURE);
380 DataObject* dObj = 0;
385 dObj =
m_store->accessData(clid);
389 dObj =
m_store->accessData(clid, key);
394 return(StatusCode::SUCCESS);
399 dataObjects.push_back(dObj);
402 if (dataObjects.size() == 0) {
404 return(StatusCode::SUCCESS);
407 if (!status.isSuccess()) {
411 return(StatusCode::SUCCESS);
417 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
418 return(StatusCode::FAILURE);
421 std::string outputConnectionString = outputName;
422 const std::string defaultMetaDataString =
"[OutputCollection=MetaDataHdr][PoolContainerPrefix=MetaData]";
423 if (std::string::size_type mpos = outputConnectionString.find(defaultMetaDataString); mpos!=std::string::npos) {
440 std::map<DataObject*, IOpaqueAddress*> written;
441 for (DataObject* dobj : dataObjects) {
444 ATH_MSG_DEBUG(
"Explicit request to write DataHeader: " << dobj->name() <<
" - skipping it.");
446 }
else if (written.find(dobj) != written.end()) {
448 ATH_MSG_DEBUG(
"Trying to write DataObject twice (clid/key): " << dobj->clID() <<
" " << dobj->name());
452 IOpaqueAddress* addr =
new TokenAddress(0, dobj->clID(), outputConnectionString);
455 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dobj, addr));
457 ATH_MSG_ERROR(
"Could not create Rep for DataObject (clid/key):" << dobj->clID() <<
" " << dobj->name());
458 return(StatusCode::FAILURE);
464 IOpaqueAddress* addr =
new TokenAddress(0, dataHeaderObj->clID(), outputConnectionString);
467 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dataHeaderObj, addr));
470 return(StatusCode::FAILURE);
473 for (DataObject* dobj : dataObjects) {
476 if (proxy !=
nullptr && written.find(dobj) != written.end()) {
477 IOpaqueAddress* addr(written.find(dobj)->second);
479 if (dobj->clID() != 1 || addr->par()[0] !=
"\n") {
485 if (proxy->address() ==
nullptr) {
486 proxy->setAddress(addr);
491 ATH_MSG_ERROR(
"Could not fill Object Refs for DataObject (clid/key):" << dobj->clID() <<
" " << dobj->name());
492 return(StatusCode::FAILURE);
495 ATH_MSG_WARNING(
"Could cast DataObject " << dobj->clID() <<
" " << dobj->name());
502 if (proxy !=
nullptr && written.find(dataHeaderObj) != written.end()) {
503 IOpaqueAddress* addr(written.find(dataHeaderObj)->second);
505 if (dataHeaderObj->clID() != 1 || addr->par()[0] !=
"\n") {
515 return(StatusCode::FAILURE);
519 return(StatusCode::FAILURE);
522 return(StatusCode::SUCCESS);
526 const std::string hltKey =
"HLTAutoKey";
529 if (
m_store->retrieve(beg, ending).isFailure() || beg == ending) {
532 for ( ; beg != ending; ++beg) {
534 for (std::vector<DataHeaderElement>::const_iterator it = beg->begin(), itLast = beg->end();
535 it != itLast; ++it) {
537 CLID clid = it->getPrimaryClassID();
541 std::string typeName;
542 if (
m_clidSvc->getTypeNameOfID(clid, typeName).isFailure() && it->getKey().find(
"Aux.") == std::string::npos) {
544 ATH_MSG_WARNING(
"Skipping " << it->getKey() <<
" with unknown clid " << clid <<
" . Further warnings for this item are suppressed" );
549 ATH_MSG_DEBUG(
"Adding " << typeName <<
"#" << it->getKey() <<
" (clid " << clid <<
") to itemlist");
550 const std::string keyName = it->getKey();
551 if (keyName.size() > 10 && keyName.compare(0, 10,hltKey)==0) {
552 p2BWrittenFromTool->
add(clid, hltKey +
"*").ignore();
553 }
else if (keyName.size() > 10 && keyName.compare(keyName.size() - 10, 10, hltKey)==0) {
554 p2BWrittenFromTool->
add(clid,
"*" + hltKey).ignore();
556 p2BWrittenFromTool->
add(clid, keyName).ignore();
564 return(StatusCode::SUCCESS);
#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_INFO(x,...)
uint32_t CLID
The Class ID type.
An AttributeList represents a logical row of attributes in a metadata table.
This file contains the class definition for the TokenAddress class.
Base class for all conversion services.
virtual StatusCode disconnectOutput(const std::string &output)
Disconnect output files from the service.
An AttributeList represents a logical row of attributes in a metadata table.
a const_iterator facade to DataHandle.
a run-time configurable list of data objects
virtual StatusCode add(const std::string &typeName, const std::string &skey)=0
add a data object identifier to the list
This class provides a Generic Transient Address for POOL tokens.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
static constexpr CLID ID()