2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5#include "src/detail/MeasurementIndex.h"
7namespace ActsTrk::detail {
9 inline void DuplicateSeedDetector::newTrajectory() {
10 if (m_disabled || m_foundSeeds == 0u || m_nextSeed == m_nUsedMeasurements.size())
13 auto beg = m_nUsedMeasurements.begin();
14 if (m_nextSeed < m_nUsedMeasurements.size()) {
15 std::advance(beg, m_nextSeed);
18 std::fill(beg, m_nUsedMeasurements.end(), 0u);
21 inline void DuplicateSeedDetector::addMeasurement(const xAOD::UncalibratedMeasurement* sl,
22 const MeasurementIndex& measurementIndex) {
23 if (m_disabled || m_nextSeed == m_nUsedMeasurements.size())
26 std::size_t hitIndex = measurementIndex.index(*sl);
27 if (!(hitIndex < m_seedIndex.size()))
30 for (index_t iseed : m_seedIndex[hitIndex]) {
31 assert(iseed < m_nUsedMeasurements.size());
33 if (iseed < m_nextSeed || m_isDuplicateSeed[iseed])
37 // Here is to decide how many hits need to be on the seed to mark it as duplicate
38 if (++m_nUsedMeasurements[iseed] >= std::max(1u, m_nSeedMeasurements[iseed] - m_measOffset)) {
39 assert(m_nUsedMeasurements[iseed] <= m_nSeedMeasurements[iseed]); // shouldn't ever find more
40 m_isDuplicateSeed[iseed] = true;
46 // For complete removal of duplicate seeds, assumes isDuplicate(iseed) is called for monotonically increasing typeIndex,iseed.
47 inline bool DuplicateSeedDetector::isDuplicate(std::size_t typeIndex, index_t iseed) {
51 if (typeIndex < m_seedOffset.size()) {
52 iseed += m_seedOffset[typeIndex];
55 assert(iseed < m_isDuplicateSeed.size());
56 // If iseed not increasing, we will miss some duplicate seeds, but won't exclude needed seeds.
57 if (iseed >= m_nextSeed) {
58 m_nextSeed = iseed + 1;
61 return m_isDuplicateSeed[iseed];
64} // namespace ActsTrk::detail