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

StoreGateSvc * eventStore () const
 Return pointer to active event SG.

Private Attributes

ServiceHandle< StoreGateSvc > m_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 30 of file AthenaPoolAddressProviderSvc.cxx.

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

◆ ~AthenaPoolAddressProviderSvc()

AthenaPoolAddressProviderSvc::~AthenaPoolAddressProviderSvc ( )
virtual

Destructor.

Definition at line 37 of file AthenaPoolAddressProviderSvc.cxx.

37 {
38}

Member Function Documentation

◆ eventStore()

StoreGateSvc * AthenaPoolAddressProviderSvc::eventStore ( ) const
private

Return pointer to active event SG.

Definition at line 40 of file AthenaPoolAddressProviderSvc.cxx.

40 {
42}
static StoreGateSvc * currentStoreGate()
get current StoreGate

◆ initialize()

StatusCode AthenaPoolAddressProviderSvc::initialize ( )
overridevirtual

Required of all Gaudi Services.

Definition at line 44 of file AthenaPoolAddressProviderSvc.cxx.

44 {
45
46 ATH_CHECK( m_metaDataStore.retrieve() );
47 ATH_CHECK( m_clidSvc.retrieve() );
48
49 return StatusCode::SUCCESS;
50}
#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 80 of file AthenaPoolAddressProviderSvc.cxx.

81 {
82 if (storeID != StoreID::EVENT_STORE && storeID != StoreID::PILEUP_STORE) {
83 return StatusCode::SUCCESS;
84 }
85
86 Guid thisFile = Guid::null();
87 const DataHeader* dataHeader = nullptr;
88 if (dataHeader == nullptr) { // New file (or reading DataHeader)
89 SG::ReadHandle<DataHeader> eventDataHeader(m_dataHeaderKey.value(), eventStore());
90 if (!eventDataHeader.isValid()) {
91 ATH_MSG_ERROR("Cannot retrieve DataHeader from StoreGate: " << m_dataHeaderKey);
92 return StatusCode::FAILURE;
93 }
94 dataHeader = eventDataHeader.cptr();
95 }
96 // second data header
97 if (m_attrListKey.value() != "") {
98 const AthenaAttributeList* attrList = nullptr;
99 std::string tokenStr;
100 if (eventStore()->retrieve(attrList, m_attrListKey.value()).isSuccess()) {
101 try {
102 tokenStr = (*attrList)["eventRef_secondary"].data<std::string>();
103 ATH_MSG_DEBUG("found AthenaAttribute, name = eventRef_secondary = " << tokenStr);
104 } catch (std::exception &e) {
105 ATH_MSG_ERROR(e.what());
106 return StatusCode::FAILURE;
107 }
108 } else {
109 ATH_MSG_ERROR("Cannot find AthenaAttribute, key = " << m_attrListKey.value());
110 return StatusCode::FAILURE;
111 }
112 IOpaqueAddress* iop = new GenericAddress(pool::POOL_StorageType.type(), ClassID_traits<DataHeader>::ID(), tokenStr, "SecondaryEventSelector");
113 if (!eventStore()->recordAddress(iop).isSuccess()) {
114 ATH_MSG_ERROR("Cannot record address to StoreGate with token string: " << tokenStr);
115 return StatusCode::FAILURE;
116 }
117 ATH_MSG_DEBUG("Created dataHeader SecondaryEventSelector");
118 }
120 bool doRegister = dataHeader->dhFormToken().empty() ||
121 m_dhFormKeys.emplace (dataHeader->dhFormToken()).second;
122 ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects");
123 for (const auto& element : *dataHeader) {
124 if (doRegister) {
126 }
127 SG::TransientAddress* tadd = element.getAddress(pool::POOL_StorageType.type());
128 if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference
129 delete tadd; tadd = nullptr;
130 } else {
131 ATH_MSG_DEBUG("loadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
132 tadd->setProvider(this, storeID);
133 tads.push_back(tadd);
134 }
135 }
136 m_guid = thisFile;
137 return StatusCode::SUCCESS;
138}
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(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:84

◆ 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 52 of file AthenaPoolAddressProviderSvc.cxx.

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

142 {
143 return StatusCode::FAILURE;
144}

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: