ATLAS Offline Software
MeasurementIndex.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <algorithm>
6 
7 namespace ActsTrk::detail {
8 
9 inline MeasurementIndex::MeasurementIndex(std::size_t nMeasurementContainerMax) {
10  m_measurementContainerOffsets.reserve(nMeasurementContainerMax);
11 }
12 
13 inline std::size_t MeasurementIndex::nMeasurements() const {
14  return m_nMeasurements;
15 }
16 
17 inline std::size_t MeasurementIndex::size() const {
18  return m_size;
19 }
20 
21 inline bool MeasurementIndex::addMeasurement(const xAOD::UncalibratedMeasurement &hit) {
22  ++m_nMeasurements;
23  auto container = hit.container(); // owning container, which might be different from clusterContainer
24  if (container == m_lastContainer) return false;
25  if (std::any_of(m_measurementContainerOffsets.begin(),
26  m_measurementContainerOffsets.end(),
27  [container](const auto& c) { return c.first == container; }))
28  return false;
29  m_measurementContainerOffsets.emplace_back(container, m_size);
30  m_lastContainerOffset = m_size;
31  m_lastContainerSize = container->size_v();
32  m_size += m_lastContainerSize;
33  m_lastContainer = container;
34  return true;
35 }
36 
37 inline void MeasurementIndex::addMeasurements(const xAOD::UncalibratedMeasurementContainer& clusterContainer) {
38  for (const xAOD::UncalibratedMeasurement* hit : clusterContainer) {
39  addMeasurement(*hit);
40  }
41 }
42 
43 inline std::size_t MeasurementIndex::index(const xAOD::UncalibratedMeasurement& hit) const {
44  const auto* container = hit.container();
45  if (container != m_lastContainer) {
46  auto it =
47  std::find_if(m_measurementContainerOffsets.begin(),
48  m_measurementContainerOffsets.end(),
49  [container](const auto& c) {
50  return c.first == container;
51  });
52  if (it == m_measurementContainerOffsets.end())
53  return m_size;
54  m_lastContainer = container;
55  m_lastContainerOffset = it->second;
56 
57  // check our local index is less than the saved size of the container
58  ++it;
59  std::size_t nextOffset = (it != m_measurementContainerOffsets.end()) ? it->second : m_size;
60  m_lastContainerSize = nextOffset - m_lastContainerOffset;
61  }
62  std::size_t ind = hit.index();
63  if (m_lastContainer == nullptr || !(ind < m_lastContainerSize))
64  return m_size;
65 
66  return m_lastContainerOffset + ind;
67 }
68 
69 inline std::pair<std::size_t,bool> MeasurementIndex::newMeasurementIndex(const xAOD::UncalibratedMeasurement& hit) {
70  bool newContainer = addMeasurement(hit);
71  return {index(hit), newContainer};
72 }
73 
74 } // namespace ActsTrk::detail