Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ColumnAccessor.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 #ifndef COLUMNAR_CORE_COLUMN_ACCESSOR_H
9 #define COLUMNAR_CORE_COLUMN_ACCESSOR_H
10 
12 #include "AthContainers/Accessor.h"
15 #include <ColumnarCore/ObjectId.h>
19 #include <span>
20 #include <type_traits>
21 
22 namespace columnar
23 {
24  template<ColumnAccessMode CAM> struct ColumnAccessModeTraits;
25 
27  {
28  template<typename T> using XAODAccessor = SG::ConstAccessor<T>;
29  template<typename T> using ColumnType = const T;
30  };
31 
33  {
34  template<typename T> using XAODAccessor = SG::Decorator<T>;
35  template<typename T> using ColumnType = T;
36  };
37 
39  {
40  template<typename T> using XAODAccessor = SG::Accessor<T>;
41  template<typename T> using ColumnType = T;
42  };
43 
44 
45 
81  template<ContainerId CI,typename CT,ColumnAccessMode CAM,typename CM> class AccessorTemplate;
82 
83 
94  template<typename CT,typename CM>
96  {
97  static constexpr bool isNativeType = false;
98  static constexpr bool useConvertInput = false;
99  static constexpr bool useConvertWithDataInput = false;
100  static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
101  };
102 
103  template<typename CT,typename CM>
104  requires ((std::is_integral_v<CT> || std::is_floating_point_v<CT>) && !std::is_same_v<CT,bool>)
106  {
107  using ColumnType = CT;
108  static constexpr bool isNativeType = true;
109  static constexpr bool useConvertInput = false;
110  static constexpr bool useConvertWithDataInput = false;
111  static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
112  };
113 
120  template<typename CT> struct NativeColumn final {};
121  template<typename CT,typename CM>
123  {
124  using ColumnType = CT;
125  static constexpr bool isNativeType = true;
126  static constexpr bool useConvertInput = false;
127  static constexpr bool useConvertWithDataInput = false;
128  static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
129  };
130 
131 
137  template<typename UT,typename CT> struct RetypeColumn final
138  {
139  static_assert (!std::is_const_v<CT>, "CT must not be const");
140  static_assert (!std::is_const_v<UT>, "UT must not be const");
141  };
142 
143  template<typename UT,typename CT,typename CM>
145  {
146  using ColumnType = CT;
147  using UserType = UT;
148  static constexpr bool isNativeType = false;
149  static constexpr bool useConvertInput = true;
150  static constexpr bool useConvertWithDataInput = false;
151  static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
152  static UT convertInput (const CT& value) {return UT (value);}
153  };
154 
155 
156 
157  // the accessor specialization for type conversions
158  template<ContainerId OT,typename CT,typename CM>
161  {
162  public:
163 
164  static_assert (ContainerIdTraits<OT>::isDefined, "ContainerId not defined, include the appropriate header");
165 
168 
169  AccessorTemplate () = default;
170 
171  AccessorTemplate (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
172  : m_base (columnBase, name, std::move (ColumnTypeTraits<CT,CM>::updateColumnInfo(columnBase, info)))
173  {}
174 
175  [[nodiscard]] decltype(auto) operator () (ObjectId<OT,CM> id) const noexcept
176  {
179  else
181  }
182 
183  [[nodiscard]] bool isAvailable (ObjectId<OT,CM> id) const noexcept
184  {
185  return m_base.isAvailable (id);
186  }
187 
188  [[nodiscard]] std::optional<UserType> getOptional (ObjectId<OT,CM> id) const
189  {
190  if (m_base.isAvailable (id))
191  return operator()(id);
192  else
193  return std::nullopt;
194  }
195 
196  private:
198  };
199 
200 
201 
202 
210 
211  template<ContainerId CI,typename CT,ColumnAccessMode CAM,typename CM>
213  {
214  accessor = AccessorTemplate<CI,CT,CAM,CM> (columnBase, name, std::move (info));
215  }
216 
217 
218 
219 
220 
221  template<ContainerId CI,typename CT,typename CM=ColumnarModeDefault> using ColumnAccessor = AccessorTemplate<CI,CT,ColumnAccessMode::input,CM>;
222  template<ContainerId CI,typename CT,typename CM=ColumnarModeDefault> using ColumnDecorator = AccessorTemplate<CI,CT,ColumnAccessMode::output,CM>;
223  template<ContainerId CI,typename CT,typename CM=ColumnarModeDefault> using ColumnUpdater = AccessorTemplate<CI,CT,ColumnAccessMode::update,CM>;
224  template<typename CT,typename CM=ColumnarModeDefault> using JetAccessor = AccessorTemplate<ContainerId::jet,CT,ColumnAccessMode::input,CM>;
225  template<typename CT,typename CM=ColumnarModeDefault> using JetDecorator = AccessorTemplate<ContainerId::jet,CT,ColumnAccessMode::output,CM>;
226  template<typename CT,typename CM=ColumnarModeDefault> using MutableJetAccessor = AccessorTemplate<ContainerId::mutableJet,CT,ColumnAccessMode::input,CM>;
227  template<typename CT,typename CM=ColumnarModeDefault> using MutableJetDecorator = AccessorTemplate<ContainerId::mutableJet,CT,ColumnAccessMode::output,CM>;
228  template<typename CT,typename CM=ColumnarModeDefault> using MutableJetUpdater = AccessorTemplate<ContainerId::mutableJet,CT,ColumnAccessMode::update,CM>;
229  template<typename CT,typename CM=ColumnarModeDefault> using MuonAccessor = AccessorTemplate<ContainerId::muon,CT,ColumnAccessMode::input,CM>;
230  template<typename CT,typename CM=ColumnarModeDefault> using MuonDecorator = AccessorTemplate<ContainerId::muon,CT,ColumnAccessMode::output,CM>;
231  template<typename CT,typename CM=ColumnarModeDefault> using TrackAccessor = AccessorTemplate<ContainerId::track,CT,ColumnAccessMode::input,CM>;
232  template<typename CT,typename CM=ColumnarModeDefault> using TrackDecorator = AccessorTemplate<ContainerId::track,CT,ColumnAccessMode::output,CM>;
233  template<typename CT,typename CM=ColumnarModeDefault> using Track0Accessor = AccessorTemplate<ContainerId::track0,CT,ColumnAccessMode::input,CM>;
234  template<typename CT,typename CM=ColumnarModeDefault> using Track0Decorator = AccessorTemplate<ContainerId::track0,CT,ColumnAccessMode::output,CM>;
235  template<typename CT,typename CM=ColumnarModeDefault> using Track1Accessor = AccessorTemplate<ContainerId::track1,CT,ColumnAccessMode::input,CM>;
236  template<typename CT,typename CM=ColumnarModeDefault> using Track1Decorator = AccessorTemplate<ContainerId::track1,CT,ColumnAccessMode::output,CM>;
237  template<typename CT,typename CM=ColumnarModeDefault> using Track2Accessor = AccessorTemplate<ContainerId::track2,CT,ColumnAccessMode::input,CM>;
238  template<typename CT,typename CM=ColumnarModeDefault> using Track2Decorator = AccessorTemplate<ContainerId::track2,CT,ColumnAccessMode::output,CM>;
239  template<typename CT,typename CM=ColumnarModeDefault> using ElectronAccessor = AccessorTemplate<ContainerId::electron,CT,ColumnAccessMode::input,CM>;
240  template<typename CT,typename CM=ColumnarModeDefault> using ElectronDecorator = AccessorTemplate<ContainerId::electron,CT,ColumnAccessMode::output,CM>;
241  template<typename CT,typename CM=ColumnarModeDefault> using PhotonAccessor = AccessorTemplate<ContainerId::photon,CT,ColumnAccessMode::input,CM>;
242  template<typename CT,typename CM=ColumnarModeDefault> using PhotonDecorator = AccessorTemplate<ContainerId::photon,CT,ColumnAccessMode::output,CM>;
243  template<typename CT,typename CM=ColumnarModeDefault> using EgammaAccessor = AccessorTemplate<ContainerId::egamma,CT,ColumnAccessMode::input,CM>;
244  template<typename CT,typename CM=ColumnarModeDefault> using EgammaDecorator = AccessorTemplate<ContainerId::egamma,CT,ColumnAccessMode::output,CM>;
245  template<typename CT,typename CM=ColumnarModeDefault> using ClusterAccessor = AccessorTemplate<ContainerId::cluster,CT,ColumnAccessMode::input,CM>;
246  template<typename CT,typename CM=ColumnarModeDefault> using ClusterDecorator = AccessorTemplate<ContainerId::cluster,CT,ColumnAccessMode::output,CM>;
247  template<typename CT,typename CM=ColumnarModeDefault> using EventInfoAccessor = AccessorTemplate<ContainerId::eventInfo,CT,ColumnAccessMode::input,CM>;
248  template<typename CT,typename CM=ColumnarModeDefault> using EventInfoDecorator = AccessorTemplate<ContainerId::eventInfo,CT,ColumnAccessMode::output,CM>;
249  template<typename CT,typename CM=ColumnarModeDefault> using ParticleAccessor = AccessorTemplate<ContainerId::particle,CT,ColumnAccessMode::input,CM>;
250  template<typename CT,typename CM=ColumnarModeDefault> using ParticleDecorator = AccessorTemplate<ContainerId::particle,CT,ColumnAccessMode::output,CM>;
251  template<typename CT,typename CM=ColumnarModeDefault> using Particle0Accessor = AccessorTemplate<ContainerId::particle0,CT,ColumnAccessMode::input,CM>;
252  template<typename CT,typename CM=ColumnarModeDefault> using Particle0Decorator = AccessorTemplate<ContainerId::particle0,CT,ColumnAccessMode::output,CM>;
253  template<typename CT,typename CM=ColumnarModeDefault> using Particle1Accessor = AccessorTemplate<ContainerId::particle1,CT,ColumnAccessMode::input,CM>;
254  template<typename CT,typename CM=ColumnarModeDefault> using Particle1Decorator = AccessorTemplate<ContainerId::particle1,CT,ColumnAccessMode::output,CM>;
255  template<typename CT,typename CM=ColumnarModeDefault> using MetAccessor = AccessorTemplate<ContainerId::met,CT,ColumnAccessMode::input,CM>;
256  template<typename CT,typename CM=ColumnarModeDefault> using MetDecorator = AccessorTemplate<ContainerId::met,CT,ColumnAccessMode::output,CM>;
257  template<typename CT,typename CM=ColumnarModeDefault> using Met0Accessor = AccessorTemplate<ContainerId::met0,CT,ColumnAccessMode::input,CM>;
258  template<typename CT,typename CM=ColumnarModeDefault> using Met0Decorator = AccessorTemplate<ContainerId::met0,CT,ColumnAccessMode::output,CM>;
259  template<typename CT,typename CM=ColumnarModeDefault> using Met1Accessor = AccessorTemplate<ContainerId::met1,CT,ColumnAccessMode::input,CM>;
260  template<typename CT,typename CM=ColumnarModeDefault> using Met1Decorator = AccessorTemplate<ContainerId::met1,CT,ColumnAccessMode::output,CM>;
261  template<typename CT,typename CM=ColumnarModeDefault> using MutableMetAccessor = AccessorTemplate<ContainerId::mutableMet,CT,ColumnAccessMode::input,CM>;
262  template<typename CT,typename CM=ColumnarModeDefault> using MutableMetDecorator = AccessorTemplate<ContainerId::mutableMet,CT,ColumnAccessMode::output,CM>;
263 }
264 
265 #include "ColumnAccessorXAOD.icc"
266 #include "ColumnAccessorArray.icc"
267 
268 #endif
grepfile.info
info
Definition: grepfile.py:38
columnar::ContainerIdTraits
Definition: ContainerId.h:97
InDetSimDataHelpers::getData
const InDetSimData * getData(const InDetSimDataCollection &coll, const Identifier &id)
Definition: InDetSimDataDict.h:24
columnar::m_base
AccessorTemplate< OT, ColumnType, ColumnAccessMode::input, CM > m_base
Definition: ColumnAccessor.h:197
columnar::ColumnTypeTraits::useConvertWithDataInput
static constexpr bool useConvertWithDataInput
Definition: ColumnAccessor.h:99
columnar::ColumnTypeTraits::useConvertInput
static constexpr bool useConvertInput
Definition: ColumnAccessor.h:98
SG::Accessor< T >
ColumnAccessorArray.icc
columnar::RetypeColumn
a type wrapper to make AccessorTemplate convert the underlying column type to a different type
Definition: ColumnAccessor.h:138
columnar::ColumnTypeTraits< RetypeColumn< UT, CT >, CM >::UserType
UT UserType
Definition: ColumnAccessor.h:147
columnar::ColumnAccessModeTraits< ColumnAccessMode::input >::ColumnType
const T ColumnType
Definition: ColumnAccessor.h:29
athena.value
value
Definition: athena.py:124
SG::ConstAccessor< T >
columnar::ColumnTypeTraits< NativeColumn< CT >, CM >::updateColumnInfo
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
Definition: ColumnAccessor.h:128
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
columnar::ColumnTypeTraits< RetypeColumn< UT, CT >, CM >::convertInput
static UT convertInput(const CT &value)
Definition: ColumnAccessor.h:152
ColumnAccessorXAOD.icc
columnar::ColumnAccessModeTraits< ColumnAccessMode::update >::ColumnType
T ColumnType
Definition: ColumnAccessor.h:41
columnar::ColumnInfo
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition: ColumnInfo.h:35
columnar::AccessorTemplate
AccessorTemplate()=default
columnar::ColumnTypeTraits< RetypeColumn< UT, CT >, CM >::updateColumnInfo
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
Definition: ColumnAccessor.h:151
SG::Decorator< T >
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
ColumnarTool.h
columnar::getOptional
std::optional< UserType > getOptional(ObjectId< OT, CM > id) const
Definition: ColumnAccessor.h:188
columnar::ColumnAccessMode
ColumnAccessMode
an enum for the different access modes for a column
Definition: ColumnInfo.h:19
columnar::ColumnTypeTraits::isNativeType
static constexpr bool isNativeType
Definition: ColumnAccessor.h:97
ObjectRange.h
columnar::ColumnAccessModeTraits< ColumnAccessMode::output >::ColumnType
T ColumnType
Definition: ColumnAccessor.h:35
merge.output
output
Definition: merge.py:17
columnar::requires
requires((std::is_integral_v< CT >||std::is_floating_point_v< CT >) &&!std::is_same_v< CT, bool >) struct ColumnTypeTraits< CT
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ObjectId.h:18
columnar::ColumnTypeTraits< NativeColumn< CT >, CM >::ColumnType
CT ColumnType
Definition: ColumnAccessor.h:124
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::NativeColumn
a type wrapper to force AccessorTemplate to treat the type as native
Definition: ColumnAccessor.h:120
Accessor.h
Helper class to provide type-safe access to aux data.
columnar::operator()
decltype(auto) operator()(ObjectId< OT, CM > id) const noexcept
Definition: ColumnAccessor.h:175
ObjectId.h
columnar::ColumnTypeTraits::updateColumnInfo
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
Definition: ColumnAccessor.h:100
xAOD::JetAttributeAccessor::accessor
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
Definition: JetAccessorMap.h:26
columnar::isAvailable
bool isAvailable(ObjectId< OT, CM > id) const noexcept
Definition: ColumnAccessor.h:183
columnar::CT
CT
Definition: ColumnAccessor.h:160
columnar::ColumnTypeTraits
a trait class to provide information about the column type
Definition: ColumnAccessor.h:96
columnar
Definition: ClusterDef.h:16
ContainerId.h
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:15
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
ColumnInfo.h
columnar::resetAccessor
void resetAccessor(AccessorTemplate< CI, CT, CAM, CM > &accessor, ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
reset a column accessor to point to a new column
Definition: ColumnAccessor.h:212
columnar::UserType
typename ColumnTypeTraits< CT, CM >::UserType UserType
Definition: ColumnAccessor.h:167
columnar::ColumnTypeTraits< RetypeColumn< UT, CT >, CM >::ColumnType
CT ColumnType
Definition: ColumnAccessor.h:146
columnar::ColumnAccessModeTraits
Definition: ColumnAccessor.h:24
Decorator.h
Helper class to provide type-safe access to aux data.
WriteBchToCool.update
update
Definition: WriteBchToCool.py:67
columnar::ColumnType
typename ColumnTypeTraits< CT, CM >::ColumnType ColumnType
Definition: ColumnAccessor.h:166