Celeritas  0.5.0-56+6b053cd
Public Member Functions | List of all members
celeritas::SBEnergyDistribution< XSCorrector > Class Template Reference

Sample exiting photon energy from Bremsstrahlung. More...

#include <SBEnergyDistribution.hh>

Public Types

Type aliases
using SBData = NativeCRef< SeltzerBergerData >
 
using Energy = units::MevEnergy
 
using EnergySq = Quantity< UnitProduct< units::Mev, units::Mev > >
 

Public Member Functions

CELER_FUNCTION SBEnergyDistribution (SBEnergyDistHelper const &helper, XSCorrector scale_xs)
 Construct from incident particle and energy. More...
 
template<class Engine >
CELER_FUNCTION Energy operator() (Engine &rng)
 
template<class Engine >
CELER_FUNCTION auto operator() (Engine &rng) -> Energy
 Sample the exiting energy by doing a table lookup and rejection.
 

Detailed Description

template<class XSCorrector>
class celeritas::SBEnergyDistribution< XSCorrector >

Sample exiting photon energy from Bremsstrahlung.

The SB energy distribution uses tabulated Seltzer-Berger differential cross section data from G4EMLOW, which stores scaled cross sections as a function of incident particle energy and exiting gamma energy (see SeltzerBergerModel for details). The sampling procedure is roughly laid out in section [PHYS341] of the GEANT3 physics reference manual, although like Geant4 we use raw tabulated SB data rather than a parameter fit. Also like Geant4 we include the extra density correction factor.

Once an element and incident energy have been selected, the exiting energy distribution is the differential cross section, which is stored as a scaled tabulated value. The reconstructed cross section gives the pdf

\[ p(\kappa) \propto \difd{\sigma}{k} s \propto \frac{1}{\kappa} \chi_Z(E, \kappa) \]

where \( \kappa = k / E \) is the ratio of the emitted photon energy to the incident charged particle energy, and the domain of p is nominally restricted by the allowable energy range \( \kappa_c < \kappa < 1 \), where \( \kappa_c \) is from the cutoff energy \( E_c \) for secondary gamma production. This distribution is sampled by decomposing it into an analytic sampling of \( 1/\kappa \) and a rejection sample on the scaled cross section \( \chi \). The analytic sample over the domain is from

\[ p_1(\kappa) \frac{1}{\ln 1/\kappa_c} \frac{1}{\kappa} \]

by sampling

\[ \kappa = \exp( \xi \ln \kappa_c ) \,, \]

and the rejection sample is the ratio of the scaled differential cross section at the exiting energy to the maximum across all exiting energies.

\[ p_2(\kappa) = \frac{\chi_Z(E, \kappa)}{\max_\kappa \chi_Z(E, \kappa)} \]

Since the tabulated data is bilinearly interpolated in incident and exiting energy, we can calculate a bounding maximum by precalculating (at setup time) the index of the maximum value of \( \chi \) and linearly interpolating those maximum values based on the incident energy.

The above algorithm is idealized; in practice, the minimum and maximum values are adjusted for a constant factor \(d_\rho\), which depends on the incident particle mass + energy and the material's electron density:

\[ \kappa_\mathrm{min} = \ln (E_c^2 + d_\rho E^2) \]

and

\[ \kappa_\mathrm{max} = \ln (E^2 + d_\rho E^2) \, . \]

With this correction, the sample of the exiting gamma energy \( k = \kappa / E \) is transformed from the simple exponential above to:

\[ k = \sqrt{ \exp(\kappa_\mathrm{min} + \xi [\kappa_\mathrm{max} - \kappa_\mathrm{min}]) - d_\rho E^2} \]

Most of the mechanics of the sampling are in the template-free SBEnergyDistHelper, which is passed as a construction argument to this sampler. The separate class exists here to minimize duplication of templated code, which is required to provide for an on-the-fly correction of the cross section sampling.

Constructor & Destructor Documentation

◆ SBEnergyDistribution()

template<class XSCorrector >
CELER_FUNCTION celeritas::SBEnergyDistribution< X >::SBEnergyDistribution ( SBEnergyDistHelper const &  helper,
XSCorrector  scale_xs 
)
inline

Construct from incident particle and energy.

The incident energy must be within the bounds of the SB table data, so the Model's applicability must be consistent with the table data.


The documentation for this class was generated from the following file: