File indexing completed on 2026-10-16 08:47:29
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "Acts/TrackFitting/GlobalChiSquareFitterBackend.hpp"
0013 #include "Acts/Utilities/AlgebraHelpers.hpp"
0014
0015 void Acts::Experimental::addMeasurementToGx2fSumsBackend(
0016 Gx2fSystem& extendedSystem,
0017 const std::vector<BoundMatrix>& jacobianFromStart,
0018 const Eigen::MatrixXd& covarianceMeasurement, const BoundVector& predicted,
0019 const Eigen::VectorXd& measurement, const Eigen::MatrixXd& projector,
0020 const Logger& logger) {
0021
0022
0023 const auto safeInvCovMeasurement = safeInverse(covarianceMeasurement);
0024 if (!safeInvCovMeasurement) {
0025 ACTS_WARNING("addMeasurementToGx2fSums: safeInvCovMeasurement failed.");
0026 ACTS_VERBOSE(" covarianceMeasurement:\n" << covarianceMeasurement);
0027 return;
0028 }
0029
0030
0031
0032
0033 Eigen::MatrixXd extendedJacobian =
0034 Eigen::MatrixXd::Zero(eBoundSize, extendedSystem.nDims());
0035
0036
0037 extendedJacobian.topLeftCorner<eBoundSize, eBoundSize>() =
0038 jacobianFromStart[0];
0039
0040
0041
0042
0043 for (std::size_t matSurface = 1; matSurface < jacobianFromStart.size();
0044 matSurface++) {
0045 const BoundMatrix jac = jacobianFromStart[matSurface];
0046
0047 const Matrix<eBoundSize, 2> jacPhiTheta =
0048 jac * Gx2fConstants::phiThetaProjector;
0049
0050
0051 const std::size_t deltaPosition = eBoundSize + 2 * (matSurface - 1);
0052
0053 extendedJacobian.template block<eBoundSize, 2>(0, deltaPosition) =
0054 jacPhiTheta;
0055 }
0056
0057 const Eigen::MatrixXd projJacobian = projector * extendedJacobian;
0058
0059 const Eigen::VectorXd projPredicted = projector * predicted;
0060
0061 const Eigen::VectorXd residual = measurement - projPredicted;
0062
0063
0064 extendedSystem.chi2() +=
0065 (residual.transpose() * (*safeInvCovMeasurement) * residual)(0, 0);
0066
0067 extendedSystem.aMatrix() +=
0068 (projJacobian.transpose() * (*safeInvCovMeasurement) * projJacobian)
0069 .eval();
0070
0071 extendedSystem.bVector() +=
0072 (residual.transpose() * (*safeInvCovMeasurement) * projJacobian)
0073 .eval()
0074 .transpose();
0075
0076 ACTS_VERBOSE(
0077 "Contributions in addMeasurementToGx2fSums:\n"
0078 << " predicted: " << predicted.transpose() << "\n"
0079 << " measurement: " << measurement.transpose() << "\n"
0080 << " covarianceMeasurement:\n"
0081 << covarianceMeasurement << "\n"
0082 << " projector:\n"
0083 << projector.eval() << "\n"
0084 << " projJacobian:\n"
0085 << projJacobian.eval() << "\n"
0086 << " projPredicted: " << (projPredicted.transpose()).eval() << "\n"
0087 << " residual: " << (residual.transpose()).eval() << "\n"
0088 << " extendedJacobian:\n"
0089 << extendedJacobian << "\n"
0090 << " aMatrix contribution:\n"
0091 << (projJacobian.transpose() * (*safeInvCovMeasurement) * projJacobian)
0092 .eval()
0093 << "\n"
0094 << " bVector contribution: "
0095 << (residual.transpose() * (*safeInvCovMeasurement) * projJacobian).eval()
0096 << "\n"
0097 << " chi2sum contribution: "
0098 << (residual.transpose() * (*safeInvCovMeasurement) * residual)(0, 0)
0099 << "\n"
0100 << " safeInvCovMeasurement:\n"
0101 << (*safeInvCovMeasurement));
0102 }