Celeritas
0.5.0-86+4a8eea4
|
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. | |
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.
|
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.