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");
272 if (wh.record(std::unique_ptr<DataHeader>(
m_dataHeader)).isFailure()) {
274 return(StatusCode::FAILURE);
281 return(StatusCode::SUCCESS);
288 std::set<std::string> insertedTags{};
292 std::unique_ptr<SG::TransientAddress> dhTransAddr;
300 if(
auto dhProxy=
m_store->proxy(&src_dh); dhProxy && dhProxy->address() ) {
303 insertedTags.insert(std::move(pTag));
305 else if( dhTransAddr ) {
308 insertedTags.insert(std::move(pTag));
320 const auto & currentKey = (*iter).getKey();
321 if( insertedTags.insert(currentKey).second ) {
345 return(StatusCode::FAILURE);
349 return(StatusCode::SUCCESS);
354 if (athConversionSvc != 0) {
357 return(StatusCode::FAILURE);
360 return(StatusCode::SUCCESS);
367 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
368 return(StatusCode::FAILURE);
371 if (!outputName.empty()) {
376 return(StatusCode::FAILURE);
379 std::vector<DataObject*> dataObjects;
380 for (TypeKeyPairs::const_iterator first = typeKeys.begin(), last = typeKeys.end();
381 first != last; ++first) {
382 const std::string&
type = (*first).first;
383 const std::string& key = (*first).second;
388 return(StatusCode::FAILURE);
390 DataObject* dObj = 0;
395 dObj =
m_store->accessData(clid);
399 dObj =
m_store->accessData(clid, key);
404 return(StatusCode::SUCCESS);
409 dataObjects.push_back(dObj);
412 if (dataObjects.size() == 0) {
414 return(StatusCode::SUCCESS);
417 if (!status.isSuccess()) {
421 return(StatusCode::SUCCESS);
427 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
428 return(StatusCode::FAILURE);
431 std::string outputConnectionString = outputName;
432 const std::string defaultMetaDataString =
"[OutputCollection=MetaDataHdr][PoolContainerPrefix=MetaData]";
433 if (std::string::size_type mpos = outputConnectionString.find(defaultMetaDataString); mpos!=std::string::npos) {
450 std::map<DataObject*, IOpaqueAddress*> written;
451 for (DataObject* dobj : dataObjects) {
454 ATH_MSG_DEBUG(
"Explicit request to write DataHeader: " << dobj->name() <<
" - skipping it.");
456 }
else if (written.find(dobj) != written.end()) {
458 ATH_MSG_DEBUG(
"Trying to write DataObject twice (clid/key): " << dobj->clID() <<
" " << dobj->name());
462 IOpaqueAddress* addr =
new TokenAddress(0, dobj->clID(), outputConnectionString);
465 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dobj, addr));
467 ATH_MSG_ERROR(
"Could not create Rep for DataObject (clid/key):" << dobj->clID() <<
" " << dobj->name());
468 return(StatusCode::FAILURE);
474 IOpaqueAddress* addr =
new TokenAddress(0, dataHeaderObj->clID(), outputConnectionString);
477 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dataHeaderObj, addr));
480 return(StatusCode::FAILURE);
483 for (DataObject* dobj : dataObjects) {
486 if (proxy !=
nullptr && written.find(dobj) != written.end()) {
487 IOpaqueAddress* addr(written.find(dobj)->second);
489 if (dobj->clID() != 1 || addr->par()[0] !=
"\n") {
495 if (proxy->address() ==
nullptr) {
496 proxy->setAddress(addr);
501 ATH_MSG_ERROR(
"Could not fill Object Refs for DataObject (clid/key):" << dobj->clID() <<
" " << dobj->name());
502 return(StatusCode::FAILURE);
505 ATH_MSG_WARNING(
"Could cast DataObject " << dobj->clID() <<
" " << dobj->name());
512 if (proxy !=
nullptr && written.find(dataHeaderObj) != written.end()) {
513 IOpaqueAddress* addr(written.find(dataHeaderObj)->second);
515 if (dataHeaderObj->clID() != 1 || addr->par()[0] !=
"\n") {
525 return(StatusCode::FAILURE);
529 return(StatusCode::FAILURE);
532 return(StatusCode::SUCCESS);
536 const std::string hltKey =
"HLTAutoKey";
539 if (
m_store->retrieve(beg, ending).isFailure() || beg == ending) {
542 for ( ; beg != ending; ++beg) {
544 for (std::vector<DataHeaderElement>::const_iterator it = beg->begin(), itLast = beg->end();
545 it != itLast; ++it) {
547 CLID clid = it->getPrimaryClassID();
551 std::string typeName;
552 if (
m_clidSvc->getTypeNameOfID(clid, typeName).isFailure() && it->getKey().find(
"Aux.") == std::string::npos) {
554 ATH_MSG_WARNING(
"Skipping " << it->getKey() <<
" with unknown clid " << clid <<
" . Further warnings for this item are suppressed" );
559 ATH_MSG_DEBUG(
"Adding " << typeName <<
"#" << it->getKey() <<
" (clid " << clid <<
") to itemlist");
560 const std::string keyName = it->getKey();
561 if (keyName.size() > 10 && keyName.compare(0, 10,hltKey)==0) {
562 p2BWrittenFromTool->
add(clid, hltKey +
"*").ignore();
563 }
else if (keyName.size() > 10 && keyName.compare(keyName.size() - 10, 10, hltKey)==0) {
564 p2BWrittenFromTool->
add(clid,
"*" + hltKey).ignore();
566 p2BWrittenFromTool->
add(clid, keyName).ignore();
574 return(StatusCode::SUCCESS);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(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()