File indexing completed on 2025-08-06 08:12:59
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Utilities/detail/Line3DWithPartialDerivatives.hpp"
0012
0013 #include "Acts/Definitions/Common.hpp"
0014 #include "Acts/Utilities/UnitVectors.hpp"
0015
0016 namespace Acts::detail {
0017
0018 template <std::floating_point T>
0019 void Line3DWithPartialDerivatives<T>::updateParameters(
0020 const ParamVector& newPars) {
0021 constexpr auto x0 = static_cast<std::uint8_t>(ParIndex::x0);
0022 constexpr auto y0 = static_cast<std::uint8_t>(ParIndex::y0);
0023 constexpr auto theta = static_cast<std::uint8_t>(ParIndex::theta);
0024 constexpr auto phi = static_cast<std::uint8_t>(ParIndex::phi);
0025
0026 m_pos[Acts::eX] = newPars[x0];
0027 m_pos[Acts::eY] = newPars[y0];
0028
0029 const T cosTheta = std::cos(newPars[theta]);
0030 const T sinTheta = std::sin(newPars[theta]);
0031 const T cosPhi = std::cos(newPars[phi]);
0032 const T sinPhi = std::sin(newPars[phi]);
0033
0034 m_dir = Vector{cosPhi * sinTheta, sinPhi * sinTheta, cosTheta};
0035
0036 m_gradient[y0] = Vector::UnitY();
0037 m_gradient[x0] = Vector::UnitX();
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 m_gradient[theta] = Vector{cosPhi * cosTheta, sinPhi * cosTheta, -sinTheta};
0050 m_gradient[phi] = Vector{-sinTheta * sinPhi, sinTheta * cosPhi, 0};
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 constexpr auto idxThetaSq = vecIdxFromSymMat<s_nPars>(theta, theta);
0064 constexpr auto idxPhiSq = vecIdxFromSymMat<s_nPars>(phi, phi);
0065 constexpr auto idxPhiTheta = vecIdxFromSymMat<s_nPars>(theta, phi);
0066 m_hessian[idxThetaSq] = -m_dir;
0067 m_hessian[idxPhiSq] = -sinTheta * Vector{cosPhi, sinPhi, 0.};
0068 m_hessian[idxPhiTheta] = cosTheta * Vector{-sinPhi, cosPhi, 0.};
0069 }
0070
0071 template <std::floating_point T>
0072 const Line3DWithPartialDerivatives<T>::Vector&
0073 Line3DWithPartialDerivatives<T>::position() const {
0074 return m_pos;
0075 }
0076 template <std::floating_point T>
0077 const Line3DWithPartialDerivatives<T>::Vector&
0078 Line3DWithPartialDerivatives<T>::direction() const {
0079 return m_dir;
0080 }
0081 template <std::floating_point T>
0082 const Line3DWithPartialDerivatives<T>::Vector&
0083 Line3DWithPartialDerivatives<T>::gradient(const ParIndex par) const {
0084 const auto param = static_cast<std::uint8_t>(par);
0085 assert(param < m_gradient.size());
0086 return m_gradient[param];
0087 }
0088 template <std::floating_point T>
0089 const Line3DWithPartialDerivatives<T>::Vector&
0090 Line3DWithPartialDerivatives<T>::hessian(const ParIndex param1,
0091 const ParIndex param2) const {
0092 const auto idx{vecIdxFromSymMat<s_nPars>(static_cast<std::size_t>(param1),
0093 static_cast<std::size_t>(param2))};
0094 assert(idx < m_hessian.size());
0095 return m_hessian[idx];
0096 }
0097
0098 template <std::floating_point T>
0099 Line3DWithPartialDerivatives<T>::Vector Line3DWithPartialDerivatives<T>::point(
0100 const double lambda) const {
0101 return position() + lambda * direction();
0102 }
0103 }