ATLAS Offline Software
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<ContainerIdConcept 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<ContainerIdConcept CI,typename CT,typename CM>
161  {
162  public:
163 
164  using ColumnType = typename ColumnTypeTraits<CT,CM>::ColumnType;
166 
167  AccessorTemplate () = default;
168 
169  AccessorTemplate (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
170  : m_base (columnBase, name, std::move (ColumnTypeTraits<CT,CM>::updateColumnInfo(columnBase, info)))
171  {}
172 
173  [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const noexcept
174  {
177  else
179  }
180 
181  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
182  {
183  return m_base.isAvailable (id);
184  }
185 
186  [[nodiscard]] std::optional<UserType> getOptional (ObjectId<CI,CM> id) const
187  {
188  if (m_base.isAvailable (id))
189  return operator()(id);
190  else
191  return std::nullopt;
192  }
193 
194  private:
196  };
197 
198 
199 
200 
208 
209  template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM,typename CM>
211  {
212  accessor = AccessorTemplate<CI,CT,CAM,CM> (columnBase, name, std::move (info));
213  }
214 
215 
216 
217 
218 
219  template<ContainerIdConcept CI,typename CT,typename CM=ColumnarModeDefault> using ColumnAccessor = AccessorTemplate<CI,CT,ColumnAccessMode::input,CM>;
220  template<ContainerIdConcept CI,typename CT,typename CM=ColumnarModeDefault> using ColumnDecorator = AccessorTemplate<CI,CT,ColumnAccessMode::output,CM>;
221  template<ContainerIdConcept CI,typename CT,typename CM=ColumnarModeDefault> using ColumnUpdater = AccessorTemplate<CI,CT,ColumnAccessMode::update,CM>;
222 }
223 
224 #include "ColumnAccessorXAOD.icc"
225 #include "ColumnAccessorArray.icc"
226 
227 #endif
InDetSimDataHelpers::getData
const InDetSimData * getData(const InDetSimDataCollection &coll, const Identifier &id)
Definition: InDetSimDataDict.h:24
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
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
columnar::ColumnTypeTraits< RetypeColumn< UT, CT >, CM >::convertInput
static UT convertInput(const CT &value)
Definition: ColumnAccessor.h:152
columnar::getOptional
std::optional< UserType > getOptional(ObjectId< CI, CM > id) const
Definition: ColumnAccessor.h:186
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::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
columnar::final
CM final
Definition: ColumnAccessor.h:106
ObjectRange.h
columnar::ColumnAccessModeTraits< ColumnAccessMode::output >::ColumnType
T ColumnType
Definition: ColumnAccessor.h:35
merge.output
output
Definition: merge.py:16
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:176
columnar::ColumnTypeTraits< NativeColumn< CT >, CM >::ColumnType
CT ColumnType
Definition: ColumnAccessor.h:124
columnar::isAvailable
bool isAvailable(ObjectId< CI, CM > id) const noexcept
Definition: ColumnAccessor.h:181
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
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.
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::m_base
AccessorTemplate< CI, ColumnType, ColumnAccessMode::input, CM > m_base
Definition: ColumnAccessor.h:195
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::requires
requires requires
Definition: VariantAccessor.h:23
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:210
columnar::UserType
typename ColumnTypeTraits< CT, CM >::UserType UserType
Definition: ColumnAccessor.h:165
columnar::ColumnTypeTraits< RetypeColumn< UT, CT >, CM >::ColumnType
CT ColumnType
Definition: ColumnAccessor.h:146
columnar::operator()
decltype(auto) operator()(ObjectId< CI, CM > id) const noexcept
Definition: ColumnAccessor.h:173
columnar::ColumnAccessModeTraits
Definition: ColumnAccessor.h:24
Decorator.h
Helper class to provide type-safe access to aux data.
python.ParticleTypeUtil.info
def info
Definition: ParticleTypeUtil.py:87
WriteBchToCool.update
update
Definition: WriteBchToCool.py:67