File indexing completed on 2026-09-14 08:18:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp"
0010
0011 #include <algorithm>
0012
0013 namespace Acts {
0014
0015 namespace {
0016
0017
0018
0019 static void removeTrack(GreedyAmbiguityResolution::State& state,
0020 std::size_t iTrack) {
0021 for (auto iMeasurement : state.measurementsPerTrack[iTrack]) {
0022 state.tracksPerMeasurement[iMeasurement].erase(iTrack);
0023
0024 if (state.tracksPerMeasurement[iMeasurement].size() == 1) {
0025 auto jTrack = *state.tracksPerMeasurement[iMeasurement].begin();
0026 --state.sharedMeasurementsPerTrack[jTrack];
0027 }
0028 }
0029
0030 state.selectedTracks.erase(iTrack);
0031 }
0032
0033 }
0034
0035 void GreedyAmbiguityResolution::resolve(State& state) const {
0036
0037
0038 auto sharedMeasurementsComperator = [&state](std::size_t a, std::size_t b) {
0039 return state.sharedMeasurementsPerTrack[a] <
0040 state.sharedMeasurementsPerTrack[b];
0041 };
0042
0043
0044
0045
0046 auto trackComperator = [&state](std::size_t a, std::size_t b) {
0047
0048 auto relativeSharedMeasurements = [&state](std::size_t i) {
0049 return 1.0 * state.sharedMeasurementsPerTrack[i] /
0050 state.measurementsPerTrack[i].size();
0051 };
0052
0053 if (relativeSharedMeasurements(a) != relativeSharedMeasurements(b)) {
0054 return relativeSharedMeasurements(a) < relativeSharedMeasurements(b);
0055 }
0056 if (state.measurementsPerTrack[a].size() ==
0057 state.measurementsPerTrack[b].size()) {
0058
0059
0060
0061
0062 return state.trackChi2[a] < state.trackChi2[b];
0063 }
0064
0065
0066
0067 return state.measurementsPerTrack[a].size() >
0068 state.measurementsPerTrack[b].size();
0069 };
0070
0071 for (std::size_t i = 0; i < m_cfg.maximumIterations; ++i) {
0072
0073 if (state.selectedTracks.empty()) {
0074 ACTS_VERBOSE("no tracks left - exit loop");
0075 break;
0076 }
0077
0078
0079
0080 auto maximumSharedMeasurements = *std::ranges::max_element(
0081 state.selectedTracks, sharedMeasurementsComperator);
0082 ACTS_VERBOSE(
0083 "maximum shared measurements "
0084 << state.sharedMeasurementsPerTrack[maximumSharedMeasurements]);
0085 if (state.sharedMeasurementsPerTrack[maximumSharedMeasurements] <
0086 m_cfg.maximumSharedHits) {
0087 break;
0088 }
0089
0090
0091 auto badTrack =
0092 *std::ranges::max_element(state.selectedTracks, trackComperator);
0093 ACTS_VERBOSE("remove track "
0094 << badTrack << " nMeas "
0095 << state.measurementsPerTrack[badTrack].size() << " nShared "
0096 << state.sharedMeasurementsPerTrack[badTrack] << " chi2 "
0097 << state.trackChi2[badTrack]);
0098 removeTrack(state, badTrack);
0099 }
0100 }
0101
0102 }