File indexing completed on 2025-07-15 08:11:44
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Units.hpp"
0012 #include "Acts/EventData/TrackContainer.hpp"
0013 #include "Acts/EventData/TrackContainerFrontendConcept.hpp"
0014 #include "Acts/EventData/TrackProxyConcept.hpp"
0015 #include "Acts/EventData/TrackStateProxy.hpp"
0016 #include "Acts/Utilities/Delegate.hpp"
0017 #include "Acts/Utilities/Logger.hpp"
0018
0019 #include <cstddef>
0020 #include <map>
0021 #include <memory>
0022 #include <numbers>
0023 #include <string>
0024 #include <tuple>
0025 #include <vector>
0026
0027 #include <boost/container/flat_map.hpp>
0028 #include <boost/container/flat_set.hpp>
0029
0030 namespace Acts {
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 class ScoreBasedAmbiguityResolution {
0043 public:
0044
0045
0046
0047
0048 struct DetectorConfig {
0049 int hitsScoreWeight = 0;
0050 int holesScoreWeight = 0;
0051 int outliersScoreWeight = 0;
0052 int otherScoreWeight = 0;
0053
0054
0055 std::vector<double> etaBins = {-5, 5};
0056
0057
0058 std::vector<std::size_t> minHitsPerEta = {0};
0059
0060
0061 std::vector<std::size_t> maxHolesPerEta = {0};
0062
0063
0064 std::vector<std::size_t> maxOutliersPerEta = {0};
0065
0066
0067 std::vector<std::size_t> maxSharedHitsPerEta = {0};
0068
0069 std::size_t maxHits = 0;
0070 std::size_t maxHoles = 0;
0071
0072
0073 bool sharedHitsFlag = false;
0074
0075 std::size_t detectorId = 0;
0076
0077
0078
0079
0080 std::vector<double> factorHits = {1.0};
0081
0082
0083
0084
0085 std::vector<double> factorHoles = {1.0};
0086 };
0087
0088
0089
0090
0091 struct TrackFeatures {
0092 std::size_t nHits = 0;
0093 std::size_t nHoles = 0;
0094 std::size_t nOutliers = 0;
0095 std::size_t nSharedHits = 0;
0096 };
0097
0098 enum class TrackStateTypes : std::uint8_t {
0099
0100 UnsharedHit,
0101
0102 SharedHit,
0103
0104 RejectedHit,
0105
0106 Outlier,
0107
0108 OtherTrackStateType
0109 };
0110
0111
0112 struct Config {
0113 std::map<std::size_t, std::size_t> volumeMap = {{0, 0}};
0114 std::vector<DetectorConfig> detectorConfigs;
0115
0116 double minScore = 0;
0117
0118 double minScoreSharedTracks = 0;
0119
0120 std::size_t maxSharedTracksPerMeasurement = 10;
0121
0122 std::size_t maxShared = 5;
0123
0124 std::size_t minUnshared = 5;
0125
0126
0127 bool useAmbiguityScoring = false;
0128 };
0129
0130
0131
0132
0133
0134
0135 template <TrackProxyConcept track_proxy_t>
0136 struct Optionals {
0137 using OptionalCuts = std::function<bool(const track_proxy_t&)>;
0138
0139 using OptionalScoreModifier =
0140 std::function<void(const track_proxy_t&, double&)>;
0141
0142 using OptionalHitSelection = std::function<void(
0143 const track_proxy_t&,
0144 const typename track_proxy_t::ConstTrackStateProxy&, TrackStateTypes&)>;
0145
0146 std::vector<OptionalCuts> cuts = {};
0147 std::vector<OptionalScoreModifier> weights = {};
0148
0149
0150 std::vector<OptionalScoreModifier> scores = {};
0151 std::vector<OptionalHitSelection> hitSelections = {};
0152 };
0153
0154 explicit ScoreBasedAmbiguityResolution(
0155 const Config& cfg,
0156 std::unique_ptr<const Logger> logger =
0157 getDefaultLogger("ScoreBasedAmbiguityResolution", Logging::INFO))
0158 : m_cfg{cfg}, m_logger{std::move(logger)} {}
0159
0160
0161
0162
0163
0164 template <TrackContainerFrontend track_container_t>
0165 std::vector<std::vector<TrackFeatures>> computeInitialState(
0166 const track_container_t& tracks) const;
0167
0168
0169
0170
0171
0172
0173
0174 template <TrackContainerFrontend track_container_t>
0175 std::vector<double> simpleScore(
0176 const track_container_t& tracks,
0177 const std::vector<std::vector<TrackFeatures>>& trackFeaturesVectors,
0178 const Optionals<typename track_container_t::ConstTrackProxy>& optionals =
0179 {}) const;
0180
0181
0182
0183
0184
0185
0186
0187 template <TrackContainerFrontend track_container_t>
0188 std::vector<double> ambiguityScore(
0189 const track_container_t& tracks,
0190 const std::vector<std::vector<TrackFeatures>>& trackFeaturesVectors,
0191 const Optionals<typename track_container_t::ConstTrackProxy>& optionals =
0192 {}) const;
0193
0194
0195
0196
0197
0198
0199
0200 bool etaBasedCuts(const DetectorConfig& detector,
0201 const TrackFeatures& trackFeatures,
0202 const double& eta) const;
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 template <TrackProxyConcept track_proxy_t>
0215 bool getCleanedOutTracks(
0216 const track_proxy_t& track, const double& trackScore,
0217 const std::vector<std::size_t>& measurementsPerTrack,
0218 const std::map<std::size_t, std::size_t>& nTracksPerMeasurement,
0219 const std::vector<std::function<
0220 void(const track_proxy_t&,
0221 const typename track_proxy_t::ConstTrackStateProxy&,
0222 TrackStateTypes&)>>& optionalHitSelections = {}) const;
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232 template <TrackContainerFrontend track_container_t,
0233 typename source_link_hash_t, typename source_link_equality_t>
0234 std::vector<int> solveAmbiguity(
0235 const track_container_t& tracks, source_link_hash_t sourceLinkHash,
0236 source_link_equality_t sourceLinkEquality,
0237 const Optionals<typename track_container_t::ConstTrackProxy>& optionals =
0238 {}) const;
0239
0240 private:
0241 Config m_cfg;
0242
0243
0244 std::unique_ptr<const Logger> m_logger = nullptr;
0245
0246
0247 const Logger& logger() const;
0248 };
0249
0250 }
0251
0252 #include "Acts/AmbiguityResolution/ScoreBasedAmbiguityResolution.ipp"