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;
 
  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);
 
  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);