File indexing completed on 2025-07-13 08:05:02
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/TrackParametrization.hpp"
0012 #include "Acts/EventData/MeasurementHelpers.hpp"
0013 #include "Acts/EventData/MultiTrajectory.hpp"
0014 #include "Acts/EventData/TrackParameters.hpp"
0015 #include "Acts/EventData/Types.hpp"
0016 #include "Acts/Geometry/GeometryHierarchyMap.hpp"
0017 #include "Acts/Geometry/GeometryIdentifier.hpp"
0018 #include "Acts/TrackFinding/CombinatorialKalmanFilterError.hpp"
0019 #include "Acts/Utilities/Logger.hpp"
0020 #include "Acts/Utilities/Result.hpp"
0021
0022 #include <cassert>
0023 #include <cstddef>
0024 #include <iterator>
0025 #include <limits>
0026 #include <utility>
0027 #include <vector>
0028
0029 namespace Acts {
0030
0031
0032
0033
0034
0035
0036 struct MeasurementSelectorCuts {
0037
0038 std::vector<double> etaBins{};
0039
0040 std::vector<double> chi2CutOff{15};
0041
0042 std::vector<std::size_t> numMeasurementsCutOff{1};
0043
0044 std::vector<double> chi2CutOffOutlier{};
0045 };
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 class MeasurementSelector {
0057 public:
0058
0059
0060
0061
0062
0063 using Config = Acts::GeometryHierarchyMap<MeasurementSelectorCuts>;
0064
0065
0066
0067
0068 MeasurementSelector();
0069
0070
0071
0072
0073 explicit MeasurementSelector(const MeasurementSelectorCuts& cuts);
0074
0075
0076
0077
0078 explicit MeasurementSelector(const Config& config);
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090 template <typename traj_t>
0091 Result<std::pair<
0092 typename std::vector<typename traj_t::TrackStateProxy>::iterator,
0093 typename std::vector<typename traj_t::TrackStateProxy>::iterator>>
0094 select(std::vector<typename traj_t::TrackStateProxy>& candidates,
0095 bool& isOutlier, const Logger& logger) const;
0096
0097 private:
0098 struct InternalCutBin {
0099 double maxTheta{};
0100 std::size_t maxNumMeasurements{};
0101 double maxChi2Measurement{};
0102 double maxChi2Outlier{};
0103 };
0104 using InternalCutBins = std::vector<InternalCutBin>;
0105 using InternalConfig = Acts::GeometryHierarchyMap<InternalCutBins>;
0106
0107 struct Cuts {
0108 std::size_t numMeasurements{};
0109 double chi2Measurement{};
0110 double chi2Outlier{};
0111 };
0112
0113 static InternalCutBins convertCutBins(const MeasurementSelectorCuts& config);
0114
0115 static Cuts getCutsByTheta(const InternalCutBins& config, double theta);
0116 Result<Cuts> getCuts(const GeometryIdentifier& geoID, double theta) const;
0117
0118 double calculateChi2(
0119 const double* fullCalibrated, const double* fullCalibratedCovariance,
0120 TrackStateTraits<MultiTrajectoryTraits::MeasurementSizeMax,
0121 false>::Parameters predicted,
0122 TrackStateTraits<MultiTrajectoryTraits::MeasurementSizeMax,
0123 false>::Covariance predictedCovariance,
0124 BoundSubspaceIndices projector, unsigned int calibratedSize) const;
0125
0126 InternalConfig m_config;
0127 };
0128
0129 }
0130
0131 #include "MeasurementSelector.ipp"