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
enum  VariableType {
  VT_UNK , VT_INT , VT_DOUBLE , VT_VECINT ,
  VT_VECDOUBLE , VT_VECEMPTY
}

Public Member Functions

 SGxAODProxyLoader (StoreGateSvc_t &evtStore, bool verbose=false)
virtual ~SGxAODProxyLoader ()
virtual void reset ()
virtual IProxyLoader::VariableType variableTypeFromString (const std::string &varname) const
virtual int loadIntVariableFromString (const std::string &varname) const
virtual double loadDoubleVariableFromString (const std::string &varname) const
virtual std::vector< int > loadVecIntVariableFromString (const std::string &varname) const
virtual std::vector< double > loadVecDoubleVariableFromString (const std::string &varname) const
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 46 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 199 of file SGxAODProxyLoader.h.

◆ ReadHandleMap

Initial value:

Definition at line 197 of file SGxAODProxyLoader.h.

◆ StoreGateSvc_t

Member Enumeration Documentation

◆ VariableType

Constructor & Destructor Documentation

◆ SGxAODProxyLoader()

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

Definition at line 42 of file SGxAODProxyLoader.cxx.

42: 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 44 of file SGxAODProxyLoader.cxx.

45 {
46 }

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 138 of file SGxAODProxyLoader.cxx.

141 {
142 const IProxyDict *proxy = Atlas::getExtendedEventContext( ctx ).proxy();
143 (void) proxy;
144 std::string container_name;
145 std::string method_name;
146 splitVarnameIntoContainerAndMethod(varname,container_name, method_name);
147 ReadHandleMap::const_iterator key_iter = m_readKeys.find(container_name);
148 if (key_iter == m_readKeys.end()) {
149 std::stringstream msg;
150 msg << "No read handle key for " << container_name;
151 throw std::runtime_error(msg.str());
152 }
153 SG::auxid_t method_id = SG::null_auxid;
154 ReadDecorHandleMap::const_iterator decor_key_iter = m_decorKeys.end();
155 if (ReadHandleMap::isVector(key_iter->second) || ReadHandleMap::isElement(key_iter->second)) {
156 method_id = SG::AuxTypeRegistry::instance().findAuxID(method_name,"");
157 if (method_id != SG::null_auxid) {
158 decor_key_iter=m_decorKeys.find(varname);
159 }
160 }
161 std::unique_ptr<IAccessor> accessor;
162 if (ReadHandleMap::isVector(key_iter->second)) {
163 if (m_verbose) { std::cout << "DEBUG SGxAODProxyLoader::computeClassForVarname is Vector: " << varname << std::endl; }
165 ReadHandleMap::vectorKey(key_iter->second),
166 (decor_key_iter != m_decorKeys.end() ? &ReadDecorHandleMap::vectorKey(decor_key_iter->second) : nullptr),
167 method_id,
168 method_name);
169 }
170 else if (ReadHandleMap::isElement(key_iter->second)) {
171 if (m_verbose) { std::cout << "DEBUG SGxAODProxyLoader::computeClassForVarname is element: " << varname << std::endl; }
173 ReadHandleMap::elementKey(key_iter->second),
174 (decor_key_iter != m_decorKeys.end() ? &ReadDecorHandleMap::elementKey(decor_key_iter->second) : nullptr),
175 method_id,
176 method_name);
177 }
178 else {
179 if (m_verbose) { std::cout << "DEBUG SGxAODProxyLoader::computeClassForVarname try to create plain type accessor for " << varname << std::endl; }
181 }
182 if (!accessor) {
183 return *m_emptyVectorAccessor;
184 }
185 IAccessor* accessorPlainPtr = accessor.get();//avoid Wpotentially-evaluated-expression from typeid
186 if (m_verbose) {
187 std::cout << "DEBUG SGxAODProxyLoader use accessor "
188 << typeid(*accessorPlainPtr).name() << " for " << varname
189 << std::endl;
190 }
191 accessor_iter->second.set(std::move(accessor));
192 return *(accessor_iter->second);
193 }
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 114 of file SGxAODProxyLoader.cxx.

119 {
120 SG::ReadHandle<T_Aux> handle(key, ctx);
121 if (!handle.isValid()) {
122 std::stringstream msg;
123 msg << "Failed to get " << key.key();
124 throw std::runtime_error(msg.str());
125 }
126 if (getContainerSize(*handle)==0) {
127 return std::unique_ptr<IAccessor>();
128 }
129 if (!isAvailable(*handle,method_id)) {
130 std::pair<RootUtils::TSMethodCall,TVirtualCollectionProxy *> method = getMethodCallAccessor(method_name, typeid(*handle));
131 return MethodAccessorFactory::instance().create( key, std::move(method.first), method.second);
132 }
133 else {
134 return ExpressionParsing::AccessorFactory::instance().create( key, method_id , decor_key );
135 }
136 }
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::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy=nullptr) const
Create an accessor which calls the specified method of an AuxElement.
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 met...
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 138 of file SGxAODProxyLoader.h.

138 {
139 std::unordered_map<std::string, CxxUtils::CachedUniquePtrT<IAccessor> >::const_iterator
140 accessor_iter = m_accessor.find(varname);
141 if (accessor_iter == m_accessor.end()) {
142 std::stringstream msg;
143 msg << "No accessor stub was created for " << varname << " i.e. variable is unknown.";
144 throw std::runtime_error(msg.str());
145 }
146 if (accessor_iter->second) return *(accessor_iter->second);
147 return computeClassForVarname(ctx,accessor_iter, varname);
148 }
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.

◆ 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(?)

Definition at line 62 of file SGxAODProxyLoader.cxx.

62 {
63 if (m_verbose) {
64 std::cout << "DEBUG SGxAODProxyLoader search for " << method_name << " in type " << info.name() << std::endl;
65 }
66 TClass *containerClass = TClass::GetClass(info);
67 if (!containerClass) {
68 if (m_verbose) {
69 std::cout << "DEBUG SGxAODProxyLoader search for " << method_name << " in normalisze type " << SG::normalizedTypeinfoName(info) << std::endl;
70 }
71 containerClass = TClass::GetClass(SG::normalizedTypeinfoName(info).c_str());
72 if (!containerClass) {
73 std::stringstream msg;
74 msg << "No dictionary for " << info.name() << std::endl;
75 throw std::runtime_error(msg.str());
76 }
77 }
78 TClass *elementClass=nullptr;
79 TVirtualCollectionProxy *collection_proxy=nullptr;
80 if( strcmp(containerClass->GetName(),"SG::AuxElementStandaloneData")==0 ) {
81 elementClass=containerClass;
82 }
83 else {
84 collection_proxy = containerClass->GetCollectionProxy();
85 elementClass = (collection_proxy ? collection_proxy->GetValueClass() : nullptr);
86 if (!elementClass) {
87 std::stringstream msg;
88 msg << "No collection proxy or element class for " << info.name() << std::endl;
89 throw std::runtime_error(msg.str());
90 }
91 }
92 RootUtils::TSMethodCall method_call;
93 method_call.setProto (elementClass, method_name, "",
94 ROOT::kConversionMatch);
95 if (!method_call.call() || !method_call.call()->IsValid()) {
96 std::stringstream msg;
97 msg << "No valid method " << method_name << " for " << info.name() << std::endl;
98 throw std::runtime_error(msg.str());
99 }
100 if (m_verbose && method_call.call()->GetMethod()) {
101 // @TODO check signature "() const
102 std::cout << "DEBUG SGxAODProxyLoader got method " << " . " << method_name << " : "
103 << method_call.call()->GetMethod()->GetReturnTypeNormalizedName ()
104 << " proto=" << method_call.call()->GetProto()
105 << " signature=" << method_call.call()->GetMethod()->GetSignature ()
106 << " proto=" << method_call.call()->GetMethod()->GetPrototype()
107 << std::endl;
108 }
109 return std::make_pair( method_call, collection_proxy);
110 }
TMethodCall * call()
Return a pointer to the thread-specific TMethodCall.
void setProto(TClass *cls, const std::string &fname, const std::string &args, ROOT::EFunctionMatchMode mode=ROOT::kExactMatch)
Set the function that we're to call.
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...

◆ loadDoubleVariableFromString()

double ExpressionParsing::SGxAODProxyLoader::loadDoubleVariableFromString ( const std::string & varname) const
virtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 224 of file SGxAODProxyLoader.cxx.

225 {
226 const EventContext& ctx = Gaudi::Hive::currentContext();
227 return dump(varname,getAccessor(ctx, varname).loadDouble(ctx));
228 }
IAccessor & getAccessor(const EventContext &ctx, const std::string &varname) const
Get an existing or create a new accessor for the given variable name.
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

◆ loadIntVariableFromString()

int ExpressionParsing::SGxAODProxyLoader::loadIntVariableFromString ( const std::string & varname) const
virtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 218 of file SGxAODProxyLoader.cxx.

219 {
220 const EventContext& ctx = Gaudi::Hive::currentContext();
221 return dump(varname,getAccessor(ctx, varname).loadInt(ctx));
222 }

◆ loadVecDoubleVariableFromString()

std::vector< double > ExpressionParsing::SGxAODProxyLoader::loadVecDoubleVariableFromString ( const std::string & varname) const
virtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 236 of file SGxAODProxyLoader.cxx.

237 {
238 const EventContext& ctx = Gaudi::Hive::currentContext();
239 return dump(varname,getAccessor(ctx, varname).loadVec(ctx));
240 }

◆ loadVecIntVariableFromString()

std::vector< int > ExpressionParsing::SGxAODProxyLoader::loadVecIntVariableFromString ( const std::string & varname) const
virtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 230 of file SGxAODProxyLoader.cxx.

231 {
232 const EventContext& ctx = Gaudi::Hive::currentContext();
233 return dump(varname,getAccessor(ctx, varname).loadVecInt(ctx));
234 }

◆ reset()

void ExpressionParsing::SGxAODProxyLoader::reset ( )
virtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 48 of file SGxAODProxyLoader.cxx.

48 {
49 m_decorKeys.clear();
50 m_readKeys.clear();
51 m_accessor.clear();
52 }

◆ splitVarnameIntoContainerAndMethod()

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

Definition at line 54 of file SGxAODProxyLoader.cxx.

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

◆ 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 242 of file SGxAODProxyLoader.cxx.

249 {
250 (void) new_output_handles;
251 std::size_t initial_size=m_decorKeys.size()+m_readKeys.size();
252 for (const std::string &var_name : var_names) {
253 if ( m_decorKeys.find(var_name)!= m_decorKeys.end()) continue;
254 std::string container_name;
255 std::string method_name;
256 splitVarnameIntoContainerAndMethod(var_name,container_name, method_name);
257 if (m_verbose) {
258 std::cout << "DEBUG SGxAODProxyLoader::updateDataDependencies var " << var_name << " -> " << container_name << " . " << method_name
259 << " i:" << input_data_in.size() << " o:" << output_data_in.size()
260 << std::endl;
261 }
262 const DataObjID *container_data_id=nullptr;
263 const DataObjID *method_data_id=nullptr;
264 bool verbose = m_verbose;
265
266 // Decide whether a variable just needs a container read handle key or a read decor handle key.
267 // Search in data handles for data handles and decor handles:
268 // decor handle : "container_name.decoration_name"
269 // data handle : "container_name"
270 // if a decor handle is found assume that it is a decoration, otherwise assume that it is either a default aux item
271 // or refers to a method call
272 auto set_ids = [&method_data_id,&container_data_id,&var_name,&container_name,verbose](const DataObjID *obj_data_id) -> bool {
273 std::string_view handle_key(obj_data_id->key());
274 std::string::size_type pos=obj_data_id->key().find('+');
275 pos = (pos==std::string::npos ? 0 : pos+1);
276 handle_key=handle_key.substr(pos,handle_key.size()-pos);
277 if (verbose && (handle_key == container_name || handle_key == var_name)) {
278 const SG::BaseInfoBase* base_info = SG::BaseInfoBase::find (obj_data_id->clid());
279 std::cout << "DEBUG SGxAODProxyLoader::updateDataDependencies " << handle_key << " matches " << var_name << " ? "
280 << (handle_key == var_name ? " method " : "")
281 << (handle_key == container_name ? " container " : "")
282 << "-> " << (base_info ? base_info->typeinfo().name() : "")
283 << std::endl;
284 }
285 if (handle_key == var_name) {
286 method_data_id = obj_data_id;
287 if (container_data_id) return true;
288 }
289 else if (handle_key == container_name ) {
290 container_data_id = obj_data_id;
291 if (method_data_id) return true;
292 }
293 return false;
294 };
295 // start with output handles which are expected to contain the decorator handles
296 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) {}
297 if (!method_data_id) {
298 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) {}
299 }
300 if (method_data_id) {
301 if (!container_data_id) {
302 container_data_id=method_data_id;
303 }
304 }
305 // ---DEBUG
306 if (m_verbose && method_data_id && method_data_id != container_data_id) {
307 std::cout << "DEBUG SGxAODProxyLoader method_clid " << method_data_id->clid() << std::endl;
308 }
309 if (m_verbose && container_data_id) {
310 std::cout << "DEBUG SGxAODProxyLoader container_clid " << container_data_id->clid() << std::endl;
311 }
312 // ___DEBUG
313
314 if (container_data_id) {
315 m_accessor.insert( std::make_pair(var_name, CxxUtils::CachedUniquePtrT<IAccessor>()));
316 bool have_container_read_key = m_readKeys.find(container_name) != m_readKeys.end();
317 if (have_container_read_key && !method_data_id) continue;
318
319 auto clid = container_data_id->clid();
320 (void) clid;
321 const SG::BaseInfoBase* base_info = (container_data_id ? SG::BaseInfoBase::find (container_data_id->clid()) : nullptr);
322 if (!base_info) {
323 std::stringstream msg;
324 msg << "Missing type information about container " << container_name << ".";
325 if (container_data_id) {
326 msg << " It seems that inheritance information is missing for " << container_data_id->className() << "."
327 << " Only container which inherit from SG::AuxVectorBase or data inheriting from SG::AuxElement "
328 << " are supported by the SGxAODProxyLoader loader.";
329 }
330 else {
331 msg << " This problem may occur if the container is read from the input"
332 << " file and not accessed anywhere in the job via read handles. ";
333 }
334 throw std::runtime_error(msg.str());
335 }
336 // ---DEBUG
337 if (m_verbose && base_info) {
338 std::cout << "DEBUG SGxAODProxyLoader " << container_name << " -> " << base_info->typeinfo().name() << std::endl;
339 for ( CLID clid : base_info->get_bases ()) {
340 const SG::BaseInfoBase* a_base_info = SG::BaseInfoBase::find (clid);
341 std::cout << "DEBUG SGxAODProxyLoader " << container_name << " base: " << a_base_info->typeinfo().name() << std::endl;
342 }
343 }
344 // ___DEBUG
345
346
347 std::any read_key;
348 std::any decor_key;
350 if (!have_container_read_key) {
351 read_key = std::make_any<SG::ReadHandleKey<SG::AuxVectorBase> >(container_name);
352 }
353 if (method_data_id) {
354 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxVectorBase> >(var_name);
355 }
356 }
357 else if (base_info->is_base(ClassID_traits<SG::AuxElement>::ID())) {
358 if (!have_container_read_key) {
359 read_key = std::make_any<SG::ReadHandleKey<SG::AuxElement> >(container_name);
360 }
361 if (method_data_id) {
362 decor_key = std::make_any<SG::ReadDecorHandleKey<SG::AuxElement> >(var_name);
363 }
364 }
365 else {
366 if (method_data_id && method_data_id != container_data_id && method_data_id->clid() != container_data_id->clid()) {
367 std::stringstream msg;
368 msg << "Did not expect a \"method\" handle for the plain type " << var_name;
369 throw std::logic_error(msg.str());
370 }
371 bool registered_key = PlainAccessorFactory::instance().registerReadKey(m_readKeys, base_info->typeinfo(), parent, var_name, new_input_handles, m_verbose);
372 if (registered_key) {
373 popRenounced(renounce, new_input_handles);
374 continue;
375 }
376 }
377
378 if (!have_container_read_key) {
379 if (!read_key.has_value()) {
380 std::stringstream msg;
381 msg << "Container " << container_name << " is of unsupported type " << base_info->typeinfo().name()
382 << " expected a type derived from SG::AuxVectorBase or SG::AuxElement";
383 throw std::runtime_error(msg.str());
384 }
385 std::pair<ReadHandleMap::iterator, bool> ret = m_readKeys.insert(std::make_pair(container_name, std::move(read_key)));
386 if (ret.second) {
387 if ( (ReadHandleMap::isVector(ret.first->second) && parent.declare(ReadHandleMap::vectorKey(ret.first->second)).isFailure())
388 || (ReadHandleMap::isElement(ret.first->second) && parent.declare(ReadHandleMap::elementKey(ret.first->second)).isFailure())) {
389 std::stringstream msg;
390 msg << "Failed to add read handle key for " << container_name;
391 throw std::runtime_error(msg.str());
392 }
393 if (m_verbose) {
394 if (ReadHandleMap::isVector(ret.first->second)) dumpDeclare(&ReadHandleMap::vectorKey(ret.first->second) );
395 else dumpDeclare(&ReadHandleMap::elementKey(ret.first->second));
396 }
397 if (ReadHandleMap::isVector(ret.first->second)) initializeHandle(&ReadHandleMap::vectorKey(ret.first->second), new_input_handles);
398 else initializeHandle(&ReadHandleMap::elementKey(ret.first->second),new_input_handles);
399 popRenounced(renounce, new_input_handles);
400
401 }
402 }
403 if (method_data_id) {
404 if (!decor_key.has_value()) {
405 std::stringstream msg;
406 msg << "Container " << container_name << " is of unsupported type " << base_info->typeinfo().name()
407 << " expected a type derived from SG::AuxVectorBase or SG::AuxElement";
408 throw std::runtime_error(msg.str());
409 }
410 std::pair<ReadDecorHandleMap::iterator, bool> ret = m_decorKeys.insert(std::make_pair(var_name,std::move(decor_key)));
411 if (ret.second) {
412 if ( (ReadDecorHandleMap::isVector(ret.first->second) && parent.declare(ReadDecorHandleMap::vectorKey(ret.first->second)).isFailure())
413 || (!ReadDecorHandleMap::isVector(ret.first->second) && parent.declare(ReadDecorHandleMap::elementKey(ret.first->second)).isFailure())) {
414 std::stringstream msg;
415 msg << "Failed to add read decor handle key for " << var_name;
416 throw std::runtime_error(msg.str());
417 }
418 if (m_verbose) {
419 if (ReadDecorHandleMap::isVector(ret.first->second)) dumpDeclare(&ReadDecorHandleMap::vectorKey(ret.first->second) );
420 else dumpDeclare(&ReadDecorHandleMap::elementKey(ret.first->second));
421 }
422 if (ReadDecorHandleMap::isVector(ret.first->second)) initializeHandle(&ReadDecorHandleMap::vectorKey(ret.first->second),new_input_handles );
423 else initializeHandle(&ReadDecorHandleMap::elementKey(ret.first->second),new_input_handles);
424 popRenounced(renounce, new_input_handles);
425 }
426 }
427 }
428 }
429 return initial_size != m_decorKeys.size()+m_readKeys.size();
430 }
uint32_t CLID
The Class ID type.
if(febId1==febId2)
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

◆ variableTypeFromString()

IProxyLoader::VariableType ExpressionParsing::SGxAODProxyLoader::variableTypeFromString ( const std::string & varname) const
virtual

Implements ExpressionParsing::IProxyLoader.

Definition at line 195 of file SGxAODProxyLoader.cxx.

195 {
196 const EventContext& ctx = Gaudi::Hive::currentContext();
197 return getAccessor(ctx, varname).variableType();
198 }
virtual IProxyLoader::VariableType variableType() const =0

◆ 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 90 of file SGxAODProxyLoader.h.

90 {
91 return ParentHelper<T>(parent);
92 }
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 208 of file SGxAODProxyLoader.h.

◆ m_decorKeys

ReadDecorHandleMap ExpressionParsing::SGxAODProxyLoader::m_decorKeys
private

Definition at line 202 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 216 of file SGxAODProxyLoader.h.

◆ m_evtStore

StoreGateSvc_t ExpressionParsing::SGxAODProxyLoader::m_evtStore
private

Definition at line 165 of file SGxAODProxyLoader.h.

◆ m_readKeys

ReadHandleMap ExpressionParsing::SGxAODProxyLoader::m_readKeys
private

Definition at line 201 of file SGxAODProxyLoader.h.

◆ m_verbose

bool ExpressionParsing::SGxAODProxyLoader::m_verbose = false
private

Definition at line 217 of file SGxAODProxyLoader.h.


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