ATLAS Offline Software
Loading...
Searching...
No Matches
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
7namespace ActsTrk::detail {
8
9inline MeasurementIndex::MeasurementIndex(std::size_t nMeasurementContainerMax) {
10 m_measurementContainerOffsets.reserve(nMeasurementContainerMax);
11}
12
13inline std::size_t MeasurementIndex::nMeasurements() const {
14 return m_nMeasurements;
15}
16
17inline std::size_t MeasurementIndex::size() const {
18 return m_size;
19}
20
21inline 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
37inline void MeasurementIndex::addMeasurements(const xAOD::UncalibratedMeasurementContainer& clusterContainer) {
38 for (const xAOD::UncalibratedMeasurement* hit : clusterContainer) {
39 addMeasurement(*hit);
40 }
41}
42
43inline 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
69inline 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