ATLAS Offline Software
AthenaPoolAddressProviderSvc.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
12 #include "registerKeys.h"
13 
17 
18 // Framework
19 #include "GaudiKernel/IClassIDSvc.h"
20 #include "GaudiKernel/GenericAddress.h"
21 #include "GaudiKernel/StatusCode.h"
22 
23 #include "StoreGate/StoreGateSvc.h"
24 #include "StoreGate/ReadHandle.h"
25 #include "StoreGate/WriteHandle.h"
26 
27 #include <vector>
28 
29 //________________________________________________________________________________
30 AthenaPoolAddressProviderSvc::AthenaPoolAddressProviderSvc(const std::string& name, ISvcLocator* pSvcLocator) :
31  ::AthService(name, pSvcLocator),
32  m_metaDataStore("MetaDataStore", name),
33  m_clidSvc("ClassIDSvc", name),
34  m_guid() {
35  declareProperty("DataHeaderKey", m_dataHeaderKey = "EventSelector");
36  declareProperty("AttributeListKey", m_attrListKey = "");
37 }
38 //________________________________________________________________________________
40 }
41 //________________________________________________________________________________
44 }
45 //________________________________________________________________________________
47  if (!::AthService::initialize().isSuccess()) {
48  ATH_MSG_FATAL("Cannot initialize AthService base class.");
49  return(StatusCode::FAILURE);
50  }
51  // Retrieve MetaDataStore
52  if (!m_metaDataStore.retrieve().isSuccess()) {
53  ATH_MSG_FATAL("Cannot get MetaDataStore.");
54  return(StatusCode::FAILURE);
55  }
56  // Retrieve ClassIDSvc
57  if (!m_clidSvc.retrieve().isSuccess()) {
58  ATH_MSG_FATAL("Cannot get ClassIDSvc.");
59  return(StatusCode::FAILURE);
60  }
61  return(StatusCode::SUCCESS);
62 }
63 //________________________________________________________________________________
65  // Release ClassIDSvc
66  if (!m_clidSvc.release().isSuccess()) {
67  ATH_MSG_WARNING("Cannot release ClassIDSvc.");
68  }
69  // Release MetaDataStore
70  if (!m_metaDataStore.release().isSuccess()) {
71  ATH_MSG_WARNING("Cannot release MetaDataStore.");
72  }
73  return(::AthService::finalize());
74 }
75 //________________________________________________________________________________
76 StatusCode AthenaPoolAddressProviderSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) {
77  return(::AthService::queryInterface(riid, ppvInterface));
78 }
79 //________________________________________________________________________________
82  if (storeID != StoreID::DETECTOR_STORE) {
83  return(StatusCode::SUCCESS);
84  }
85  ServiceHandle<StoreGateSvc> detectorStoreSvc("DetectorStore", name());
86  if (!detectorStoreSvc.retrieve().isSuccess()) {
87  ATH_MSG_ERROR("Cannot get DetectorStore.");
88  return(StatusCode::FAILURE);
89  }
90  SG::ReadHandle<DataHeader> dataHeader("CondProxyProvider", detectorStoreSvc->name());
91  if (!dataHeader.isValid()) {
92  ATH_MSG_DEBUG("Cannot retrieve DataHeader from DetectorStore.");
93  return(StatusCode::SUCCESS);
94  }
95  ATH_MSG_DEBUG("The current File contains: " << dataHeader->size() << " objects");
96  for (const auto& element : *dataHeader) {
97  SG::TransientAddress* tadd = element.getAddress();
98  if (tadd->clID() == ClassID_traits<DataHeader>::ID()) {
99  delete tadd; tadd = nullptr;
100  } else {
101  ATH_MSG_DEBUG("preLoadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
102  tads.push_back(tadd);
103  }
104  EventSelectorAthenaPoolUtil::registerKeys(element, &*detectorStoreSvc);
105  }
106  if (!detectorStoreSvc.release().isSuccess()) {
107  ATH_MSG_WARNING("Cannot release DetectorStoreSvc.");
108  }
109  return(StatusCode::SUCCESS);
110 }
111 //________________________________________________________________________________
114  if (storeID != StoreID::EVENT_STORE && storeID != StoreID::PILEUP_STORE) {
115  return(StatusCode::SUCCESS);
116  }
117 
118  Guid thisFile = Guid::null();
119  const DataHeader* dataHeader = nullptr;
120  if (dataHeader == nullptr) { // New file (or reading DataHeader)
121  SG::ReadHandle<DataHeader> eventDataHeader(m_dataHeaderKey.value(), eventStore()->name());
122  if (!eventDataHeader.isValid()) {
123  ATH_MSG_ERROR("Cannot retrieve DataHeader from StoreGate: " << m_dataHeaderKey);
124  return(StatusCode::FAILURE);
125  }
126  dataHeader = eventDataHeader.cptr();
127  }
128  // second data header
129  if (m_attrListKey.value() != "") {
130  const AthenaAttributeList* attrList = nullptr;
131  std::string tokenStr;
132  if (eventStore()->retrieve(attrList, m_attrListKey.value()).isSuccess()) {
133  try {
134  tokenStr = (*attrList)["eventRef_secondary"].data<std::string>();
135  ATH_MSG_DEBUG("found AthenaAttribute, name = eventRef_secondary = " << tokenStr);
136  } catch (std::exception &e) {
137  ATH_MSG_ERROR(e.what());
138  return (StatusCode::FAILURE);
139  }
140  } else {
141  ATH_MSG_ERROR("Cannot find AthenaAttribute, key = " << m_attrListKey.value());
142  return (StatusCode::FAILURE);
143  }
144  IOpaqueAddress* iop = new GenericAddress(POOL_StorageType, ClassID_traits<DataHeader>::ID(), tokenStr, "SecondaryEventSelector");
145  if (!eventStore()->recordAddress(iop).isSuccess()) {
146  ATH_MSG_ERROR("Cannot record address to StoreGate with token string: " << tokenStr);
147  return(StatusCode::FAILURE);
148  }
149  ATH_MSG_DEBUG("Created dataHeader SecondaryEventSelector");
150  }
151  ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects");
152  for (const auto& element : *dataHeader) {
153  SG::TransientAddress* tadd = element.getAddress();
154  if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference
155  delete tadd; tadd = nullptr;
156  } else {
157  ATH_MSG_DEBUG("loadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
158  tadd->setProvider(this, storeID);
159  tads.push_back(tadd);
160  }
162  }
163  m_guid = thisFile;
164  return(StatusCode::SUCCESS);
165 }
166 //________________________________________________________________________________
168  SG::TransientAddress* /*tad*/,
169  const EventContext& /*ctx*/) {
170  return(StatusCode::FAILURE);
171 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
CurrentEventStore.h
Hold a pointer to the current event store.
registerKeys.h
Helper functions for registering hash keys with the SG service.
Guid::null
static const Guid & null()
NULL-Guid: static class method.
Definition: Guid.cxx:18
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:53
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
initialize
void initialize()
Definition: run_EoverP.cxx:894
SG::TransientAddress
Definition: TransientAddress.h:32
AthenaPoolAddressProviderSvc::m_guid
Guid m_guid
Definition: AthenaPoolAddressProviderSvc.h:62
AthenaPoolAddressProviderSvc::m_clidSvc
ServiceHandle< IClassIDSvc > m_clidSvc
Definition: AthenaPoolAddressProviderSvc.h:61
AthenaPoolAddressProviderSvc::updateAddress
virtual StatusCode updateAddress(StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx)
Update a transient address.
Definition: AthenaPoolAddressProviderSvc.cxx:167
AthenaPoolAddressProviderSvc::m_metaDataStore
ServiceHandle< StoreGateSvc > m_metaDataStore
Definition: AthenaPoolAddressProviderSvc.h:60
SG::TransientAddress::name
const std::string & name() const
Get the primary (hashed) SG key.
Definition: TransientAddress.h:208
EventSelectorAthenaPoolUtil::registerKeys
void registerKeys(const DataHeaderElement &dhe, StoreGateSvc *store)
Register all hash keys for one DH Element.
Definition: registerKeys.cxx:22
WriteHandle.h
Handle class for recording to StoreGate.
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
AthenaPoolAddressProviderSvc::preLoadAddresses
virtual StatusCode preLoadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads)
Get all addresses from provider.
Definition: AthenaPoolAddressProviderSvc.cxx:80
AthenaPoolAddressProviderSvc::initialize
virtual StatusCode initialize()
Required of all Gaudi Services.
Definition: AthenaPoolAddressProviderSvc.cxx:46
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AthenaPoolAddressProviderSvc::m_dataHeaderKey
StringProperty m_dataHeaderKey
DataHeaderKey, StoreGate key of event entry object (type DataHeader).
Definition: AthenaPoolAddressProviderSvc.h:66
StoreID::PILEUP_STORE
@ PILEUP_STORE
Definition: StoreID.h:31
DataHeader
This class provides the layout for summary information stored for data written to POOL.
Definition: DataHeader.h:124
DataHeader::size
int size() const
Definition: DataHeader.cxx:251
AthenaPoolAddressProviderSvc::finalize
virtual StatusCode finalize()
Required of all Gaudi Services.
Definition: AthenaPoolAddressProviderSvc.cxx:64
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AthService
Definition: AthService.h:32
SG::TransientAddress::clID
CLID clID() const
Retrieve string key:
Definition: TransientAddress.h:201
StoreGateSvc::currentStoreGate
static StoreGateSvc * currentStoreGate()
get current StoreGate
Definition: StoreGateSvc.cxx:69
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:40
calibdata.exception
exception
Definition: calibdata.py:496
AthenaAttributeList
An AttributeList represents a logical row of attributes in a metadata table. The name and type of eac...
Definition: PersistentDataModel/PersistentDataModel/AthenaAttributeList.h:45
DataHeader.h
This file contains the class definition for the DataHeader and DataHeaderElement classes.
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
AthenaPoolAddressProviderSvc::m_attrListKey
Gaudi::Property< std::string > m_attrListKey
Attribute list key of a secondary input file.
Definition: AthenaPoolAddressProviderSvc.h:70
StoreID::DETECTOR_STORE
@ DETECTOR_STORE
Definition: StoreID.h:27
SG::TransientAddress::setProvider
void setProvider(IAddressProvider *provider, StoreID::type storeID)
Definition: TransientAddress.h:317
AthenaPoolAddressProviderSvc::loadAddresses
virtual StatusCode loadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads)
Get all addresses for this event from provider.
Definition: AthenaPoolAddressProviderSvc.cxx:112
AthenaPoolAddressProviderSvc::~AthenaPoolAddressProviderSvc
virtual ~AthenaPoolAddressProviderSvc()
Destructor.
Definition: AthenaPoolAddressProviderSvc.cxx:39
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
AthenaAttributeList.h
An AttributeList represents a logical row of attributes in a metadata table. The name and type of eac...
AthenaPoolAddressProviderSvc.h
This file contains the class definition for the AthenaPoolAddressProviderSvc class.
TokenAddress.h
This file contains the class definition for the TokenAddress class.
AthenaPoolAddressProviderSvc::queryInterface
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvInterface)
Does this object satisfy a given interface? See Gaudi documentation for details.
Definition: AthenaPoolAddressProviderSvc.cxx:76
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
Guid
This class provides a encapsulation of a GUID/UUID/CLSID/IID data structure (128 bit number).
Definition: Guid.h:20
StoreID::type
type
Definition: StoreID.h:24
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
AthenaPoolAddressProviderSvc::AthenaPoolAddressProviderSvc
AthenaPoolAddressProviderSvc(const std::string &name, ISvcLocator *pSvcLocator)
Standard Service Constructor.
Definition: AthenaPoolAddressProviderSvc.cxx:30
IAddressProvider::tadList
std::list< SG::TransientAddress * > tadList
Definition: IAddressProvider.h:32
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
StoreID::EVENT_STORE
@ EVENT_STORE
Definition: StoreID.h:26
ReadHandle.h
Handle class for reading from StoreGate.
AthenaPoolAddressProviderSvc::eventStore
StoreGateSvc * eventStore() const
Return pointer to active event SG.
Definition: AthenaPoolAddressProviderSvc.cxx:42
StoreGateSvc.h
ServiceHandle< StoreGateSvc >