ATLAS Offline Software
Loading...
Searching...
No Matches
ReadCondHandle.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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 CondContBase *cb(nullptr);
129 if (m_hkey.getCS()->retrieve(cb, m_hkey.key()).isFailure()) {
130 throw SG::ExcNoCondCont (m_hkey.fullKey().key(), "Can't retrieve.");
131 } else {
132 m_cc = dynamic_cast< CondCont<T>* > (cb);
133 if (m_cc == 0) {
134 throw SG::ExcNoCondCont (m_hkey.fullKey().key(), "Can't dcast CondContBase.");
135 }
136 }
137 }
138 }
139
140 //---------------------------------------------------------------------------
141
142 template <typename T>
143 bool
145
146 if (m_obj != 0) return true;
147
148 if ( ATH_UNLIKELY(!m_cc->find(m_eid, m_obj, &m_range)) ) {
150 m_obj = nullptr;
151 return false;
152 }
153
154 return true;
155 }
156
157 //---------------------------------------------------------------------------
158
159 template <typename T>
160 const T*
162
163 if (m_obj == 0) {
164 if (!initCondHandle()) {
165 // std::ostringstream ost;
166 // m_cc->list(ost);
167 // MsgStream msg(Athena::getMessageSvc(), "ReadCondHandle");
168 // msg << MSG::ERROR
169 // << "ReadCondHandle::retrieve() could not find EventTime "
170 // << m_eid << " for key " << objKey() << "\n"
171 // << ost.str()
172 // << endmsg;
173 return nullptr;
174 }
175 }
176
177 return m_obj;
178 }
179
180 //---------------------------------------------------------------------------
181
182 template <typename T>
183 const T*
184 ReadCondHandle<T>::retrieve(const EventIDBase& eid) {
185 if (eid == m_eid) {
186 return retrieve();
187 }
188
189 // pointer_type obj(0);
190 const_pointer_type cobj(0);
191 if (! (m_cc->find(eid, cobj) ) ) {
192 ReadCondHandleNotFound (*m_cc, eid, m_hkey.objKey());
193 return nullptr;
194 }
195
196 // const_pointer_type cobj = const_cast<const_pointer_type>( obj );
197
198 return cobj;
199 }
200
201 //---------------------------------------------------------------------------
202
203 template <typename T>
204 bool
206
207 return initCondHandle();
208 }
209
210 //---------------------------------------------------------------------------
211
212 template <typename T>
213 bool
214 ReadCondHandle<T>::isValid(const EventIDBase& t) const {
215
216 return (m_cc->valid(t));
217 }
218
219 //---------------------------------------------------------------------------
220
221 template <typename T>
222 bool
224
225 if (m_obj == 0) {
226 if (!initCondHandle()) {
227 return false;
228 }
229 }
230
231 if (m_range) {
232 r = *m_range;
233 return true;
234 }
235
236 return false;
237 }
238
239 template <typename T>
240 const EventIDRange&
242
243 if (m_obj == 0) {
244 if (!initCondHandle()) {
246 }
247 }
248
249 if (!m_range) {
250 throw SG::ExcNoRange();
251 }
252 return *m_range;
253
254 }
255
256
257 //---------------------------------------------------------------------------
258
259 template <typename T>
260 bool
261 ReadCondHandle<T>::range(const EventIDBase& eid, EventIDRange& r) const {
262
263 return ( m_cc->range(eid, r) );
264 }
265
266
267 // helper methods to create a read cond handle from the corresponding key.
268 template <class T>
270 const EventContext& ctx = Gaudi::Hive::currentContext()) {
271 return SG::ReadCondHandle<T>(key, ctx);
272 }
273
281 template <class T>
282 const T* get (const ReadCondHandleKey<T>& key,
283 const EventContext& ctx)
284 {
285 if (key.key().empty()) return nullptr;
286 try {
287 ReadCondHandle<T> h (key, ctx);
288 return h.cptr();
289 }
290 catch (SG::ExcNoCondCont&) {
291 return nullptr;
292 }
293 }
294
295
304 template <class T>
305 StatusCode get (const T*& ptr,
306 const ReadCondHandleKey<T>& key,
307 const EventContext& ctx)
308 {
309 ptr = get(key, ctx);
310 return (ptr || key.empty()) ? StatusCode::SUCCESS : StatusCode::FAILURE;
311 }
312
313}
314
315#endif
316
#define ATH_UNLIKELY(x)
Hold mappings of ranges to condition objects.
Exceptions that can be thrown from StoreGate.
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()
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())