ATLAS Offline Software
Loading...
Searching...
No Matches
ReadCondHandle.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef STOREGATE_READCONDHANDLE_H
6#define STOREGATE_READCONDHANDLE_H 1
7
10
15
16#include "GaudiKernel/DataObjID.h"
17#include "GaudiKernel/EventIDBase.h"
18#include "GaudiKernel/EventContext.h"
19#include "GaudiKernel/ThreadLocalContext.h"
20
21#include <string>
22#include <stdexcept>
23#include <any>
24
25
26namespace SG {
27
28
35 void ReadCondHandleNotFound (const CondContBase& cc,
36 const EventIDBase& eid,
37 const std::string& key);
38
39 template <typename T>
41
42 public:
43 typedef T* pointer_type; // FIXME: better handling of
44 typedef const T* const_pointer_type; // qualified T type ?
45 typedef T& reference_type;
46 typedef const T& const_reference_type;
47
48 public:
51 const EventContext& ctx);
52
53 ReadCondHandle(SG::ReadCondHandleKey<T>&& key) = delete; // Not allowed from a temporary.
55 const EventContext& ctx) = delete; // Not allowed from a temporary.
56
58
59 const std::string& key() const { return m_hkey.key(); }
60 const DataObjID& fullKey() const { return m_hkey.fullKey(); }
61
63 const_pointer_type retrieve( const EventIDBase& t);
64
68
69
70 bool isValid();
71 bool isValid(const EventIDBase& t) const ;
72
73 bool range(EventIDRange& r);
74 bool range(const EventIDBase& t, EventIDRange& r) const;
75 const EventIDRange& getRange();
76
77 CondCont<T>* getCC() { return m_cc; }
78
79 private:
80
82
83 EventIDBase m_eid;
84 CondCont<T>* m_cc {nullptr};
85 const T* m_obj { nullptr };
86 const EventIDRange* m_range { nullptr };
87
89 };
90
91
92 //---------------------------------------------------------------------------
93
94 template <typename T>
96 ReadCondHandle(key, Gaudi::Hive::currentContext())
97 {
98 // cppcheck-suppress missingReturn; false positive
99 }
100
101 //---------------------------------------------------------------------------
102
103 template <typename T>
105 const EventContext& ctx):
106 m_eid( ctx.eventID() ),
107 m_cc( key.getCC() ),
108 m_hkey(key)
109 {
110 try {
111 EventIDBase::number_type conditionsRun =
113 if (conditionsRun != EventIDBase::UNDEFNUM) {
114 m_eid.set_run_number (conditionsRun);
115 }
116 }
117 catch (const std::bad_any_cast& e) {
118 throw SG::ExcBadContext (ctx, key.objKey());
119 }
120
121 if (ATH_UNLIKELY(!key.isInit())) {
122 throw SG::ExcUninitKey (key.clid(), key.key(), key.storeHandle().name(),
123 "", "ReadCond");
124 }
125
126 if (ATH_UNLIKELY(m_cc == 0)) {
127 // try to retrieve it
128 StoreGateSvc* cs = m_hkey.getCS();
129 CondContBase *cb(nullptr);
130 if (cs->retrieve(cb, m_hkey.key()).isFailure()) {
131 throw SG::ExcNoCondCont (m_hkey.fullKey().key(), "Can't retrieve.");
132 } else {
133 m_cc = dynamic_cast< CondCont<T>* > (cb);
134 if (m_cc == 0) {
135 throw SG::ExcNoCondCont (m_hkey.fullKey().key(), "Can't dcast CondContBase.");
136 }
137 }
138 }
139 }
140
141 //---------------------------------------------------------------------------
142
143 template <typename T>
144 bool
146
147 if (m_obj != 0) return true;
148
149 if ( ATH_UNLIKELY(!m_cc->find(m_eid, m_obj, &m_range)) ) {
151 m_obj = nullptr;
152 return false;
153 }
154
155 return true;
156 }
157
158 //---------------------------------------------------------------------------
159
160 template <typename T>
161 const T*
163
164 if (m_obj == 0) {
165 if (!initCondHandle()) {
166 // std::ostringstream ost;
167 // m_cc->list(ost);
168 // MsgStream msg(Athena::getMessageSvc(), "ReadCondHandle");
169 // msg << MSG::ERROR
170 // << "ReadCondHandle::retrieve() could not find EventTime "
171 // << m_eid << " for key " << objKey() << "\n"
172 // << ost.str()
173 // << endmsg;
174 return nullptr;
175 }
176 }
177
178 return m_obj;
179 }
180
181 //---------------------------------------------------------------------------
182
183 template <typename T>
184 const T*
185 ReadCondHandle<T>::retrieve(const EventIDBase& eid) {
186 if (eid == m_eid) {
187 return retrieve();
188 }
189
190 // pointer_type obj(0);
191 const_pointer_type cobj(0);
192 if (! (m_cc->find(eid, cobj) ) ) {
193 ReadCondHandleNotFound (*m_cc, eid, m_hkey.objKey());
194 return nullptr;
195 }
196
197 // const_pointer_type cobj = const_cast<const_pointer_type>( obj );
198
199 return cobj;
200 }
201
202 //---------------------------------------------------------------------------
203
204 template <typename T>
205 bool
207
208 return initCondHandle();
209 }
210
211 //---------------------------------------------------------------------------
212
213 template <typename T>
214 bool
215 ReadCondHandle<T>::isValid(const EventIDBase& t) const {
216
217 return (m_cc->valid(t));
218 }
219
220 //---------------------------------------------------------------------------
221
222 template <typename T>
223 bool
225
226 if (m_obj == 0) {
227 if (!initCondHandle()) {
228 return false;
229 }
230 }
231
232 if (m_range) {
233 r = *m_range;
234 return true;
235 }
236
237 return false;
238 }
239
240 template <typename T>
241 const EventIDRange&
243
244 if (m_obj == 0) {
245 if (!initCondHandle()) {
247 }
248 }
249
250 if (!m_range) {
251 throw SG::ExcNoRange();
252 }
253 return *m_range;
254
255 }
256
257
258 //---------------------------------------------------------------------------
259
260 template <typename T>
261 bool
262 ReadCondHandle<T>::range(const EventIDBase& eid, EventIDRange& r) const {
263
264 return ( m_cc->range(eid, r) );
265 }
266
267
268 // helper methods to create a read cond handle from the corresponding key.
269 template <class T>
271 const EventContext& ctx = Gaudi::Hive::currentContext()) {
272 return SG::ReadCondHandle<T>(key, ctx);
273 }
274
282 template <class T>
283 const T* get (const ReadCondHandleKey<T>& key,
284 const EventContext& ctx)
285 {
286 if (key.key().empty()) return nullptr;
287 try {
288 ReadCondHandle<T> h (key, ctx);
289 return h.cptr();
290 }
291 catch (SG::ExcNoCondCont&) {
292 return nullptr;
293 }
294 }
295
296
305 template <class T>
306 StatusCode get (const T*& ptr,
307 const ReadCondHandleKey<T>& key,
308 const EventContext& ctx)
309 {
310 ptr = get(key, ctx);
311 return (ptr || key.empty()) ? StatusCode::SUCCESS : StatusCode::FAILURE;
312 }
313
314}
315
316#endif
317
#define ATH_UNLIKELY(x)
Hold mappings of ranges to condition objects.
Exceptions that can be thrown from StoreGate.
if(febId1==febId2)
Handle class for reading from StoreGate.
Header file for AthHistogramAlgorithm.
EventIDBase::number_type conditionsRun() const
Base class for all conditions containers.
Definition CondCont.h:140
Hold mapping of ranges to condition objects.
Definition CondCont.h:889
Exception — Bad EventContext extension while building ReadCondHandle.
Exception — ReadCondHandle didn't initialize in getRange().
Exception — Can't retrieve CondCont from ReadCondHandle.
Exception — Range not set in ReadCondHandle::getRange().
const_pointer_type operator->()
const_pointer_type operator*()
ReadCondHandle(const SG::ReadCondHandleKey< T > &key)
const_pointer_type retrieve()
bool range(EventIDRange &r)
const EventIDRange * m_range
const SG::ReadCondHandleKey< T > & m_hkey
CondCont< T > * getCC()
ReadCondHandle(SG::ReadCondHandleKey< T > &&key)=delete
const DataObjID & fullKey() const
const T & const_reference_type
CondCont< T > * m_cc
const T * const_pointer_type
ReadCondHandle(SG::ReadCondHandleKey< T > &&key, const EventContext &ctx)=delete
const EventIDRange & getRange()
const_pointer_type cptr()
The Athena Transient Store API.
StatusCode retrieve(const T *&ptr) const
Retrieve the default object into a const T*.
int r
Definition globals.cxx:22
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
=============================================================================
Forward declaration.
void ReadCondHandleNotFound(const CondContBase &cc, const EventIDBase &eid, const std::string &key)
Report a conditions container lookup failure.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())