2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
7 namespace ActsTrk::detail {
9 inline MeasurementIndex::MeasurementIndex(std::size_t nMeasurementContainerMax) {
10 m_measurementContainerOffsets.reserve(nMeasurementContainerMax);
13 inline std::size_t MeasurementIndex::nMeasurements() const {
14 return m_nMeasurements;
17 inline std::size_t MeasurementIndex::size() const {
21 inline bool MeasurementIndex::addMeasurement(const xAOD::UncalibratedMeasurement &hit) {
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; }))
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;
37 inline void MeasurementIndex::addMeasurements(const xAOD::UncalibratedMeasurementContainer& clusterContainer) {
38 for (const xAOD::UncalibratedMeasurement* hit : clusterContainer) {
43 inline std::size_t MeasurementIndex::index(const xAOD::UncalibratedMeasurement& hit) const {
44 const auto* container = hit.container();
45 if (container != m_lastContainer) {
47 std::find_if(m_measurementContainerOffsets.begin(),
48 m_measurementContainerOffsets.end(),
49 [container](const auto& c) {
50 return c.first == container;
52 if (it == m_measurementContainerOffsets.end())
54 m_lastContainer = container;
55 m_lastContainerOffset = it->second;
57 // check our local index is less than the saved size of the container
59 std::size_t nextOffset = (it != m_measurementContainerOffsets.end()) ? it->second : m_size;
60 m_lastContainerSize = nextOffset - m_lastContainerOffset;
62 std::size_t ind = hit.index();
63 if (m_lastContainer == nullptr || !(ind < m_lastContainerSize))
66 return m_lastContainerOffset + ind;
69 inline std::pair<std::size_t,bool> MeasurementIndex::newMeasurementIndex(const xAOD::UncalibratedMeasurement& hit) {
70 bool newContainer = addMeasurement(hit);
71 return {index(hit), newContainer};
74 } // namespace ActsTrk::detail