File indexing completed on 2026-03-30 07:46:53
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/TrackParametrization.hpp"
0013 #include "Acts/Definitions/Units.hpp"
0014 #include "Acts/Geometry/GeometryContext.hpp"
0015 #include "Acts/MagneticField/ConstantBField.hpp"
0016 #include "Acts/MagneticField/MagneticFieldContext.hpp"
0017 #include "Acts/Propagator/AtlasStepper.hpp"
0018 #include "Acts/Propagator/EigenStepper.hpp"
0019 #include "Acts/Surfaces/CurvilinearSurface.hpp"
0020 #include "Acts/Surfaces/CylinderSurface.hpp"
0021 #include "Acts/Surfaces/DiscSurface.hpp"
0022 #include "Acts/Surfaces/PerigeeSurface.hpp"
0023 #include "Acts/Surfaces/PlaneSurface.hpp"
0024 #include "Acts/Surfaces/StrawSurface.hpp"
0025 #include "Acts/Surfaces/Surface.hpp"
0026 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0027
0028 #include <array>
0029 #include <cstddef>
0030 #include <memory>
0031 #include <optional>
0032 #include <utility>
0033
0034 using namespace Acts;
0035 using namespace Acts::UnitLiterals;
0036
0037 namespace ActsTests {
0038
0039 using BFieldType = ConstantBField;
0040 using EigenStepperType = EigenStepper<>;
0041 using AtlasStepperType = AtlasStepper;
0042 using Covariance = BoundMatrix;
0043
0044
0045 GeometryContext tgContext = GeometryContext::dangerouslyDefaultConstruct();
0046 MagneticFieldContext mfContext = MagneticFieldContext();
0047
0048 static auto bField = std::make_shared<BFieldType>(Vector3{0, 0, 1_T});
0049
0050
0051
0052
0053
0054
0055
0056
0057 Transform3 createCylindricTransform(const Vector3& nposition, double angleX,
0058 double angleY) {
0059 Transform3 ctransform;
0060 ctransform.setIdentity();
0061 ctransform.pretranslate(nposition);
0062 ctransform.prerotate(AngleAxis3(angleX, Vector3::UnitX()));
0063 ctransform.prerotate(AngleAxis3(angleY, Vector3::UnitY()));
0064 return ctransform;
0065 }
0066
0067
0068
0069
0070
0071
0072
0073
0074 Transform3 createPlanarTransform(const Vector3& nposition,
0075 const Vector3& nnormal, double angleT,
0076 double angleU) {
0077
0078 Vector3 T = nnormal.normalized();
0079 Vector3 U = std::abs(T.dot(Vector3::UnitZ())) < 0.99
0080 ? Vector3::UnitZ().cross(T).normalized()
0081 : Vector3::UnitX().cross(T).normalized();
0082 Vector3 V = T.cross(U);
0083
0084 RotationMatrix3 curvilinearRotation;
0085 curvilinearRotation.col(0) = U;
0086 curvilinearRotation.col(1) = V;
0087 curvilinearRotation.col(2) = T;
0088
0089 Transform3 ctransform{curvilinearRotation};
0090 ctransform.pretranslate(nposition);
0091 ctransform.prerotate(AngleAxis3(angleT, T));
0092 ctransform.prerotate(AngleAxis3(angleU, U));
0093
0094 return ctransform;
0095 }
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 BoundToFreeMatrix convertToMatrix(const std::array<double, 60> P) {
0115
0116 BoundToFreeMatrix jMatrix = BoundToFreeMatrix::Zero();
0117 for (std::size_t j = 0; j < eBoundSize; ++j) {
0118 for (std::size_t i = 0; i < eFreeSize; ++i) {
0119 std::size_t ijc = eFreeSize + j * eFreeSize + i;
0120 jMatrix(i, j) = P[ijc];
0121 }
0122 }
0123 return jMatrix;
0124 }
0125
0126
0127
0128
0129
0130
0131 template <typename Parameters>
0132 void testJacobianToGlobal(const Parameters& pars) {
0133
0134
0135 AtlasStepperType astep(bField);
0136 AtlasStepperType::State astepState =
0137 astep.makeState(AtlasStepperType::Options(tgContext, mfContext));
0138 astep.initialize(astepState, pars);
0139
0140 EigenStepperType estep(bField);
0141 EigenStepperType::State estepState =
0142 estep.makeState(EigenStepperType::Options(tgContext, mfContext));
0143 estep.initialize(estepState, pars);
0144
0145
0146 auto asMatrix = convertToMatrix(astepState.pVector);
0147
0148
0149 CHECK_CLOSE_OR_SMALL(asMatrix, estepState.jacToGlobal, 1e-6, 1e-9);
0150 }
0151
0152 BOOST_AUTO_TEST_SUITE(PropagatorSuite)
0153
0154
0155 BOOST_AUTO_TEST_CASE(JacobianCurvilinearToGlobalTest) {
0156
0157 Covariance cov;
0158 cov << 10_mm, 0, 0, 0, 0, 0, 0, 10_mm, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0,
0159 0, 0.1, 0, 0, 0, 0, 0, 0, 1. / (10_GeV), 0, 0, 0, 0, 0, 0, 0;
0160 BoundTrackParameters curvilinear = BoundTrackParameters::createCurvilinear(
0161 Vector4(341., 412., 93., 0.), Vector3(1.2, 8.3, 0.45), 1 / 10.0, cov,
0162 ParticleHypothesis::pion());
0163
0164
0165 testJacobianToGlobal(curvilinear);
0166 }
0167
0168
0169 BOOST_AUTO_TEST_CASE(JacobianCylinderToGlobalTest) {
0170
0171 auto cTransform = createCylindricTransform({10., -5., 0.}, 0.004, 0.03);
0172 auto cSurface = Surface::makeShared<CylinderSurface>(cTransform, 200., 1000.);
0173
0174 Covariance cov;
0175 cov << 10_mm, 0, 0, 0, 0, 0, 0, 10_mm, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0,
0176 0, 0.1, 0, 0, 0, 0, 0, 0, 1. / (10_GeV), 0, 0, 0, 0, 0, 0, 0;
0177
0178 BoundVector pars;
0179 pars << 182.34, -82., 0.134, 0.85, 1. / (100_GeV), 0;
0180
0181 BoundTrackParameters atCylinder(cSurface, pars, std::move(cov),
0182 ParticleHypothesis::pion());
0183
0184
0185 testJacobianToGlobal(atCylinder);
0186 }
0187
0188
0189 BOOST_AUTO_TEST_CASE(JacobianDiscToGlobalTest) {
0190
0191 auto dTransform = createPlanarTransform(
0192 {10., -5., 0.}, Vector3(0.23, 0.07, 1.).normalized(), 0.004, 0.03);
0193 auto dSurface = Surface::makeShared<DiscSurface>(dTransform, 200., 1000.);
0194
0195 Covariance cov;
0196 cov << 10_mm, 0, 0, 0, 0, 0, 0, 10_mm, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0,
0197 0, 0.1, 0, 0, 0, 0, 0, 0, 1. / (10_GeV), 0, 0, 0, 0, 0, 0, 0;
0198
0199 BoundVector pars;
0200 pars << 192.34, 1.823, 0.734, 0.235, 1. / (100_GeV), 0;
0201
0202 BoundTrackParameters atDisc(dSurface, pars, std::move(cov),
0203 ParticleHypothesis::pion());
0204
0205
0206 testJacobianToGlobal(atDisc);
0207 }
0208
0209
0210 BOOST_AUTO_TEST_CASE(JacobianPlaneToGlobalTest) {
0211
0212 Vector3 sPosition(3421., 112., 893.);
0213 Vector3 sNormal = Vector3(1.2, -0.3, 0.05).normalized();
0214
0215
0216 std::shared_ptr<PlaneSurface> pSurface =
0217 CurvilinearSurface(sPosition, sNormal).planeSurface();
0218
0219 Covariance cov;
0220 cov << 10_mm, 0, 0, 0, 0, 0, 0, 10_mm, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0,
0221 0, 0.1, 0, 0, 0, 0, 0, 0, 1. / (10_GeV), 0, 0, 0, 0, 0, 0, 0;
0222
0223 BoundVector pars;
0224 pars << 12.34, -8722., 2.134, 0.85, 1. / (100_GeV), 0;
0225
0226 BoundTrackParameters atPlane(pSurface, pars, std::move(cov),
0227 ParticleHypothesis::pion());
0228
0229
0230 testJacobianToGlobal(atPlane);
0231 }
0232
0233
0234 BOOST_AUTO_TEST_CASE(JacobianPerigeeToGlobalTest) {
0235
0236 auto pSurface = Surface::makeShared<PerigeeSurface>(Vector3({0., 0., 0.}));
0237
0238 Covariance cov;
0239 cov << 10_mm, 0, 0, 0, 0, 0, 0, 10_mm, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0,
0240 0, 0.1, 0, 0, 0, 0, 0, 0, 1. / (10_GeV), 0, 0, 0, 0, 0, 0, 0;
0241 BoundVector pars;
0242 pars << -3.34, -822., -0.734, 0.85, 1. / (100_GeV), 0;
0243
0244 BoundTrackParameters perigee(pSurface, pars, std::move(cov),
0245 ParticleHypothesis::pion());
0246
0247
0248 testJacobianToGlobal(perigee);
0249 }
0250
0251
0252 BOOST_AUTO_TEST_CASE(JacobianStrawToGlobalTest) {
0253
0254 auto sTransform = createCylindricTransform({1019., -52., 382.}, 0.4, -0.3);
0255 auto sSurface = Surface::makeShared<StrawSurface>(sTransform, 10., 1000.);
0256
0257 Covariance cov;
0258 cov << 10_mm, 0, 0, 0, 0, 0, 0, 10_mm, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0,
0259 0, 0.1, 0, 0, 0, 0, 0, 0, 1. / (10_GeV), 0, 0, 0, 0, 0, 0, 0;
0260
0261 BoundVector pars;
0262 pars << -8.34, 812., 0.734, 0.25, 1. / (100_GeV), 0;
0263
0264 BoundTrackParameters atStraw(sSurface, pars, std::move(cov),
0265 ParticleHypothesis::pion());
0266
0267
0268 testJacobianToGlobal(atStraw);
0269 }
0270
0271 BOOST_AUTO_TEST_SUITE_END()
0272
0273 }