File indexing completed on 2025-07-05 08:26:13
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp"
0012 #include "Acts/EventData/TrackStateType.hpp"
0013
0014 #include <unordered_map>
0015
0016 namespace Acts {
0017
0018 template <typename track_container_t, typename traj_t,
0019 template <typename> class holder_t, typename source_link_hash_t,
0020 typename source_link_equality_t>
0021 void GreedyAmbiguityResolution::computeInitialState(
0022 const TrackContainer<track_container_t, traj_t, holder_t>& tracks,
0023 State& state, source_link_hash_t&& sourceLinkHash,
0024 source_link_equality_t&& sourceLinkEquality) const {
0025 auto measurementIndexMap =
0026 std::unordered_map<SourceLink, std::size_t, source_link_hash_t,
0027 source_link_equality_t>(0, sourceLinkHash,
0028 sourceLinkEquality);
0029
0030
0031
0032
0033 for (const auto& track : tracks) {
0034
0035 if (track.nMeasurements() < m_cfg.nMeasurementsMin) {
0036 continue;
0037 }
0038 std::vector<std::size_t> measurements;
0039 for (auto ts : track.trackStatesReversed()) {
0040 bool isMeasurement = ts.typeFlags().test(TrackStateFlag::MeasurementFlag);
0041 bool isOutlier = ts.typeFlags().test(TrackStateFlag::OutlierFlag);
0042 if (isMeasurement && !isOutlier) {
0043 SourceLink sourceLink = ts.getUncalibratedSourceLink();
0044
0045 auto emplace = measurementIndexMap.try_emplace(
0046 sourceLink, measurementIndexMap.size());
0047 measurements.push_back(emplace.first->second);
0048 }
0049 }
0050
0051 state.trackTips.push_back(track.index());
0052 state.trackChi2.push_back(track.chi2() / track.nDoF());
0053 state.measurementsPerTrack.push_back(std::move(measurements));
0054 state.selectedTracks.insert(state.numberOfTracks);
0055
0056 ++state.numberOfTracks;
0057 }
0058
0059
0060 for (std::size_t iTrack = 0; iTrack < state.numberOfTracks; ++iTrack) {
0061 for (auto iMeasurement : state.measurementsPerTrack[iTrack]) {
0062 state.tracksPerMeasurement[iMeasurement].insert(iTrack);
0063 }
0064 }
0065
0066
0067 state.sharedMeasurementsPerTrack =
0068 std::vector<std::size_t>(state.trackTips.size(), 0);
0069 for (std::size_t iTrack = 0; iTrack < state.numberOfTracks; ++iTrack) {
0070 for (auto iMeasurement : state.measurementsPerTrack[iTrack]) {
0071 if (state.tracksPerMeasurement[iMeasurement].size() > 1) {
0072 ++state.sharedMeasurementsPerTrack[iTrack];
0073 }
0074 }
0075 }
0076 }
0077
0078 }