ATLAS Offline Software
Loading...
Searching...
No Matches
DuplicateSeedDetector.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
8#include <stdexcept>
9#include <array>
10
11namespace ActsTrk::detail {
12
14 unsigned int measOffset,
15 bool enabled)
16 : m_disabled(!enabled),
17 m_measOffset(measOffset),
18 m_nUsedMeasurements(enabled ? numSeeds : 0ul, 0u),
19 m_nSeedMeasurements(enabled ? numSeeds : 0ul, 0u),
20 m_isDuplicateSeed(enabled ? numSeeds : 0ul, false) {
21 if (m_disabled)
22 return;
23 m_seedOffset.reserve(2ul);
24 }
25
26 void DuplicateSeedDetector::addSeeds(std::size_t typeIndex,
27 const ActsTrk::SeedContainer &seeds,
28 const MeasurementIndex& measurementIndex) {
29 addSeeds(typeIndex, seeds, measurementIndex,
30 [](const ActsTrk::SpacePointRange&) -> std::array<std::size_t, 3> { return {0, 1, 2}; });
31 }
32
33 void DuplicateSeedDetector::addSeeds(std::size_t typeIndex,
34 const ActsTrk::SeedContainer &seeds,
35 const MeasurementIndex& measurementIndex,
36 SpacePointIndicesFun_t spacePointIndicesFun) {
37 if (m_disabled)
38 return;
39 if (!(typeIndex < m_seedOffset.size()))
40 m_seedOffset.resize(typeIndex + 1);
41 m_seedOffset[typeIndex] = m_numSeeds;
42 m_seedIndex.resize(measurementIndex.size()); // will resize for each seed container, but always with the same space
43
44 for (const ActsTrk::Seed seed : seeds) {
45 std::size_t nSP = 0;
46 const auto& sps = seed.sp();
47 for (std::size_t isp : spacePointIndicesFun(sps)) {
48 const xAOD::SpacePoint *sp = sps.at(isp);
49 const std::vector<const xAOD::UncalibratedMeasurement *> &els = sp->measurements();
50 for (const xAOD::UncalibratedMeasurement *meas : els) {
51 std::size_t hitIndex = measurementIndex.index(*meas);
52 if (!(hitIndex < m_seedIndex.size())) {
53 // std::cout << "ERROR hit index " << hitIndex << " past end of " << m_seedIndex.size() << " hit indices\n";
54 continue;
55 }
56 m_seedIndex[hitIndex].push_back(m_numSeeds);
58 }
59 ++nSP;
60 if (nSP >= 3) break;
61 }
62 ++m_numSeeds;
63 }
64 }
65
66} // namespace ActsTrk::detail
static Double_t sp
DuplicateSeedDetector(std::size_t numSeeds, index_t measOffset, bool enabled)
std::vector< boost::container::small_vector< index_t, 2 > > m_seedIndex
void addSeeds(std::size_t typeIndex, const ActsTrk::SeedContainer &seeds, const MeasurementIndex &measurementIndex)
std::function< std::array< std::size_t, 3 >(const ActsTrk::SpacePointRange &)> SpacePointIndicesFun_t
std::size_t index(const xAOD::UncalibratedMeasurement &hit) const
Hash functions to pack the source link into unordered_maps / unordered_sets.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.