From 19a2abceeb7490a2a284a888736d63beee593fc7 Mon Sep 17 00:00:00 2001 From: Maximilian Reininghaus <maximilian.reininghaus@kit.edu> Date: Mon, 27 May 2019 14:23:31 -0300 Subject: [PATCH] added example for energy loss --- Documentation/Examples/CMakeLists.txt | 11 ++++ Documentation/Examples/stopping_power.cc | 82 ++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 Documentation/Examples/stopping_power.cc diff --git a/Documentation/Examples/CMakeLists.txt b/Documentation/Examples/CMakeLists.txt index 8e14094da..97acd4567 100644 --- a/Documentation/Examples/CMakeLists.txt +++ b/Documentation/Examples/CMakeLists.txt @@ -106,6 +106,17 @@ target_link_libraries (vertical_EAS ) install (TARGETS vertical_EAS DESTINATION share/examples) +CORSIKA_ADD_TEST(stopping_power) +target_link_libraries (stopping_power + SuperStupidStack + CORSIKAunits + ProcessEnergyLoss + CORSIKAparticles + CORSIKAgeometry + CORSIKAenvironment + ) + +install (TARGETS vertical_EAS DESTINATION share/examples) CORSIKA_ADD_TEST (staticsequence_example) target_link_libraries (staticsequence_example CORSIKAprocesssequence diff --git a/Documentation/Examples/stopping_power.cc b/Documentation/Examples/stopping_power.cc new file mode 100644 index 000000000..0ca9f8be4 --- /dev/null +++ b/Documentation/Examples/stopping_power.cc @@ -0,0 +1,82 @@ +/* + * (c) Copyright 2019 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/environment/Environment.h> +#include <corsika/geometry/Sphere.h> +#include <corsika/process/energy_loss/EnergyLoss.h> +#include <corsika/setup/SetupStack.h> +#include <corsika/units/PhysicalUnits.h> +#include <corsika/utl/CorsikaFenv.h> + +#include <fstream> +#include <iostream> +#include <limits> + +using namespace corsika; +using namespace corsika::process; +using namespace corsika::particles; +using namespace corsika::geometry; +using namespace corsika::environment; + +using namespace std; +using namespace corsika::units::si; + +// +// This example demonstrates the energy loss of muons as function of beta*gamma (=p/m) +// +int main() { + feenableexcept(FE_INVALID); + + // setup environment, geometry + using EnvType = Environment<setup::IEnvironmentModel>; + EnvType env; + + const CoordinateSystem& rootCS = env.GetCoordinateSystem(); + + process::energy_loss::EnergyLoss eLoss; + + setup::Stack stack; + + std::ofstream file("dEdX.dat"); + file << "# beta*gamma, dE/dX / eV/(g/cm²)" << std::endl; + + for (HEPEnergyType E0 = 300_MeV; E0 < 1_PeV; E0 *= 1.05) { + stack.Clear(); + const Code beamCode = Code::MuPlus; + const HEPMassType mass = GetMass(beamCode); + double theta = 0.; + double phi = 0.; + + auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) { + return sqrt((Elab - m) * (Elab + m)); + }; + HEPMomentumType P0 = elab2plab(E0, mass); + auto momentumComponents = [](double theta, double phi, HEPMomentumType ptot) { + return std::make_tuple(ptot * sin(theta) * cos(phi), ptot * sin(theta) * sin(phi), + -ptot * cos(theta)); + }; + auto const [px, py, pz] = + momentumComponents(theta / 180. * M_PI, phi / 180. * M_PI, P0); + auto plab = corsika::stack::MomentumVector(rootCS, {px, py, pz}); + cout << "input particle: " << beamCode << endl; + cout << "input angles: theta=" << theta << " phi=" << phi << endl; + cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl; + Point pos(rootCS, 0_m, 0_m, + 112.8_km); // this is the CORSIKA 7 start of atmosphere/universe + stack.AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ + beamCode, E0, plab, pos, 0_ns}); + + auto const p = stack.GetNextParticle(); + HEPEnergyType dE = eLoss.BetheBloch(p, 1_g / square(1_cm)); + file << P0 / mass << "\t" << -dE / 1_eV << std::endl; + } +} -- GitLab