File indexing completed on 2025-08-05 08:10:13
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsFatras/Physics/ElectroMagnetic/BetheHeitler.hpp"
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/PdgParticle.hpp"
0013 #include "Acts/Utilities/UnitVectors.hpp"
0014 #include "ActsFatras/EventData/Barcode.hpp"
0015 #include "ActsFatras/EventData/ProcessType.hpp"
0016
0017 #include <algorithm>
0018 #include <cmath>
0019 #include <utility>
0020
0021 ActsFatras::Particle ActsFatras::BetheHeitler::bremPhoton(
0022 const Particle &particle, Scalar gammaE, Scalar rndPsi, Scalar rndTheta1,
0023 Scalar rndTheta2, Scalar rndTheta3) const {
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 Scalar psi = 2. * M_PI * rndPsi;
0034
0035
0036 Scalar theta = 0.;
0037 if (uniformHertzDipoleAngle) {
0038
0039 theta = particle.mass() / particle.energy() * rndTheta1;
0040 } else {
0041
0042 theta = particle.mass() / particle.energy();
0043
0044 constexpr Scalar a = 0.625;
0045 Scalar u = -log(rndTheta2 * rndTheta3) / a;
0046 theta *= (rndTheta1 < 0.25) ? u : u / 3.;
0047 }
0048
0049 Vector3 particleDirection = particle.direction();
0050 Vector3 photonDirection = particleDirection;
0051
0052
0053 Acts::RotationMatrix3 rotation(
0054
0055 Acts::AngleAxis3(psi, particleDirection) *
0056
0057 Acts::AngleAxis3(theta, Acts::makeCurvilinearUnitU(particleDirection)));
0058 photonDirection.applyOnTheLeft(rotation);
0059
0060 Particle photon(particle.particleId().makeDescendant(0),
0061 Acts::PdgParticle::eGamma);
0062 photon.setProcess(ActsFatras::ProcessType::eBremsstrahlung)
0063 .setPosition4(particle.fourPosition())
0064 .setDirection(photonDirection)
0065 .setAbsoluteMomentum(gammaE)
0066 .setReferenceSurface(particle.referenceSurface());
0067 return photon;
0068 }