File indexing completed on 2025-08-05 08:10:23
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/data/test_case.hpp>
0010 #include <boost/test/unit_test.hpp>
0011
0012 #include "Acts/Geometry/CuboidVolumeBuilder.hpp"
0013 #include "Acts/Geometry/GeometryContext.hpp"
0014 #include "Acts/Geometry/TrackingGeometryBuilder.hpp"
0015 #include "Acts/MagneticField/ConstantBField.hpp"
0016 #include "Acts/MagneticField/MagneticFieldContext.hpp"
0017 #include "Acts/Material/HomogeneousVolumeMaterial.hpp"
0018 #include "Acts/Propagator/DenseEnvironmentExtension.hpp"
0019 #include "Acts/Propagator/EigenStepper.hpp"
0020 #include "Acts/Propagator/Navigator.hpp"
0021 #include "Acts/Propagator/Propagator.hpp"
0022 #include "Acts/Propagator/RiddersPropagator.hpp"
0023 #include "Acts/Tests/CommonHelpers/PredefinedMaterials.hpp"
0024 #include "Acts/Utilities/Logger.hpp"
0025
0026 #include <limits>
0027
0028 #include "PropagationDatasets.hpp"
0029 #include "PropagationTests.hpp"
0030
0031 namespace {
0032
0033 namespace ds = ActsTests::PropagationDatasets;
0034 using namespace Acts::UnitLiterals;
0035
0036 using MagneticField = Acts::ConstantBField;
0037 using Stepper = Acts::EigenStepper<
0038 Acts::StepperExtensionList<Acts::DenseEnvironmentExtension>>;
0039 using Propagator = Acts::Propagator<Stepper, Acts::Navigator>;
0040 using RiddersPropagator = Acts::RiddersPropagator<Propagator>;
0041
0042
0043 constexpr auto epsPos = 10_um;
0044 constexpr auto epsDir = 1_mrad;
0045 constexpr auto epsMom = 5_MeV;
0046
0047 constexpr auto epsCov = 0.07;
0048
0049 const Acts::GeometryContext geoCtx;
0050 const Acts::MagneticFieldContext magCtx;
0051
0052 inline std::shared_ptr<const Acts::TrackingGeometry> makeDetector() {
0053 using namespace Acts;
0054
0055
0056 static std::shared_ptr<const Acts::TrackingGeometry> detector;
0057 if (!detector) {
0058 CuboidVolumeBuilder::VolumeConfig vConf;
0059 vConf.position = {0., 0., 0.};
0060 vConf.length = {4_m, 4_m, 4_m};
0061 vConf.volumeMaterial = std::make_shared<const HomogeneousVolumeMaterial>(
0062 Acts::Test::makeBeryllium());
0063 CuboidVolumeBuilder::Config conf;
0064 conf.volumeCfg.push_back(vConf);
0065 conf.position = {0., 0., 0.};
0066 conf.length = {4_m, 4_m, 4_m};
0067 CuboidVolumeBuilder cvb(conf);
0068 TrackingGeometryBuilder::Config tgbCfg;
0069 tgbCfg.trackingVolumeBuilders.push_back(
0070 [=](const auto& context, const auto& inner, const auto&) {
0071 return cvb.trackingVolume(context, inner, nullptr);
0072 });
0073 detector = TrackingGeometryBuilder(tgbCfg).trackingGeometry(geoCtx);
0074 }
0075
0076 return detector;
0077 }
0078
0079 inline Propagator makePropagator(double bz) {
0080 using namespace Acts;
0081
0082 auto magField = std::make_shared<MagneticField>(Acts::Vector3(0.0, 0.0, bz));
0083 Stepper stepper(std::move(magField));
0084 auto logger = getDefaultLogger("Nominal", Logging::INFO);
0085 return Propagator(
0086 std::move(stepper),
0087 Acts::Navigator{{makeDetector()}, logger->cloneWithSuffix("Nav")},
0088 logger->cloneWithSuffix("Prop"));
0089 }
0090
0091 inline RiddersPropagator makeRiddersPropagator(double bz) {
0092 using namespace Acts;
0093
0094 auto magField = std::make_shared<MagneticField>(Acts::Vector3(0.0, 0.0, bz));
0095 Stepper stepper(std::move(magField));
0096 auto logger = getDefaultLogger("Ridder", Logging::INFO);
0097 auto propagator = Propagator(
0098 std::move(stepper),
0099 Acts::Navigator{{makeDetector()}, logger->cloneWithSuffix("Nav")},
0100 logger->cloneWithSuffix("Prop"));
0101 return RiddersPropagator(std::move(propagator));
0102 }
0103
0104 }
0105
0106 BOOST_AUTO_TEST_SUITE(PropagationDenseConstant)
0107
0108
0109
0110
0111 BOOST_DATA_TEST_CASE(ForwardBackward,
0112 ds::phi* ds::theta* ds::absMomentum* ds::chargeNonZero*
0113 ds::pathLength* ds::magneticField,
0114 phi, theta, p, q, s, bz) {
0115 runForwardBackwardTest<Propagator, Acts::DenseStepperPropagatorOptions>(
0116 makePropagator(bz), geoCtx, magCtx,
0117 makeParametersCurvilinear(phi, theta, p, q), s, epsPos, epsDir, epsMom);
0118 }
0119
0120
0121
0122
0123 BOOST_DATA_TEST_CASE(ToCylinderAlongZ,
0124 ds::phi* ds::thetaWithoutBeam* ds::absMomentum*
0125 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0126 phi, theta, p, q, s, bz) {
0127 runToSurfaceTest<Propagator, ZCylinderSurfaceBuilder,
0128 Acts::DenseStepperPropagatorOptions>(
0129 makePropagator(bz), geoCtx, magCtx,
0130 makeParametersCurvilinear(phi, theta, p, q), s, ZCylinderSurfaceBuilder(),
0131 epsPos, epsDir, epsMom);
0132 }
0133
0134 BOOST_DATA_TEST_CASE(ToDisc,
0135 ds::phi* ds::theta* ds::absMomentum* ds::chargeNonZero*
0136 ds::pathLength* ds::magneticField,
0137 phi, theta, p, q, s, bz) {
0138 runToSurfaceTest<Propagator, DiscSurfaceBuilder,
0139 Acts::DenseStepperPropagatorOptions>(
0140 makePropagator(bz), geoCtx, magCtx,
0141 makeParametersCurvilinear(phi, theta, p, q), s, DiscSurfaceBuilder(),
0142 epsPos, epsDir, epsMom);
0143 }
0144
0145 BOOST_DATA_TEST_CASE(ToPlane,
0146 ds::phi* ds::theta* ds::absMomentum* ds::chargeNonZero*
0147 ds::pathLength* ds::magneticField,
0148 phi, theta, p, q, s, bz) {
0149 runToSurfaceTest<Propagator, PlaneSurfaceBuilder,
0150 Acts::DenseStepperPropagatorOptions>(
0151 makePropagator(bz), geoCtx, magCtx,
0152 makeParametersCurvilinear(phi, theta, p, q), s, PlaneSurfaceBuilder(),
0153 epsPos, epsDir, epsMom);
0154 }
0155
0156
0157 BOOST_DATA_TEST_CASE(ToStrawAlongZ,
0158 ds::phi* ds::thetaWithoutBeam* ds::absMomentum*
0159 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0160 phi, theta, p, q, s, bz) {
0161 runToSurfaceTest<Propagator, ZStrawSurfaceBuilder,
0162 Acts::DenseStepperPropagatorOptions>(
0163 makePropagator(bz), geoCtx, magCtx,
0164 makeParametersCurvilinear(phi, theta, p, q), s, ZStrawSurfaceBuilder(),
0165 epsPos, epsDir, epsMom);
0166 }
0167
0168
0169
0170 BOOST_DATA_TEST_CASE(CovarianceCurvilinear,
0171 ds::phi* ds::thetaWithoutBeam* ds::absMomentum*
0172 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0173 phi, theta, p, q, s, bz) {
0174 runForwardComparisonTest<Propagator, RiddersPropagator,
0175 Acts::DenseStepperPropagatorOptions>(
0176 makePropagator(bz), makeRiddersPropagator(bz), geoCtx, magCtx,
0177 makeParametersCurvilinearWithCovariance(phi, theta, p, q), s, epsPos,
0178 epsDir, epsMom, epsCov);
0179 }
0180
0181
0182 BOOST_DATA_TEST_CASE(CovarianceToCylinderAlongZ,
0183 ds::phiWithoutAmbiguity* ds::thetaCentral* ds::absMomentum*
0184 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0185 phi, theta, p, q, s, bz) {
0186 runToSurfaceComparisonTest<Propagator, RiddersPropagator,
0187 ZCylinderSurfaceBuilder,
0188 Acts::DenseStepperPropagatorOptions>(
0189 makePropagator(bz), makeRiddersPropagator(bz), geoCtx, magCtx,
0190 makeParametersCurvilinearWithCovariance(phi, theta, p, q), s,
0191 ZCylinderSurfaceBuilder(), epsPos, epsDir, epsMom, epsCov);
0192 }
0193
0194 BOOST_DATA_TEST_CASE(CovarianceToDisc,
0195 ds::phi* ds::thetaWithoutBeam* ds::absMomentum*
0196 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0197 phi, theta, p, q, s, bz) {
0198 runToSurfaceComparisonTest<Propagator, RiddersPropagator, DiscSurfaceBuilder,
0199 Acts::DenseStepperPropagatorOptions>(
0200 makePropagator(bz), makeRiddersPropagator(bz), geoCtx, magCtx,
0201 makeParametersCurvilinearWithCovariance(phi, theta, p, q), s,
0202 DiscSurfaceBuilder(), epsPos, epsDir, epsMom, epsCov);
0203 }
0204
0205
0206 BOOST_DATA_TEST_CASE(CovarianceToPlane,
0207 ds::phi* ds::thetaWithoutBeam* ds::absMomentum*
0208 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0209 phi, theta, p, q, s, bz) {
0210 runToSurfaceComparisonTest<Propagator, RiddersPropagator, PlaneSurfaceBuilder,
0211 Acts::DenseStepperPropagatorOptions>(
0212 makePropagator(bz), makeRiddersPropagator(bz), geoCtx, magCtx,
0213 makeParametersCurvilinearWithCovariance(phi, theta, p, q), s,
0214 PlaneSurfaceBuilder(), epsPos, epsDir, epsMom, epsCov);
0215 }
0216
0217
0218 BOOST_DATA_TEST_CASE(CovarianceToStrawAlongZ,
0219 ds::phiWithoutAmbiguity* ds::thetaCentral* ds::absMomentum*
0220 ds::chargeNonZero* ds::pathLength* ds::magneticField,
0221 phi, theta, p, q, s, bz) {
0222 runToSurfaceComparisonTest<Propagator, RiddersPropagator,
0223 ZStrawSurfaceBuilder,
0224 Acts::DenseStepperPropagatorOptions>(
0225 makePropagator(bz), makeRiddersPropagator(bz), geoCtx, magCtx,
0226 makeParametersCurvilinearWithCovariance(phi, theta, p, q), s,
0227 ZStrawSurfaceBuilder(), epsPos, epsDir, epsMom, epsCov);
0228 }
0229
0230 BOOST_AUTO_TEST_SUITE_END()