ATLAS Offline Software
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  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 
105  const MeasurementContainer &container(unsigned index) const { return m_measurementContainerList.at(index); }
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 
131  const MeasurementContainer &container(unsigned index) const { return m_measurementContainerList.at(index); }
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>
235  static bool isDimension(const SG::AuxVectorBase &container) {
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
243  unsigned int getDimension(const xAOD::PixelClusterContainer &container) {
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
ActsTrk::detail::AtlasMeasurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:231
ActsTrk::detail::AtlasMeasurementContainerList::isDimension
static bool isDimension(const SG::AuxVectorBase &container)
Definition: AtlasUncalibSourceLinkAccessor.h:235
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:223
ActsTrk::detail::MeasurementRange::MeasurementRange
MeasurementRange()
Definition: AtlasUncalibSourceLinkAccessor.h:46
MeasurementContainerWithDimension.h
ActsTrk::detail::GenUncalibSourceLinkAccessor::Iterator
Acts::SourceLinkAdapterIterator< BaseIterator > Iterator
Definition: AtlasUncalibSourceLinkAccessor.h:203
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:200
ActsTrk::detail::GenMeasurementRangeListFlat::numContainers
std::size_t numContainers() const
Definition: AtlasUncalibSourceLinkAccessor.h:129
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:162
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
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
python.SystemOfUnits.second
float second
Definition: SystemOfUnits.py:135
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::difference_type
unsigned int difference_type
Definition: AtlasUncalibSourceLinkAccessor.h:192
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:199
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::operator++
BaseIterator & operator++()
Definition: AtlasUncalibSourceLinkAccessor.h:170
athena.value
value
Definition: athena.py:124
ActsTrk::detail::GenMeasurementRangeListFlat::MeasurementRangeContainer
std::vector< std::pair< std::size_t, MeasurementRange > > MeasurementRangeContainer
Definition: AtlasUncalibSourceLinkAccessor.h:114
ActsTrk::detail::GenUncalibSourceLinkAccessor::m_measurementRanges
const T_MeasurementRangeList * m_measurementRanges
Definition: AtlasUncalibSourceLinkAccessor.h:155
ActsTrk::detail::MeasurementRange
Definition: AtlasUncalibSourceLinkAccessor.h:24
ActsTrk::detail::GenMeasurementRangeList
Definition: AtlasUncalibSourceLinkAccessor.h:85
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator
Definition: AtlasUncalibSourceLinkAccessor.h:160
ActsTrk::detail::MeasurementRange::CONTAINER_IDX_SHIFT
static constexpr unsigned int CONTAINER_IDX_SHIFT
Definition: AtlasUncalibSourceLinkAccessor.h:25
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:66
ActsTrk::detail::GenMeasurementRangeListFlat::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:131
ActsTrk::detail::GenMeasurementRangeListFlat::setContainer
void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container)
Definition: AtlasUncalibSourceLinkAccessor.h:123
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:656
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
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:92
DataVector::auxbase
const SG::AuxVectorBase & auxbase() const
Convert to AuxVectorBase.
ActsTrk::detail::GenMeasurementRangeList::numContainers
std::size_t numContainers() const
Definition: AtlasUncalibSourceLinkAccessor.h:103
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:195
ActsTrk::detail::GenUncalibSourceLinkAccessor::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:222
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ActsTrk::detail::GenUncalibSourceLinkAccessor::GenUncalibSourceLinkAccessor
GenUncalibSourceLinkAccessor(const T_MeasurementRangeList &measurement_ranges)
Definition: AtlasUncalibSourceLinkAccessor.h:204
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:158
ActsTrk::detail::GenUncalibSourceLinkAccessor
Accessor for the above source link container.
Definition: AtlasUncalibSourceLinkAccessor.h:153
ActsTrk::detail::GenMeasurementRangeList::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:94
ActsTrk::detail::GenMeasurementRangeListFlat::insert
std::pair< MeasurementRangeContainer::iterator, bool > insert(MeasurementRangeContainer::value_type &&value)
Definition: AtlasUncalibSourceLinkAccessor.h:141
ActsTrk::detail::GenMeasurementRangeListFlat::m_measurementContainerList
T_MeasurementContainerList m_measurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:116
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:189
ActsTrk::detail::GenUncalibSourceLinkAccessor::range
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Definition: AtlasUncalibSourceLinkAccessor.h:209
PixelClusterContainer.h
ActsTrk::detail::GenMeasurementRangeList::m_measurementContainerList
T_MeasurementContainerList m_measurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:90
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::operator*
Acts::SourceLink operator*() const
Definition: AtlasUncalibSourceLinkAccessor.h:177
HGTDClusterContainer.h
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
DataVector
Derived DataVector<T>.
Definition: DataVector.h:795
MeasurementContainerListWithDimension
Definition: MeasurementContainerWithDimension.h:261
ActsTrk::detail::GenMeasurementRangeListFlat
Definition: AtlasUncalibSourceLinkAccessor.h:111
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:243
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:187
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::m_containerList
const std::vector< MeasurementContainer > * m_containerList
Definition: AtlasUncalibSourceLinkAccessor.h:198
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:97
DeMoScan.index
string index
Definition: DeMoScan.py:362
a
TList * a
Definition: liststreamerinfos.cxx:10
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
ActsTrk::detail::GenMeasurementRangeListFlat::MeasurementContainer
typename T_MeasurementContainerList::measurement_container_variant_t MeasurementContainer
Definition: AtlasUncalibSourceLinkAccessor.h:113
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:175
StripClusterContainer.h
ActsTrk::detail::GenMeasurementRangeList< AtlasMeasurementContainerList >::MeasurementRangeContainer
std::unordered_map< std::size_t, MeasurementRange > MeasurementRangeContainer
Definition: AtlasUncalibSourceLinkAccessor.h:88
DeMoScan.first
bool first
Definition: DeMoScan.py:534
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::GenMeasurementRangeListFlat::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:120
ActsTrk::detail::GenUncalibSourceLinkAccessor::BaseIterator::containerIndex
unsigned int containerIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:188
ActsTrk::detail::GenMeasurementRangeList::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:105
ActsTrk::detail
Athena definition of the Eigen plugin.
Definition: MeasurementCalibratorBase.h:19
ActsTrk::detail::MeasurementRange::isMeasurementExpected
bool isMeasurementExpected() const
Definition: AtlasUncalibSourceLinkAccessor.h:79
ActsTrk::detail::GenMeasurementRangeListFlat::find
MeasurementRangeContainer::const_iterator find(const MeasurementRangeContainer::value_type::first_type &key) const
Definition: AtlasUncalibSourceLinkAccessor.h:134
value_type
Definition: EDM_MasterSearch.h:11
python.compressB64.c
def c
Definition: compressB64.py:93
ActsTrk::detail::MeasurementRange::CONTAINER_IDX_MASK
static constexpr unsigned int CONTAINER_IDX_MASK
Definition: AtlasUncalibSourceLinkAccessor.h:26
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37