File indexing completed on 2025-08-06 08:11:40
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/Definitions/Algebra.hpp"
0013 #include "Acts/Definitions/Common.hpp"
0014 #include "Acts/Definitions/PdgParticle.hpp"
0015 #include "Acts/Definitions/Units.hpp"
0016 #include "Acts/Tests/CommonHelpers/FloatComparisons.hpp"
0017 #include "ActsFatras/EventData/Particle.hpp"
0018 #include "ActsFatras/Physics/ElectroMagnetic/PhotonConversion.hpp"
0019
0020 #include <cmath>
0021 #include <limits>
0022 #include <memory>
0023 #include <random>
0024 #include <utility>
0025 #include <vector>
0026
0027 #include "Dataset.hpp"
0028
0029 using Generator = std::ranlux48;
0030
0031 BOOST_AUTO_TEST_SUITE(FatrasPhotonConversion)
0032
0033 BOOST_DATA_TEST_CASE(NoPhoton, Dataset::parametersPhotonConversion, phi, lambda,
0034 seed) {
0035 using Scalar = ActsFatras::PhotonConversion::Scalar;
0036 using namespace Acts::UnitLiterals;
0037
0038 Generator gen(seed);
0039
0040
0041 ActsFatras::Particle particle =
0042 Dataset::makeParticle(Acts::PdgParticle::eElectron, phi, lambda, 1_GeV);
0043 ActsFatras::Particle particleInit = particle;
0044
0045 ActsFatras::PhotonConversion pc;
0046
0047
0048 std::pair<Scalar, Scalar> limits;
0049 limits = pc.generatePathLimits(gen, particle);
0050 BOOST_CHECK_EQUAL(limits.first, std::numeric_limits<Scalar>::infinity());
0051 BOOST_CHECK_EQUAL(limits.second, std::numeric_limits<Scalar>::infinity());
0052
0053
0054 std::vector<ActsFatras::Particle> generated;
0055 BOOST_CHECK(!pc.run(gen, particle, generated));
0056 BOOST_CHECK(generated.empty());
0057
0058 BOOST_CHECK_EQUAL(particle.fourPosition(), particleInit.fourPosition());
0059 BOOST_CHECK_EQUAL(particle.fourMomentum(), particleInit.fourMomentum());
0060 BOOST_CHECK_EQUAL(particle.process(), particleInit.process());
0061 BOOST_CHECK_EQUAL(particle.properTime(), particleInit.properTime());
0062 BOOST_CHECK_EQUAL(particle.pathInX0(), particleInit.pathInX0());
0063 BOOST_CHECK_EQUAL(particle.pathInL0(), particleInit.pathInL0());
0064 }
0065
0066 BOOST_DATA_TEST_CASE(DeadPhoton, Dataset::parametersPhotonConversion, phi,
0067 lambda, seed) {
0068 using Scalar = ActsFatras::PhotonConversion::Scalar;
0069 using namespace Acts::UnitLiterals;
0070
0071 Generator gen(seed);
0072
0073
0074 ActsFatras::Particle particle =
0075 Dataset::makeParticle(Acts::PdgParticle::eGamma, phi, lambda, 0);
0076 ActsFatras::Particle particleInit = particle;
0077
0078 ActsFatras::PhotonConversion pc;
0079
0080
0081 std::pair<Scalar, Scalar> limits = pc.generatePathLimits(gen, particle);
0082 BOOST_CHECK_EQUAL(limits.first, std::numeric_limits<Scalar>::infinity());
0083 BOOST_CHECK_EQUAL(limits.second, std::numeric_limits<Scalar>::infinity());
0084
0085
0086 std::vector<ActsFatras::Particle> generated;
0087 BOOST_CHECK(!pc.run(gen, particle, generated));
0088 BOOST_CHECK(generated.empty());
0089
0090 BOOST_CHECK_EQUAL(particle.fourPosition(), particleInit.fourPosition());
0091 BOOST_CHECK_EQUAL(particle.fourMomentum(), particleInit.fourMomentum());
0092 BOOST_CHECK_EQUAL(particle.process(), particleInit.process());
0093 BOOST_CHECK_EQUAL(particle.properTime(), particleInit.properTime());
0094 BOOST_CHECK_EQUAL(particle.pathInX0(), particleInit.pathInX0());
0095 BOOST_CHECK_EQUAL(particle.pathInL0(), particleInit.pathInL0());
0096 }
0097
0098 BOOST_DATA_TEST_CASE(LowMomentumPhoton, Dataset::parametersPhotonConversion,
0099 phi, lambda, seed) {
0100 using Scalar = ActsFatras::PhotonConversion::Scalar;
0101 using namespace Acts::UnitLiterals;
0102
0103 Generator gen(seed);
0104
0105
0106 ActsFatras::Particle particle =
0107 Dataset::makeParticle(Acts::PdgParticle::eGamma, phi, lambda, 1_keV);
0108 ActsFatras::Particle particleInit = particle;
0109
0110 ActsFatras::PhotonConversion pc;
0111
0112
0113 std::pair<Scalar, Scalar> limits = pc.generatePathLimits(gen, particle);
0114 BOOST_CHECK_EQUAL(limits.first, std::numeric_limits<Scalar>::infinity());
0115 BOOST_CHECK_EQUAL(limits.second, std::numeric_limits<Scalar>::infinity());
0116
0117
0118 std::vector<ActsFatras::Particle> generated;
0119 BOOST_CHECK(!pc.run(gen, particle, generated));
0120 BOOST_CHECK(generated.empty());
0121
0122 BOOST_CHECK_EQUAL(particle.fourPosition(), particleInit.fourPosition());
0123 BOOST_CHECK_EQUAL(particle.fourMomentum(), particleInit.fourMomentum());
0124 BOOST_CHECK_EQUAL(particle.process(), particleInit.process());
0125 BOOST_CHECK_EQUAL(particle.properTime(), particleInit.properTime());
0126 BOOST_CHECK_EQUAL(particle.pathInX0(), particleInit.pathInX0());
0127 BOOST_CHECK_EQUAL(particle.pathInL0(), particleInit.pathInL0());
0128 }
0129
0130 BOOST_DATA_TEST_CASE(HighMomentumPhoton, Dataset::parametersPhotonConversion,
0131 phi, lambda, seed) {
0132 using Scalar = ActsFatras::PhotonConversion::Scalar;
0133 using namespace Acts::UnitLiterals;
0134
0135 Generator gen(seed);
0136
0137
0138 ActsFatras::Particle particle =
0139 Dataset::makeParticle(Acts::PdgParticle::eGamma, phi, lambda, 1_GeV);
0140 ActsFatras::Particle particleInit = particle;
0141
0142 ActsFatras::PhotonConversion pc;
0143
0144
0145 std::pair<Scalar, Scalar> limits = pc.generatePathLimits(gen, particle);
0146 BOOST_CHECK_NE(limits.first, std::numeric_limits<Scalar>::infinity());
0147 BOOST_CHECK_EQUAL(limits.second, std::numeric_limits<Scalar>::infinity());
0148
0149
0150 std::vector<ActsFatras::Particle> generated;
0151 BOOST_CHECK(pc.run(gen, particle, generated));
0152 BOOST_CHECK_EQUAL(generated.size(), 2);
0153
0154
0155 BOOST_CHECK((generated[0].pdg() == Acts::PdgParticle::eElectron) ||
0156 (generated[0].pdg() == Acts::PdgParticle::ePositron));
0157 BOOST_CHECK((generated[1].pdg() == Acts::PdgParticle::eElectron) ||
0158 (generated[1].pdg() == Acts::PdgParticle::ePositron));
0159 BOOST_CHECK_NE(generated[0].pdg(), generated[1].pdg());
0160 BOOST_CHECK_NE(generated[0].fourMomentum(), Acts::Vector4::Zero());
0161 BOOST_CHECK_NE(generated[1].fourMomentum(), Acts::Vector4::Zero());
0162
0163
0164 Acts::Vector4 momSum =
0165 generated[0].fourMomentum() + generated[1].fourMomentum();
0166 Acts::Vector3 momVector = momSum.template segment<3>(Acts::eMom0);
0167 double sSum = momSum[Acts::eEnergy] * momSum[Acts::eEnergy] -
0168 momVector.norm() * momVector.norm();
0169 BOOST_CHECK(std::isfinite(sSum));
0170
0171 double sParticle =
0172 particleInit.energy() * particleInit.energy() -
0173 particleInit.absoluteMomentum() * particleInit.absoluteMomentum();
0174 BOOST_CHECK(std::isfinite(sParticle));
0175 CHECK_CLOSE_OR_SMALL(sSum, sParticle, 1e-2, 1e-2);
0176 }
0177
0178 BOOST_AUTO_TEST_SUITE_END()