From 2c8b209a787fc4534462960ddc8723a0629140ed Mon Sep 17 00:00:00 2001 From: Maximilian Reininghaus <maximilian.reininghaus@kit.edu> Date: Thu, 6 Jun 2019 14:58:22 -0300 Subject: [PATCH] added radiative losses with constant b --- Documentation/Examples/stopping_power.cc | 2 +- Processes/EnergyLoss/EnergyLoss.cc | 22 ++++++++++++++++++---- Processes/EnergyLoss/EnergyLoss.h | 8 ++++++-- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Documentation/Examples/stopping_power.cc b/Documentation/Examples/stopping_power.cc index 0ca9f8be4..edbd2bc32 100644 --- a/Documentation/Examples/stopping_power.cc +++ b/Documentation/Examples/stopping_power.cc @@ -76,7 +76,7 @@ int main() { beamCode, E0, plab, pos, 0_ns}); auto const p = stack.GetNextParticle(); - HEPEnergyType dE = eLoss.BetheBloch(p, 1_g / square(1_cm)); + HEPEnergyType dE = eLoss.TotalEnergyLoss(p, 1_g / square(1_cm)); file << P0 / mass << "\t" << -dE / 1_eV << std::endl; } } diff --git a/Processes/EnergyLoss/EnergyLoss.cc b/Processes/EnergyLoss/EnergyLoss.cc index b49030a57..febabc776 100644 --- a/Processes/EnergyLoss/EnergyLoss.cc +++ b/Processes/EnergyLoss/EnergyLoss.cc @@ -146,6 +146,20 @@ namespace corsika::process::energy_loss { (0.5 * log(aux) - beta2 - Cadj / Z - delta / 2 + barkas + bloch) * dX; } + // radiation losses according to PDG 2018, ch. 33 ref. [5] + HEPEnergyType EnergyLoss::RadiationLosses(SetupParticle const& vP, + GrammageType const vDX) { + // simple-minded hard-coded value for b(E) inspired by data from + // http://pdg.lbl.gov/2018/AtomicNuclearProperties/ for N and O. + auto constexpr b = 3.0 * 1e-6 * square(1_cm) / 1_g; + return -vP.GetEnergy() * b * vDX; + } + + HEPEnergyType EnergyLoss::TotalEnergyLoss(SetupParticle const& vP, + GrammageType const vDX) { + return BetheBloch(vP, vDX) + RadiationLosses(vP, vDX); + } + process::EProcessReturn EnergyLoss::DoContinuous(SetupParticle& p, SetupTrack const& t) { if (p.GetChargeNumber() == 0) return process::EProcessReturn::eOk; @@ -153,7 +167,7 @@ namespace corsika::process::energy_loss { p.GetNode()->GetModelProperties().IntegratedGrammage(t, t.GetLength()); cout << "EnergyLoss " << p.GetPID() << ", z=" << p.GetChargeNumber() << ", dX=" << dX / 1_g * square(1_cm) << "g/cm2" << endl; - HEPEnergyType dE = BetheBloch(p, dX); + HEPEnergyType dE = TotalEnergyLoss(p, dX); auto E = p.GetEnergy(); const auto Ekin = E - p.GetMass(); auto Enew = E + dE; @@ -173,14 +187,14 @@ namespace corsika::process::energy_loss { return status; } - units::si::LengthType EnergyLoss::MaxStepLength(SetupParticle const& vParticle, - SetupTrack const& vTrack) const { + LengthType EnergyLoss::MaxStepLength(SetupParticle const& vParticle, + SetupTrack const& vTrack) const { if (vParticle.GetChargeNumber() == 0) { return units::si::meter * std::numeric_limits<double>::infinity(); } auto constexpr dX = 1_g / square(1_cm); - auto const dE = -BetheBloch(vParticle, dX); // dE > 0 + auto const dE = -TotalEnergyLoss(vParticle, dX); // dE > 0 //~ auto const Ekin = vParticle.GetEnergy() - vParticle.GetMass(); auto const maxLoss = 0.01 * vParticle.GetEnergy(); auto const maxGrammage = maxLoss / dE * dX; diff --git a/Processes/EnergyLoss/EnergyLoss.h b/Processes/EnergyLoss/EnergyLoss.h index 36d1ee6b4..4380a8ddc 100644 --- a/Processes/EnergyLoss/EnergyLoss.h +++ b/Processes/EnergyLoss/EnergyLoss.h @@ -38,8 +38,12 @@ namespace corsika::process::energy_loss { units::si::HEPEnergyType GetTotal() const { return fEnergyLossTot; } void PrintProfile() const; - static units::si::HEPEnergyType BetheBloch(setup::Stack::ParticleType const& p, - const units::si::GrammageType dX); + static units::si::HEPEnergyType BetheBloch(setup::Stack::ParticleType const&, + const units::si::GrammageType); + static units::si::HEPEnergyType RadiationLosses(setup::Stack::ParticleType const&, + const units::si::GrammageType); + static units::si::HEPEnergyType TotalEnergyLoss(setup::Stack::ParticleType const&, + const units::si::GrammageType); private: int GetXbin(setup::Stack::ParticleType const&, setup::Trajectory const&, -- GitLab