ATLAS Offline Software
VariantOptObjectId.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_OPT_OBJECT_ID_H
9 #define COLUMNAR_VARIANT_VARIANT_OPT_OBJECT_ID_H
10 
14 
15 namespace columnar
16 {
17  template<ContainerIdConcept... CIList>
19  {
22  public:
23 
24  using CI = VariantContainerId<CIList...>;
26  using xAODObject = typename CI::xAODObjectIdType;
27 
28  OptObjectId () noexcept = default;
29 
30  OptObjectId (std::nullopt_t) noexcept {}
31 
32  OptObjectId (const ObjectId<CI,ColumnarModeXAOD>& val_object) noexcept
33  : m_object (&val_object.getXAODObjectNoexcept())
34  {}
35 
36  OptObjectId (xAODObject *val_object) noexcept
37  : m_object (val_object)
38  {}
39 
40  template<ContainerIdConcept CI2>
41  requires (CI::template isValidContainer<CI2>())
42  OptObjectId (ObjectId<CI2,ColumnarModeXAOD> val_object) noexcept
43  : m_object (&val_object.getXAODObjectNoexcept())
44  {}
45 
46  template<ContainerIdConcept CI2>
47  requires (CI::template isValidContainer<CI2>())
48  OptObjectId (OptObjectId<CI2,ColumnarModeXAOD> val_object) noexcept
49  : m_object (val_object.getXAODObjectNoexcept())
50  {}
51 
52  OptObjectId (const OptObjectId<CI,ColumnarModeXAOD>& that) noexcept = default;
53 
54  OptObjectId& operator = (const OptObjectId<CI,ColumnarModeXAOD>& that) noexcept = default;
55 
56  explicit operator bool () const noexcept {
57  return m_object != nullptr;}
58 
59  [[nodiscard]] bool has_value () const noexcept {
60  return m_object != nullptr;}
61 
62  [[nodiscard]] ObjectId<CI,ColumnarModeXAOD> value () const {
63  if (m_object == nullptr)
64  throw std::bad_optional_access();
65  // This object should ever be held within the context of a
66  // single thread (and generally on the stack), so the associated
67  // check is meaningless.
68  auto *result ATLAS_THREAD_SAFE = m_object;
70 
72  if (m_object == nullptr)
73  throw std::bad_optional_access();
74  return ObjectId<CI,ColumnarModeXAOD> (*m_object);}
75 
76  [[nodiscard]] xAODObject *getXAODObject () const noexcept {
77  return m_object;}
78 
79  // a version of `getXAODObject` that only exists when it is `noexcept`
80  [[nodiscard]] xAODObject *getXAODObjectNoexcept () const noexcept {
81  return m_object;}
82 
83  [[nodiscard]] bool operator == (const OptObjectId<CI,ColumnarModeXAOD>& that) const noexcept {
84  return m_object == that.m_object;}
85 
86 
87 
90  private:
91 
92  xAODObject *m_object = nullptr;
93  };
94 
95  template<ContainerIdConcept... CIList>
97  {
98  return str << &obj.getXAODObjectNoexcept() << "/" << obj.getXAODObjectNoexcept().index();
99  }
100 
101  template<ContainerIdConcept... CIList>
103  {
104  return &lhs.getXAODObjectNoexcept() == &rhs.getXAODObjectNoexcept();
105  }
106 
107  template<ContainerIdConcept... CIList>
109  {
110  return &lhs.getXAODObjectNoexcept() != &rhs.getXAODObjectNoexcept();
111  }
112 
113 
114 
115 
117  {
120  public:
121 
122  using CI = VariantContainerId<CIList...>;
125  static constexpr std::size_t invalidVariantIndex = CI::numVariants;
126 
127  OptObjectId () noexcept = default;
128 
129  OptObjectId (std::nullopt_t) noexcept {}
130 
132  : m_data (val_object.getData()), m_variantIndex (val_object.getVariantIndex()), m_objectIndex (val_object.getObjectIndex())
133  {}
134 
135  template<ContainerIdConcept CI2>
136  requires (CI::template isValidContainer<CI2>())
137  OptObjectId (ObjectId<CI2,ColumnarModeArray> val_object) noexcept
138  : m_data (val_object.getData()), m_variantIndex (CI::template getVariantIndex<CI2>()), m_objectIndex (val_object.getIndex())
139  {}
140 
141  template<ContainerIdConcept CI2>
142  requires (CI::template isValidContainer<CI2>())
143  OptObjectId (OptObjectId<CI2,ColumnarModeArray> val_object) noexcept
144  : m_data (val_object.getData())
145  {
146  if (val_object.has_value())
147  {
148  m_variantIndex = CI::template getVariantIndex<CI2>();
149  m_objectIndex = val_object.getIndex();
150  } else
151  {
152  m_variantIndex = invalidVariantIndex;
153  m_objectIndex = invalidObjectIndex;
154  }
155  }
156 
157  // Whatever you do: Do not remove this function. Yes, it will always
158  // throw. It is meant to throw in this template specialization, and
159  // only do something useful in the xAOD mode specialization. If you
160  // remove it you break the columnar mode.
161  OptObjectId (xAODObject * /*val_object*/)
162  {
163  throw std::logic_error ("can't call xAOD function in columnar mode");
164  }
165 
166  OptObjectId (const OptObjectId<CI,ColumnarModeArray>& that) noexcept = default;
167 
169 
170  // Whatever you do: Do not remove this function. Yes, it will always
171  // throw. It is meant to throw in this template specialization, and
172  // only do something useful in the xAOD mode specialization. If you
173  // remove it you break the columnar mode.
174  [[nodiscard]] xAODObject *getXAODObject () const {
175  throw std::logic_error ("can't call xAOD function in columnar mode");}
176 
177  explicit operator bool () const noexcept {
178  return m_variantIndex != invalidVariantIndex;}
179 
180  [[nodiscard]] bool has_value () const noexcept {
181  return m_variantIndex != invalidVariantIndex;}
182 
183  [[nodiscard]] ObjectId<CI,ColumnarModeArray> value () const {
184  if (m_variantIndex == invalidVariantIndex)
185  throw std::bad_optional_access();
186  return ObjectId<CI,ColumnarModeArray> (m_data, m_variantIndex, m_objectIndex);}
187 
189  if (m_variantIndex == invalidVariantIndex)
190  throw std::bad_optional_access();
191  return ObjectId<CI,ColumnarModeArray> (m_data, m_variantIndex, m_objectIndex);
192  }
193 
194  [[nodiscard]] bool operator == (const OptObjectId<CI,ColumnarModeArray>& that) const noexcept {
195  return m_variantIndex == that.m_variantIndex && m_objectIndex == that.m_objectIndex;
196  }
197 
198 
199 
202  public:
203 
204  explicit OptObjectId (void **val_data, std::size_t val_variantIndex, std::size_t val_objectIndex) noexcept
205  : m_data (val_data), m_variantIndex (val_variantIndex), m_objectIndex (val_objectIndex)
206  {}
207 
208  [[nodiscard]] std::size_t getVariantIndex () const noexcept {
209  return m_variantIndex;}
210 
211  [[nodiscard]] std::size_t getObjectIndex () const noexcept {
212  return m_objectIndex;}
213 
214  [[nodiscard]] void **getData () const noexcept {
215  return m_data;}
216 
217 
218 
221  private:
222 
223  void **m_data = nullptr;
224  std::size_t m_variantIndex = invalidVariantIndex;
225  std::size_t m_objectIndex = invalidObjectIndex;
226  };
227 
228  template<ContainerIdConcept... CIList>
230  {
231  using CI = VariantContainerId<CIList...>;
232  return str << CI::idNameArray.at(obj.getVariantIndex()) << "/" << obj.getObjectIndex();
233  }
234 
235  template<ContainerIdConcept... CIList>
237  {
238  return lhs.getVariantIndex() == rhs.getVariantIndex() && lhs.getObjectIndex() == rhs.getObjectIndex();
239  }
240 
241  template<ContainerIdConcept... CIList>
243  {
244  return lhs.getVariantIndex() != rhs.getVariantIndex() || lhs.getObjectIndex() != rhs.getObjectIndex();
245  }
246 }
247 
248 #endif
columnar::OptObjectId< CI, ColumnarModeArray >
Definition: OptObjectId.h:109
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getXAODObject
xAODObject * getXAODObject() const
Definition: VariantOptObjectId.h:174
OptObjectId.h
InDetSimDataHelpers::getData
const InDetSimData * getData(const InDetSimDataCollection &coll, const Identifier &id)
Definition: InDetSimDataDict.h:24
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::getXAODObject
xAODObject * getXAODObject() const noexcept
Definition: VariantOptObjectId.h:76
columnar::VariantContainerId
a "variant" ContainerId
Definition: VariantDef.h:98
get_generator_info.result
result
Definition: get_generator_info.py:21
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getVariantIndex
std::size_t getVariantIndex() const noexcept
Definition: VariantOptObjectId.h:208
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::getXAODObjectNoexcept
xAODObject * getXAODObjectNoexcept() const noexcept
Definition: VariantOptObjectId.h:80
VariantDef.h
m_data
std::vector< T > m_data
Definition: TrackTruthMatchingBaseAlg.cxx:660
taskman.template
dictionary template
Definition: taskman.py:314
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::OptObjectId
OptObjectId(const OptObjectId< CI, ColumnarModeArray > &that) noexcept=default
columnar::getXAODObjectNoexcept
xAODContainer & getXAODObjectNoexcept() const noexcept
Definition: ObjectRange.h:151
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
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::requires
requires(CI::template isValidContainer< CI2 >()) OptObjectId(OptObjectId< CI2
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::xAODObject
typename CI::xAODObjectIdType xAODObject
Definition: VariantOptObjectId.h:124
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::OptObjectId
OptObjectId(const ObjectId< CI, ColumnarModeXAOD > &val_object) noexcept
Definition: VariantOptObjectId.h:32
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
columnar::operator==
bool operator==(const ObjectId< CI, ColumnarModeXAOD > &lhs, const ObjectId< CI, ColumnarModeXAOD > &rhs)
Definition: ObjectId.h:82
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::OptObjectId
OptObjectId() noexcept=default
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::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::has_value
bool has_value() const noexcept
Definition: VariantOptObjectId.h:59
InDetDD::operator*
SiLocalPosition operator*(const SiLocalPosition &position, const double factor)
Definition: SiLocalPosition.cxx:98
columnar::ObjectId< CI, ColumnarModeXAOD >
Definition: ObjectId.h:26
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::OptObjectId
OptObjectId() noexcept=default
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::has_value
bool has_value() const noexcept
Definition: VariantOptObjectId.h:180
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::OptObjectId
OptObjectId(xAODObject *)
Definition: VariantOptObjectId.h:161
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::value
ObjectId< CI, ColumnarModeXAOD > value() const
Definition: VariantOptObjectId.h:62
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::requires
requires(CI::template isValidContainer< CI2 >()) OptObjectId(ObjectId< CI2
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getObjectIndex
std::size_t getObjectIndex() const noexcept
Definition: VariantOptObjectId.h:211
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::value
ObjectId< CI, ColumnarModeArray > value() const
Definition: VariantOptObjectId.h:183
columnar::final
CM final
Definition: ColumnAccessor.h:106
VariantObjectId.h
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::OptObjectId
OptObjectId(ObjectId< CI, ColumnarModeArray > val_object) noexcept
Definition: VariantOptObjectId.h:131
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:178
columnar::invalidObjectIndex
constexpr ColumnarOffsetType invalidObjectIndex
the value for an invalid element index
Definition: IColumnarTool.h:25
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getData
void ** getData() const noexcept
Definition: VariantOptObjectId.h:214
columnar::ColumnarModeArray
Definition: ColumnarDef.h:33
python.CaloAddPedShiftConfig.default
default
Definition: CaloAddPedShiftConfig.py:43
columnar::ContainerIdConcept
concept ContainerIdConcept
concept for a container id
Definition: ContainerId.h:171
columnar
Definition: ClusterDef.h:16
columnar::OptObjectId< CI, ColumnarModeXAOD >
Definition: OptObjectId.h:31
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::requires
requires(CI::template isValidContainer< CI2 >()) OptObjectId(ObjectId< CI2
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::OptObjectId
OptObjectId(void **val_data, std::size_t val_variantIndex, std::size_t val_objectIndex) noexcept
Definition: VariantOptObjectId.h:204
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:18
columnar::requires
requires requires
Definition: VariantAccessor.h:22
str
Definition: BTagTrackIpAccessor.cxx:11
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::xAODObject
typename CI::xAODObjectIdType xAODObject
Definition: VariantOptObjectId.h:26
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
columnar::ObjectId< CI, ColumnarModeArray >
Definition: ObjectId.h:97
python.PyAthena.obj
obj
Definition: PyAthena.py:132
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
columnar::OptObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::OptObjectId
OptObjectId(xAODObject *val_object) noexcept
Definition: VariantOptObjectId.h:36
columnar::operator<<
std::ostream & operator<<(std::ostream &str, const ObjectId< CI, ColumnarModeXAOD > &obj)
Definition: ObjectId.h:76