ATLAS Offline Software
Loading...
Searching...
No Matches
ExpressionParsing::SGxAODProxyLoader Class Reference

Auxiliary class to access content of xAOD objects referred to by variables of an expressions handled by an instance of the ExpressionParser. More...

#include <SGxAODProxyLoader.h>

Inheritance diagram for ExpressionParsing::SGxAODProxyLoader:
Collaboration diagram for ExpressionParsing::SGxAODProxyLoader:

Classes

class  IParentHelper
 Interface of an auxiliary class to pass the parent, e.g. More...
class  ParentHelper
 Template of an auxiliary class to declare the new handles in the parent AthAlgTool, AthAlgorithm etc. More...
class  ReadHandleMapTmpl
 Particular map which is used to associate names to read handles of AuxElements or AuxVectorBase. More...

Public Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t
using VariableType = IAccessor::VariableType

Public Member Functions

 SGxAODProxyLoader (StoreGateSvc_t &evtStore, bool verbose=false)
virtual ~SGxAODProxyLoader ()
virtual void reset () override
virtual VariableType variableType (const std::string &var_name) const override
virtual std::pair< IProxyLoader::VariableType, const IAccessor & > getAccessorFromString (const EventContext &ctx, const std::string &varname) const override
virtual int loadInt (const EventContext &ctx, const std::string &varname) const override
virtual double loadDouble (const EventContext &ctx, const std::string &varname) const override
virtual std::vector< int > loadVecInt (const EventContext &ctx, const std::string &varname) const override
virtual std::vector< double > loadVec (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.

Static Public Member Functions

template<class T>
static ParentHelper< T > wrapParent (T *parent)
 auxiliary method to create the auxiliary class to declare new data handles with the calling AthAlgTool, AthAlgorithm etc.

Private Types

using ReadHandleMap
using ReadDecorHandleMap

Private Member Functions

void splitVarnameIntoContainerAndMethod (const std::string &varname, std::string &containerName, std::string &methodName) const
IAccessorcomputeClassForVarname (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.
std::pair< RootUtils::TSMethodCall, TVirtualCollectionProxy * > getMethodCallAccessor (const std::string &method_name, const std::type_info &info) const
 Auxiliary method to create a TMethodCall and eventually also a collection proxy to call the given method of the specified container type.
IAccessorgetAccessor (const EventContext &ctx, const std::string &varname) const
 Get an existing or create a new accessor for the given variable name.
template<class T_Aux>
std::unique_ptr< IAccessorcreateAccessor (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.

Private Attributes

StoreGateSvc_t m_evtStore
ReadHandleMap m_readKeys
ReadDecorHandleMap m_decorKeys
std::unordered_map< std::string, CxxUtils::CachedUniquePtrT< IAccessor > > m_accessor
 Association of variable names to accessors for corresponding xAOD object content.
std::unique_ptr< IAccessorm_emptyVectorAccessor
 Special accessor to handle empty vectors Accessor are constructed at time of first evaluation.
bool m_verbose = false

Detailed Description

Auxiliary class to access content of xAOD objects referred to by variables of an expressions handled by an instance of the ExpressionParser.

Definition at line 47 of file SGxAODProxyLoader.h.

Member Typedef Documentation

◆ ReadDecorHandleMap

Initial value:
Particular map which is used to associate names to read handles of AuxElements or AuxVectorBase.
Property holding a SG store/key/clid/attr name from which a ReadDecorHandle is made.

Definition at line 203 of file SGxAODProxyLoader.h.

◆ ReadHandleMap

Initial value:

Definition at line 201 of file SGxAODProxyLoader.h.

◆ StoreGateSvc_t

◆ VariableType

Constructor & Destructor Documentation

◆ SGxAODProxyLoader()

ExpressionParsing::SGxAODProxyLoader::SGxAODProxyLoader ( StoreGateSvc_t & evtStore,
bool verbose = false )

Definition at line 45 of file SGxAODProxyLoader.cxx.

45: m_evtStore(evtStore), m_emptyVectorAccessor(std::make_unique<EmptyVectorAccessor>()),m_verbose(verbose) { }
std::unique_ptr< IAccessor > m_emptyVectorAccessor
Special accessor to handle empty vectors Accessor are constructed at time of first evaluation.
bool verbose
Definition hcg.cxx:73

◆ ~SGxAODProxyLoader()

ExpressionParsing::SGxAODProxyLoader::~SGxAODProxyLoader ( )
virtual

Definition at line 47 of file SGxAODProxyLoader.cxx.

48 {}

Member Function Documentation

◆ computeClassForVarname()

IAccessor & ExpressionParsing::SGxAODProxyLoader::computeClassForVarname ( const EventContext & ctx,
std::unordered_map< std::string, CxxUtils::CachedUniquePtrT< IAccessor > >::const_iterator accessor_iter,
const std::string & varname ) const
private

Auxiliary method to create an xAOD object content accessor for the given variable name.

Parameters
ctxthe current event context
accessor_iterlocation where the newly created accessor will be stored.
varnamethe variable name which defines the xAOD container and the content.

Definition at line 132 of file SGxAODProxyLoader.cxx.

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; }
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; }
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; }
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 }
std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const
void splitVarnameIntoContainerAndMethod(const std::string &varname, std::string &containerName, std::string &methodName) const
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.
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.
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
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
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
MsgStream & msg
Definition testRead.cxx:32

◆ createAccessor()

template<class T_Aux>
std::unique_ptr< IAccessor > ExpressionParsing::SGxAODProxyLoader::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
private

Auxiliary method to create an accessor for the given method_name.

Parameters
ctxthe current event context.
keya valid read handle key to retrieve the corresponding container.
decor_keya valid read handle key or nullptr to create a decoration handle for the given method
method_idthe xAOD ID of the given method
thename of the method.
Returns
returns an accessor for the xAOD content.

Definition at line 107 of file SGxAODProxyLoader.cxx.

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 }
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.
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.
std::pair< RootUtils::ClingCallWrapperUncheckedReturnValue<>, TVirtualCollectionProxy * > getMethodCallAccessor(const std::string &method_name, const std::type_info &info, bool verbose)
bool isAvailable(const T_Aux &cont, SG::auxid_t auxid)

◆ getAccessor()

IAccessor & ExpressionParsing::SGxAODProxyLoader::getAccessor ( const EventContext & ctx,
const std::string & varname ) const
inlineprivate

Get an existing or create a new accessor for the given variable name.

Parameters
ctxthe current event context
varnamethe name of the variable for which an accessor will be returned. The event context is needed if a new accessor has to be created to gather information about the type which the variable refers to.

Definition at line 142 of file SGxAODProxyLoader.h.

142 {
143 std::unordered_map<std::string, CxxUtils::CachedUniquePtrT<IAccessor> >::const_iterator
144 accessor_iter = m_accessor.find(varname);
145 if (accessor_iter == m_accessor.end()) {
146 std::stringstream msg;
147 msg << "No accessor stub was created for " << varname << " i.e. variable is unknown.";
148 throw std::runtime_error(msg.str());
149 }
150 if (accessor_iter->second) return *(accessor_iter->second);
151 return computeClassForVarname(ctx,accessor_iter, varname);
152 }
std::unordered_map< std::string, CxxUtils::CachedUniquePtrT< IAccessor > > m_accessor
Association of variable names to accessors for corresponding xAOD object content.
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.

◆ getAccessorFromString()

std::pair< IProxyLoader::VariableType, const IAccessor & > ExpressionParsing::SGxAODProxyLoader::getAccessorFromString ( const EventContext & ctx,
const std::string & varname ) const
overridevirtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 202 of file SGxAODProxyLoader.cxx.

202 {
203 const IAccessor &accessor = getAccessor(ctx, varname);
204 return {accessor.variableType(varname), accessor};
205 }
IAccessor & getAccessor(const EventContext &ctx, const std::string &varname) const
Get an existing or create a new accessor for the given variable name.

◆ getMethodCallAccessor()

std::pair< RootUtils::TSMethodCall, TVirtualCollectionProxy * > ExpressionParsing::SGxAODProxyLoader::getMethodCallAccessor ( const std::string & method_name,
const std::type_info & info ) const
private

Auxiliary method to create a TMethodCall and eventually also a collection proxy to call the given method of the specified container type.

Parameters
method_namethe name of the method to be called.
infothe type_info of the container whose method is to be called.
Returns
a TMethodCall object and optionally collection proxy which is owned by ROOT(?)

◆ loadDouble()

double ExpressionParsing::SGxAODProxyLoader::loadDouble ( const EventContext & ctx,
const std::string & varname ) const
overridevirtual

Implements ExpressionParsing::IAccessor.

Definition at line 230 of file SGxAODProxyLoader.cxx.

231 {
232 return dump(varname,getAccessor(ctx, varname).loadDouble(ctx,varname));
233 }
virtual double loadDouble(const EventContext &ctx, const std::string &varname) const override
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

◆ loadInt()

int ExpressionParsing::SGxAODProxyLoader::loadInt ( const EventContext & ctx,
const std::string & varname ) const
overridevirtual

Implements ExpressionParsing::IAccessor.

Definition at line 225 of file SGxAODProxyLoader.cxx.

226 {
227 return dump(varname,getAccessor(ctx, varname).loadInt(ctx,varname));
228 }
virtual int loadInt(const EventContext &ctx, const std::string &varname) const override

◆ loadVec()

std::vector< double > ExpressionParsing::SGxAODProxyLoader::loadVec ( const EventContext & ctx,
const std::string & varname ) const
overridevirtual

Implements ExpressionParsing::IAccessor.

Definition at line 240 of file SGxAODProxyLoader.cxx.

241 {
242 return dump(varname,getAccessor(ctx, varname).loadVec(ctx,varname));
243 }
virtual std::vector< double > loadVec(const EventContext &ctx, const std::string &varname) const override

◆ loadVecInt()

std::vector< int > ExpressionParsing::SGxAODProxyLoader::loadVecInt ( const EventContext & ctx,
const std::string & varname ) const
overridevirtual

Implements ExpressionParsing::IAccessor.

Definition at line 235 of file SGxAODProxyLoader.cxx.

236 {
237 return dump(varname,getAccessor(ctx, varname).loadVecInt(ctx,varname));
238 }
virtual std::vector< int > loadVecInt(const EventContext &ctx, const std::string &varname) const override

◆ reset()

void ExpressionParsing::SGxAODProxyLoader::reset ( )
overridevirtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 50 of file SGxAODProxyLoader.cxx.

50 {
51 m_decorKeys.clear();
52 m_readKeys.clear();
53 m_accessor.clear();
54 }

◆ splitVarnameIntoContainerAndMethod()

void ExpressionParsing::SGxAODProxyLoader::splitVarnameIntoContainerAndMethod ( const std::string & varname,
std::string & containerName,
std::string & methodName ) const
private

Definition at line 56 of file SGxAODProxyLoader.cxx.

57 {
58 size_t dotPosition = varname.find('.');
59 containerName = varname.substr(0, dotPosition);
60 methodName = varname.substr(dotPosition + 1);
61 }

◆ updateDataDependencies()

bool ExpressionParsing::SGxAODProxyLoader::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.

Parameters
parentauxiliary class to declare new data handles with the calling parent
var_namesthe variables for which data dependencies might be created.
renouncea list of output data keys, which should be renounced from the new_input_handles list.
input_data_inread data object IDs declared by all algorithms and tools
output_data_inwrite data object IDs declared by all algorithms and tools
new_input_handleswill be filled with read data handles newly created by this loader
new_output_handleswill be filled with write data handles newly created by this loader (unused).
Returns
true if new handles have been declared.

Definition at line 245 of file SGxAODProxyLoader.cxx.

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 //container_data_id logically cannot be nullptr here
325 const SG::BaseInfoBase* base_info = SG::BaseInfoBase::find (container_data_id->clid());
326 if (!base_info) {
327 std::stringstream msg;
328 msg << "Missing type information about container " << container_name << ".";
329 if (container_data_id) {
330 msg << " It seems that inheritance information is missing for " << container_data_id->className() << "."
331 << " Only container which inherit from SG::AuxVectorBase or data inheriting from SG::AuxElement "
332 << " are supported by the SGxAODProxyLoader loader.";
333 }
334 else {
335 msg << " This problem may occur if the container is read from the input"
336 << " file and not accessed anywhere in the job via read handles. ";
337 }
338 throw std::runtime_error(msg.str());
339 }
340 // ---DEBUG
341 if (m_verbose && base_info) {
342 std::cout << "DEBUG SGxAODProxyLoader " << container_name << " -> " << base_info->typeinfo().name() << std::endl;
343 for ( CLID clid : base_info->get_bases ()) {
344 const SG::BaseInfoBase* a_base_info = SG::BaseInfoBase::find (clid);
345 std::cout << "DEBUG SGxAODProxyLoader " << container_name << " base: " << a_base_info->typeinfo().name() << std::endl;
346 }
347 }
348 // ___DEBUG
349
350
351 std::any read_key;
352 std::any decor_key;
354 if (!have_container_read_key) {
355 read_key = std::make_any<SG::ReadHandleKey<SG::AuxVectorBase> >(container_name);
356 }
357 if (method_data_id) {
358 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxVectorBase> >(var_name);
359 }
360 }
361 else if (base_info->is_base(ClassID_traits<SG::AuxElement>::ID())) {
362 if (!have_container_read_key) {
363 read_key = std::make_any<SG::ReadHandleKey<SG::AuxElement> >(container_name);
364 }
365 if (method_data_id) {
366 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxElement> >(var_name);
367 }
368 }
369 else {
370 if (method_data_id && method_data_id != container_data_id && method_data_id->clid() != container_data_id->clid()) {
371 std::stringstream msg;
372 msg << "Did not expect a \"method\" handle for the plain type " << var_name;
373 throw std::logic_error(msg.str());
374 }
375 bool registered_key = PlainAccessorFactory::instance().registerReadKey(m_readKeys, base_info->typeinfo(), parent, var_name, new_input_handles, m_verbose);
376 if (registered_key) {
377 popRenounced(renounce, new_input_handles);
378 continue;
379 }
380 }
381
382 if (!have_container_read_key) {
383 if (!read_key.has_value()) {
384 std::stringstream msg;
385 msg << "Container " << container_name << " is of unsupported type " << base_info->typeinfo().name()
386 << " expected a type derived from SG::AuxVectorBase or SG::AuxElement";
387 throw std::runtime_error(msg.str());
388 }
389 std::pair<ReadHandleMap::iterator, bool> ret = m_readKeys.insert(std::make_pair(container_name, std::move(read_key)));
390 if (ret.second) {
391 if ( (ReadHandleMap::isVector(ret.first->second) && parent.declare(ReadHandleMap::vectorKey(ret.first->second)).isFailure())
392 || (ReadHandleMap::isElement(ret.first->second) && parent.declare(ReadHandleMap::elementKey(ret.first->second)).isFailure())) {
393 std::stringstream msg;
394 msg << "Failed to add read handle key for " << container_name;
395 throw std::runtime_error(msg.str());
396 }
397 if (m_verbose) {
398 if (ReadHandleMap::isVector(ret.first->second)) dumpDeclare(&ReadHandleMap::vectorKey(ret.first->second) );
399 else dumpDeclare(&ReadHandleMap::elementKey(ret.first->second));
400 }
401 if (ReadHandleMap::isVector(ret.first->second)) initializeHandle(&ReadHandleMap::vectorKey(ret.first->second), new_input_handles);
402 else initializeHandle(&ReadHandleMap::elementKey(ret.first->second),new_input_handles);
403 popRenounced(renounce, new_input_handles);
404
405 }
406 }
407 if (method_data_id) {
408 if (!decor_key.has_value()) {
409 std::stringstream msg;
410 msg << "Container " << container_name << " is of unsupported type " << base_info->typeinfo().name()
411 << " expected a type derived from SG::AuxVectorBase or SG::AuxElement";
412 throw std::runtime_error(msg.str());
413 }
414 std::pair<ReadDecorHandleMap::iterator, bool> ret = m_decorKeys.insert(std::make_pair(var_name,std::move(decor_key)));
415 if (ret.second) {
416 if ( (ReadDecorHandleMap::isVector(ret.first->second) && parent.declare(ReadDecorHandleMap::vectorKey(ret.first->second)).isFailure())
417 || (!ReadDecorHandleMap::isVector(ret.first->second) && parent.declare(ReadDecorHandleMap::elementKey(ret.first->second)).isFailure())) {
418 std::stringstream msg;
419 msg << "Failed to add read decor handle key for " << var_name;
420 throw std::runtime_error(msg.str());
421 }
422 if (m_verbose) {
423 if (ReadDecorHandleMap::isVector(ret.first->second)) dumpDeclare(&ReadDecorHandleMap::vectorKey(ret.first->second) );
424 else dumpDeclare(&ReadDecorHandleMap::elementKey(ret.first->second));
425 }
426 if (ReadDecorHandleMap::isVector(ret.first->second)) initializeHandle(&ReadDecorHandleMap::vectorKey(ret.first->second),new_input_handles );
427 else initializeHandle(&ReadDecorHandleMap::elementKey(ret.first->second),new_input_handles);
428 popRenounced(renounce, new_input_handles);
429 }
430 }
431 }
432 }
433 return initial_size != m_decorKeys.size()+m_readKeys.size();
434 }
uint32_t CLID
The Class ID type.
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)
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
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

◆ variableType()

IAccessor::VariableType ExpressionParsing::SGxAODProxyLoader::variableType ( const std::string & var_name) const
overridevirtual

Implements ExpressionParsing::IAccessor.

Definition at line 189 of file SGxAODProxyLoader.cxx.

189 {
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 }
virtual std::pair< IProxyLoader::VariableType, const IAccessor & > getAccessorFromString(const EventContext &ctx, const std::string &varname) const override

◆ wrapParent()

template<class T>
ParentHelper< T > ExpressionParsing::SGxAODProxyLoader::wrapParent ( T * parent)
inlinestatic

auxiliary method to create the auxiliary class to declare new data handles with the calling AthAlgTool, AthAlgorithm etc.

Definition at line 94 of file SGxAODProxyLoader.h.

94 {
95 return ParentHelper<T>(parent);
96 }
Template of an auxiliary class to declare the new handles in the parent AthAlgTool,...

Member Data Documentation

◆ m_accessor

std::unordered_map<std::string, CxxUtils::CachedUniquePtrT<IAccessor> > ExpressionParsing::SGxAODProxyLoader::m_accessor
private

Association of variable names to accessors for corresponding xAOD object content.

The map structure is constructed before the event loop. The content of its leaves is completed during the event loop.

Definition at line 212 of file SGxAODProxyLoader.h.

◆ m_decorKeys

ReadDecorHandleMap ExpressionParsing::SGxAODProxyLoader::m_decorKeys
private

Definition at line 206 of file SGxAODProxyLoader.h.

◆ m_emptyVectorAccessor

std::unique_ptr<IAccessor> ExpressionParsing::SGxAODProxyLoader::m_emptyVectorAccessor
private

Special accessor to handle empty vectors Accessor are constructed at time of first evaluation.

This fails for empty containers because empty container do not necessarily provide enough type information to create the correct accessor. This is mitigated by this special accessor which is used until the final accessor can be created.

Definition at line 220 of file SGxAODProxyLoader.h.

◆ m_evtStore

StoreGateSvc_t ExpressionParsing::SGxAODProxyLoader::m_evtStore
private

Definition at line 169 of file SGxAODProxyLoader.h.

◆ m_readKeys

ReadHandleMap ExpressionParsing::SGxAODProxyLoader::m_readKeys
private

Definition at line 205 of file SGxAODProxyLoader.h.

◆ m_verbose

bool ExpressionParsing::SGxAODProxyLoader::m_verbose = false
private

Definition at line 221 of file SGxAODProxyLoader.h.


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