ATLAS Offline Software
Loading...
Searching...
No Matches
SGxAODProxyLoader.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6// SGxAODProxyLoader.cxx, (c) ATLAS Detector software
8// Author: Thomas Gillam (thomas.gillam@cern.ch)
9// ExpressionParsing library
11// for debugging : #define DEBUG_VARIABLE_LOADING
12
20
21#include "Utils.h"
22#include "DebugUtils.h"
23#include "BaseAccessor.h"
24#include "xAODAccessor.h"
25#include "MethodAccessor.h"
26#include "PlainAccessor.h"
27#include "ClingCallWrapper.h"
28
29
30namespace {
31 void popRenounced(const std::vector<std::string> &renounce,
32 std::vector<Gaudi::DataHandle *> &new_input_handles) {
33 if (!new_input_handles.empty()) {
34 for (const std::string &a_key : renounce) {
35 if (new_input_handles.back()->objKey() == a_key ) {
36 new_input_handles.pop_back();
37 break;
38 }
39 }
40 }
41 }
42}
43
44namespace ExpressionParsing {
46
49
51 m_decorKeys.clear();
52 m_readKeys.clear();
53 m_accessor.clear();
54 }
55
56 void SGxAODProxyLoader::splitVarnameIntoContainerAndMethod(const std::string &varname, std::string &containerName, std::string &methodName) const
57 {
58 size_t dotPosition = varname.find('.');
59 containerName = varname.substr(0, dotPosition);
60 methodName = varname.substr(dotPosition + 1);
61 }
62
63 namespace details {
64 std::pair<RootUtils::ClingCallWrapperUncheckedReturnValue<>, TVirtualCollectionProxy *>
65 getMethodCallAccessor(const std::string &method_name, const std::type_info &info, bool verbose) {
66 if (verbose) {
67 std::cout << "DEBUG SGxAODProxyLoader search for " << method_name << " in type " << info.name() << std::endl;
68 }
69 TClass *containerClass = TClass::GetClass(info);
70 if (!containerClass) {
71 if (verbose) {
72 std::cout << "DEBUG SGxAODProxyLoader search for " << method_name << " in normalisze type " << SG::normalizedTypeinfoName(info) << std::endl;
73 }
74 containerClass = TClass::GetClass(SG::normalizedTypeinfoName(info).c_str());
75 if (!containerClass) {
76 std::stringstream msg;
77 msg << "No dictionary for " << info.name() << std::endl;
78 throw std::runtime_error(msg.str());
79 }
80 }
81 TClass *elementClass=nullptr;
82 TVirtualCollectionProxy *collection_proxy=nullptr;
83 if( strcmp(containerClass->GetName(),"SG::AuxElementStandaloneData")==0 ) {
84 elementClass=containerClass;
85 }
86 else {
87 collection_proxy = containerClass->GetCollectionProxy();
88 elementClass = (collection_proxy ? collection_proxy->GetValueClass() : nullptr);
89 if (!elementClass) {
90 std::stringstream msg;
91 msg << "No collection proxy or element class for " << info.name() << std::endl;
92 throw std::runtime_error(msg.str());
93 }
94 }
96 if (verbose) {
97 std::cout << "DEBUG SGxAODProxyLoader got method " << " . " << method_name << " : "
98 << method_wrapper.getReturnTypeNormalizedName()
99 << "wrapper="<< typeid(method_wrapper).name()
100 << std::endl;
101 }
102 return std::make_pair(method_wrapper, collection_proxy);
103 }
104 }
105
106 template <class T_Aux>
107 std::unique_ptr<IAccessor> SGxAODProxyLoader::createAccessor(const EventContext& ctx,
108 const SG::ReadHandleKey<T_Aux> &key,
109 const SG::ReadDecorHandleKey<T_Aux> *decor_key,
110 SG::auxid_t method_id,
111 const std::string &method_name) const
112 {
113 SG::ReadHandle<T_Aux> handle(key, ctx);
114 if (!handle.isValid()) {
115 std::stringstream amsg;
116 amsg << "Failed to get " << key.key();
117 throw std::runtime_error(amsg.str());
118 }
119 if (getContainerSize(*handle)==0) {
120 return std::unique_ptr<IAccessor>();
121 }
122 if (!isAvailable(*handle,method_id)) {
123 auto [method_wrapper, proxy]
124 = details::getMethodCallAccessor(method_name, typeid(*handle), m_verbose);
125 return MethodAccessorFactory::instance().create( key, std::move(method_wrapper), proxy);
126 }
127 else {
128 return ExpressionParsing::AccessorFactory::instance().create( key, method_id , decor_key );
129 }
130 }
131
133 std::unordered_map<std::string, CxxUtils::CachedUniquePtrT<IAccessor> >::const_iterator accessor_iter,
134 const std::string &varname) const
135 {
136 const IProxyDict *proxy = Atlas::getExtendedEventContext( ctx ).proxy();
137 (void) proxy;
138 std::string container_name;
139 std::string method_name;
140 splitVarnameIntoContainerAndMethod(varname,container_name, method_name);
141 ReadHandleMap::const_iterator key_iter = m_readKeys.find(container_name);
142 if (key_iter == m_readKeys.end()) {
143 std::stringstream msg;
144 msg << "No read handle key for " << container_name;
145 throw std::runtime_error(msg.str());
146 }
147 SG::auxid_t method_id = SG::null_auxid;
148 ReadDecorHandleMap::const_iterator decor_key_iter = m_decorKeys.end();
149 if (ReadHandleMap::isVector(key_iter->second) || ReadHandleMap::isElement(key_iter->second)) {
150 method_id = SG::AuxTypeRegistry::instance().findAuxID(method_name,"");
151 if (method_id != SG::null_auxid) {
152 decor_key_iter=m_decorKeys.find(varname);
153 }
154 }
155 std::unique_ptr<IAccessor> accessor;
156 if (ReadHandleMap::isVector(key_iter->second)) {
157 if (m_verbose) { std::cout << "DEBUG SGxAODProxyLoader::computeClassForVarname is Vector: " << varname << std::endl; }
158 accessor = createAccessor(ctx,
159 ReadHandleMap::vectorKey(key_iter->second),
160 (decor_key_iter != m_decorKeys.end() ? &ReadDecorHandleMap::vectorKey(decor_key_iter->second) : nullptr),
161 method_id,
162 method_name);
163 }
164 else if (ReadHandleMap::isElement(key_iter->second)) {
165 if (m_verbose) { std::cout << "DEBUG SGxAODProxyLoader::computeClassForVarname is element: " << varname << std::endl; }
166 accessor = createAccessor(ctx,
167 ReadHandleMap::elementKey(key_iter->second),
168 (decor_key_iter != m_decorKeys.end() ? &ReadDecorHandleMap::elementKey(decor_key_iter->second) : nullptr),
169 method_id,
170 method_name);
171 }
172 else {
173 if (m_verbose) { std::cout << "DEBUG SGxAODProxyLoader::computeClassForVarname try to create plain type accessor for " << varname << std::endl; }
174 accessor = PlainAccessorFactory::instance().createAccessor(key_iter->second);
175 }
176 if (!accessor) {
177 return *m_emptyVectorAccessor;
178 }
179 IAccessor* accessorPlainPtr = accessor.get();//avoid Wpotentially-evaluated-expression from typeid
180 if (m_verbose) {
181 std::cout << "DEBUG SGxAODProxyLoader use accessor "
182 << typeid(*accessorPlainPtr).name() << " for " << varname
183 << std::endl;
184 }
185 accessor_iter->second.set(std::move(accessor));
186 return *(accessor_iter->second);
187 }
188
190 // This method has to be implemented because it is part of the interface
191 // but the SGxAODProxyLoader will return pointers to different IAccesor objects
192 // depending on the situation and the method variableType will be called of those
193 // objects. Thus, there is really no need to pass the event context through, because
194 // this method is never called and the event context would not be used in all other cases.
195 const EventContext& ctx = Gaudi::Hive::currentContext();
196 std::pair< IProxyLoader::VariableType, const IAccessor &>
197 ret = getAccessorFromString(ctx, varname);
198 return ret.first;
199 }
200
201 std::pair< IProxyLoader::VariableType, const IAccessor &>
202 SGxAODProxyLoader::getAccessorFromString(const EventContext &ctx, const std::string &varname) const {
203 const IAccessor &accessor = getAccessor(ctx, varname);
204 return {accessor.variableType(varname), accessor};
205 }
206
207 namespace {
208 template <typename T>
209 std::ostream &operator<<(std::ostream &out, const std::vector<T> &vec) {
210 for (auto elm : vec) {
211 std::cout << " " << elm;
212 }
213 return out;
214 }
215 template<class T>
216 T dump(const std::string &varname, T val) {
217 (void) varname;
218#ifdef DEBUG_VARIABLE_LOADING
219 std::cout << "DEBUG SGxAODProxyLoader::dump " << varname << val << std::endl;
220#endif
221 return val;
222 }
223 }
224
225 int SGxAODProxyLoader::loadInt(const EventContext& ctx,const std::string &varname) const
226 {
227 return dump(varname,getAccessor(ctx, varname).loadInt(ctx,varname));
228 }
229
230 double SGxAODProxyLoader::loadDouble(const EventContext& ctx,const std::string &varname) const
231 {
232 return dump(varname,getAccessor(ctx, varname).loadDouble(ctx,varname));
233 }
234
235 std::vector<int> SGxAODProxyLoader::loadVecInt(const EventContext& ctx,const std::string &varname) const
236 {
237 return dump(varname,getAccessor(ctx, varname).loadVecInt(ctx,varname));
238 }
239
240 std::vector<double> SGxAODProxyLoader::loadVec(const EventContext& ctx,const std::string &varname) const
241 {
242 return dump(varname,getAccessor(ctx, varname).loadVec(ctx,varname));
243 }
244
246 const std::vector<std::string> &var_names,
247 const std::vector<std::string> &renounce,
248 const std::vector<const DataObjID *> &input_data_in,
249 const std::vector<const DataObjID *> &output_data_in,
250 std::vector<Gaudi::DataHandle *> &new_input_handles,
251 std::vector<Gaudi::DataHandle *> &new_output_handles)
252 {
253 (void) new_output_handles;
254 std::size_t initial_size=m_decorKeys.size()+m_readKeys.size();
255 for (const std::string &var_name : var_names) {
256 if ( m_decorKeys.find(var_name)!= m_decorKeys.end()) continue;
257 std::string container_name;
258 std::string method_name;
259 splitVarnameIntoContainerAndMethod(var_name,container_name, method_name);
260 if (m_verbose) {
261 std::cout << "DEBUG SGxAODProxyLoader::updateDataDependencies var " << var_name << " -> " << container_name << " . " << method_name
262 << " i:" << input_data_in.size() << " o:" << output_data_in.size()
263 << std::endl;
264 }
265 const DataObjID *container_data_id=nullptr;
266 const DataObjID *method_data_id=nullptr;
267 bool verbose = m_verbose;
268
269 // Decide whether a variable just needs a container read handle key or a read decor handle key.
270 // Search in data handles for data handles and decor handles:
271 // decor handle : "container_name.decoration_name"
272 // data handle : "container_name"
273 // if a decor handle is found assume that it is a decoration, otherwise assume that it is either a default aux item
274 // or refers to a method call
275 auto set_ids = [&method_data_id,&container_data_id,&var_name,&container_name,verbose](const DataObjID *obj_data_id) -> bool {
276 std::string_view handle_key(obj_data_id->key());
277 std::string::size_type pos=obj_data_id->key().find('+');
278 pos = (pos==std::string::npos ? 0 : pos+1);
279 handle_key=handle_key.substr(pos,handle_key.size()-pos);
280 if (verbose && (handle_key == container_name || handle_key == var_name)) {
281 const SG::BaseInfoBase* base_info = SG::BaseInfoBase::find (obj_data_id->clid());
282 std::cout << "DEBUG SGxAODProxyLoader::updateDataDependencies " << handle_key << " matches " << var_name << " ? "
283 << (handle_key == var_name ? " method " : "")
284 << (handle_key == container_name ? " container " : "")
285 << "-> " << (base_info ? base_info->typeinfo().name() : "")
286 << std::endl;
287 }
288 if (handle_key == var_name) {
289 method_data_id = obj_data_id;
290 if (container_data_id) return true;
291 }
292 else if (handle_key == container_name ) {
293 container_data_id = obj_data_id;
294 if (method_data_id) return true;
295 }
296 return false;
297 };
298 // start with output handles which are expected to contain the decorator handles
299 for( std::vector<const DataObjID *>::const_iterator elm_iter = output_data_in.begin(); elm_iter != output_data_in.end() && !set_ids(*elm_iter); ++elm_iter) {}
300 if (!method_data_id) {
301 for( std::vector<const DataObjID *>::const_iterator elm_iter = input_data_in.begin(); elm_iter != input_data_in.end() && !set_ids(*elm_iter); ++elm_iter) {}
302 }
303 if (method_data_id) {
304 if (!container_data_id) {
305 container_data_id=method_data_id;
306 }
307 }
308 // ---DEBUG
309 if (m_verbose && method_data_id && method_data_id != container_data_id) {
310 std::cout << "DEBUG SGxAODProxyLoader method_clid " << method_data_id->clid() << std::endl;
311 }
312 if (m_verbose && container_data_id) {
313 std::cout << "DEBUG SGxAODProxyLoader container_clid " << container_data_id->clid() << std::endl;
314 }
315 // ___DEBUG
316
317 if (container_data_id) {
318 m_accessor.insert( std::make_pair(var_name, CxxUtils::CachedUniquePtrT<IAccessor>()));
319 bool have_container_read_key = m_readKeys.find(container_name) != m_readKeys.end();
320 if (have_container_read_key && !method_data_id) continue;
321
322 auto clid = container_data_id->clid();
323 (void) clid;
324 const SG::BaseInfoBase* base_info = (container_data_id ? SG::BaseInfoBase::find (container_data_id->clid()) : nullptr);
325 if (!base_info) {
326 std::stringstream msg;
327 msg << "Missing type information about container " << container_name << ".";
328 if (container_data_id) {
329 msg << " It seems that inheritance information is missing for " << container_data_id->className() << "."
330 << " Only container which inherit from SG::AuxVectorBase or data inheriting from SG::AuxElement "
331 << " are supported by the SGxAODProxyLoader loader.";
332 }
333 else {
334 msg << " This problem may occur if the container is read from the input"
335 << " file and not accessed anywhere in the job via read handles. ";
336 }
337 throw std::runtime_error(msg.str());
338 }
339 // ---DEBUG
340 if (m_verbose && base_info) {
341 std::cout << "DEBUG SGxAODProxyLoader " << container_name << " -> " << base_info->typeinfo().name() << std::endl;
342 for ( CLID clid : base_info->get_bases ()) {
343 const SG::BaseInfoBase* a_base_info = SG::BaseInfoBase::find (clid);
344 std::cout << "DEBUG SGxAODProxyLoader " << container_name << " base: " << a_base_info->typeinfo().name() << std::endl;
345 }
346 }
347 // ___DEBUG
348
349
350 std::any read_key;
351 std::any decor_key;
353 if (!have_container_read_key) {
354 read_key = std::make_any<SG::ReadHandleKey<SG::AuxVectorBase> >(container_name);
355 }
356 if (method_data_id) {
357 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxVectorBase> >(var_name);
358 }
359 }
360 else if (base_info->is_base(ClassID_traits<SG::AuxElement>::ID())) {
361 if (!have_container_read_key) {
362 read_key = std::make_any<SG::ReadHandleKey<SG::AuxElement> >(container_name);
363 }
364 if (method_data_id) {
365 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxElement> >(var_name);
366 }
367 }
368 else {
369 if (method_data_id && method_data_id != container_data_id && method_data_id->clid() != container_data_id->clid()) {
370 std::stringstream msg;
371 msg << "Did not expect a \"method\" handle for the plain type " << var_name;
372 throw std::logic_error(msg.str());
373 }
374 bool registered_key = PlainAccessorFactory::instance().registerReadKey(m_readKeys, base_info->typeinfo(), parent, var_name, new_input_handles, m_verbose);
375 if (registered_key) {
376 popRenounced(renounce, new_input_handles);
377 continue;
378 }
379 }
380
381 if (!have_container_read_key) {
382 if (!read_key.has_value()) {
383 std::stringstream msg;
384 msg << "Container " << container_name << " is of unsupported type " << base_info->typeinfo().name()
385 << " expected a type derived from SG::AuxVectorBase or SG::AuxElement";
386 throw std::runtime_error(msg.str());
387 }
388 std::pair<ReadHandleMap::iterator, bool> ret = m_readKeys.insert(std::make_pair(container_name, std::move(read_key)));
389 if (ret.second) {
390 if ( (ReadHandleMap::isVector(ret.first->second) && parent.declare(ReadHandleMap::vectorKey(ret.first->second)).isFailure())
391 || (ReadHandleMap::isElement(ret.first->second) && parent.declare(ReadHandleMap::elementKey(ret.first->second)).isFailure())) {
392 std::stringstream msg;
393 msg << "Failed to add read handle key for " << container_name;
394 throw std::runtime_error(msg.str());
395 }
396 if (m_verbose) {
397 if (ReadHandleMap::isVector(ret.first->second)) dumpDeclare(&ReadHandleMap::vectorKey(ret.first->second) );
398 else dumpDeclare(&ReadHandleMap::elementKey(ret.first->second));
399 }
400 if (ReadHandleMap::isVector(ret.first->second)) initializeHandle(&ReadHandleMap::vectorKey(ret.first->second), new_input_handles);
401 else initializeHandle(&ReadHandleMap::elementKey(ret.first->second),new_input_handles);
402 popRenounced(renounce, new_input_handles);
403
404 }
405 }
406 if (method_data_id) {
407 if (!decor_key.has_value()) {
408 std::stringstream msg;
409 msg << "Container " << container_name << " is of unsupported type " << base_info->typeinfo().name()
410 << " expected a type derived from SG::AuxVectorBase or SG::AuxElement";
411 throw std::runtime_error(msg.str());
412 }
413 std::pair<ReadDecorHandleMap::iterator, bool> ret = m_decorKeys.insert(std::make_pair(var_name,std::move(decor_key)));
414 if (ret.second) {
415 if ( (ReadDecorHandleMap::isVector(ret.first->second) && parent.declare(ReadDecorHandleMap::vectorKey(ret.first->second)).isFailure())
416 || (!ReadDecorHandleMap::isVector(ret.first->second) && parent.declare(ReadDecorHandleMap::elementKey(ret.first->second)).isFailure())) {
417 std::stringstream msg;
418 msg << "Failed to add read decor handle key for " << var_name;
419 throw std::runtime_error(msg.str());
420 }
421 if (m_verbose) {
422 if (ReadDecorHandleMap::isVector(ret.first->second)) dumpDeclare(&ReadDecorHandleMap::vectorKey(ret.first->second) );
423 else dumpDeclare(&ReadDecorHandleMap::elementKey(ret.first->second));
424 }
425 if (ReadDecorHandleMap::isVector(ret.first->second)) initializeHandle(&ReadDecorHandleMap::vectorKey(ret.first->second),new_input_handles );
426 else initializeHandle(&ReadDecorHandleMap::elementKey(ret.first->second),new_input_handles);
427 popRenounced(renounce, new_input_handles);
428 }
429 }
430 }
431 }
432 return initial_size != m_decorKeys.size()+m_readKeys.size();
433 }
434}
Manage index tracking and synchronization of auxiliary data.
std::vector< size_t > vec
Provide an interface for finding inheritance information at run time.
uint32_t CLID
The Class ID type.
Property holding a SG store/key/clid/attr name from which a ReadDecorHandle is made.
Handle class for reading a decoration on an object.
Cached pointer with atomic update.
std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxElement > &key, SG::auxid_t auxid, const SG::ReadDecorHandleKey< SG::AuxElement > *decor_key=nullptr) const
create an accessor for the specified content of an AuxElement.
Special accessor to handle empty containers until the correct accessor can be created.
Interface of auxiliary classes to access xAOD object content.
Definition IAccessor.h:17
std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxElement > &key, RootUtils::ClingCallWrapperUncheckedReturnValue<> &&method_wrapper, TVirtualCollectionProxy *proxy=nullptr) const
Create an accessor which calls the specified method of an AuxElement.
static bool registerReadKey(std::unordered_map< std::string, std::any > &read_keys, SGxAODProxyLoader::IParentHelper &parent, const std::string &var_name, std::vector< Gaudi::DataHandle * > &new_input_handles, bool verbose)
std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const
Interface of an auxiliary class to pass the parent, e.g.
std::unordered_map< std::string, CxxUtils::CachedUniquePtrT< IAccessor > > m_accessor
Association of variable names to accessors for corresponding xAOD object content.
void splitVarnameIntoContainerAndMethod(const std::string &varname, std::string &containerName, std::string &methodName) const
virtual std::vector< double > loadVec(const EventContext &ctx, const std::string &varname) const override
virtual int loadInt(const EventContext &ctx, const std::string &varname) const override
ServiceHandle< StoreGateSvc > StoreGateSvc_t
virtual double loadDouble(const EventContext &ctx, const std::string &varname) const override
bool updateDataDependencies(SGxAODProxyLoader::IParentHelper &parent, const std::vector< std::string > &var_names, const std::vector< std::string > &renounce, const std::vector< const DataObjID * > &input_data_in, const std::vector< const DataObjID * > &output_data_in, std::vector< Gaudi::DataHandle * > &new_input_handles, std::vector< Gaudi::DataHandle * > &new_output_handles)
Create extra data dependencies arising eventually from the given variables.
IAccessor & getAccessor(const EventContext &ctx, const std::string &varname) const
Get an existing or create a new accessor for the given variable name.
virtual VariableType variableType(const std::string &var_name) const override
virtual std::vector< int > loadVecInt(const EventContext &ctx, const std::string &varname) const override
virtual std::pair< IProxyLoader::VariableType, const IAccessor & > getAccessorFromString(const EventContext &ctx, const std::string &varname) const override
IAccessor & computeClassForVarname(const EventContext &ctx, std::unordered_map< std::string, CxxUtils::CachedUniquePtrT< IAccessor > >::const_iterator accessor_iter, const std::string &varname) const
Auxiliary method to create an xAOD object content accessor for the given variable name.
SGxAODProxyLoader(StoreGateSvc_t &evtStore, bool verbose=false)
std::unique_ptr< IAccessor > createAccessor(const EventContext &ctx, const SG::ReadHandleKey< T_Aux > &key, const SG::ReadDecorHandleKey< T_Aux > *decor_key, SG::auxid_t method_id, const std::string &method_name) const
Auxiliary method to create an accessor for the given method_name.
std::unique_ptr< IAccessor > m_emptyVectorAccessor
Special accessor to handle empty vectors Accessor are constructed at time of first evaluation.
Intermediate helper class wrapping a cling method call with arbitrary return type.
std::string getReturnTypeNormalizedName() const
the normalized name of the function return type.
SG::auxid_t findAuxID(const std::string &name, const std::string &clsname="") const
Look up a name -> auxid_t mapping.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
The non-template portion of the BaseInfo implementation.
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
Definition BaseInfo.cxx:570
const std::type_info & typeinfo() const
Return the std::type_info for this class.
Definition BaseInfo.cxx:151
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
Definition BaseInfo.cxx:304
bool is_base(CLID clid) const
Return true if clid is the ID of a class that is known to be a base of T.
Definition BaseInfo.cxx:344
Property holding a SG store/key/clid/attr name from which a ReadDecorHandle is made.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
bool verbose
Definition hcg.cxx:73
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
std::pair< RootUtils::ClingCallWrapperUncheckedReturnValue<>, TVirtualCollectionProxy * > getMethodCallAccessor(const std::string &method_name, const std::type_info &info, bool verbose)
Namespace holding all the expression evaluation code.
std::ostream & operator<<(std::ostream &os, const StackElement &el)
Declare an output operator for StackElement objects.
bool isAvailable(const T_Aux &cont, SG::auxid_t auxid)
void initializeHandle(T_Key *key, std::vector< Gaudi::DataHandle * > &new_input_handles)
Auxiliary function to initialize newly create data handles.
void dumpDeclare(const T *key)
Function for debugging which dumps information about newly declared data handles.
Definition DebugUtils.h:65
std::ostream & dump(std::ostream &out, const I4MomIter iBeg, const I4MomIter iEnd)
Helper to stream out a range of I4Momentum objects.
Definition P4Dumper.h:24
ClingCallWrapperUncheckedReturnValue< T_MethodArgs... > getClingCallWrapper(TClass *the_class, const std::string &method_name, bool is_const)
helper method to wrap a method of a certain name with defined arguments, but arbitrary return type im...
std::string normalizedTypeinfoName(const std::type_info &info)
Convert a type_info to a normalized string representation (matching the names used in the root dictio...
static const auxid_t null_auxid
To signal no aux data item.
Definition AuxTypes.h:30
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27
unsigned long long T
-event-from-file
STL namespace.
MsgStream & msg
Definition testRead.cxx:32