Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
AtlasUncalibSourceLinkAccessor.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3  */
4 #ifndef ATLASUNCALIBSROUCELINACCESOR_H
5 #define ATLASUNCALIBSROUCELINACCESOR_H
6 
8 
12 
14 #include <variant>
15 #include <vector>
16 #include <unordered_map>
17 #include <utility>
18 
19 namespace ActsTrk::detail {
20 
21 // Helper class to describe ranges of measurements
22 // the range provides the measurement collection index and element index range (begin, end)
23  struct MeasurementRange : public std::pair<unsigned int, unsigned int>
24  {
25  static constexpr unsigned int CONTAINER_IDX_SHIFT = 28;
26  static constexpr unsigned int CONTAINER_IDX_MASK = (1u << 31) | (1u << 30) | (1u << 29) | (1u << 28);
27  static constexpr unsigned int ELEMENT_IDX_MASK = ~CONTAINER_IDX_MASK;
28  static constexpr unsigned int createRangeValue(unsigned int container_idx, unsigned int index)
29  {
30  assert(container_idx < (1u << (32 - CONTAINER_IDX_SHIFT)));
31  assert((index & CONTAINER_IDX_MASK) == 0u);
32  return (container_idx << CONTAINER_IDX_SHIFT) | index;
33  }
34  static constexpr unsigned int extractContainerIndex(unsigned int value) {
36  }
37  static constexpr unsigned int extractElementIndex(unsigned int value) {
38  return value & ELEMENT_IDX_MASK;
39  }
40  bool isConsistentRange() const {
43  || (extractElementIndex(this->first)==ELEMENT_IDX_MASK && extractElementIndex(this->second)==0));
44  }
45 
46  MeasurementRange() : std::pair<unsigned int, unsigned int>(std::numeric_limits<unsigned int>::max(), std::numeric_limits<unsigned int>::max()) {}
47  MeasurementRange(unsigned int container_idx, unsigned int start_element_idx, unsigned int end_element_idx)
48  : std::pair<unsigned int, unsigned int>( createRangeValue(container_idx, start_element_idx),
49  createRangeValue(container_idx, end_element_idx) ) {
50  }
51 
55  0);
56  }
57 
58  void updateEnd(std::size_t container_idx, unsigned int end_element_idx) {
59  assert( extractContainerIndex(this->first) == container_idx);
60  this->second = createRangeValue(container_idx, end_element_idx);
61  }
62 
63  unsigned int containerIndex() const
64  {
65  assert(isConsistentRange());
66  return extractContainerIndex(this->first);
67  }
68  unsigned int elementBeginIndex() const
69  {
70  assert(isConsistentRange());
71  return extractElementIndex(this->first);
72  }
73  unsigned int elementEndIndex() const
74  {
75  assert(isConsistentRange());
76  return extractElementIndex(this->second);
77  }
78  bool empty() const { assert(isConsistentRange()); return this->first == this->second; }
79  bool isMeasurementExpected() const { assert(isConsistentRange()); return this->first <= this->second; }
80  };
81 
82  // List of measurement ranges and the measurement container targeted by the ranges.
83  template <typename T_MeasurementContainerList >
84  class GenMeasurementRangeList : public std::unordered_map<std::size_t, MeasurementRange>
85  {
86  public:
87  using MeasurementContainer = typename T_MeasurementContainerList::measurement_container_variant_t;
88  private:
89  T_MeasurementContainerList m_measurementContainerList;
90 
91  public:
92 
93  const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementContainerList.containerList(); }
94 
95  // set container, resizing if necessary. That is just in case we call addMeasurements out of order or not for 2 types of measurements
96  void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container) {
97  if (container) {
98  // @TODO allow for container == nullprt ?
99  m_measurementContainerList.setContainer(container_index, *container);
100  }
101  }
102  std::size_t numContainers() const { return m_measurementContainerList.size(); }
103 
104  const MeasurementContainer &container(unsigned index) const { return m_measurementContainerList.at(index); }
105  };
106 
111  template <typename T_MeasurementRangeList>
113  {
114  private:
115  const T_MeasurementRangeList *m_measurementRanges;
116 
117  public:
118  using MeasurementContainer = typename T_MeasurementRangeList::MeasurementContainer;
120  {
121  public:
122  BaseIterator(const std::vector< MeasurementContainer > *containerList,
123  unsigned int container_index,
124  unsigned int element_index)
125  : m_containerList(containerList),
126  m_containerIndex(container_index),
127  m_index(element_index)
128  {
129  }
131  {
132  ++m_index;
133  return *this;
134  }
135  bool operator==(const BaseIterator &a) const { return m_index == a.m_index && m_containerIndex == a.m_containerIndex; }
136 
137  Acts::SourceLink operator*() const
138  {
139  // @TODO avoid double indirection
140  const xAOD::UncalibratedMeasurementContainer *base_container
141  = std::visit([](const auto &a) -> const xAOD::UncalibratedMeasurementContainer *{return a.containerPtr(); },
142  (*m_containerList)[m_containerIndex] );
143  assert( m_index < base_container->size());
144  return Acts::SourceLink{ makeATLASUncalibSourceLink( (*base_container)[m_index] )};
145  }
146 
147  const std::vector< MeasurementContainer > &measurementContainerList() const { return *m_containerList; }
148  unsigned int containerIndex() const { return m_containerIndex; }
149  unsigned int index() const { return m_index; }
150 
151  using value_type = unsigned int;
152  using difference_type = unsigned int;
155  using iterator_category = std::input_iterator_tag;
156 
157  private:
158  const std::vector< MeasurementContainer > *m_containerList;
159  unsigned int m_containerIndex;
160  unsigned int m_index;
161  };
162 
163  using Iterator = Acts::SourceLinkAdapterIterator<BaseIterator>;
164  GenUncalibSourceLinkAccessor(const T_MeasurementRangeList &measurement_ranges)
165  : m_measurementRanges(&measurement_ranges)
166  {
167  }
168  // get the range of elements with requested geoId
169  std::pair<Iterator, Iterator> range(const Acts::Surface &surface) const
170  {
171  typename T_MeasurementRangeList::const_iterator
172  range_iter = m_measurementRanges->find(surface.geometryId().value());
173  if (range_iter == m_measurementRanges->end())
174  {
175  return {Iterator(BaseIterator(nullptr, 0u, 0u)),
176  Iterator(BaseIterator(nullptr, 0u, 0u))};
177  }
178 
179  return {Iterator(BaseIterator(&measurementContainerList(), range_iter->second.containerIndex(), range_iter->second.elementBeginIndex())),
180  Iterator(BaseIterator(&measurementContainerList(), range_iter->second.containerIndex(), range_iter->second.elementEndIndex()))};
181  }
182  const MeasurementContainer &container(unsigned index) const { return m_measurementRanges->container(index); }
183  const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementRanges->measurementContainerList(); }
184 
185  };
186 
187  class AtlasMeasurementContainerList : public MeasurementContainerListWithDimension< AtlasMeasurementContainerList,
188  ContainerRefWithDim<xAOD::PixelClusterContainer,2>,
189  ContainerRefWithDim<xAOD::StripClusterContainer,1>,
190  ContainerRefWithDim<xAOD::HGTDClusterContainer,3> >
191  {
192  public:
193 
194  template <std::size_t DIM>
195  static bool isDimension(const SG::AuxVectorBase &container) {
196  static const xAOD::PosAccessor<DIM> acc{"localPositionDim" + std::to_string(DIM)};
197  return container.isAvailable(acc.auxid());
198  }
199 
200  // to support 2D and 3D pixel measurements
201  // @note to support 3D pixel measurements, still need to add ContainerRefWithDim<xAOD::PixelClusterContainer,3> as
202  // template paramter to MeasurementContainerListWithDimension
203  unsigned int getDimension(const xAOD::PixelClusterContainer &container) {
204  if (isDimension<2>(container.auxbase())) { return 2u; }
205  else if (isDimension<3>(container.auxbase())) { return 3u; }
206  else {
207  throw std::runtime_error("Unsupported dimension for PixelClusterContainer");
208  }
209  }
210  };
211 
214 
215 }
216 
217 #endif
ActsTrk::detail::AtlasMeasurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:191
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
ActsTrk::detail::AtlasMeasurementContainerList::isDimension
static bool isDimension(const SG::AuxVectorBase &container)
Definition: AtlasUncalibSourceLinkAccessor.h:195
ActsTrk::detail::MeasurementRange::createRangeValue
static constexpr unsigned int createRangeValue(unsigned int container_idx, unsigned int index)
Definition: AtlasUncalibSourceLinkAccessor.h:28
ActsTrk::detail::GenUncalibSourceLinkAccessor::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:183
ActsTrk::detail::MeasurementRange::MeasurementRange
MeasurementRange()
Definition: AtlasUncalibSourceLinkAccessor.h:46
MeasurementContainerWithDimension.h
ActsTrk::detail::GenUncalibSourceLinkAccessor::Iterator
Acts::SourceLinkAdapterIterator< BaseIterator > Iterator
Definition: AtlasUncalibSourceLinkAccessor.h:163
ActsTrk::detail::MeasurementRange::extractContainerIndex
static constexpr unsigned int extractContainerIndex(unsigned int value)
Definition: AtlasUncalibSourceLinkAccessor.h:34
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::m_index
unsigned int m_index
Definition: AtlasUncalibSourceLinkAccessor.h:160
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
ActsTrk::detail::MeasurementRange::updateEnd
void updateEnd(std::size_t container_idx, unsigned int end_element_idx)
Definition: AtlasUncalibSourceLinkAccessor.h:58
index
Definition: index.py:1
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::BaseIterator
BaseIterator(const std::vector< MeasurementContainer > *containerList, unsigned int container_index, unsigned int element_index)
Definition: AtlasUncalibSourceLinkAccessor.h:122
ActsTrk::detail::MeasurementRange::extractElementIndex
static constexpr unsigned int extractElementIndex(unsigned int value)
Definition: AtlasUncalibSourceLinkAccessor.h:37
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::difference_type
unsigned int difference_type
Definition: AtlasUncalibSourceLinkAccessor.h:152
ActsTrk::detail::GenMeasurementRangeList< AtlasMeasurementContainerList >::MeasurementContainer
typename T_MeasurementContainerList::measurement_container_variant_t MeasurementContainer
Definition: AtlasUncalibSourceLinkAccessor.h:87
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::m_containerIndex
unsigned int m_containerIndex
Definition: AtlasUncalibSourceLinkAccessor.h:159
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::operator++
BaseIterator & operator++()
Definition: AtlasUncalibSourceLinkAccessor.h:130
athena.value
value
Definition: athena.py:124
ActsTrk::detail::GenUncalibSourceLinkAccessor::m_measurementRanges
const T_MeasurementRangeList * m_measurementRanges
Definition: AtlasUncalibSourceLinkAccessor.h:115
ActsTrk::detail::MeasurementRange
Definition: AtlasUncalibSourceLinkAccessor.h:24
ActsTrk::detail::GenMeasurementRangeList
Definition: AtlasUncalibSourceLinkAccessor.h:85
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator
Definition: AtlasUncalibSourceLinkAccessor.h:120
ActsTrk::detail::MeasurementRange::CONTAINER_IDX_SHIFT
static constexpr unsigned int CONTAINER_IDX_SHIFT
Definition: AtlasUncalibSourceLinkAccessor.h:25
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:662
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
SG::AuxVectorBase
Manage index tracking and synchronization of auxiliary data.
Definition: AuxVectorBase.h:98
DataVector::auxbase
const SG::AuxVectorBase & auxbase() const
Convert to AuxVectorBase.
ActsTrk::detail::GenMeasurementRangeList::numContainers
std::size_t numContainers() const
Definition: AtlasUncalibSourceLinkAccessor.h:102
ActsTrk::detail::MeasurementRange::empty
bool empty() const
Definition: AtlasUncalibSourceLinkAccessor.h:78
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::iterator_category
std::input_iterator_tag iterator_category
Definition: AtlasUncalibSourceLinkAccessor.h:155
ActsTrk::detail::GenUncalibSourceLinkAccessor::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:182
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ActsTrk::detail::GenUncalibSourceLinkAccessor::GenUncalibSourceLinkAccessor
GenUncalibSourceLinkAccessor(const T_MeasurementRangeList &measurement_ranges)
Definition: AtlasUncalibSourceLinkAccessor.h:164
ActsTrk::detail::MeasurementRange::elementBeginIndex
unsigned int elementBeginIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:68
ActsTrk::makeATLASUncalibSourceLink
ATLASUncalibSourceLink makeATLASUncalibSourceLink(const xAOD::UncalibratedMeasurementContainer *container, std::size_t index, [[maybe_unused]] const EventContext &ctx)
Definition: ATLASSourceLink.h:30
ActsTrk::detail::GenUncalibSourceLinkAccessor::MeasurementContainer
typename T_MeasurementRangeList::MeasurementContainer MeasurementContainer
Definition: AtlasUncalibSourceLinkAccessor.h:118
ActsTrk::detail::GenUncalibSourceLinkAccessor
Accessor for the above source link container.
Definition: AtlasUncalibSourceLinkAccessor.h:113
ActsTrk::detail::GenMeasurementRangeList::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:93
ActsTrk::detail::MeasurementRange::MeasurementRange
MeasurementRange(unsigned int container_idx, unsigned int start_element_idx, unsigned int end_element_idx)
Definition: AtlasUncalibSourceLinkAccessor.h:47
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::index
unsigned int index() const
Definition: AtlasUncalibSourceLinkAccessor.h:149
ActsTrk::detail::GenUncalibSourceLinkAccessor::range
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Definition: AtlasUncalibSourceLinkAccessor.h:169
PixelClusterContainer.h
ActsTrk::detail::GenMeasurementRangeList::m_measurementContainerList
T_MeasurementContainerList m_measurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:89
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::operator*
Acts::SourceLink operator*() const
Definition: AtlasUncalibSourceLinkAccessor.h:137
HGTDClusterContainer.h
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
MeasurementContainerListWithDimension
Definition: MeasurementContainerWithDimension.h:258
ActsTrk::detail::MeasurementRange::ELEMENT_IDX_MASK
static constexpr unsigned int ELEMENT_IDX_MASK
Definition: AtlasUncalibSourceLinkAccessor.h:27
ActsTrk::detail::AtlasMeasurementContainerList::getDimension
unsigned int getDimension(const xAOD::PixelClusterContainer &container)
Definition: AtlasUncalibSourceLinkAccessor.h:203
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:147
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::m_containerList
const std::vector< MeasurementContainer > * m_containerList
Definition: AtlasUncalibSourceLinkAccessor.h:158
ActsTrk::detail::MeasurementRange::noMeasurementExpected
static MeasurementRange noMeasurementExpected()
Definition: AtlasUncalibSourceLinkAccessor.h:52
SG::AuxVectorBase::isAvailable
bool isAvailable(const std::string &name, const std::string &clsname="") const
Test to see if a variable exists in the store.
ActsTrk::detail::GenMeasurementRangeList::setContainer
void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container)
Definition: AtlasUncalibSourceLinkAccessor.h:96
DeMoScan.index
string index
Definition: DeMoScan.py:364
a
TList * a
Definition: liststreamerinfos.cxx:10
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
ActsTrk::detail::MeasurementRange::elementEndIndex
unsigned int elementEndIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:73
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::operator==
bool operator==(const BaseIterator &a) const
Definition: AtlasUncalibSourceLinkAccessor.h:135
StripClusterContainer.h
DeMoScan.first
bool first
Definition: DeMoScan.py:536
ActsTrk::detail::MeasurementRange::isConsistentRange
bool isConsistentRange() const
Definition: AtlasUncalibSourceLinkAccessor.h:40
ActsTrk::detail::MeasurementRange::containerIndex
unsigned int containerIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:63
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::containerIndex
unsigned int containerIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:148
ActsTrk::detail::GenMeasurementRangeList::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:104
ActsTrk::detail
Definition: Decoration.h:15
ActsTrk::detail::MeasurementRange::isMeasurementExpected
bool isMeasurementExpected() const
Definition: AtlasUncalibSourceLinkAccessor.h:79
value_type
Definition: EDM_MasterSearch.h:11
ActsTrk::detail::MeasurementRange::CONTAINER_IDX_MASK
static constexpr unsigned int CONTAINER_IDX_MASK
Definition: AtlasUncalibSourceLinkAccessor.h:26