Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:10:23

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2020 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
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 // absolute parameter tolerances for position, direction, and absolute momentum
0043 constexpr auto epsPos = 10_um;
0044 constexpr auto epsDir = 1_mrad;
0045 constexpr auto epsMom = 5_MeV;
0046 // relative covariance tolerance
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   // avoid rebuilding the tracking geometry for every propagator
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 }  // namespace
0105 
0106 BOOST_AUTO_TEST_SUITE(PropagationDenseConstant)
0107 
0108 // check that the propagation is reversible and self-consistent
0109 
0110 // TODO does not seem to work as-is
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 // check that reachable surfaces are correctly reached
0121 
0122 // True forward/backward tracks do not work with z cylinders
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 // True forward/backward tracks do not work with z straws
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 // check covariance transport using the ridders propagator for comparison
0169 // Covariance transport does not work for theta close to poles
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 // limit theta to ignore the covariance mismatches at high theta for now
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 // Covariance transport does not work for theta close to poles
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 // limit theta to ignore the covariance mismatches at high theta for now
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()