IAP GITLAB

Skip to content
Snippets Groups Projects
EnergyLoss.h 3.12 KiB
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_

Ralf Ulrich's avatar
Ralf Ulrich committed
#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>


  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);
Ralf Ulrich's avatar
Ralf Ulrich committed
    template <typename TDim>
    EnergyLoss(geometry::Point const& injectionPoint,
               geometry::Vector<TDim> const& direction)
        : InjectionPoint_(injectionPoint)
        , ShowerAxisDirection_(direction.normalized()) {}
Ralf Ulrich's avatar
Ralf Ulrich committed

    EnergyLoss(setup::Trajectory const& trajectory)
        : EnergyLoss(trajectory.GetPosition(0), trajectory.GetV0()){};

    void Init() {}
    process::EProcessReturn DoContinuous(setup::Stack::ParticleType&,
                                         setup::Trajectory const&);
    units::si::LengthType MaxStepLength(setup::Stack::ParticleType const&,
                                        setup::Trajectory const&) const;
    units::si::HEPEnergyType GetTotal() const { return EnergyLossTot_; }
ralfulrich's avatar
ralfulrich committed
    void PrintProfile() const;
    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);
ralfulrich's avatar
ralfulrich committed

  private:
Ralf Ulrich's avatar
Ralf Ulrich committed
    void FillProfile(setup::Stack::ParticleType const&, setup::Trajectory const&,
                     units::si::HEPEnergyType);
    // void FillProfileAbsorbed(setup::Stack::ParticleType const&, setup::Trajectory
    // const&);
    units::si::HEPEnergyType EnergyLossTot_ = units::si::HEPEnergyType::zero();
    units::si::GrammageType const dX_ = std::invoke([]() {
Ralf Ulrich's avatar
Ralf Ulrich committed
      using namespace units::si;
      return 10_g / square(1_cm);
    });                                               // profile binning
    std::map<int, units::si::HEPEnergyType> Profile_; // longitudinal profile
    geometry::Point const InjectionPoint_;
    geometry::Vector<units::si::dimensionless_d> const ShowerAxisDirection_;
  const units::si::GrammageType dX_threshold_ = std::invoke([]() {
    using namespace units::si;
    return 0.0001_g / square(1_cm);
  });