File indexing completed on 2025-06-06 08:07:51
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/TrackParametrization.hpp"
0012 #include "Acts/EventData/MultiTrajectory.hpp"
0013 #include "Acts/Geometry/GeometryContext.hpp"
0014 #include "Acts/Utilities/Logger.hpp"
0015 #include "Acts/Utilities/Result.hpp"
0016
0017 #include <cstddef>
0018 #include <optional>
0019
0020 namespace Acts {
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 class MbfSmoother {
0038 public:
0039
0040
0041
0042
0043
0044
0045 template <typename traj_t>
0046 Result<void> operator()(const GeometryContext& gctx, traj_t& trajectory,
0047 std::size_t entryIndex,
0048 const Logger& logger = getDummyLogger()) const {
0049 (void)gctx;
0050 (void)logger;
0051
0052 using TrackStateProxy = typename traj_t::TrackStateProxy;
0053
0054 TrackStateProxy start_ts = trajectory.getTrackState(entryIndex);
0055
0056
0057
0058 BoundMatrix big_lambda_hat = BoundMatrix::Zero();
0059 BoundVector small_lambda_hat = BoundVector::Zero();
0060
0061 trajectory.applyBackwards(start_ts.index(), [&](TrackStateProxy ts) {
0062
0063 ts.addComponents(TrackStatePropMask::Smoothed);
0064
0065 InternalTrackState internalTrackState(ts);
0066
0067
0068 calculateSmoothed(internalTrackState, big_lambda_hat, small_lambda_hat);
0069
0070
0071 if (!ts.hasPrevious()) {
0072 return;
0073 }
0074
0075
0076 if (ts.typeFlags().test(TrackStateFlag::MeasurementFlag)) {
0077 visitMeasurement(internalTrackState, big_lambda_hat, small_lambda_hat);
0078 } else {
0079 visitNonMeasurement(internalTrackState, big_lambda_hat,
0080 small_lambda_hat);
0081 }
0082 });
0083
0084 return Result<void>::success();
0085 }
0086
0087 private:
0088
0089
0090 struct InternalTrackState final {
0091 using Projector =
0092 typename TrackStateTraits<MultiTrajectoryTraits::MeasurementSizeMax,
0093 false>::Projector;
0094 using Jacobian =
0095 typename TrackStateTraits<MultiTrajectoryTraits::MeasurementSizeMax,
0096 false>::Covariance;
0097 using Parameters =
0098 typename TrackStateTraits<MultiTrajectoryTraits::MeasurementSizeMax,
0099 false>::Parameters;
0100 using Covariance =
0101 typename TrackStateTraits<MultiTrajectoryTraits::MeasurementSizeMax,
0102 false>::Covariance;
0103
0104 struct Measurement final {
0105 unsigned int calibratedSize{0};
0106
0107 const double* calibrated{nullptr};
0108 const double* calibratedCovariance{nullptr};
0109 Projector projector;
0110
0111 template <typename TrackStateProxy>
0112 explicit Measurement(TrackStateProxy ts)
0113 : calibratedSize(ts.calibratedSize()),
0114 calibrated(ts.effectiveCalibrated().data()),
0115 calibratedCovariance(ts.effectiveCalibratedCovariance().data()),
0116 projector(ts.projector()) {}
0117 };
0118
0119 Jacobian jacobian;
0120
0121 Parameters predicted;
0122 Covariance predictedCovariance;
0123 Parameters filtered;
0124 Covariance filteredCovariance;
0125 Parameters smoothed;
0126 Covariance smoothedCovariance;
0127
0128 std::optional<Measurement> measurement;
0129
0130 template <typename TrackStateProxy>
0131 explicit InternalTrackState(TrackStateProxy ts)
0132 : jacobian(ts.jacobian()),
0133 predicted(ts.predicted()),
0134 predictedCovariance(ts.predictedCovariance()),
0135 filtered(ts.filtered()),
0136 filteredCovariance(ts.filteredCovariance()),
0137 smoothed(ts.smoothed()),
0138 smoothedCovariance(ts.smoothedCovariance()),
0139 measurement(ts.typeFlags().test(TrackStateFlag::MeasurementFlag)
0140 ? std::optional<Measurement>(ts)
0141 : std::nullopt) {}
0142 };
0143
0144
0145 void calculateSmoothed(InternalTrackState& ts,
0146 const BoundMatrix& big_lambda_hat,
0147 const BoundVector& small_lambda_hat) const;
0148
0149
0150 void visitNonMeasurement(const InternalTrackState& ts,
0151 BoundMatrix& big_lambda_hat,
0152 BoundVector& small_lambda_hat) const;
0153
0154
0155 void visitMeasurement(const InternalTrackState& ts,
0156 BoundMatrix& big_lambda_hat,
0157 BoundVector& small_lambda_hat) const;
0158 };
0159
0160 }