ATLAS Offline Software
Loading...
Searching...
No Matches
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
19namespace 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) {
35 return (value & CONTAINER_IDX_MASK) >> CONTAINER_IDX_SHIFT;
36 }
37 static constexpr unsigned int extractElementIndex(unsigned int value) {
38 return value & ELEMENT_IDX_MASK;
39 }
40 bool isConsistentRange() const {
41 return extractContainerIndex(this->first) == extractContainerIndex(this->second)
42 && ( extractElementIndex(this->first) <= extractElementIndex(this->second)
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
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 using MeasurementRangeContainer = std::unordered_map<std::size_t, MeasurementRange>;
89 private:
90 T_MeasurementContainerList m_measurementContainerList;
91
92 public:
93
94 const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementContainerList.containerList(); }
95
96 // set container, resizing if necessary. That is just in case we call addMeasurements out of order or not for 2 types of measurements
97 void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container) {
98 if (container) {
99 // @TODO allow for container == nullprt ?
100 m_measurementContainerList.setContainer(container_index, *container);
101 }
102 }
103 std::size_t numContainers() const { return m_measurementContainerList.size(); }
104
106 };
107
108 // List of measurement ranges and the measurement container targeted by the ranges.
109 template <typename T_MeasurementContainerList >
110 class GenMeasurementRangeListFlat : public std::vector<std::pair<std::size_t, MeasurementRange>>
111 {
112 public:
113 using MeasurementContainer = typename T_MeasurementContainerList::measurement_container_variant_t;
114 using MeasurementRangeContainer = std::vector<std::pair<std::size_t, MeasurementRange>>;
115 private:
116 T_MeasurementContainerList m_measurementContainerList;
117
118 public:
119
120 const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementContainerList.containerList(); }
121
122 // set container, resizing if necessary. That is just in case we call addMeasurements out of order or not for 2 types of measurements
123 void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container) {
124 if (container) {
125 // @TODO allow for container == nullprt ?
126 m_measurementContainerList.setContainer(container_index, *container);
127 }
128 }
129 std::size_t numContainers() const { return m_measurementContainerList.size(); }
130
132
133 // required std::unordered_map methods compatible with GenMeasurementRangeList
134 MeasurementRangeContainer::const_iterator find(const MeasurementRangeContainer::value_type::first_type &key) const {
135 return std::find_if(begin(), end(),
136 [&key](const auto &c) {
137 return c.first == key;
138 });
139 }
140
141 std::pair<MeasurementRangeContainer::iterator, bool> insert(MeasurementRangeContainer::value_type&& value) {
142 emplace_back(std::forward<MeasurementRangeContainer::value_type>(value));
143 return {std::prev(end()), true};
144 }
145 };
146
151 template <typename T_MeasurementRangeList>
153 {
154 private:
155 const T_MeasurementRangeList *m_measurementRanges;
156
157 public:
158 using MeasurementContainer = typename T_MeasurementRangeList::MeasurementContainer;
160 {
161 public:
162 BaseIterator(const std::vector< MeasurementContainer > *containerList,
163 unsigned int container_index,
164 unsigned int element_index)
165 : m_containerList(containerList),
166 m_containerIndex(container_index),
167 m_index(element_index)
168 {
169 }
171 {
172 ++m_index;
173 return *this;
174 }
175 bool operator==(const BaseIterator &a) const { return m_index == a.m_index && m_containerIndex == a.m_containerIndex; }
176
177 Acts::SourceLink operator*() const
178 {
179 // @TODO avoid double indirection
180 const xAOD::UncalibratedMeasurementContainer *base_container
181 = std::visit([](const auto &a) -> const xAOD::UncalibratedMeasurementContainer *{return a.containerPtr(); },
182 (*m_containerList)[m_containerIndex] );
183 assert( m_index < base_container->size());
184 return Acts::SourceLink{ makeATLASUncalibSourceLink( (*base_container)[m_index] )};
185 }
186
187 const std::vector< MeasurementContainer > &measurementContainerList() const { return *m_containerList; }
188 unsigned int containerIndex() const { return m_containerIndex; }
189 unsigned int index() const { return m_index; }
190
191 using value_type = unsigned int;
192 using difference_type = unsigned int;
195 using iterator_category = std::input_iterator_tag;
196
197 private:
198 const std::vector< MeasurementContainer > *m_containerList;
199 unsigned int m_containerIndex;
200 unsigned int m_index;
201 };
202
203 using Iterator = Acts::SourceLinkAdapterIterator<BaseIterator>;
204 GenUncalibSourceLinkAccessor(const T_MeasurementRangeList &measurement_ranges)
205 : m_measurementRanges(&measurement_ranges)
206 {
207 }
208 // get the range of elements with requested geoId
209 std::pair<Iterator, Iterator> range(const Acts::Surface &surface) const
210 {
211 typename T_MeasurementRangeList::const_iterator
212 range_iter = m_measurementRanges->find(surface.geometryId().value());
213 if (range_iter == m_measurementRanges->end())
214 {
215 return {Iterator(BaseIterator(nullptr, 0u, 0u)),
216 Iterator(BaseIterator(nullptr, 0u, 0u))};
217 }
218
219 return {Iterator(BaseIterator(&measurementContainerList(), range_iter->second.containerIndex(), range_iter->second.elementBeginIndex())),
220 Iterator(BaseIterator(&measurementContainerList(), range_iter->second.containerIndex(), range_iter->second.elementEndIndex()))};
221 }
222 const MeasurementContainer &container(unsigned index) const { return m_measurementRanges->container(index); }
223 const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementRanges->measurementContainerList(); }
224
225 };
226
227 class AtlasMeasurementContainerList : public MeasurementContainerListWithDimension< AtlasMeasurementContainerList,
228 ContainerRefWithDim<xAOD::PixelClusterContainer,2>,
229 ContainerRefWithDim<xAOD::StripClusterContainer,1>,
230 ContainerRefWithDim<xAOD::HGTDClusterContainer,3> >
231 {
232 public:
233
234 template <std::size_t DIM>
236 static const xAOD::PosAccessor<DIM> acc{"localPositionDim" + std::to_string(DIM)};
237 return container.isAvailable(acc.auxid());
238 }
239
240 // to support 2D and 3D pixel measurements
241 // @note to support 3D pixel measurements, still need to add ContainerRefWithDim<xAOD::PixelClusterContainer,3> as
242 // template paramter to MeasurementContainerListWithDimension
244 if (isDimension<2>(container.auxbase())) { return 2u; }
245 else if (isDimension<3>(container.auxbase())) { return 3u; }
246 else {
247 throw std::runtime_error("Unsupported dimension for PixelClusterContainer");
248 }
249 }
250 };
251
255
256}
257
258#endif
#define max(a, b)
Definition cfImp.cxx:41
unsigned int getDimension(const xAOD::PixelClusterContainer &container)
static bool isDimension(const SG::AuxVectorBase &container)
std::pair< MeasurementRangeContainer::iterator, bool > insert(MeasurementRangeContainer::value_type &&value)
const std::vector< MeasurementContainer > & measurementContainerList() const
std::vector< std::pair< std::size_t, MeasurementRange > > MeasurementRangeContainer
typename T_MeasurementContainerList::measurement_container_variant_t MeasurementContainer
MeasurementRangeContainer::const_iterator find(const MeasurementRangeContainer::value_type::first_type &key) const
void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container)
void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container)
typename T_MeasurementContainerList::measurement_container_variant_t MeasurementContainer
std::unordered_map< std::size_t, MeasurementRange > MeasurementRangeContainer
const std::vector< MeasurementContainer > & measurementContainerList() const
const std::vector< MeasurementContainer > & measurementContainerList() const
BaseIterator(const std::vector< MeasurementContainer > *containerList, unsigned int container_index, unsigned int element_index)
Acts::SourceLinkAdapterIterator< BaseIterator > Iterator
const std::vector< MeasurementContainer > & measurementContainerList() const
GenUncalibSourceLinkAccessor(const T_MeasurementRangeList &measurement_ranges)
const MeasurementContainer & container(unsigned index) const
typename T_MeasurementRangeList::MeasurementContainer MeasurementContainer
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Manage index tracking and synchronization of auxiliary data.
STL class.
Athena definition of the Eigen plugin.
GenMeasurementRangeListFlat< AtlasMeasurementContainerList > MeasurementRangeListFlat
GenUncalibSourceLinkAccessor< MeasurementRangeList > UncalibSourceLinkAccessor
GenMeasurementRangeList< AtlasMeasurementContainerList > MeasurementRangeList
ATLASUncalibSourceLink makeATLASUncalibSourceLink(const xAOD::UncalibratedMeasurementContainer *container, std::size_t index, const EventContext &ctx)
Definition index.py:1
STL namespace.
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
SG::AuxElement::Accessor< std::array< float, N > > PosAccessor
xAOD Accessor to the position
UncalibratedMeasurementContainer_v1 UncalibratedMeasurementContainer
Define the version of the uncalibrated measurement container.
void updateEnd(std::size_t container_idx, unsigned int end_element_idx)
static constexpr unsigned int CONTAINER_IDX_SHIFT
static constexpr unsigned int createRangeValue(unsigned int container_idx, unsigned int index)
static constexpr unsigned int CONTAINER_IDX_MASK
MeasurementRange(unsigned int container_idx, unsigned int start_element_idx, unsigned int end_element_idx)
static constexpr unsigned int extractContainerIndex(unsigned int value)
static constexpr unsigned int extractElementIndex(unsigned int value)