13#include "GaudiKernel/IOpaqueAddress.h"
14#include "GaudiKernel/INamedInterface.h"
15#include "GaudiKernel/IClassIDSvc.h"
16#include "GaudiKernel/ThreadLocalContext.h"
31 const std::string& name,
32 const IInterface* parent) : base_class(
type, name, parent),
34 m_decSvc(
"DecisionSvc/DecisionSvc", name) {
54 const INamedInterface* parentAlg =
dynamic_cast<const INamedInterface*
>(parent());
65 const std::string keyword =
"[AttributeListKey=";
66 std::string::size_type pos =
m_outputName.value().find(keyword);
67 if( (pos != std::string::npos) ) {
69 const std::string attrListKey =
m_outputName.value().substr(pos + keyword.size(),
70 m_outputName.value().find(
']', pos + keyword.size()) - pos - keyword.size());
100 return(StatusCode::SUCCESS);
104 const std::string& cnvSvc,
105 bool extendProvenenceRecord) {
108 if (
m_store.release().isFailure()) {
113 if (cnvSvc !=
m_conversionSvc.type() && cnvSvc !=
"EventPersistencySvc") {
120 return(StatusCode::FAILURE);
124 auto pprop =
dynamic_cast<const IProperty*
>(parent());
127 return(StatusCode::FAILURE);
129 auto keep =
dynamic_cast<const StringProperty&
>( pprop->getProperty(
"KeepProvenanceTagsRegEx") );
141 return(StatusCode::FAILURE);
143 return(StatusCode::SUCCESS);
150 if (!outputName.empty()) {
155 return(StatusCode::FAILURE);
164 return(StatusCode::FAILURE);
173 if (
m_store->removeDataAndProxy(preDh).isFailure()) {
175 return(StatusCode::FAILURE);
187 std::vector<std::string> dhKeys;
190 const std::string boolTypeStr{
"bool"};
191 for (
const std::string& dhKey : dhKeys) {
192 bool primaryDH =
false;
194 if (dhKey ==
"EventSelector") primaryDH =
true;
195 ATH_MSG_DEBUG(
"No transientContains DataHeader with key {}", dhKey);
197 if (
m_store->retrieve(dh, dhKey).isFailure()) {
198 ATH_MSG_DEBUG(
"Unable to retrieve the DataHeader with key {}", dhKey);
205 if (dh->
isInput() || primaryDH) {
213 if (!attrListHandle.isValid()) {
224 newone->copyData(*attlist);
227 auto streams =
m_decSvc->getStreams();
228 for (
auto it = streams.begin();
229 it != streams.end(); ++it) {
230 newone->extend(*it,boolTypeStr);
231 (*newone)[*it].data<
bool>() =
m_decSvc->isEventAccepted(*it,Gaudi::Hive::currentContext());
242 ATH_MSG_DEBUG(
"Decisions already added by a different stream");
255 if (wh.record(std::unique_ptr<DataHeader>(
m_dataHeader)).isFailure()) {
257 return(StatusCode::FAILURE);
264 return(StatusCode::SUCCESS);
271 std::set<std::string> insertedTags{};
275 std::unique_ptr<SG::TransientAddress> dhTransAddr;
283 if(
auto dhProxy=
m_store->proxy(&src_dh); dhProxy && dhProxy->address() ) {
286 insertedTags.insert(std::move(pTag));
288 else if( dhTransAddr ) {
291 insertedTags.insert(std::move(pTag));
303 const auto & currentKey = (*iter).getKey();
304 if( insertedTags.insert(currentKey).second ) {
328 return(StatusCode::FAILURE);
332 return(StatusCode::SUCCESS);
337 if (athConversionSvc != 0) {
340 return(StatusCode::FAILURE);
343 return(StatusCode::SUCCESS);
350 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
351 return(StatusCode::FAILURE);
354 if (!outputName.empty()) {
359 return(StatusCode::FAILURE);
362 std::vector<DataObject*> dataObjects;
363 for (TypeKeyPairs::const_iterator first = typeKeys.begin(), last = typeKeys.end();
364 first != last; ++first) {
365 const std::string&
type = (*first).first;
366 const std::string& key = (*first).second;
371 return(StatusCode::FAILURE);
373 DataObject* dObj = 0;
378 dObj =
m_store->accessData(clid);
382 dObj =
m_store->accessData(clid, key);
387 return(StatusCode::SUCCESS);
392 dataObjects.push_back(dObj);
395 if (dataObjects.size() == 0) {
397 return(StatusCode::SUCCESS);
400 if (!status.isSuccess()) {
404 return(StatusCode::SUCCESS);
410 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
411 return(StatusCode::FAILURE);
414 std::string outputConnectionString = outputName;
415 const std::string defaultMetaDataString =
"[OutputCollection=MetaDataHdr][PoolContainerPrefix=MetaData]";
416 if (std::string::size_type mpos = outputConnectionString.find(defaultMetaDataString); mpos!=std::string::npos) {
433 std::map<DataObject*, IOpaqueAddress*> written;
434 for (DataObject* dobj : dataObjects) {
437 ATH_MSG_DEBUG(
"Explicit request to write DataHeader: {} - skipping it.",
440 }
else if (written.find(dobj) != written.end()) {
442 ATH_MSG_DEBUG(
"Trying to write DataObject twice (clid/key): {} {}",
443 dobj->clID(), dobj->name());
447 IOpaqueAddress* addr =
new TokenAddress(0, dobj->clID(), outputConnectionString);
450 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dobj, addr));
452 ATH_MSG_ERROR(
"Could not create Rep for DataObject (clid/key):{} {}",
453 dobj->clID(), dobj->name());
454 return(StatusCode::FAILURE);
460 IOpaqueAddress* addr =
new TokenAddress(0, dataHeaderObj->clID(), outputConnectionString);
463 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dataHeaderObj, addr));
466 return(StatusCode::FAILURE);
469 for (DataObject* dobj : dataObjects) {
472 if (proxy !=
nullptr && written.find(dobj) != written.end()) {
473 IOpaqueAddress* addr(written.find(dobj)->second);
475 if (dobj->clID() != 1 || addr->par()[0] !=
"\n") {
481 if (proxy->address() ==
nullptr) {
482 proxy->setAddress(addr);
487 ATH_MSG_ERROR(
"Could not fill Object Refs for DataObject (clid/key):{} {}",
488 dobj->clID(), dobj->name());
489 return(StatusCode::FAILURE);
493 dobj->clID(), dobj->name());
500 if (proxy !=
nullptr && written.find(dataHeaderObj) != written.end()) {
501 IOpaqueAddress* addr(written.find(dataHeaderObj)->second);
503 if (dataHeaderObj->clID() != 1 || addr->par()[0] !=
"\n") {
513 return(StatusCode::FAILURE);
517 return(StatusCode::FAILURE);
520 return(StatusCode::SUCCESS);
524 const std::string hltKey =
"HLTAutoKey";
527 if (
m_store->retrieve(beg, ending).isFailure() || beg == ending) {
530 for ( ; beg != ending; ++beg) {
532 for (std::vector<DataHeaderElement>::const_iterator it = beg->begin(), itLast = beg->end();
533 it != itLast; ++it) {
535 CLID clid = it->getPrimaryClassID();
539 std::string typeName;
540 if (
m_clidSvc->getTypeNameOfID(clid, typeName).isFailure() && it->getKey().find(
"Aux.") == std::string::npos) {
542 ATH_MSG_WARNING(
"Skipping {} with unknown clid {} . Further warnings for this item are suppressed",
549 typeName, it->getKey(), clid);
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()