ATLAS Offline Software
Loading...
Searching...
No Matches
xAODVariableProxyLoaders.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6// xAODVariableProxyLoaders.h, (c) ATLAS Detector software
8// Author: Thomas Gillam (thomas.gillam@cern.ch)
9// ExpressionParsing library
11
12#ifndef XAOD_VARIABLE_PROXY_LOADERS_H
13#define XAOD_VARIABLE_PROXY_LOADERS_H
14
16
19#include "TMethodCall.h"
20#include "TVirtualCollectionProxy.h"
24
25#include <unordered_map>
26#include <string>
27#include <typeinfo>
28
29namespace ExpressionParsing {
30
32 public:
34 virtual bool isValid(const SG::AuxElement *auxElement) const = 0;
35 virtual bool isValid(const SG::AuxVectorData *auxVectorData) const = 0;
36
37 virtual int getIntValue(const SG::AuxElement *auxElement) const = 0;
38 virtual double getDoubleValue(const SG::AuxElement *auxElement) const = 0;
39 virtual std::vector<int> getVecIntValue(const SG::AuxVectorData *auxVectorData) = 0;
40 virtual std::vector<double> getVecDoubleValue(const SG::AuxVectorData *auxVectorData) = 0;
41 };
42
43
44 template <typename T> class AccessorWrapper : public BaseAccessorWrapper {
45 public:
46 AccessorWrapper(const std::string &elementName) :
47 m_elementName(elementName), m_acc(elementName)
48 {
49 }
50
51 virtual ~AccessorWrapper() { }
52
53 virtual bool isValid(const SG::AuxElement *auxElement) const {
54 return m_acc.isAvailable(*auxElement);
55 }
56
57 virtual bool isValid(const SG::AuxVectorData *auxVectorData) const {
58 // TPSG: A bit hacky - implementation copied from AuxElement.icc
60 SG::auxid_t auxid = r.findAuxID(m_elementName);
61 if (!auxVectorData || !auxVectorData->getConstStore()) return false;
62
63 // At this point we just have to cross our fingers and hope...
64 if (auxVectorData->size_v() == 0) return true;
65
66 const SG::auxid_set_t& ids = auxVectorData->getConstStore()->getAuxIDs();
67 if( ids.find (auxid) != ids.end() ) return true;
68 return auxVectorData->getConstStore()->getData( auxid ) != 0;
69 }
70
71 virtual int getIntValue(const SG::AuxElement *auxElement) const {
72 return (int) m_acc(*auxElement);
73 }
74
75 virtual double getDoubleValue(const SG::AuxElement *auxElement) const {
76 return (double) m_acc(*auxElement);
77 }
78
79 virtual std::vector<int> getVecIntValue(const SG::AuxVectorData *auxVectorData) {
80 size_t N = auxVectorData->size_v();
81 std::vector<int> result(N);
82 for (size_t i = 0; i < N; ++i) {
83 result[i] = (int) m_acc(*auxVectorData, i);
84 }
85 return result;
86 }
87
88 virtual std::vector<double> getVecDoubleValue(const SG::AuxVectorData *auxVectorData) {
89 size_t N = auxVectorData->size_v();
90 std::vector<double> result(N);
91 for (size_t i = 0; i < N; ++i) {
92 result[i] = (double) m_acc(*auxVectorData, i);
93 }
94 return result;
95 }
96
97 private:
98 std::string m_elementName;
100 };
101
102
104 public:
105 TMethodWrapper(const std::type_info &elementTypeinfo, const std::string &methodName);
108 virtual ~TMethodWrapper();
110 virtual bool isValid(const SG::AuxElement *auxElement) const;
111 virtual bool isValid(const SG::AuxVectorData *auxVectorData) const;
112
113 virtual int getIntValue(const SG::AuxElement *auxElement) const;
114 virtual double getDoubleValue(const SG::AuxElement *auxElement) const;
115 virtual std::vector<int> getVecIntValue(const SG::AuxVectorData *auxVectorData);
116 virtual std::vector<double> getVecDoubleValue(const SG::AuxVectorData *auxVectorData);
117
118 private:
121 };
122
123
125 public:
126 TMethodCollectionWrapper(const std::type_info &containerTypeinfo, const std::string &methodName);
131 virtual bool isValid(const SG::AuxElement *auxElement) const;
132 virtual bool isValid(const SG::AuxVectorData *auxVectorData) const;
133
134 virtual int getIntValue(const SG::AuxElement *auxElement) const;
135 virtual double getDoubleValue(const SG::AuxElement *auxElement) const;
136 virtual std::vector<int> getVecIntValue(const SG::AuxVectorData *auxVectorData);
137 virtual std::vector<double> getVecDoubleValue(const SG::AuxVectorData *auxVectorData);
138
139 private:
140 TVirtualCollectionProxy *m_collectionProxy;
143 };
144
145
147 public:
149 virtual ~xAODProxyLoader();
150
154
155 virtual void reset();
156
157 protected:
158 template<class TYPE, class AUX>
159 bool try_type(const std::string& varname, const std::type_info* ti, const AUX* data) const;
160
161 template<class AUX>
162 IProxyLoader::VariableType try_all_known_types(const std::string& varname, const AUX* data, bool isVector) const;
163
165 mutable accessorCache_t m_accessorCache ATLAS_THREAD_SAFE;
166 };
167
168
170 public:
172 xAODElementProxyLoader(const SG::AuxElement *auxElement);
173
174 void setData(const SG::AuxElement *auxElement);
175
176 virtual IProxyLoader::VariableType variableTypeFromString(const std::string &varname) const;
177 virtual int loadIntVariableFromString(const std::string &varname) const;
178 virtual double loadDoubleVariableFromString(const std::string &varname) const;
179 virtual std::vector<int> loadVecIntVariableFromString(const std::string &varname) const;
180 virtual std::vector<double> loadVecDoubleVariableFromString(const std::string &varname) const;
181
182 private:
184 };
185
186
188 public:
190 xAODVectorProxyLoader(const SG::AuxVectorData *auxVectorData);
191
192 void setData(const SG::AuxVectorData *auxElement);
193
194 virtual IProxyLoader::VariableType variableTypeFromString(const std::string &varname) const;
195 virtual int loadIntVariableFromString(const std::string &varname) const;
196 virtual double loadDoubleVariableFromString(const std::string &varname) const;
197 virtual std::vector<int> loadVecIntVariableFromString(const std::string &varname) const;
198 virtual std::vector<double> loadVecDoubleVariableFromString(const std::string &varname) const;
199
200 private:
202 };
203
204}
205
206#endif // XAOD_VARIABLE_PROXY_LOADERS_H
Base class for elements of a container that can have aux data.
Hash map from strings allowing concurrent, lockless reads.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Simple (non-deleting) Updater implementation.
Helper for thread-safe TMethodCall. Extracted from Type.
Define macros for attributes used to control the static checker.
Hash map from strings allowing concurrent, lockless reads.
virtual bool isValid(const SG::AuxElement *auxElement) const
SG::AuxElement::ConstAccessor< T > m_acc
virtual bool isValid(const SG::AuxVectorData *auxVectorData) const
virtual std::vector< int > getVecIntValue(const SG::AuxVectorData *auxVectorData)
virtual std::vector< double > getVecDoubleValue(const SG::AuxVectorData *auxVectorData)
virtual double getDoubleValue(const SG::AuxElement *auxElement) const
AccessorWrapper(const std::string &elementName)
virtual int getIntValue(const SG::AuxElement *auxElement) const
virtual bool isValid(const SG::AuxElement *auxElement) const =0
virtual bool isValid(const SG::AuxVectorData *auxVectorData) const =0
virtual std::vector< int > getVecIntValue(const SG::AuxVectorData *auxVectorData)=0
virtual int getIntValue(const SG::AuxElement *auxElement) const =0
virtual std::vector< double > getVecDoubleValue(const SG::AuxVectorData *auxVectorData)=0
virtual double getDoubleValue(const SG::AuxElement *auxElement) const =0
RootUtils::TSMethodCall m_methodCall ATLAS_THREAD_SAFE
virtual bool isValid(const SG::AuxElement *auxElement) const
virtual int getIntValue(const SG::AuxElement *auxElement) const
virtual std::vector< int > getVecIntValue(const SG::AuxVectorData *auxVectorData)
virtual double getDoubleValue(const SG::AuxElement *auxElement) const
TMethodCollectionWrapper & operator=(const TMethodCollectionWrapper &)=delete
TMethodCollectionWrapper(const std::type_info &containerTypeinfo, const std::string &methodName)
TMethodCollectionWrapper(const TMethodCollectionWrapper &)=delete
virtual std::vector< double > getVecDoubleValue(const SG::AuxVectorData *auxVectorData)
virtual std::vector< int > getVecIntValue(const SG::AuxVectorData *auxVectorData)
TMethodWrapper & operator=(const TMethodWrapper &)=delete
TMethodWrapper(const std::type_info &elementTypeinfo, const std::string &methodName)
virtual std::vector< double > getVecDoubleValue(const SG::AuxVectorData *auxVectorData)
RootUtils::TSMethodCall m_methodCall ATLAS_THREAD_SAFE
virtual bool isValid(const SG::AuxElement *auxElement) const
virtual double getDoubleValue(const SG::AuxElement *auxElement) const
TMethodWrapper(const TMethodWrapper &)=delete
IProxyLoader::VariableType variableType()
virtual int getIntValue(const SG::AuxElement *auxElement) const
void setData(const SG::AuxElement *auxElement)
virtual double loadDoubleVariableFromString(const std::string &varname) const
virtual std::vector< double > loadVecDoubleVariableFromString(const std::string &varname) const
virtual int loadIntVariableFromString(const std::string &varname) const
virtual std::vector< int > loadVecIntVariableFromString(const std::string &varname) const
virtual IProxyLoader::VariableType variableTypeFromString(const std::string &varname) const
xAODProxyLoader(const xAODProxyLoader &)=delete
Disallow copy construction and assignment.
bool try_type(const std::string &varname, const std::type_info *ti, const AUX *data) const
xAODProxyLoader & operator=(const xAODProxyLoader &)=delete
IProxyLoader::VariableType try_all_known_types(const std::string &varname, const AUX *data, bool isVector) const
CxxUtils::ConcurrentStrMap< BaseAccessorWrapper *, CxxUtils::SimpleUpdater > accessorCache_t
accessorCache_t m_accessorCache ATLAS_THREAD_SAFE
virtual std::vector< int > loadVecIntVariableFromString(const std::string &varname) const
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
void setData(const SG::AuxVectorData *auxElement)
virtual std::vector< double > loadVecDoubleVariableFromString(const std::string &varname) const
Helper for making a thread-safe function call.
Base class for elements of a container that can have aux data.
Definition AuxElement.h:483
SG::ConstAccessor< T, ALLOC > ConstAccessor
Definition AuxElement.h:569
Handle mappings between names and auxid_t.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Manage lookup of vectors of auxiliary data.
virtual size_t size_v() const =0
Return the size of the container.
const SG::IConstAuxStore * getConstStore() const
Return the current store, as a const interface.
virtual const SG::auxid_set_t & getAuxIDs() const =0
Return a set of identifiers for existing data items in this store.
virtual const void * getData(SG::auxid_t auxid) const =0
Return the data vector for one aux data item.
A set of aux data identifiers.
Definition AuxTypes.h:47
int r
Definition globals.cxx:22
Namespace holding all the expression evaluation code.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27