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;
202 for (
const std::string& dhKey : dhKeys) {
203 bool primaryDH =
false;
205 if (dhKey ==
"EventSelector") primaryDH =
true;
206 ATH_MSG_DEBUG(
"No transientContains DataHeader with key " << dhKey);
208 if (
m_store->retrieve(dh, dhKey).isFailure()) {
209 ATH_MSG_DEBUG(
"Unable to retrieve the DataHeader with key " << dhKey);
211 if (dh->isInput() || hasInputAlias(*
m_store->proxy(dh)) || primaryDH) {
219 if (!attrListHandle.isValid()) {
230 newone->copyData(*attlist);
233 auto streams =
m_decSvc->getStreams();
234 for (
auto it = streams.begin();
235 it != streams.end(); ++it) {
236 newone->extend(*it,
"bool");
237 (*newone)[*it].data<
bool>() =
m_decSvc->isEventAccepted(*it,Gaudi::Hive::currentContext());
247 ATH_MSG_DEBUG(
"Decisions already added by a different stream");
270 if (wh.record(std::unique_ptr<DataHeader>(
m_dataHeader)).isFailure()) {
272 return(StatusCode::FAILURE);
279 return(StatusCode::SUCCESS);
286 std::set<std::string> insertedTags{};
290 std::unique_ptr<SG::TransientAddress> dhTransAddr;
298 if(
auto dhProxy=
m_store->proxy(&src_dh); dhProxy && dhProxy->address() ) {
301 insertedTags.insert(std::move(pTag));
303 else if( dhTransAddr ) {
306 insertedTags.insert(std::move(pTag));
318 const auto & currentKey = (*iter).getKey();
319 if( insertedTags.insert(currentKey).second ) {
343 return(StatusCode::FAILURE);
347 return(StatusCode::SUCCESS);
352 if (athConversionSvc != 0) {
355 return(StatusCode::FAILURE);
358 return(StatusCode::SUCCESS);
365 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
366 return(StatusCode::FAILURE);
369 if (!outputName.empty()) {
374 return(StatusCode::FAILURE);
377 std::vector<DataObject*> dataObjects;
378 for (TypeKeyPairs::const_iterator first = typeKeys.begin(), last = typeKeys.end();
379 first != last; ++first) {
380 const std::string&
type = (*first).first;
381 const std::string& key = (*first).second;
386 return(StatusCode::FAILURE);
388 DataObject* dObj = 0;
393 dObj =
m_store->accessData(clid);
397 dObj =
m_store->accessData(clid, key);
402 return(StatusCode::SUCCESS);
407 dataObjects.push_back(dObj);
410 if (dataObjects.size() == 0) {
412 return(StatusCode::SUCCESS);
415 if (!status.isSuccess()) {
419 return(StatusCode::SUCCESS);
425 ATH_MSG_ERROR(
"Connection NOT open. Please open a connection before streaming out objects.");
426 return(StatusCode::FAILURE);
429 std::string outputConnectionString = outputName;
430 const std::string defaultMetaDataString =
"[OutputCollection=MetaDataHdr][PoolContainerPrefix=MetaData]";
431 if (std::string::size_type mpos = outputConnectionString.find(defaultMetaDataString); mpos!=std::string::npos) {
448 std::map<DataObject*, IOpaqueAddress*> written;
449 for (DataObject* dobj : dataObjects) {
452 ATH_MSG_DEBUG(
"Explicit request to write DataHeader: " << dobj->name() <<
" - skipping it.");
454 }
else if (written.find(dobj) != written.end()) {
456 ATH_MSG_DEBUG(
"Trying to write DataObject twice (clid/key): " << dobj->clID() <<
" " << dobj->name());
460 IOpaqueAddress* addr =
new TokenAddress(0, dobj->clID(), outputConnectionString);
463 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dobj, addr));
465 ATH_MSG_ERROR(
"Could not create Rep for DataObject (clid/key):" << dobj->clID() <<
" " << dobj->name());
466 return(StatusCode::FAILURE);
472 IOpaqueAddress* addr =
new TokenAddress(0, dataHeaderObj->clID(), outputConnectionString);
475 written.insert(std::pair<DataObject*, IOpaqueAddress*>(dataHeaderObj, addr));
478 return(StatusCode::FAILURE);
481 for (DataObject* dobj : dataObjects) {
484 if (proxy !=
nullptr && written.find(dobj) != written.end()) {
485 IOpaqueAddress* addr(written.find(dobj)->second);
487 if (dobj->clID() != 1 || addr->par()[0] !=
"\n") {
493 if (proxy->address() ==
nullptr) {
494 proxy->setAddress(addr);
499 ATH_MSG_ERROR(
"Could not fill Object Refs for DataObject (clid/key):" << dobj->clID() <<
" " << dobj->name());
500 return(StatusCode::FAILURE);
503 ATH_MSG_WARNING(
"Could cast DataObject " << dobj->clID() <<
" " << dobj->name());
510 if (proxy !=
nullptr && written.find(dataHeaderObj) != written.end()) {
511 IOpaqueAddress* addr(written.find(dataHeaderObj)->second);
513 if (dataHeaderObj->clID() != 1 || addr->par()[0] !=
"\n") {
523 return(StatusCode::FAILURE);
527 return(StatusCode::FAILURE);
530 return(StatusCode::SUCCESS);
534 const std::string hltKey =
"HLTAutoKey";
537 if (
m_store->retrieve(beg, ending).isFailure() || beg == ending) {
540 for ( ; beg != ending; ++beg) {
542 for (std::vector<DataHeaderElement>::const_iterator it = beg->begin(), itLast = beg->end();
543 it != itLast; ++it) {
545 CLID clid = it->getPrimaryClassID();
549 std::string typeName;
550 if (
m_clidSvc->getTypeNameOfID(clid, typeName).isFailure() && it->getKey().find(
"Aux.") == std::string::npos) {
552 ATH_MSG_WARNING(
"Skipping " << it->getKey() <<
" with unknown clid " << clid <<
" . Further warnings for this item are suppressed" );
557 ATH_MSG_DEBUG(
"Adding " << typeName <<
"#" << it->getKey() <<
" (clid " << clid <<
") to itemlist");
558 const std::string keyName = it->getKey();
559 if (keyName.size() > 10 && keyName.compare(0, 10,hltKey)==0) {
560 p2BWrittenFromTool->
add(clid, hltKey +
"*").ignore();
561 }
else if (keyName.size() > 10 && keyName.compare(keyName.size() - 10, 10, hltKey)==0) {
562 p2BWrittenFromTool->
add(clid,
"*" + hltKey).ignore();
564 p2BWrittenFromTool->
add(clid, keyName).ignore();
572 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())