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,
46 m_clidSvc(
"ClassIDSvc",
name),
47 m_decSvc(
"DecisionSvc/DecisionSvc",
name) {
67 const INamedInterface* parentAlg =
dynamic_cast<const INamedInterface*
>(
parent());
78 const std::string
keyword =
"[AttributeListKey=";
80 if( (
pos != std::string::npos) ) {
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);
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);
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;
294 dhTransAddr.reset( dhe.getAddress(0) );
298 if(
auto dhProxy=
m_store->proxy(&src_dh); dhProxy && dhProxy->address() ) {
301 insertedTags.insert(
pTag);
303 else if( dhTransAddr ) {
306 insertedTags.insert(
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);
374 return(StatusCode::FAILURE);
377 std::vector<DataObject*> dataObjects;
378 for (TypeKeyPairs::const_iterator
first = typeKeys.begin(), last = typeKeys.end();
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);
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();
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" );
558 const std::string
keyName =
it->getKey();
560 p2BWrittenFromTool->
add(clid, hltKey +
"*").ignore();
562 p2BWrittenFromTool->
add(clid,
"*" + hltKey).ignore();
564 p2BWrittenFromTool->
add(clid,
keyName).ignore();
572 return(StatusCode::SUCCESS);