ATLAS Offline Software
Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
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. More...
 

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. More...
 

Private Types

using ReadHandleMap = ReadHandleMapTmpl< SG::ReadHandleKey< SG::AuxElement >, SG::ReadHandleKey< SG::AuxVectorBase > >
 
using ReadDecorHandleMap = ReadHandleMapTmpl< SG::ReadDecorHandleKey< SG::AuxElement >, SG::ReadDecorHandleKey< SG::AuxVectorBase > >
 

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. More...
 
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. More...
 
IAccessorgetAccessor (const EventContext &ctx, const std::string &varname) const
 Get an existing or create a new accessor for the given variable name. More...
 
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. More...
 

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. More...
 
std::unique_ptr< IAccessorm_emptyVectorAccessor
 Special accessor to handle empty vectors Accessor are constructed at time of first evaluation. More...
 
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

Definition at line 199 of file SGxAODProxyLoader.h.

◆ ReadHandleMap

Definition at line 197 of file SGxAODProxyLoader.h.

◆ StoreGateSvc_t

Definition at line 49 of file SGxAODProxyLoader.h.

Member Enumeration Documentation

◆ VariableType

Enumerator
VT_UNK 
VT_INT 
VT_DOUBLE 
VT_VECINT 
VT_VECDOUBLE 
VT_VECEMPTY 

Definition at line 21 of file IProxyLoader.h.

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) { }

◆ ~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; }
164  accessor = createAccessor(ctx,
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; }
172  accessor = createAccessor(ctx,
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  }

◆ 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  }

◆ 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  }

◆ 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  }

◆ 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  }

◆ 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  }

◆ 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  }

◆ wrapParent()

template<class T >
static 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  }

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:
RunTileTBRec.method
method
Definition: RunTileTBRec.py:73
grepfile.info
info
Definition: grepfile.py:38
ExpressionParsing::PlainAccessorFactory::registerReadKey
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)
Definition: PlainAccessor.h:112
ExpressionParsing::IProxyLoader::VT_VECEMPTY
@ VT_VECEMPTY
Definition: IProxyLoader.h:21
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:392
ExpressionParsing::SGxAODProxyLoader::m_verbose
bool m_verbose
Definition: SGxAODProxyLoader.h:217
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:639
SG::AuxTypeRegistry::findAuxID
SG::auxid_t findAuxID(const std::string &name, const std::string &clsname="") const
Look up a name -> auxid_t mapping.
Definition: AuxTypeRegistry.cxx:756
SG::normalizedTypeinfoName
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...
Definition: normalizedTypeinfoName.cxx:120
CheckAppliedSFs.var_name
var_name
Definition: CheckAppliedSFs.py:241
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
ExpressionParsing::IProxyLoader::VT_VECDOUBLE
@ VT_VECDOUBLE
Definition: IProxyLoader.h:21
CxxUtils::CachedUniquePtrT
Cached pointer with atomic update.
Definition: CachedUniquePtr.h:54
ExpressionParsing::SGxAODProxyLoader::splitVarnameIntoContainerAndMethod
void splitVarnameIntoContainerAndMethod(const std::string &varname, std::string &containerName, std::string &methodName) const
Definition: SGxAODProxyLoader.cxx:54
ExpressionParsing::SGxAODProxyLoader::ReadHandleMapTmpl< SG::ReadHandleKey< SG::AuxElement >, SG::ReadHandleKey< SG::AuxVectorBase > >::elementKey
static SG::ReadHandleKey< SG::AuxElement > & elementKey(std::any &anything)
Get a reference to the element object referred to by any or throw an exception.
Definition: SGxAODProxyLoader.h:189
ExpressionParsing::SGxAODProxyLoader::getMethodCallAccessor
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...
Definition: SGxAODProxyLoader.cxx:62
ExpressionParsing::AccessorFactory::create
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.
Definition: xAODAccessor.h:198
SG::BaseInfoBase::get_bases
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
IProxyDict
A proxy dictionary.
Definition: AthenaKernel/AthenaKernel/IProxyDict.h:47
ExpressionParsing::SGxAODProxyLoader::m_readKeys
ReadHandleMap m_readKeys
Definition: SGxAODProxyLoader.h:201
ExpressionParsing::Singleton< PlainAccessorFactory >::instance
static PlainAccessorFactory & instance()
Definition: PhysicsAnalysis/CommonTools/ExpressionEvaluation/src/Utils.h:90
ExpressionParsing::isAvailable
bool isAvailable(const T_Aux &cont, SG::auxid_t auxid)
run_Egamma1_LArStrip_Fex.dump
dump
Definition: run_Egamma1_LArStrip_Fex.py:88
RootUtils::TSMethodCall
Helper for making a thread-safe function call.
Definition: TSMethodCall.h:33
Atlas::getExtendedEventContext
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
Definition: ExtendedEventContext.cxx:32
ExpressionParsing::SGxAODProxyLoader::m_accessor
std::unordered_map< std::string, CxxUtils::CachedUniquePtrT< IAccessor > > m_accessor
Association of variable names to accessors for corresponding xAOD object content.
Definition: SGxAODProxyLoader.h:208
SG::auxid_t
size_t auxid_t
Identifier for a particular aux data item.
Definition: AuxTypes.h:27
ExpressionParsing::IProxyLoader::VT_DOUBLE
@ VT_DOUBLE
Definition: IProxyLoader.h:21
ExpressionParsing::IProxyLoader::VT_UNK
@ VT_UNK
Definition: IProxyLoader.h:21
ExpressionParsing::MethodAccessorFactory::create
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.
Definition: MethodAccessor.h:224
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:40
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ExpressionParsing::SGxAODProxyLoader::ReadHandleMapTmpl< SG::ReadHandleKey< SG::AuxElement >, SG::ReadHandleKey< SG::AuxVectorBase > >::isVector
static bool isVector(const std::any &anything)
Check whether the given any is the "vector" object.
Definition: SGxAODProxyLoader.h:185
ExpressionParsing::IProxyLoader::VT_VECINT
@ VT_VECINT
Definition: IProxyLoader.h:21
RootUtils::TSMethodCall::call
TMethodCall * call()
Return a pointer to the thread-specific TMethodCall.
Definition: TSMethodCall.cxx:109
ExpressionParsing::PlainAccessorFactory::createAccessor
std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const
Definition: PlainAccessor.h:208
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
ExpressionParsing::IAccessor::variableType
virtual IProxyLoader::VariableType variableType() const =0
ExpressionParsing::SGxAODProxyLoader::m_decorKeys
ReadDecorHandleMap m_decorKeys
Definition: SGxAODProxyLoader.h:202
ExpressionParsing::IProxyLoader::VT_INT
@ VT_INT
Definition: IProxyLoader.h:21
ExpressionParsing::SGxAODProxyLoader::getAccessor
IAccessor & getAccessor(const EventContext &ctx, const std::string &varname) const
Get an existing or create a new accessor for the given variable name.
Definition: SGxAODProxyLoader.h:138
ExpressionParsing::SGxAODProxyLoader::m_evtStore
StoreGateSvc_t m_evtStore
Definition: SGxAODProxyLoader.h:165
SG::BaseInfoBase::find
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
Definition: BaseInfo.cxx:569
RootUtils::TSMethodCall::setProto
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.
Definition: TSMethodCall.cxx:90
xAOD::JetAttributeAccessor::accessor
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
Definition: JetAccessorMap.h:26
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
ExpressionParsing::getContainerSize
std::size_t getContainerSize(const T &cont)
Definition: PhysicsAnalysis/CommonTools/ExpressionEvaluation/src/Utils.h:73
ExpressionParsing::SGxAODProxyLoader::ReadHandleMapTmpl< SG::ReadHandleKey< SG::AuxElement >, SG::ReadHandleKey< SG::AuxVectorBase > >::vectorKey
static SG::ReadHandleKey< SG::AuxVectorBase > & vectorKey(std::any &anything)
Get a reference to the vector object referred to by any or throw an exception.
Definition: SGxAODProxyLoader.h:191
LArG4AODNtuplePlotter.varname
def varname(hname)
Definition: LArG4AODNtuplePlotter.py:37
ExpressionParsing::dumpDeclare
void dumpDeclare(const T *key)
Function for debugging which dumps information about newly declared data handles.
Definition: DebugUtils.h:65
ExpressionParsing::SGxAODProxyLoader::createAccessor
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.
Definition: SGxAODProxyLoader.cxx:114
python.TriggerHandler.verbose
verbose
Definition: TriggerHandler.py:297
SG::BaseInfoBase
The non-template portion of the BaseInfo implementation.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:451
ExpressionParsing::SGxAODProxyLoader::ReadHandleMapTmpl< SG::ReadHandleKey< SG::AuxElement >, SG::ReadHandleKey< SG::AuxVectorBase > >::isElement
static bool isElement(const std::any &anything)
Check whether the given any is the "element" object.
Definition: SGxAODProxyLoader.h:187
ExpressionParsing::SGxAODProxyLoader::computeClassForVarname
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.
Definition: SGxAODProxyLoader.cxx:138
ExpressionParsing::SGxAODProxyLoader::m_emptyVectorAccessor
std::unique_ptr< IAccessor > m_emptyVectorAccessor
Special accessor to handle empty vectors Accessor are constructed at time of first evaluation.
Definition: SGxAODProxyLoader.h:216
SG::BaseInfoBase::typeinfo
const std::type_info & typeinfo() const
Return the std::type_info for this class.
Definition: BaseInfo.cxx:151
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
ExpressionParsing::initializeHandle
void initializeHandle(T_Key *key, std::vector< Gaudi::DataHandle * > &new_input_handles)
Auxiliary function to initialize newly create data handles.
Definition: PhysicsAnalysis/CommonTools/ExpressionEvaluation/src/Utils.h:17
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
SG::BaseInfoBase::is_base
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