Newer
Older
/*
* (c) Copyright 2018 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.
*/
#ifndef _Processes_EnergyLoss_h_
#define _Processes_EnergyLoss_h_
#include <corsika/geometry/Point.h>
#include <corsika/geometry/Vector.h>
#include <corsika/process/ContinuousProcess.h>
#include <corsika/units/PhysicalUnits.h>
#include <corsika/setup/SetupStack.h>
#include <corsika/setup/SetupTrajectory.h>
#include <map>
Felix Riehn
committed
namespace corsika::process::energy_loss {
class EnergyLoss : public corsika::process::ContinuousProcess<EnergyLoss> {
using MeVgcm2 = decltype(1e6 * units::si::electronvolt / units::si::gram *
units::si::square(1e-2 * units::si::meter));
void MomentumUpdate(setup::Stack::ParticleType&, units::si::HEPEnergyType Enew);
template <typename TDim>
EnergyLoss(geometry::Point const& injectionPoint,
geometry::Vector<TDim> const& direction)
Felix Riehn
committed
: InjectionPoint_(injectionPoint)
, ShowerAxisDirection_(direction.normalized()) {}
EnergyLoss(setup::Trajectory const& trajectory)
: EnergyLoss(trajectory.GetPosition(0), trajectory.GetV0()){};
process::EProcessReturn DoContinuous(setup::Stack::ParticleType&,
setup::Trajectory const&);
units::si::LengthType MaxStepLength(setup::Stack::ParticleType const&,
setup::Trajectory const&) const;
Felix Riehn
committed
units::si::HEPEnergyType GetTotal() const { return EnergyLossTot_; }
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);
void FillProfile(setup::Stack::ParticleType const&, setup::Trajectory const&,
units::si::HEPEnergyType);
// void FillProfileAbsorbed(setup::Stack::ParticleType const&, setup::Trajectory
// const&);
Felix Riehn
committed
units::si::HEPEnergyType EnergyLossTot_ = units::si::HEPEnergyType::zero();
units::si::GrammageType const dX_ = std::invoke([]() {
using namespace units::si;
return 10_g / square(1_cm);
}); // profile binning
Felix Riehn
committed
std::map<int, units::si::HEPEnergyType> Profile_; // longitudinal profile
geometry::Point const InjectionPoint_;
geometry::Vector<units::si::dimensionless_d> const ShowerAxisDirection_;
Felix Riehn
committed
const units::si::GrammageType dX_threshold_ = std::invoke([]() {
using namespace units::si;
return 0.0001_g / square(1_cm);
});
Felix Riehn
committed
} // namespace corsika::process::energy_loss