46 #include <TRestWimpUtils.h>
54 const double reducedMass = GetReducedMass(wimpMass, Anum);
55 const double reducedMassSingle = GetReducedMass(wimpMass, 1.);
56 return pow(Anum *
GEV_PER_UMA * reducedMass / reducedMassSingle, 2.);
63 const double TRestWimpUtils::GetReducedMass(
const double wimpMass,
const double Anum) {
73 const double TRestWimpUtils::GetHelmFormFactor(
const double recoilEnergy,
const double Anum) {
75 const double q = sqrt(2. * Anum *
GEV_PER_UMA * 1E6 * recoilEnergy);
77 const double qs = q * s / HC_KEV_FM;
79 const double RN = sqrt(pow(1.23 * std::cbrt(Anum) - 0.60, 2) +
80 (7. / 3.) * pow(TMath::Pi(), 2) * 0.52 * 0.52 - 5. * s * s);
81 const double qR = q * RN / HC_KEV_FM;
83 const double bessel1 = sin(qR) / (qR * qR) - cos(qR) / qR;
85 double formFactor = 3. * bessel1 / qR * exp(-0.5 * qs * qs);
95 const double TRestWimpUtils::GetVMin(
const double wimpMass,
const double Anum,
const double recoilEnergy) {
96 const double reducedMass = GetReducedMass(wimpMass, Anum);
97 return sqrt(Anum *
GEV_PER_UMA * recoilEnergy * 1E-6 / (2. * reducedMass * reducedMass)) * LIGHT_SPEED;
104 const double TRestWimpUtils::GetVelocityDistribution(
const double v,
const double vLab,
const double vRMS,
105 const double vEscape) {
106 const double vAdim = vRMS / vLab;
107 const double Nesc = erf(vAdim) - (2. / sqrt(TMath::Pi())) * (vAdim)*exp(-vAdim * vAdim);
108 const double xMax = std::min(1., (vEscape * vEscape - vLab * vLab - v * v) / (2. * vLab * v));
109 return v * Nesc / (vLab * vRMS * sqrt(TMath::Pi())) *
110 (exp(-(v - vLab) * (v - vLab) / (vRMS * vRMS)) -
111 exp(-(v * v + vLab * vLab + 2 * v * vLab * xMax) / (vRMS * vRMS)));
121 const double TRestWimpUtils::GetDifferentialCrossSection(
const double wimpMass,
const double crossSection,
122 const double velocity,
const double recoilEnergy,
125 const double reducedMass = GetReducedMass(wimpMass, Anum);
126 const double Emax = 1E6 / LIGHT_SPEED / LIGHT_SPEED * 2. * reducedMass * reducedMass * velocity *
128 const double formFactor = GetHelmFormFactor(recoilEnergy, Anum);
130 return cs * formFactor * formFactor / Emax;
138 const double TRestWimpUtils::GetRecoilRate(
const double wimpMass,
const double crossSection,
139 const double recoilEnergy,
const double Anum,
const double vLab,
140 const double vRMS,
const double vEscape,
const double wimpDensity,
141 const double abundance) {
142 const double vMin = GetVMin(wimpMass, Anum, recoilEnergy);
143 const double vMax = vEscape + vLab;
144 const double nNuclei = abundance * N_AVOGADRO * 1E3 / Anum;
146 if (vMin > vMax)
return 0;
149 const double velStep = 0.1;
151 for (
double v = vMin; v < vMax; v += velStep) {
152 const double flux = 1E5 * v * wimpDensity / wimpMass;
153 const double diffRate = flux *
154 GetDifferentialCrossSection(wimpMass, crossSection, v, recoilEnergy, Anum) *
155 GetVelocityDistribution(v, vLab, vRMS, vEscape);
156 rate += diffRate * velStep;
159 return rate * SECONDS_PER_DAY * nNuclei;
166 const double TRestWimpUtils::GetQuenchingFactor(
const double recoilEnergy,
const double Anum,
168 const double deltaE = 0.0001, Emin = 0.1, resolution = 0.1;
169 double g, Er = recoilEnergy, Ev;
173 g = 0.66 * pow(Znum, 5. / 18.) / sqrt(Anum) * pow(recoilEnergy, 1. / 6.);
174 }
while ((Er / (1 + g) * g) > Emin);
178 g = 0.66 * pow(Znum, 5. / 18.) / sqrt(Anum) * pow(Er, 1. / 6.);
179 Ev = (Er / (1 + g) * g);
180 }
while (recoilEnergy > Ev);
constexpr double GEV_PER_UMA
Physics constants.
const double GetRelativeNuclearCS(const double wimpMass, const double Anum)
Generic functions for different calculations.