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 
69 
72  private:
73 
74  xAODObject *m_object = nullptr;
75  };
76 
77  template<ContainerIdConcept... CIList>
79  {
80  return str << &obj.getXAODObjectNoexcept() << "/" << obj.getXAODObjectNoexcept().index();
81  }
82 
83  template<ContainerIdConcept... CIList>
85  {
86  return &lhs.getXAODObjectNoexcept() == &rhs.getXAODObjectNoexcept();
87  }
88 
89  template<ContainerIdConcept... CIList>
91  {
92  return &lhs.getXAODObjectNoexcept() != &rhs.getXAODObjectNoexcept();
93  }
94 
95 
96 
97 
99  {
102  public:
103 
104  using CI = VariantContainerId<CIList...>;
107 
108  // Whatever you do: Do not remove this function. Yes, it will always
109  // throw. It is meant to throw in this template specialization, and
110  // only do something useful in the xAOD mode specialization. If you
111  // remove it you break the columnar mode.
112  ObjectId (xAODObject& /*val_object*/)
113  {
114  throw std::logic_error ("can't call xAOD function in columnar mode");
115  }
116 
118 
119  template<ContainerIdConcept CI2>
120  requires (CI2::regularObjectId && CI::template isValidContainer<CI2>())
121  ObjectId (const ObjectId<CI2,ColumnarModeArray>& that) noexcept
122  : m_data (that.getData()), m_variantIndex (CI::template getVariantIndex<CI2>()), m_objectIndex (that.getIndex())
123  {}
124 
126 
127  // Whatever you do: Do not remove this function. Yes, it will always
128  // throw. It is meant to throw in this template specialization, and
129  // only do something useful in the xAOD mode specialization. If you
130  // remove it you break the columnar mode.
131  [[nodiscard]] xAODObject& getXAODObject () const {
132  throw std::logic_error ("can't call xAOD function in columnar mode");}
133 
134  template<ContainerIdConcept CI2>
135  requires (CI::template isValidContainer<CI2>())
136  [[nodiscard]] OptObjectId<CI2,CM> tryGetVariant () const
137  {
138  if (m_variantIndex == CI::template getVariantIndex<CI2>())
139  return OptObjectId<CI2,CM> (m_data, m_objectIndex);
140  else
141  return OptObjectId<CI2,CM> ();
142  }
143 
144  template<typename Acc,typename... Args>
145  requires std::invocable<Acc,ObjectId<VariantContainerId<CIList...>,ColumnarModeArray>,Args...>
146  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
147  return acc (*this, std::forward<Args> (args)...);}
148 
149 
150 
153  public:
154 
155  explicit ObjectId (void **val_data, std::size_t val_variantIndex, std::size_t val_objectIndex) noexcept
156  : m_data (val_data), m_variantIndex (val_variantIndex), m_objectIndex (val_objectIndex)
157  {}
158 
159  [[nodiscard]] std::size_t getVariantIndex () const noexcept {
160  return m_variantIndex;}
161 
162  [[nodiscard]] std::size_t getObjectIndex () const noexcept {
163  return m_objectIndex;}
164 
165  [[nodiscard]] void **getData () const noexcept {
166  return m_data;}
167 
168 
169 
172  private:
173 
174  void **m_data = nullptr;
175  std::size_t m_variantIndex = 0u;
176  std::size_t m_objectIndex = 0u;
177  };
178 
179  template<ContainerIdConcept... CIList>
181  {
182  using CI = VariantContainerId<CIList...>;
183  return str << CI::idNameArray.at(obj.getVariantIndex()) << "/" << obj.getObjectIndex();
184  }
185 
186  template<ContainerIdConcept... CIList>
188  {
189  return lhs.getVariantIndex() == rhs.getVariantIndex() && lhs.getObjectIndex() == rhs.getObjectIndex();
190  }
191 
192  template<ContainerIdConcept... CIList>
194  {
195  return lhs.getVariantIndex() != rhs.getVariantIndex() || lhs.getObjectIndex() != rhs.getObjectIndex();
196  }
197 }
198 
199 #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:316
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:177
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:165
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::getVariantIndex
std::size_t getVariantIndex() const noexcept
Definition: VariantObjectId.h:159
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:162
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:131
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::ObjectId
ObjectId(xAODObject &)
Definition: VariantObjectId.h:112
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:136
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:176
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::ObjectId
ObjectId(void **val_data, std::size_t val_variantIndex, std::size_t val_objectIndex) noexcept
Definition: VariantObjectId.h:155
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeXAOD >::xAODObject
typename CI::xAODObjectIdType xAODObject
Definition: VariantObjectId.h:25
columnar::ObjectId< VariantContainerId< CIList... >, ColumnarModeArray >::xAODObject
typename CI::xAODObjectIdType xAODObject
Definition: VariantObjectId.h:106
python.Dumpers.typename
def typename(t)
Definition: Dumpers.py:193
columnar::ColumnarModeArray
Definition: ColumnarDef.h:30
columnar::ContainerIdConcept
concept ContainerIdConcept
concept for a container id
Definition: ContainerId.h:171
columnar
Definition: ClusterDef.h:16
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:15
columnar::requires
requires requires
Definition: VariantAccessor.h:23
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