ATLAS Offline Software
VariantAccessor.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_VARIANT_VARIANT_ACCESSOR_H
9 #define COLUMNAR_VARIANT_VARIANT_ACCESSOR_H
10 
13 #include <boost/mp11/tuple.hpp>
14 
15 namespace columnar
16 {
17  // the column accessor for variant objects in ColumnarModeXAOD
18  //
19  // This just wraps a regular accessor, as in xAOD mode variants aren't
20  // really a thing.
21  template<ContainerIdConcept CIBase,ContainerIdConcept... CIList,typename CT,ColumnAccessMode CAM>
24  {
27  public:
28 
29  static_assert (!std::is_const_v<CT>, "CT must not be const");
30 
31  using CI = VariantContainerId<CIBase,CIList...>;
33  using AccessorTuple = std::tuple<AccessorTemplate<CIList,CT,CAM,CM>...>;
34 
35  AccessorTemplate () noexcept = default;
36 
37  AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
38  {
39  resetAccessor (m_accessor, columnarTool, name, ColumnInfo(info));
40  }
41 
43  {
44  m_accessor = std::move (that.m_accessor);
45  }
46 
48  {
49  if (this != &that)
50  m_accessor = std::move (that.m_accessor);
51  return *this;
52  }
53 
56 
57  void reset (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
58  {
59  resetAccessor (m_accessor, columnarTool, name, ColumnInfo(info));
60  }
61 
62  [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const noexcept
63  {
64  return m_accessor (id.getBaseObject());
65  }
66 
67  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
68  {
69  return m_accessor.isAvailable (id.getBaseObject());
70  }
71 
74  private:
75 
77  };
78 
79 
80 
81  // the column accessor for variant objects in ColumnarModeArray
82  //
83  // This internally contains a tuple of accessors, one for each
84  // variant. This is probably not the best way to implement it, but it
85  // fits best with the current accessor infrastructure.
86  template<ContainerIdConcept CIBase,ContainerIdConcept... CIList,typename CT,ColumnAccessMode CAM>
89  {
92  public:
93 
94  static_assert (!std::is_const_v<CT>, "CT must not be const");
95 
96  using CI = VariantContainerId<CIBase,CIList...>;
98  using AccessorTuple = std::tuple<AccessorTemplate<CIList,CT,CAM,CM>...>;
99 
100  AccessorTemplate () noexcept = default;
101 
102  AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
103  {
104  boost::mp11::tuple_for_each (m_accessors, [&columnarTool,&name,&info] (auto& accessor)
105  {
106  resetAccessor (accessor, columnarTool, name, ColumnInfo(info));
107  });
108  }
109 
111  {
112  m_accessors = std::move (that.m_accessors);
113  }
114 
116  {
117  if (this != &that)
118  m_accessors = std::move (that.m_accessors);
119  return *this;
120  }
121 
124 
125  void reset (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
126  {
127  boost::mp11::tuple_for_each (m_accessors, [&columnarTool,&name,&info] (auto& accessor)
128  {
129  resetAccessor (accessor, columnarTool, name, ColumnInfo(info));
130  });
131  }
132 
133  [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const noexcept
134  {
135  return internalGet<0> (id);
136  }
137 
138  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
139  {
140  return internalIsAvailable<0> (id);
141  }
142 
145  private:
146 
148 
149  template<unsigned Index>
150  void internalInit (ColumnarTool<CM>& columnarTool, const std::string& name, const ColumnInfo& info)
151  {
152  resetAccessor (std::get<Index>(m_accessors), columnarTool, name, ColumnInfo(info));
153  if constexpr (Index + 1 < CI::numVariants)
154  internalInit<Index + 1>(columnarTool, name, info);
155  }
156 
157  template<unsigned Index>
158  decltype(auto) internalGet (const ObjectId<CI,CM>& id) const noexcept
159  {
160  if (id.getVariantIndex() == Index)
161  {
162  using CI2 = std::tuple_element_t<Index,std::tuple<CIList...>>;
163  ObjectId<CI2,CM> objId {id.getData(), id.getObjectIndex()};
164  return std::get<Index>(m_accessors)(objId);
165  } else if constexpr (Index+1 < CI::numVariants)
166  return internalGet<Index + 1>(id);
167  else
168  {
169  std::cerr << "Invalid variant index: " << id.getVariantIndex() << std::endl;
170  std::abort ();
171  }
172  }
173 
174  template<unsigned Index>
175  bool internalIsAvailable (const ObjectId<CI,CM>& id) const noexcept
176  {
177  if (id.getVariantIndex() == Index)
178  {
179  using CI2 = std::tuple_element_t<Index,std::tuple<CIList...>>;
180  ObjectId<CI2,CM> objId {id.getData(), id.getObjectIndex()};
181  return std::get<Index>(m_accessors).isAvailable(objId);
182  } else if constexpr (Index+1 < CI::numVariants)
183  return internalIsAvailable<Index + 1>(id);
184  else
185  {
186  std::cerr << "Invalid variant index: " << id.getVariantIndex() << std::endl;
187  std::abort ();
188  }
189  }
190  };
191 }
192 
193 #endif
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::AccessorTemplate
AccessorTemplate() noexcept=default
columnar::VariantContainerId
a "variant" ContainerId
Definition: VariantDef.h:98
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::AccessorTuple
std::tuple< AccessorTemplate< CIList, CT, CAM, CM >... > AccessorTuple
Definition: VariantAccessor.h:33
VariantDef.h
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::m_accessors
AccessorTuple m_accessors
Definition: VariantAccessor.h:147
columnar::operator=
AccessorTemplate & operator=(AccessorTemplate &&that)
Definition: VectorColumn.h:88
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::isAvailable
bool isAvailable(ObjectId< CI, CM > id) const noexcept
Definition: VariantAccessor.h:67
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::reset
void reset(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
Definition: VariantAccessor.h:125
columnar::ColumnInfo
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition: ColumnInfo.h:35
Index
IndexedConstituentUserInfo::Index Index
Definition: IndexedConstituentUserInfo.cxx:12
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::internalInit
void internalInit(ColumnarTool< CM > &columnarTool, const std::string &name, const ColumnInfo &info)
Definition: VariantAccessor.h:150
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTemplate
AccessorTemplate(AccessorTemplate &&that)
Definition: VariantAccessor.h:110
ColumnAccessor.h
columnar::ColumnAccessMode
ColumnAccessMode
an enum for the different access modes for a column
Definition: ColumnInfo.h:19
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTuple
std::tuple< AccessorTemplate< CIList, CT, CAM, CM >... > AccessorTuple
Definition: VariantAccessor.h:98
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:178
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::reset
void reset(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
Definition: VariantAccessor.h:57
xAOD::JetAttributeAccessor::accessor
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
Definition: JetAccessorMap.h:26
columnar::ColumnarModeArray
Definition: ColumnarDef.h:33
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTemplate
AccessorTemplate() noexcept=default
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::m_accessor
AccessorTemplate< CIBase, CT, CAM, CM > m_accessor
Definition: VariantAccessor.h:76
python.CaloAddPedShiftConfig.default
default
Definition: CaloAddPedShiftConfig.py:43
columnar::CT
CT
Definition: ColumnAccessor.h:160
columnar::ContainerIdConcept
concept ContainerIdConcept
concept for a container id
Definition: ContainerId.h:171
columnar
Definition: ClusterDef.h:16
columnar::m_accessor
ColumnAccessor< CI, std::vector< typename ColumnTypeTraits< CT, CM >::ColumnType >, CM > m_accessor
Definition: VectorColumn.h:164
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:18
columnar::requires
requires requires
Definition: VariantAccessor.h:22
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::internalIsAvailable
bool internalIsAvailable(const ObjectId< CI, CM > &id) const noexcept
Definition: VariantAccessor.h:175
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::AccessorTemplate
AccessorTemplate(const AccessorTemplate &)=delete
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
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:252
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTemplate
AccessorTemplate(const AccessorTemplate &)=delete
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::isAvailable
bool isAvailable(ObjectId< CI, CM > id) const noexcept
Definition: VariantAccessor.h:138
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeXAOD >::AccessorTemplate
AccessorTemplate(AccessorTemplate &&that)
Definition: VariantAccessor.h:42
python.ParticleTypeUtil.info
def info
Definition: ParticleTypeUtil.py:87