ATLAS Offline Software
VariantObjectId.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_OBJECT_ID_H
9 #define COLUMNAR_VARIANT_VARIANT_OBJECT_ID_H
10 
13 
14 namespace columnar
15 {
16  template<ContainerIdConcept... CIList>
18  {
21  public:
22 
23  using CI = VariantContainerId<CIList...>;
25  using xAODObject = typename CI::xAODObjectIdType;
26 
27  ObjectId (xAODObject& val_object) noexcept
28  : m_object (&val_object)
29  {}
30 
32 
33  template<ContainerIdConcept CI2>
34  requires (CI::template isValidContainer<CI2>())
35  ObjectId (const ObjectId<CI2,CM>& that) noexcept
36  : m_object (&that.getXAODObject())
37  {}
38 
40 
41  [[nodiscard]] xAODObject& getXAODObject () const noexcept {
42  // This object should ever be held within the context of a
43  // single thread (and generally on the stack), so the associated
44  // check is meaningless.
45  auto *result ATLAS_THREAD_SAFE = m_object;
46  return *result;}
47 
48  // a version of `getXAODObject` that only exists when it is `noexcept`
49  [[nodiscard]] xAODObject& getXAODObjectNoexcept () const noexcept {
50  // This object should ever be held within the context of a
51  // single thread (and generally on the stack), so the associated
52  // check is meaningless.
53  auto *result ATLAS_THREAD_SAFE = m_object;
54  return *result;}
55 
56  template<ContainerIdConcept CI2>
57  requires (CI::template isValidContainer<CI2>())
58  [[nodiscard]] OptObjectId<CI2,CM> tryGetVariant () const
59  {
60  return OptObjectId<CI2,CM> (dynamic_cast<typename CI2::xAODObjectIdType*>(m_object));
61  }
62 
63  template<typename Acc,typename... Args>
64  requires std::invocable<Acc,ObjectId<VariantContainerId<CIList...>,ColumnarModeXAOD>,Args...>
65  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
66  return acc (*this, std::forward<Args> (args)...);}
67 
68 
71  public:
72 
74  {
75  return ObjectId<typename CI::baseId,CM> (*m_object);
76  }
77 
78 
81  private:
82 
83  xAODObject *m_object = nullptr;
84  };
85 
86  template<ContainerIdConcept... CIList>
88  {
89  return str << &obj.getXAODObjectNoexcept() << "/" << obj.getXAODObjectNoexcept().index();
90  }
91 
92  template<ContainerIdConcept... CIList>
94  {
95  return &lhs.getXAODObjectNoexcept() == &rhs.getXAODObjectNoexcept();
96  }
97 
98  template<ContainerIdConcept... CIList>
100  {
101  return &lhs.getXAODObjectNoexcept() != &rhs.getXAODObjectNoexcept();
102  }
103 
104 
105 
106 
108  {
111  public:
112 
113  using CI = VariantContainerId<CIList...>;
116 
117  // Whatever you do: Do not remove this function. Yes, it will always
118  // throw. It is meant to throw in this template specialization, and
119  // only do something useful in the xAOD mode specialization. If you
120  // remove it you break the columnar mode.
121  ObjectId (xAODObject& /*val_object*/)
122  {
123  throw std::logic_error ("can't call xAOD function in columnar mode");
124  }
125 
127 
128  template<ContainerIdConcept CI2>
129  requires (CI2::regularObjectId && CI::template isValidContainer<CI2>())
130  ObjectId (const ObjectId<CI2,ColumnarModeArray>& that) noexcept
131  : m_data (that.getData()), m_variantIndex (CI::template getVariantIndex<CI2>()), m_objectIndex (that.getIndex())
132  {}
133 
135 
136  // Whatever you do: Do not remove this function. Yes, it will always
137  // throw. It is meant to throw in this template specialization, and
138  // only do something useful in the xAOD mode specialization. If you
139  // remove it you break the columnar mode.
140  [[nodiscard]] xAODObject& getXAODObject () const {
141  throw std::logic_error ("can't call xAOD function in columnar mode");}
142 
143  template<ContainerIdConcept CI2>
144  requires (CI::template isValidContainer<CI2>())
145  [[nodiscard]] OptObjectId<CI2,CM> tryGetVariant () const
146  {
147  if (m_variantIndex == CI::template getVariantIndex<CI2>())
148  return OptObjectId<CI2,CM> (m_data, m_objectIndex);
149  else
150  return OptObjectId<CI2,CM> ();
151  }
152 
153  template<typename Acc,typename... Args>
154  requires std::invocable<Acc,ObjectId<VariantContainerId<CIList...>,ColumnarModeArray>,Args...>
155  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
156  return acc (*this, std::forward<Args> (args)...);}
157 
158 
159 
162  public:
163 
164  explicit ObjectId (void **val_data, std::size_t val_variantIndex, std::size_t val_objectIndex) noexcept
165  : m_data (val_data), m_variantIndex (val_variantIndex), m_objectIndex (val_objectIndex)
166  {}
167 
168  [[nodiscard]] std::size_t getVariantIndex () const noexcept {
169  return m_variantIndex;}
170 
171  [[nodiscard]] std::size_t getObjectIndex () const noexcept {
172  return m_objectIndex;}
173 
174  [[nodiscard]] void **getData () const noexcept {
175  return m_data;}
176 
177 
178 
181  private:
182 
183  void **m_data = nullptr;
184  std::size_t m_variantIndex = 0u;
185  std::size_t m_objectIndex = 0u;
186  };
187 
188  template<ContainerIdConcept... CIList>
190  {
191  using CI = VariantContainerId<CIList...>;
192  return str << CI::idNameArray.at(obj.getVariantIndex()) << "/" << obj.getObjectIndex();
193  }
194 
195  template<ContainerIdConcept... CIList>
197  {
198  return lhs.getVariantIndex() == rhs.getVariantIndex() && lhs.getObjectIndex() == rhs.getObjectIndex();
199  }
200 
201  template<ContainerIdConcept... CIList>
203  {
204  return lhs.getVariantIndex() != rhs.getVariantIndex() || lhs.getObjectIndex() != rhs.getObjectIndex();
205  }
206 }
207 
208 #endif
OptObjectId.h
InDetSimDataHelpers::getData
const InDetSimData * getData(const InDetSimDataCollection &coll, const Identifier &id)
Definition: InDetSimDataDict.h:24
columnar::VariantContainerId
a "variant" ContainerId
Definition: VariantDef.h:98
get_generator_info.result
result
Definition: get_generator_info.py:21
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:47
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::ObjectId
ObjectId(const ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD > &that) noexcept=default
VariantDef.h
m_data
std::vector< T > m_data
Definition: TrackTruthMatchingBaseAlg.cxx:660
columnar::getXAODObject
xAODContainer & getXAODObject() const noexcept
Definition: ObjectRange.h:147
taskman.template
dictionary template
Definition: taskman.py:314
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::ObjectId
ObjectId(xAODObject &val_object) noexcept
Definition: VariantObjectId.h:27
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::requires
requires(CI2::regularObjectId &&CI::template isValidContainer< CI2 >()) ObjectId(const ObjectId< CI2
columnar::OptObjectId
a class representing a single optional object (electron, muons, etc.)
Definition: ContainerId.h:179
columnar::operator=
AccessorTemplate & operator=(AccessorTemplate &&that)
Definition: VectorColumn.h:88
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
Args
Definition: test_lwtnn_fastgraph.cxx:12
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getData
void ** getData() const noexcept
Definition: VariantObjectId.h:174
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getVariantIndex
std::size_t getVariantIndex() const noexcept
Definition: VariantObjectId.h:168
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::getXAODObjectNoexcept
xAODObject & getXAODObjectNoexcept() const noexcept
Definition: VariantObjectId.h:49
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getObjectIndex
std::size_t getObjectIndex() const noexcept
Definition: VariantObjectId.h:171
columnar::operator==
bool operator==(const ObjectId< CI, ColumnarModeXAOD > &lhs, const ObjectId< CI, ColumnarModeXAOD > &rhs)
Definition: ObjectId.h:82
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getXAODObject
xAODObject & getXAODObject() const
Definition: VariantObjectId.h:140
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::ObjectId
ObjectId(xAODObject &)
Definition: VariantObjectId.h:121
columnar::VariantContainerId::xAODObjectIdType
typename CIBase::xAODObjectIdType xAODObjectIdType
the xAOD type to use with ObjectId
Definition: VariantDef.h:114
columnar::operator!=
bool operator!=(const ObjectId< CI, ColumnarModeXAOD > &lhs, const ObjectId< CI, ColumnarModeXAOD > &rhs)
Definition: ObjectId.h:88
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::tryGetVariant
CM tryGetVariant() const
Definition: VariantObjectId.h:145
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::requires
requires(CI::template isValidContainer< CI2 >()) OptObjectId< CI2
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::tryGetVariant
CM tryGetVariant() const
Definition: VariantObjectId.h:58
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::ObjectId
ObjectId(const ObjectId< VariantContainerId< CIList... >, ColumnarModeArray > &that) noexcept=default
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:178
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::ObjectId
ObjectId(void **val_data, std::size_t val_variantIndex, std::size_t val_objectIndex) noexcept
Definition: VariantObjectId.h:164
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::xAODObject
typename CI::xAODObjectIdType xAODObject
Definition: VariantObjectId.h:25
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::getBaseObject
ObjectId< typename CI::baseId, CM > getBaseObject() const
Definition: VariantObjectId.h:73
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::xAODObject
typename CI::xAODObjectIdType xAODObject
Definition: VariantObjectId.h:115
python.Dumpers.typename
def typename(t)
Definition: Dumpers.py:193
columnar::ColumnarModeArray
Definition: ColumnarDef.h:33
columnar::ContainerIdConcept
concept ContainerIdConcept
concept for a container id
Definition: ContainerId.h:171
columnar
Definition: ClusterDef.h:16
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:18
columnar::requires
requires requires
Definition: VariantAccessor.h:22
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::getXAODObject
xAODObject & getXAODObject() const noexcept
Definition: VariantObjectId.h:41
str
Definition: BTagTrackIpAccessor.cxx:11
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::requires
requires(CI::template isValidContainer< CI2 >()) ObjectId(const ObjectId< CI2
python.PyAthena.obj
obj
Definition: PyAthena.py:132
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::requires
requires(CI::template isValidContainer< CI2 >()) OptObjectId< CI2
columnar::operator<<
std::ostream & operator<<(std::ostream &str, const ObjectId< CI, ColumnarModeXAOD > &obj)
Definition: ObjectId.h:76