Implemented Models

Medium

HomoEarth

template<typename Vector3 = Vector3d<double>, typename Value = double>
class HomoEarth : public darkprop::Earth<Vector3d<double>, double>

A homogeneous Earth model composed of 8 components.

Public Functions

virtual Value propagate(Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) override

Propagate a particle.

Sample a free path and propagate the particle and determine whether the particle is in the Medium or not. Set Particle::in_medium to false if the simulation should stop.

virtual Target sampleTarget(const Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) const override

Sample a target before scattering.

PREMEarth

template<typename Vector3 = Vector3d<double>, typename Value = double>
class PREMEarth : public darkprop::Earth<Vector3d<double>, double>

Preliminary reference Earth model (PREM).

Public Functions

virtual Value propagate(Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) override

Propagate a particle.

Sample a free path and propagate the particle and determine whether the particle is in the Medium or not. Set Particle::in_medium to false if the simulation should stop.

virtual Target sampleTarget(const Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) const override

Sample a target before scattering.

Value densityIntegral(Value r0, Value cosa, Value L, std::size_t layer)

Analytic integration of the density.

HomoElectronEarth

template<typename Vector3 = Vector3d<double>, typename Value = double>
class HomoElectronEarth : public darkprop::Earth<Vector3d<double>, double>

Public Functions

inline virtual Value propagate(Particle<Vector3, Value> &p, RandomNumber<Value> &rn) override

Propagate a particle.

Sample a free path and propagate the particle and determine whether the particle is in the Medium or not. Set Particle::in_medium to false if the simulation should stop.

inline virtual Target sampleTarget(const Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) const override

Sample a target before scattering.

Sun

template<typename Vector3 = Vector3d<double>, typename Value = double>
class Sun : public darkprop::MediumBall<Vector3d<double>, double>

A Sun model.

Currently, the Sun only works with SolarDM which has constant cross section.

Public Functions

void init(const std::string &filename)

Load the tabular normalized number density integral function.

Value densityIntegral(Value y)

For certain y, the maximal value of the integrated number density, i.e.

the value of integrated number density at \( x=\sqrt{1-y^2} \). unit: cm^-3. Same as number density. y ranges in [0,1].

inline Value densityIntegralNormalized(Value y, Value x)

The normalized density integral.

inline Value densityIntegralInverseNormalized(Value y, Value z)

The inverse of the normalized density integral.

virtual Value propagate(Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) override

Propagate a particle.

Sample a free path and propagate the particle and determine whether the particle is in the Medium or not. Set Particle::in_medium to false if the simulation should stop.

virtual Target sampleTarget(const Particle<Vector3, Value> &particle, RandomNumber<Value> &rn) const override

Sample a target before scattering.

This Sun model is implemented only working with the SolarDM model which assumes constant cross section and only couples to proton, and includes only proton and \({}^4\rm He\). So the free path equation (Eq. (8)) can be written as

(13)\[\sigma_{\chi p} \int_0^L (n_p + 4 n_{\rm He}) \mathrm{d}l = -\ln\xi,\]

where \(\sigma_{\chi p}\) is DM-proton scattering cross section, \(n_p\) (\(n_{\rm He}\)) is the number density of proton (\({}^4\rm He\)), and \(1 - \xi\) is replaced with \(\xi\) since they have the same distribution. Note that the factor of 4 comes from coherent scattering. Using the reasonable approximation that the density of the Sun is isotropic, we use the coordinates \((x, y)\) as shown in Fig. 2.

illustration of the coordinates (x, y)

Fig. 2 The coordinates \((x, y)\) for the isotropic Sun.

The direction of \(x\) aligns with the velocity of the particle. The radius has been normalized to 1. So \(y\) ranges in \((0, 1)\) and \(x\) ranges in \((-\sqrt{1 - y^2}, \sqrt{1 - y^2})\). We further define the normalized density integral

(14)\[z(y, x) \equiv \frac{\int_{-\sqrt{1-y^2}}^{x} (n_p + 4 n_{\rm He}) \mathrm{d}x'} {\int_{-\sqrt{1-y^2}}^{\sqrt{1-y^2}} (n_p + 4 n_{\rm He}) \mathrm{d}x'}.\]

Thus \(0 \leq z \leq 1\). Now suppose the particle starts at \(x_0\), Eq. (13) can be solved as follows

(15)\[z(y, x) = z(y, x_0) + \frac{\ln\xi}{\sigma_{\chi p} R_\odot z(\sqrt{1 + y^2}, y)},\]

where \(R_\odot\) is the radius of the Sun. Then \(x\) is solved with the inverse of \(z\), \(x = x(y, z)\), and the free path is \(L = (x - x_0) R_\odot\).

Particle

SIDM

template<typename Vector3 = Vector3d<double>, typename Value = double>
class SIDM : public darkprop::ParticleElastic<Vector3d<double>, double>

Spin independent elastic scattering DM model with constant cross section.

Subclassed by darkprop::SIFFCutDM< Vector3, Value >, darkprop::SIFFExpDM< Vector3, Value >, darkprop::SIHelmDM< Vector3, Value >, darkprop::SIHelmDiscreteDM< Vector3, Value >

Public Functions

inline virtual Value totalCrossSection(const Target &t) const override

Total cross section scattering with Target t.

Use current this->T as initial kinetic energy. Return the statistical weight.

inline virtual Value scatteringSampleTr(const Target &t, RandomNumber<Value> &rn) override

Sample recoil kinetic energy of the target particle in laboratory frame.

SIHelmDM

template<typename Vector3 = Vector3d<double>, typename Value = double>
class SIHelmDM : public darkprop::SIDM<Vector3d<double>, double>

Spin independent elastic scattering DM model with Helm form factor.

Public Functions

inline virtual Value scatteringSampleTr(const Target &t, RandomNumber<Value> &rn) override

Sample recoil kinetic energy of the target particle in laboratory frame.

inline virtual Value totalCrossSection(const Target &t) const override

Total cross section scattering with Target t.

Use current this->T as initial kinetic energy. Return the statistical weight.

DMElectron

template<typename Vector3 = Vector3d<double>, typename Value = double>
class DMElectron : public darkprop::ParticleElastic<Vector3d<double>, double>

A DM-electron vector coupling model.

Used to cross check for arXiv:2403.08361.

Public Functions

inline virtual Value totalCrossSection(const Target &t) const override

Total cross section scattering with Target t.

Use current this->T as initial kinetic energy. Return the statistical weight.

inline virtual Value scatteringSampleTr(const Target &t, RandomNumber<Value> &rn) override

Sample recoil kinetic energy of the target particle in laboratory frame.

SolarDM

template<typename Vector3 = Vector3d<double>, typename Value = double>
class SolarDM : public darkprop::Particle<Vector3d<double>, double>

The Solar DM model.

Public Functions

inline void setTempScale(Value t_temp_scale)

Set the temperature scaling factor multiplied to the real temperature.

This is used to adjust the temperature of the Sun.

inline virtual Value totalCrossSection(const Target &t) const override

Total cross section scattering with Target t.

Use current this->T as initial kinetic energy. Return the statistical weight.

virtual Value scatter(const Target &t, RandomNumber<Value> &rn) override

Sample final state DM particle.

The changes are made directly. Return the statistical weight.