ATLAS Offline Software
Loading...
Searching...
No Matches
AthenaPoolAddressProviderSvc Class Reference

This class is the EventSelector and AddressProvider for event data. More...

#include <AthenaPoolAddressProviderSvc.h>

Inheritance diagram for AthenaPoolAddressProviderSvc:
Collaboration diagram for AthenaPoolAddressProviderSvc:

Public Member Functions

 AthenaPoolAddressProviderSvc (const std::string &name, ISvcLocator *pSvcLocator)
 Standard Service Constructor.
virtual ~AthenaPoolAddressProviderSvc ()
 Destructor.
virtual StatusCode initialize () override
 Required of all Gaudi Services.
virtual StatusCode preLoadAddresses (StoreID::type storeID, IAddressProvider::tadList &tads) override
 Get all addresses from provider.
virtual StatusCode loadAddresses (StoreID::type storeID, IAddressProvider::tadList &tads) override
 Get all addresses for this event from provider.
virtual StatusCode updateAddress (StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx) override
 Update a transient address.

Private Member Functions

StoreGateSvceventStore () const
 Return pointer to active event SG.

Private Attributes

ServiceHandle< StoreGateSvcm_metaDataStore
ServiceHandle< IClassIDSvc > m_clidSvc
Guid m_guid
std::unordered_set< std::string > m_dhFormKeys
 Set of DataHeader form keys for which we've already done registerKeys.
Gaudi::Property< std::string > m_dataHeaderKey
Gaudi::Property< std::string > m_attrListKey

Detailed Description

This class is the EventSelector and AddressProvider for event data.

Definition at line 28 of file AthenaPoolAddressProviderSvc.h.

Constructor & Destructor Documentation

◆ AthenaPoolAddressProviderSvc()

AthenaPoolAddressProviderSvc::AthenaPoolAddressProviderSvc ( const std::string & name,
ISvcLocator * pSvcLocator )

Standard Service Constructor.

Definition at line 31 of file AthenaPoolAddressProviderSvc.cxx.

31 :
32 base_class(name, pSvcLocator),
33 m_metaDataStore("StoreGateSvc/MetaDataStore", name),
34 m_clidSvc("ClassIDSvc", name),
35 m_guid() {
36}
ServiceHandle< StoreGateSvc > m_metaDataStore
ServiceHandle< IClassIDSvc > m_clidSvc

◆ ~AthenaPoolAddressProviderSvc()

AthenaPoolAddressProviderSvc::~AthenaPoolAddressProviderSvc ( )
virtual

Destructor.

Definition at line 38 of file AthenaPoolAddressProviderSvc.cxx.

38 {
39}

Member Function Documentation

◆ eventStore()

StoreGateSvc * AthenaPoolAddressProviderSvc::eventStore ( ) const
private

Return pointer to active event SG.

Definition at line 41 of file AthenaPoolAddressProviderSvc.cxx.

41 {
43}
static StoreGateSvc * currentStoreGate()
get current StoreGate

◆ initialize()

StatusCode AthenaPoolAddressProviderSvc::initialize ( )
overridevirtual

Required of all Gaudi Services.

Definition at line 45 of file AthenaPoolAddressProviderSvc.cxx.

45 {
46
47 ATH_CHECK( m_metaDataStore.retrieve() );
48 ATH_CHECK( m_clidSvc.retrieve() );
49
50 return StatusCode::SUCCESS;
51}
#define ATH_CHECK
Evaluate an expression and check for errors.

◆ loadAddresses()

StatusCode AthenaPoolAddressProviderSvc::loadAddresses ( StoreID::type storeID,
IAddressProvider::tadList & tads )
overridevirtual

Get all addresses for this event from provider.

Parameters
storeID[IN] store ID, this function only preloads event store addresses.
tads[OUT] list of the transient addresses which were preloaded.

Only call registerKeys() if we haven't seen this form before.

Definition at line 81 of file AthenaPoolAddressProviderSvc.cxx.

82 {
83 if (storeID != StoreID::EVENT_STORE && storeID != StoreID::PILEUP_STORE) {
84 return StatusCode::SUCCESS;
85 }
86
87 Guid thisFile = Guid::null();
88 const DataHeader* dataHeader = nullptr;
89 if (dataHeader == nullptr) { // New file (or reading DataHeader)
90 SG::ReadHandle<DataHeader> eventDataHeader(m_dataHeaderKey.value(), eventStore()->name());
91 if (!eventDataHeader.isValid()) {
92 ATH_MSG_ERROR("Cannot retrieve DataHeader from StoreGate: " << m_dataHeaderKey);
93 return StatusCode::FAILURE;
94 }
95 dataHeader = eventDataHeader.cptr();
96 }
97 // second data header
98 if (m_attrListKey.value() != "") {
99 const AthenaAttributeList* attrList = nullptr;
100 std::string tokenStr;
101 if (eventStore()->retrieve(attrList, m_attrListKey.value()).isSuccess()) {
102 try {
103 tokenStr = (*attrList)["eventRef_secondary"].data<std::string>();
104 ATH_MSG_DEBUG("found AthenaAttribute, name = eventRef_secondary = " << tokenStr);
105 } catch (std::exception &e) {
106 ATH_MSG_ERROR(e.what());
107 return StatusCode::FAILURE;
108 }
109 } else {
110 ATH_MSG_ERROR("Cannot find AthenaAttribute, key = " << m_attrListKey.value());
111 return StatusCode::FAILURE;
112 }
113 IOpaqueAddress* iop = new GenericAddress(pool::POOL_StorageType.type(), ClassID_traits<DataHeader>::ID(), tokenStr, "SecondaryEventSelector");
114 if (!eventStore()->recordAddress(iop).isSuccess()) {
115 ATH_MSG_ERROR("Cannot record address to StoreGate with token string: " << tokenStr);
116 return StatusCode::FAILURE;
117 }
118 ATH_MSG_DEBUG("Created dataHeader SecondaryEventSelector");
119 }
121 bool doRegister = dataHeader->dhFormToken().empty() ||
122 m_dhFormKeys.emplace (dataHeader->dhFormToken()).second;
123 ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects");
124 for (const auto& element : *dataHeader) {
125 if (doRegister) {
127 }
128 SG::TransientAddress* tadd = element.getAddress(pool::POOL_StorageType.type());
129 if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference
130 delete tadd; tadd = nullptr;
131 } else {
132 ATH_MSG_DEBUG("loadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
133 tadd->setProvider(this, storeID);
134 tads.push_back(tadd);
135 }
136 }
137 m_guid = thisFile;
138 return StatusCode::SUCCESS;
139}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
StoreGateSvc * eventStore() const
Return pointer to active event SG.
std::unordered_set< std::string > m_dhFormKeys
Set of DataHeader form keys for which we've already done registerKeys.
Gaudi::Property< std::string > m_attrListKey
Gaudi::Property< std::string > m_dataHeaderKey
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
int size() const
static const Guid & null() noexcept
NULL-Guid: static class method.
Definition Guid.cxx:14
CLID clID() const
Retrieve string key:
const std::string & name() const
Get the primary (hashed) SG key.
void setProvider(IAddressProvider *provider, StoreID::type storeID)
@ EVENT_STORE
Definition StoreID.h:26
@ PILEUP_STORE
Definition StoreID.h:31
void registerKeys(const DataHeaderElement &dhe, StoreGateSvc *store)
Register all hash keys for one DH Element.
static const DbType POOL_StorageType
Definition DbType.h:98
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ preLoadAddresses()

StatusCode AthenaPoolAddressProviderSvc::preLoadAddresses ( StoreID::type storeID,
IAddressProvider::tadList & tads )
overridevirtual

Get all addresses from provider.

Called before begin event.

Parameters
storeID[IN] store ID, this function only preloads detector store addresses.
tads[OUT] list of the transient addresses which were preloaded.

Definition at line 53 of file AthenaPoolAddressProviderSvc.cxx.

54 {
55 if (storeID != StoreID::DETECTOR_STORE) {
56 return StatusCode::SUCCESS;
57 }
58 ServiceHandle<StoreGateSvc> detectorStoreSvc("DetectorStore", name());
59 ATH_CHECK( detectorStoreSvc.retrieve() );
60
61 SG::ReadHandle<DataHeader> dataHeader("CondProxyProvider", detectorStoreSvc->name());
62 if (!dataHeader.isValid()) {
63 ATH_MSG_DEBUG("Cannot retrieve DataHeader from DetectorStore.");
64 return StatusCode::SUCCESS;
65 }
66 ATH_MSG_DEBUG("The current File contains: " << dataHeader->size() << " objects");
67 for (const auto& element : *dataHeader) {
68 SG::TransientAddress* tadd = element.getAddress(pool::POOL_StorageType.type());
69 if (tadd->clID() == ClassID_traits<DataHeader>::ID()) {
70 delete tadd; tadd = nullptr;
71 } else {
72 ATH_MSG_DEBUG("preLoadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
73 tads.push_back(tadd);
74 }
75 EventSelectorAthenaPoolUtil::registerKeys(element, &*detectorStoreSvc);
76 }
77
78 return StatusCode::SUCCESS;
79}
@ DETECTOR_STORE
Definition StoreID.h:27

◆ updateAddress()

StatusCode AthenaPoolAddressProviderSvc::updateAddress ( StoreID::type storeID,
SG::TransientAddress * tad,
const EventContext & ctx )
overridevirtual

Update a transient address.

Parameters
storeID[IN] store ID, this function only preloads event store addresses.
tad[IN] transient address to be updated.

Definition at line 141 of file AthenaPoolAddressProviderSvc.cxx.

143 {
144 return StatusCode::FAILURE;
145}

Member Data Documentation

◆ m_attrListKey

Gaudi::Property<std::string> AthenaPoolAddressProviderSvc::m_attrListKey
private
Initial value:
{this, "AttributeListKey", {},
"Attribute list key of a secondary input file. If non-zero, creates a new IOpaqueAddress for that file and records it."}

Definition at line 65 of file AthenaPoolAddressProviderSvc.h.

65 {this, "AttributeListKey", {},
66 "Attribute list key of a secondary input file. If non-zero, creates a new IOpaqueAddress for that file and records it."};

◆ m_clidSvc

ServiceHandle<IClassIDSvc> AthenaPoolAddressProviderSvc::m_clidSvc
private

Definition at line 56 of file AthenaPoolAddressProviderSvc.h.

◆ m_dataHeaderKey

Gaudi::Property<std::string> AthenaPoolAddressProviderSvc::m_dataHeaderKey
private
Initial value:
{this, "DataHeaderKey", "EventSelector",
"StoreGate key of event entry object"}

Definition at line 62 of file AthenaPoolAddressProviderSvc.h.

62 {this, "DataHeaderKey", "EventSelector",
63 "StoreGate key of event entry object"};

◆ m_dhFormKeys

std::unordered_set<std::string> AthenaPoolAddressProviderSvc::m_dhFormKeys
private

Set of DataHeader form keys for which we've already done registerKeys.

Definition at line 59 of file AthenaPoolAddressProviderSvc.h.

◆ m_guid

Guid AthenaPoolAddressProviderSvc::m_guid
private

Definition at line 57 of file AthenaPoolAddressProviderSvc.h.

◆ m_metaDataStore

ServiceHandle<StoreGateSvc> AthenaPoolAddressProviderSvc::m_metaDataStore
private

Definition at line 55 of file AthenaPoolAddressProviderSvc.h.


The documentation for this class was generated from the following files: