ATLAS Offline Software
AtlasUncalibSourceLinkAccessor.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3  */
4 #ifndef ATLASUNCALIBSROUCELINACCESOR_H
5 #define ATLASUNCALIBSROUCELINACCESOR_H
6 
8 
11 
12 
13 // #include "MakeDerivedVariant.h"
15 #include <variant>
16 #include <vector>
17 #include <utility>
18 
19 namespace ActsTrk {
20 // Helper class to describe ranges of measurements
21 // the range provides the measurement collection index and element index range (begin, end)
22  struct MeasurementRange : public std::pair<unsigned int, unsigned int>
23  {
24  MeasurementRange() : std::pair<unsigned int, unsigned int>(std::numeric_limits<unsigned int>::max(), std::numeric_limits<unsigned int>::max()) {}
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 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  void setRangeBegin(std::size_t container_idx, unsigned int element_idx)
35  {
36  assert(container_idx < (1u << (32 - CONTAINER_IDX_SHIFT)));
37  this->first = MeasurementRange::createRangeValue(container_idx, element_idx);
38  }
39  void setRangeEnd(std::size_t container_idx, unsigned int element_idx)
40  {
41  this->second = MeasurementRange::createRangeValue(container_idx, element_idx);
42  }
43  unsigned int containerIndex() const
44  {
45  assert((this->first & CONTAINER_IDX_MASK) == (this->second & CONTAINER_IDX_MASK));
46  return (this->first & CONTAINER_IDX_MASK) >> CONTAINER_IDX_SHIFT;
47  }
48  unsigned int elementBeginIndex() const
49  {
50  assert((this->first & CONTAINER_IDX_MASK) == (this->second & CONTAINER_IDX_MASK));
51  return this->first & ELEMENT_IDX_MASK;
52  }
53  unsigned int elementEndIndex() const
54  {
55  assert((this->first & CONTAINER_IDX_MASK) == (this->second & CONTAINER_IDX_MASK));
56  return this->second & ELEMENT_IDX_MASK;
57  }
58  bool empty() const { return this->first == this->second; }
59  };
60 
61  // List of measurement ranges and the measurement container targeted by the ranges.
62  template <typename T_MeasurementContainerList >
63  class GenMeasurementRangeList : public std::vector<MeasurementRange>
64  {
65  public:
66  using MeasurementContainer = typename T_MeasurementContainerList::measurement_container_variant_t;
67  private:
68  T_MeasurementContainerList m_measurementContainerList;
69 
70  public:
71 
72  const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementContainerList.containerList(); }
73 
74  // set container, resizing if necessary. That is just in case we call addMeasurements out of order or not for 2 types of measurements
75  void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container) {
76  if (container) {
77  // @TODO allow for container == nullprt ?
78  m_measurementContainerList.setContainer(container_index, *container);
79  }
80  }
81  std::size_t numContainers() const { return m_measurementContainerList.size(); }
82 
83  const MeasurementContainer &container(unsigned index) const { return m_measurementContainerList.at(index); }
84  };
85 
90  template <typename T_MeasurementRangeList>
92  {
93  private:
94  const std::vector<Acts::GeometryIdentifier> *m_orderedGeoIds;
95  const T_MeasurementRangeList *m_measurementRanges;
96 
97  public:
98  using MeasurementContainer = typename T_MeasurementRangeList::MeasurementContainer;
100  {
101  public:
102  BaseIterator(const std::vector< MeasurementContainer > *containerList,
103  unsigned int container_index,
104  unsigned int element_index)
105  : m_containerList(containerList),
106  m_containerIndex(container_index),
107  m_index(element_index)
108  {
109  }
111  {
112  ++m_index;
113  return *this;
114  }
115  bool operator==(const BaseIterator &a) const { return m_index == a.m_index && m_containerIndex == a.m_containerIndex; }
116 
117  Acts::SourceLink operator*() const
118  {
119  // @TODO avoid double indirection
120  const xAOD::UncalibratedMeasurementContainer *base_container
121  = std::visit([](const auto &a) -> const xAOD::UncalibratedMeasurementContainer *{return a.containerPtr(); },
122  (*m_containerList)[m_containerIndex] );
123  assert( m_index < base_container->size());
124  return Acts::SourceLink{ makeATLASUncalibSourceLink( (*base_container)[m_index] )};
125  }
126 
127  const std::vector< MeasurementContainer > &measurementContainerList() const { return *m_containerList; }
128  unsigned int containerIndex() const { return m_containerIndex; }
129  unsigned int index() const { return m_index; }
130 
131  using value_type = unsigned int;
132  using difference_type = unsigned int;
135  using iterator_category = std::input_iterator_tag;
136 
137  private:
138  const std::vector< MeasurementContainer > *m_containerList;
139  unsigned int m_containerIndex;
140  unsigned int m_index;
141  };
142 
143  using Iterator = Acts::SourceLinkAdapterIterator<BaseIterator>;
144  GenUncalibSourceLinkAccessor(const std::vector<Acts::GeometryIdentifier> &ordered_geoIds,
145  const T_MeasurementRangeList &measurement_ranges)
146  : m_orderedGeoIds(&ordered_geoIds),
147  m_measurementRanges(&measurement_ranges)
148  {
149  }
150  // get the range of elements with requested geoId
151  std::pair<Iterator, Iterator> range(const Acts::Surface &surface) const
152  {
153  std::vector<Acts::GeometryIdentifier>::const_iterator
154  geo_iter = std::lower_bound(m_orderedGeoIds->begin(), m_orderedGeoIds->end(), surface.geometryId());
155  if (geo_iter == m_orderedGeoIds->end() || *geo_iter != surface.geometryId() || (*m_measurementRanges).at(geo_iter - m_orderedGeoIds->begin()).empty())
156  {
157  return {Iterator(BaseIterator(nullptr, 0u, 0u)),
158  Iterator(BaseIterator(nullptr, 0u, 0u))};
159  }
160 
161  assert(static_cast<std::size_t>(geo_iter - m_orderedGeoIds->begin()) < m_measurementRanges->size());
162  const MeasurementRange &range = (*m_measurementRanges).at(geo_iter - m_orderedGeoIds->begin());
163  // const xAOD::UncalibratedMeasurementContainer *container
164  // = std::visit( [](const auto &a) -> const xAOD::UncalibratedMeasurementContainer * { return a},
165  // m_measurementRanges->container(range.containerIndex()));
166  return {Iterator(BaseIterator(&measurementContainerList(), range.containerIndex(), range.elementBeginIndex())),
167  Iterator(BaseIterator(&measurementContainerList(), range.containerIndex(), range.elementEndIndex()))};
168  }
169  const MeasurementContainer &container(unsigned index) const { return m_measurementRanges->container(index); }
170  const std::vector< MeasurementContainer > &measurementContainerList() const { return m_measurementRanges->measurementContainerList(); }
171 
172  };
173 
174  class AtlasMeasurementContainerList : public MeasurementContainerListWithDimension< AtlasMeasurementContainerList,
175  ContainerRefWithDim<xAOD::PixelClusterContainer,2>,
176  ContainerRefWithDim<xAOD::StripClusterContainer,1> >
177  {
178  public:
179 
180  template <std::size_t DIM>
181  static bool isDimension(const SG::AuxVectorBase &container) {
182  static const xAOD::PosAccessor<DIM> acc{"localPositionDim" + std::to_string(DIM)};
183  return container.isAvailable(acc.auxid());
184  }
185 
186  // to support 2D and 3D pixel measurements
187  // @note to support 3D pixel measurements, still need to add ContainerRefWithDim<xAOD::PixelClusterContainer,3> as
188  // template paramter to MeasurementContainerListWithDimension
189  unsigned int getDimension(const xAOD::PixelClusterContainer &container) {
190  if (isDimension<2>(container.auxbase())) { return 2u; }
191  else if (isDimension<3>(container.auxbase())) { return 3u; }
192  else {
193  throw std::runtime_error("Unsupported dimension for PixelClusterContainer");
194  }
195  }
196  };
197 
200 
201 }
202 #endif
ActsTrk::MeasurementRange::elementBeginIndex
unsigned int elementBeginIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:48
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
ActsTrk::MeasurementRange::empty
bool empty() const
Definition: AtlasUncalibSourceLinkAccessor.h:58
ActsTrk::AtlasMeasurementContainerList::getDimension
unsigned int getDimension(const xAOD::PixelClusterContainer &container)
Definition: AtlasUncalibSourceLinkAccessor.h:189
MeasurementContainerWithDimension.h
ActsTrk::GenUncalibSourceLinkAccessor::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:169
max
#define max(a, b)
Definition: cfImp.cxx:41
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:66
ActsTrk::MeasurementRange::setRangeEnd
void setRangeEnd(std::size_t container_idx, unsigned int element_idx)
Definition: AtlasUncalibSourceLinkAccessor.h:39
ActsTrk::GenMeasurementRangeList::container
const MeasurementContainer & container(unsigned index) const
Definition: AtlasUncalibSourceLinkAccessor.h:83
ActsTrk::MeasurementRange::elementEndIndex
unsigned int elementEndIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:53
index
Definition: index.py:1
ActsTrk::MeasurementRange
Definition: AtlasUncalibSourceLinkAccessor.h:23
ActsTrk::GenUncalibSourceLinkAccessor::m_orderedGeoIds
const std::vector< Acts::GeometryIdentifier > * m_orderedGeoIds
Definition: AtlasUncalibSourceLinkAccessor.h:94
ActsTrk::MeasurementRange::MeasurementRange
MeasurementRange()
Definition: AtlasUncalibSourceLinkAccessor.h:24
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::m_containerList
const std::vector< MeasurementContainer > * m_containerList
Definition: AtlasUncalibSourceLinkAccessor.h:138
ActsTrk::MeasurementRange::ELEMENT_IDX_MASK
static constexpr unsigned int ELEMENT_IDX_MASK
Definition: AtlasUncalibSourceLinkAccessor.h:27
ActsTrk::GenUncalibSourceLinkAccessor::Iterator
Acts::SourceLinkAdapterIterator< BaseIterator > Iterator
Definition: AtlasUncalibSourceLinkAccessor.h:143
ActsTrk::GenUncalibSourceLinkAccessor
Accessor for the above source link container.
Definition: AtlasUncalibSourceLinkAccessor.h:92
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::containerIndex
unsigned int containerIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:128
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:662
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
SG::AuxVectorBase
Manage index tracking and synchronization of auxiliary data.
Definition: AuxVectorBase.h:98
DataVector::auxbase
const SG::AuxVectorBase & auxbase() const
Convert to AuxVectorBase.
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::BaseIterator
BaseIterator(const std::vector< MeasurementContainer > *containerList, unsigned int container_index, unsigned int element_index)
Definition: AtlasUncalibSourceLinkAccessor.h:102
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator
Definition: AtlasUncalibSourceLinkAccessor.h:100
ActsTrk::makeATLASUncalibSourceLink
ATLASUncalibSourceLink makeATLASUncalibSourceLink(const xAOD::UncalibratedMeasurementContainer *container, std::size_t index, [[maybe_unused]] const EventContext &ctx)
Definition: ATLASSourceLink.h:31
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::m_index
unsigned int m_index
Definition: AtlasUncalibSourceLinkAccessor.h:140
ActsTrk::GenUncalibSourceLinkAccessor::GenUncalibSourceLinkAccessor
GenUncalibSourceLinkAccessor(const std::vector< Acts::GeometryIdentifier > &ordered_geoIds, const T_MeasurementRangeList &measurement_ranges)
Definition: AtlasUncalibSourceLinkAccessor.h:144
ActsTrk::GenMeasurementRangeList::m_measurementContainerList
T_MeasurementContainerList m_measurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:68
PixelClusterContainer.h
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::index
unsigned int index() const
Definition: AtlasUncalibSourceLinkAccessor.h:129
ActsTrk::MeasurementRange::containerIndex
unsigned int containerIndex() const
Definition: AtlasUncalibSourceLinkAccessor.h:43
ActsTrk::AtlasMeasurementContainerList::isDimension
static bool isDimension(const SG::AuxVectorBase &container)
Definition: AtlasUncalibSourceLinkAccessor.h:181
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
ActsTrk::GenMeasurementRangeList
Definition: AtlasUncalibSourceLinkAccessor.h:64
ActsTrk::GenMeasurementRangeList::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:72
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
MeasurementContainerListWithDimension
Definition: MeasurementContainerWithDimension.h:258
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::operator++
BaseIterator & operator++()
Definition: AtlasUncalibSourceLinkAccessor.h:110
ActsTrk::GenUncalibSourceLinkAccessor::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:170
ActsTrk::GenMeasurementRangeList::setContainer
void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container)
Definition: AtlasUncalibSourceLinkAccessor.h:75
ActsTrk::GenUncalibSourceLinkAccessor::range
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Definition: AtlasUncalibSourceLinkAccessor.h:151
ActsTrk::MeasurementRange::setRangeBegin
void setRangeBegin(std::size_t container_idx, unsigned int element_idx)
Definition: AtlasUncalibSourceLinkAccessor.h:34
ActsTrk::GenUncalibSourceLinkAccessor::MeasurementContainer
typename T_MeasurementRangeList::MeasurementContainer MeasurementContainer
Definition: AtlasUncalibSourceLinkAccessor.h:98
ActsTrk::MeasurementRange::CONTAINER_IDX_SHIFT
static constexpr unsigned int CONTAINER_IDX_SHIFT
Definition: AtlasUncalibSourceLinkAccessor.h:25
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::iterator_category
std::input_iterator_tag iterator_category
Definition: AtlasUncalibSourceLinkAccessor.h:135
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::difference_type
unsigned int difference_type
Definition: AtlasUncalibSourceLinkAccessor.h:132
ActsTrk::MeasurementRange::createRangeValue
static unsigned int createRangeValue(unsigned int container_idx, unsigned int index)
Definition: AtlasUncalibSourceLinkAccessor.h:28
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::GenUncalibSourceLinkAccessor::BaseIterator::operator==
bool operator==(const BaseIterator &a) const
Definition: AtlasUncalibSourceLinkAccessor.h:115
DeMoScan.index
string index
Definition: DeMoScan.py:362
a
TList * a
Definition: liststreamerinfos.cxx:10
StripClusterContainer.h
DeMoScan.first
bool first
Definition: DeMoScan.py:534
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
ActsTrk::MeasurementRange::CONTAINER_IDX_MASK
static constexpr unsigned int CONTAINER_IDX_MASK
Definition: AtlasUncalibSourceLinkAccessor.h:26
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::m_containerIndex
unsigned int m_containerIndex
Definition: AtlasUncalibSourceLinkAccessor.h:139
ActsTrk::GenMeasurementRangeList::MeasurementContainer
typename T_MeasurementContainerList::measurement_container_variant_t MeasurementContainer
Definition: AtlasUncalibSourceLinkAccessor.h:66
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::measurementContainerList
const std::vector< MeasurementContainer > & measurementContainerList() const
Definition: AtlasUncalibSourceLinkAccessor.h:127
ActsTrk::GenUncalibSourceLinkAccessor::BaseIterator::operator*
Acts::SourceLink operator*() const
Definition: AtlasUncalibSourceLinkAccessor.h:117
value_type
Definition: EDM_MasterSearch.h:11
ActsTrk::AtlasMeasurementContainerList
Definition: AtlasUncalibSourceLinkAccessor.h:177
ActsTrk::GenMeasurementRangeList::numContainers
std::size_t numContainers() const
Definition: AtlasUncalibSourceLinkAccessor.h:81
ActsTrk::GenUncalibSourceLinkAccessor::m_measurementRanges
const T_MeasurementRangeList * m_measurementRanges
Definition: AtlasUncalibSourceLinkAccessor.h:95