File indexing completed on 2026-08-16 08:17:20
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/EventData/AnyTrackStateProxy.hpp"
0010 #include "Acts/Utilities/Diagnostics.hpp"
0011 #include "Acts/Utilities/TrackHelpers.hpp"
0012
0013
0014
0015
0016
0017
0018
0019 namespace Acts {
0020
0021 std::pair<BoundVector, BoundMatrix> calculateUnbiasedParametersCovariance(
0022 const AnyConstTrackStateProxy& trackState) {
0023
0024
0025
0026
0027
0028
0029
0030
0031 if (!trackState.hasSmoothed()) {
0032 throw std::invalid_argument("track state has no smoothed parameters");
0033 }
0034 if (!trackState.hasCalibrated()) {
0035 throw std::invalid_argument("track state has no calibrated parameters");
0036 }
0037
0038 return visit_measurement(
0039 trackState.calibratedSize(),
0040 [&]<std::size_t measdim>(std::integral_constant<std::size_t, measdim>) {
0041 FixedBoundSubspaceHelper<measdim> subspaceHelper =
0042 trackState.template projectorSubspaceHelper<measdim>();
0043
0044
0045 auto H = subspaceHelper.projector();
0046 auto s = trackState.smoothed();
0047 auto C = trackState.smoothedCovariance();
0048 auto m = trackState.template calibrated<measdim>();
0049 auto V = trackState.template calibratedCovariance<measdim>();
0050 auto K =
0051 (C * H.transpose() * (H * C * H.transpose() - V).inverse()).eval();
0052 BoundVector unbiasedParamsVec = s + K * (m - H * s);
0053 BoundMatrix unbiasedParamsCov = C - K * H * C;
0054 return std::make_pair(unbiasedParamsVec, unbiasedParamsCov);
0055 });
0056 }
0057
0058 }