ATLAS Offline Software
Loading...
Searching...
No Matches
AtlasUncalibSourceLinkAccessor.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4#ifndef ATLASUNCALIBSROUCELINACCESOR_H
5#define ATLASUNCALIBSROUCELINACCESOR_H
6
11
13#include "Acts/Surfaces/Surface.hpp"
14
16#include <variant>
17#include <vector>
18#include <unordered_map>
19#include <utility>
20
21namespace ActsTrk::detail {
22
23// Helper class to describe ranges of measurements
24// the range provides the measurement collection index and element index range (begin, end)
25 struct MeasurementRange : public std::pair<unsigned int, unsigned int>
26 {
27 static constexpr unsigned int CONTAINER_IDX_SHIFT = 28;
28 static constexpr unsigned int CONTAINER_IDX_MASK = (1u << 31) | (1u << 30) | (1u << 29) | (1u << 28);
29 static constexpr unsigned int ELEMENT_IDX_MASK = ~CONTAINER_IDX_MASK;
30 static constexpr unsigned int createRangeValue(unsigned int container_idx, unsigned int index)
31 {
32 assert(container_idx < (1u << (32 - CONTAINER_IDX_SHIFT)));
33 assert((index & CONTAINER_IDX_MASK) == 0u);
34 return (container_idx << CONTAINER_IDX_SHIFT) | index;
35 }
36 static constexpr unsigned int extractContainerIndex(unsigned int value) {
37 return (value & CONTAINER_IDX_MASK) >> CONTAINER_IDX_SHIFT;
38 }
39 static constexpr unsigned int extractElementIndex(unsigned int value) {
40 return value & ELEMENT_IDX_MASK;
41 }
42 bool isConsistentRange() const {
43 return extractContainerIndex(this->first) == extractContainerIndex(this->second)
44 && ( extractElementIndex(this->first) <= extractElementIndex(this->second)
45 || (extractElementIndex(this->first)==ELEMENT_IDX_MASK && extractElementIndex(this->second)==0));
46 }
47
48 MeasurementRange() : std::pair<unsigned int, unsigned int>(std::numeric_limits<unsigned int>::max(), std::numeric_limits<unsigned int>::max()) {}
49 MeasurementRange(unsigned int container_idx, unsigned int start_element_idx, unsigned int end_element_idx)
50 : std::pair<unsigned int, unsigned int>( createRangeValue(container_idx, start_element_idx),
51 createRangeValue(container_idx, end_element_idx) ) {
52 }
53
59
60 void updateEnd(std::size_t container_idx, unsigned int end_element_idx) {
61 assert( extractContainerIndex(this->first) == container_idx);
62 this->second = createRangeValue(container_idx, end_element_idx);
63 }
64
65 unsigned int containerIndex() const
66 {
67 assert(isConsistentRange());
68 return extractContainerIndex(this->first);
69 }
70 unsigned int elementBeginIndex() const
71 {
72 assert(isConsistentRange());
73 return extractElementIndex(this->first);
74 }
75 unsigned int elementEndIndex() const
76 {
77 assert(isConsistentRange());
78 return extractElementIndex(this->second);
79 }
80 bool empty() const { assert(isConsistentRange()); return this->first == this->second; }
81 bool isMeasurementExpected() const { assert(isConsistentRange()); return this->first <= this->second; }
82 };
83
84 // List of measurement ranges and the measurement container targeted by the ranges.
85 template <typename T_MeasurementContainerList >
86 class GenMeasurementRangeList : public std::unordered_map<std::size_t, MeasurementRange>
87 {
88 public:
89 using MeasurementContainer = typename T_MeasurementContainerList::measurement_container_variant_t;
90 using MeasurementRangeContainer = std::unordered_map<std::size_t, MeasurementRange>;
91 private:
92 T_MeasurementContainerList m_measurementContainerList;
93
94 public:
95
96 const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementContainerList.containerList(); }
97
98 // set container, resizing if necessary. That is just in case we call addMeasurements out of order or not for 2 types of measurements
99 void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container) {
100 if (container) {
101 // @TODO allow for container == nullprt ?
102 m_measurementContainerList.setContainer(container_index, *container);
103 }
104 }
105 std::size_t numContainers() const { return m_measurementContainerList.size(); }
106
108 };
109
110 // List of measurement ranges and the measurement container targeted by the ranges.
111 template <typename T_MeasurementContainerList >
112 class GenMeasurementRangeListFlat : public std::vector<std::pair<std::size_t, MeasurementRange>>
113 {
114 public:
115 using MeasurementContainer = typename T_MeasurementContainerList::measurement_container_variant_t;
116 using MeasurementRangeContainer = std::vector<std::pair<std::size_t, MeasurementRange>>;
117 private:
118 T_MeasurementContainerList m_measurementContainerList;
119
120 public:
121
122 const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementContainerList.containerList(); }
123
124 // set container, resizing if necessary. That is just in case we call addMeasurements out of order or not for 2 types of measurements
125 void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container) {
126 if (container) {
127 // @TODO allow for container == nullprt ?
128 m_measurementContainerList.setContainer(container_index, *container);
129 }
130 }
131 std::size_t numContainers() const { return m_measurementContainerList.size(); }
132
134
135 // required std::unordered_map methods compatible with GenMeasurementRangeList
136 MeasurementRangeContainer::const_iterator find(const MeasurementRangeContainer::value_type::first_type &key) const {
137 return std::find_if(begin(), end(),
138 [&key](const auto &c) {
139 return c.first == key;
140 });
141 }
142
143 std::pair<MeasurementRangeContainer::iterator, bool> insert(MeasurementRangeContainer::value_type&& value) {
144 emplace_back(std::forward<MeasurementRangeContainer::value_type>(value));
145 return {std::prev(end()), true};
146 }
147 };
148
153 template <typename T_MeasurementRangeList>
155 {
156 private:
157 const T_MeasurementRangeList *m_measurementRanges;
158
159 public:
160 using MeasurementContainer = typename T_MeasurementRangeList::MeasurementContainer;
162 {
163 public:
164 BaseIterator(const std::vector< MeasurementContainer > *containerList,
165 unsigned int container_index,
166 unsigned int element_index)
167 : m_containerList(containerList),
168 m_containerIndex(container_index),
169 m_index(element_index)
170 {
171 }
173 {
174 ++m_index;
175 return *this;
176 }
177 bool operator==(const BaseIterator &a) const { return m_index == a.m_index && m_containerIndex == a.m_containerIndex; }
178
179 Acts::SourceLink operator*() const
180 {
181 // @TODO avoid double indirection
182 const xAOD::UncalibratedMeasurementContainer *base_container
183 = std::visit([](const auto &a) -> const xAOD::UncalibratedMeasurementContainer* {
184 return a.containerPtr();
185 }, (*m_containerList)[m_containerIndex] );
187 return MeasurementCalibratorBase::pack((*base_container)[m_index]);
188 }
189
190 const std::vector< MeasurementContainer > &measurementContainerList() const { return *m_containerList; }
191 unsigned int containerIndex() const { return m_containerIndex; }
192 unsigned int index() const { return m_index; }
193
194 using value_type = unsigned int;
195 using difference_type = unsigned int;
198 using iterator_category = std::input_iterator_tag;
199
200 private:
201 const std::vector< MeasurementContainer > *m_containerList;
202 unsigned int m_containerIndex;
203 unsigned int m_index;
204 };
205
206 using Iterator = Acts::SourceLinkAdapterIterator<BaseIterator>;
207 GenUncalibSourceLinkAccessor(const T_MeasurementRangeList &measurement_ranges)
208 : m_measurementRanges(&measurement_ranges)
209 {
210 }
211 // get the range of elements with requested geoId
212 std::pair<Iterator, Iterator> range(const Acts::Surface &surface) const
213 {
214 typename T_MeasurementRangeList::const_iterator
215 range_iter = m_measurementRanges->find(surface.geometryId().value());
216 if (range_iter == m_measurementRanges->end())
217 {
218 return {Iterator(BaseIterator(nullptr, 0u, 0u)),
219 Iterator(BaseIterator(nullptr, 0u, 0u))};
220 }
221
222 return {Iterator(BaseIterator(&measurementContainerList(), range_iter->second.containerIndex(), range_iter->second.elementBeginIndex())),
223 Iterator(BaseIterator(&measurementContainerList(), range_iter->second.containerIndex(), range_iter->second.elementEndIndex()))};
224 }
225 const MeasurementContainer &container(unsigned index) const { return m_measurementRanges->container(index); }
226 const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementRanges->measurementContainerList(); }
227
228 };
229
230 class AtlasMeasurementContainerList : public MeasurementContainerListWithDimension< AtlasMeasurementContainerList,
231 ContainerRefWithDim<xAOD::PixelClusterContainer,2>,
232 ContainerRefWithDim<xAOD::StripClusterContainer,1>,
233 ContainerRefWithDim<xAOD::HGTDClusterContainer,3> >
234 {
235 public:
236
237 template <std::size_t DIM>
238 static bool isDimension(const SG::AuxVectorBase &container) {
239 static const xAOD::PosAccessor<DIM> acc{"localPositionDim" + std::to_string(DIM)};
240 return container.isAvailable(acc.auxid());
241 }
242
243 // to support 2D and 3D pixel measurements
244 // @note to support 3D pixel measurements, still need to add ContainerRefWithDim<xAOD::PixelClusterContainer,3> as
245 // template paramter to MeasurementContainerListWithDimension
246 unsigned int getDimension(const xAOD::PixelClusterContainer &container) {
247 if (isDimension<2>(container.auxbase())) { return 2u; }
248 else if (isDimension<3>(container.auxbase())) { return 3u; }
249 else {
250 throw std::runtime_error("Unsupported dimension for PixelClusterContainer");
251 }
252 }
253 };
254
258
259}
260
261#endif
static Double_t a
size_t size() const
Number of registered mappings.
#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
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
Manage index tracking and synchronization of auxiliary data.
bool isAvailable(auxid_t id) const
Test to see if a variable exists in the store.
STL class.
Hash functions to pack the source link into unordered_maps / unordered_sets.
GenMeasurementRangeListFlat< AtlasMeasurementContainerList > MeasurementRangeListFlat
GenUncalibSourceLinkAccessor< MeasurementRangeList > UncalibSourceLinkAccessor
GenMeasurementRangeList< AtlasMeasurementContainerList > MeasurementRangeList
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)