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