gambit is hosted by Hepforge, IPPP Durham
GAMBIT  v1.5.0-2191-ga4742ac
a Global And Modular Bsm Inference Tool
DirectDetection.cpp
Go to the documentation of this file.
1 // GAMBIT: Global and Modular BSM Inference Tool
2 // *********************************************
46 
49 
50 namespace Gambit
51 {
52  namespace DarkBit
53  {
54 
56  //
57  // Direct detection couplings
58  //
60 
64  {
65  using namespace Pipes::DD_couplings_DarkSUSY_DS5;
66 
67  double fG;
68 
69  // Set proton hadronic matrix elements
70  BEreq::ddcom->ftp(7) = *Param["fpu"];
71  BEreq::ddcom->ftp(8) = *Param["fpd"];
72  BEreq::ddcom->ftp(10) = *Param["fps"];
73 
74  fG = 2./27.*(1. - *Param["fpu"] - *Param["fpd"] - *Param["fps"]);
75  BEreq::ddcom->ftp(9) = fG;
76  BEreq::ddcom->ftp(11) = fG;
77  BEreq::ddcom->ftp(12) = fG;
78 
79  logger() << LogTags::debug << "DarkSUSY proton hadronic matrix elements set to:" << endl;
80  logger() << LogTags::debug << "ftp(7) = fpu = " << BEreq::ddcom->ftp(7);
81  logger() << LogTags::debug << "\tftp(8) = fpd = " << BEreq::ddcom->ftp(8);
82  logger() << LogTags::debug << "\tftp(10) = fps = " << BEreq::ddcom->ftp(10) << endl;
83  logger() << LogTags::debug << "ftp(9) = ftp(11) = ftp(12) = 2/27 fG = " <<
84  BEreq::ddcom->ftp(9) << EOM;
85 
86  // Set neutron hadronic matrix elements
87  BEreq::ddcom->ftn(7) = *Param["fnu"];
88  BEreq::ddcom->ftn(8) = *Param["fnd"];
89  BEreq::ddcom->ftn(10) = *Param["fns"];
90 
91  fG = 2./27.*(1. - *Param["fnu"] - *Param["fnd"] - *Param["fns"]);
92  BEreq::ddcom->ftn(9) = fG;
93  BEreq::ddcom->ftn(11) = fG;
94  BEreq::ddcom->ftn(12) = fG;
95 
96  logger() << LogTags::debug << "DarkSUSY neutron hadronic matrix elements set to:" << endl;
97  logger() << LogTags::debug << "ftn(7) = fnu = " << BEreq::ddcom->ftn(7);
98  logger() << LogTags::debug << "\tftn(8) = fnd = " << BEreq::ddcom->ftn(8);
99  logger() << LogTags::debug << "\tftn(10) = fns = " << BEreq::ddcom->ftn(10) << endl;
100  logger() << LogTags::debug << "ftn(9) = ftn(11) = ftn(12) = 2/27 fG = " <<
101  BEreq::ddcom->ftn(9) << EOM;
102 
103  // Set deltaq
104  BEreq::ddcom->delu = *Param["deltau"];
105  BEreq::ddcom->deld = *Param["deltad"];
106  BEreq::ddcom->dels = *Param["deltas"];
107  logger() << LogTags::debug << "DarkSUSY delta q set to:" << endl;
108  logger() << LogTags::debug << "delu = delta u = " << BEreq::ddcom->delu;
109  logger() << LogTags::debug << "\tdeld = delta d = " << BEreq::ddcom->deld;
110  logger() << LogTags::debug << "\tdels = delta s = " << BEreq::ddcom->dels << EOM;
111 
112 
113  // Loop corrections and pole removal.
114 
115  // Option loop<bool>: If true, include 1-loop effects discussed in
116  // Drees Nojiri Phys.Rev. D48 (1993) 3483-3501 (default: true)
117  BEreq::ddcom->dddn = runOptions->getValueOrDef<bool>(true,"loop");
118 
119  // Option pole<bool>: If true, include pole in nuclear scattering cross-section.
120  // If false, approximate squark propagator as 1/m_sq^2 (default: false)
121  BEreq::ddcom->ddpole = runOptions->getValueOrDef<bool>(false,"pole");
122 
123  // Some version notes:
124  // The default in DS5 is to for both these options to be false (tree-level cross-section with pole removed).
125  // The default in DS6 is to use Drees-Nojiri (1 loop) with the pole removed, which isn't an
126  // option in the official DS5.1.3. The version in GAMBIT is patched to implement this option though,
127  // so we use it as the default here.
128 
129  // Calling DarkSUSY subroutine dsddgpgn(gps,gns,gpa,gna)
130  // to set all four couplings.
131  std::vector<double> DDcouplings=BEreq::get_DD_couplings();
132  double factor =
134  runOptions->getValueOrDef<double>(1., "rescale_couplings");
135  result.gps = factor*DDcouplings[0];// *= factor;
136  result.gns = factor*DDcouplings[1];// *= factor;
137  result.gpa = factor*DDcouplings[2];// *= factor;
138  result.gna = factor*DDcouplings[3];// *= factor;
139  logger() << LogTags::debug << "DarkSUSY dsddgpgn gives:" << std::endl;
140  logger() << LogTags::debug << " gps = " << result.gps << std::endl;
141  logger() << LogTags::debug << " gns = " << result.gns << std::endl;
142  logger() << LogTags::debug << " gpa = " << result.gpa << std::endl;
143  logger() << LogTags::debug << " gna = " << result.gna << EOM;
144  }
145 
149  {
150  using namespace Pipes::DD_couplings_DarkSUSY_MSSM;
151 
152  double fG;
153 
154  // Set proton hadronic matrix elements
155  BEreq::ddcomlegacy->ftp(7) = *Param["fpu"];
156  BEreq::ddcomlegacy->ftp(8) = *Param["fpd"];
157  BEreq::ddcomlegacy->ftp(10) = *Param["fps"];
158 
159  fG = 2./27.*(1. - *Param["fpu"] - *Param["fpd"] - *Param["fps"]);
160  BEreq::ddcomlegacy->ftp(9) = fG;
161  BEreq::ddcomlegacy->ftp(11) = fG;
162  BEreq::ddcomlegacy->ftp(12) = fG;
163 
164  logger() << LogTags::debug << "DarkSUSY proton hadronic matrix elements set to:" << endl;
165  logger() << LogTags::debug << "ftp(7) = fpu = " << BEreq::ddcomlegacy->ftp(7);
166  logger() << LogTags::debug << "\tftp(8) = fpd = " << BEreq::ddcomlegacy->ftp(8);
167  logger() << LogTags::debug << "\tftp(10) = fps = " << BEreq::ddcomlegacy->ftp(10) << endl;
168  logger() << LogTags::debug << "ftp(9) = ftp(11) = ftp(12) = 2/27 fG = " <<
169  BEreq::ddcomlegacy->ftp(9) << EOM;
170 
171  // Set neutron hadronic matrix elements
172  BEreq::ddcomlegacy->ftn(7) = *Param["fnu"];
173  BEreq::ddcomlegacy->ftn(8) = *Param["fnd"];
174  BEreq::ddcomlegacy->ftn(10) = *Param["fns"];
175 
176  fG = 2./27.*(1. - *Param["fnu"] - *Param["fnd"] - *Param["fns"]);
177  BEreq::ddcomlegacy->ftn(9) = fG;
178  BEreq::ddcomlegacy->ftn(11) = fG;
179  BEreq::ddcomlegacy->ftn(12) = fG;
180 
181  logger() << LogTags::debug << "DarkSUSY neutron hadronic matrix elements set to:" << endl;
182  logger() << LogTags::debug << "ftn(7) = fnu = " << BEreq::ddcomlegacy->ftn(7);
183  logger() << LogTags::debug << "\tftn(8) = fnd = " << BEreq::ddcomlegacy->ftn(8);
184  logger() << LogTags::debug << "\tftn(10) = fns = " << BEreq::ddcomlegacy->ftn(10) << endl;
185  logger() << LogTags::debug << "ftn(9) = ftn(11) = ftn(12) = 2/27 fG = " <<
186  BEreq::ddcomlegacy->ftn(9) << EOM;
187 
188  // Set deltaq
189  BEreq::ddcomlegacy->delu = *Param["deltau"];
190  BEreq::ddcomlegacy->deld = *Param["deltad"];
191  BEreq::ddcomlegacy->dels = *Param["deltas"];
192  logger() << LogTags::debug << "DarkSUSY delta q set to:" << endl;
193  logger() << LogTags::debug << "delu = delta u = " << BEreq::ddcomlegacy->delu;
194  logger() << LogTags::debug << "\tdeld = delta d = " << BEreq::ddcomlegacy->deld;
195  logger() << LogTags::debug << "\tdels = delta s = " << BEreq::ddcomlegacy->dels << EOM;
196 
197 
198  // Loop corrections and pole removal.
199 
200  // Option loop<bool>: If true, include 1-loop effects discussed in
201  // Drees Nojiri Phys.Rev. D48 (1993) 3483-3501 (default: true)
202  BEreq::ddmssmcom->dddn = runOptions->getValueOrDef<bool>(true,"loop");
203 
204  // Option pole<bool>: If true, include pole in nuclear scattering cross-section.
205  // If false, approximate squark propagator as 1/m_sq^2 (default: false)
206  BEreq::ddmssmcom->ddpole = runOptions->getValueOrDef<bool>(false,"pole");
207 
208  // Some version notes:
209  // The default in DS5 is for both these options to be false (tree-level cross-section with pole removed).
210  // The default in DS6 is to use Drees-Nojiri (1 loop) with the pole removed, which isn't an
211  // option in the official DS5.1.3. The version in GAMBIT is patched to implement this option though,
212  // so we use it as the default here.
213 
214  // Calling DarkSUSY subroutine dsddgpgn(gps,gns,gpa,gna)
215  // to set all four couplings.
216  std::vector<double> DDcouplings=BEreq::get_DD_couplings();
217  double factor =
219  runOptions->getValueOrDef<double>(1., "rescale_couplings");
220  result.gps = factor*DDcouplings[0];// *= factor;
221  result.gns = factor*DDcouplings[1];// *= factor;
222  result.gpa = factor*DDcouplings[2];// *= factor;
223  result.gna = factor*DDcouplings[3];// *= factor;
224  logger() << LogTags::debug << "DarkSUSY dsddgpgn gives:" << std::endl;
225  logger() << LogTags::debug << " gps = " << result.gps << std::endl;
226  logger() << LogTags::debug << " gns = " << result.gns << std::endl;
227  logger() << LogTags::debug << " gpa = " << result.gpa << std::endl;
228  logger() << LogTags::debug << " gna = " << result.gna << EOM;
229  }
230 
231 
235  {
236  using namespace Pipes::DD_couplings_MicrOmegas;
237 
238  // Set proton hadronic matrix elements.
239  BEreq::MOcommon->par[2] = *Param["fpd"];
240  BEreq::MOcommon->par[3] = *Param["fpu"];
241  BEreq::MOcommon->par[4] = *Param["fps"];
242 
243  logger() << LogTags::debug << "micrOMEGAs proton hadronic matrix elements set to:" << endl;
244  logger() << LogTags::debug << "ScalarFFPd = fpd = " << BEreq::MOcommon->par[2];
245  logger() << LogTags::debug << "\tScalarFFPu = fpu = " << BEreq::MOcommon->par[3];
246  logger() << LogTags::debug << "\tScalarFFPs = fps = " << BEreq::MOcommon->par[4] << EOM;
247 
248  // Set neutron hadronic matrix elements.
249  BEreq::MOcommon->par[11] = *Param["fnd"];
250  BEreq::MOcommon->par[12] = *Param["fnu"];
251  BEreq::MOcommon->par[13] = *Param["fns"];
252 
253  logger() << LogTags::debug << "micrOMEGAs neutron hadronic matrix elements set to:" << endl;
254  logger() << LogTags::debug << "ScalarFFNd = fnd = " << BEreq::MOcommon->par[11];
255  logger() << LogTags::debug << "\tScalarFFNu = fnu = " << BEreq::MOcommon->par[12];
256  logger() << LogTags::debug << "\tScalarFFNs = fns = " << BEreq::MOcommon->par[13] << EOM;
257 
258  //Set delta q.
259  BEreq::MOcommon->par[5] = *Param["deltad"];
260  BEreq::MOcommon->par[6] = *Param["deltau"];
261  BEreq::MOcommon->par[7] = *Param["deltas"];
262 
263  BEreq::MOcommon->par[14] = *Param["deltau"];
264  BEreq::MOcommon->par[15] = *Param["deltad"];
265  BEreq::MOcommon->par[16] = *Param["deltas"];
266 
267  logger() << LogTags::debug << "micrOMEGAs delta q set to:" << endl;
268  logger() << LogTags::debug << "pVectorFFPd = pVectorFFNu = delta d = "
269  << BEreq::MOcommon->par[5] << endl;
270  logger() << LogTags::debug << "pVectorFFPu = pVectorFFPd = delta u = "
271  << BEreq::MOcommon->par[6] << endl;
272  logger() << LogTags::debug << "pVectorFFPs = pVectorFFNs = delta s = "
273  << BEreq::MOcommon->par[7] << EOM;
274 
275  double p1[2], p2[2], p3[2], p4[2];
276  int error;
277  if (runOptions->getValueOrDef<bool>(true, "box"))
278  error = BEreq::nucleonAmplitudes(byVal(BEreq::FeScLoop.pointer()),
279  byVal(p1), byVal(p2), byVal(p3), byVal(p4));
280  else error = BEreq::nucleonAmplitudes(NULL,
281  byVal(p1), byVal(p2), byVal(p3), byVal(p4));
282  if(error!=0)
283  DarkBit_error().raise(LOCAL_INFO,
284  "micrOMEGAs nucleonAmplitudes function failed with "
285  "error code " + std::to_string(error) + ".");
286 
287  // Rescaling to agree with DarkSUSY convention:
288  result.gps = p1[0]*2;
289  result.gpa = p2[0]*2;
290  result.gns = p3[0]*2;
291  result.gna = p4[0]*2;
292 
293  logger() << LogTags::debug << "micrOMEGAs nucleonAmplitudes gives:" << endl;
294  logger() << LogTags::debug << " gps: " << result.gps << endl;
295  logger() << LogTags::debug << " gns: " << result.gns << endl;
296  logger() << LogTags::debug << " gpa: " << result.gpa << endl;
297  logger() << LogTags::debug << " gna: " << result.gna << EOM;
298  }
299 
301  void sigma_SI_p_simple(double &result)
302  {
303  using namespace Pipes::sigma_SI_p_simple;
304  double gps = Dep::DD_couplings->gps;
305  double reduced_mass = *Dep::mwimp * m_proton / (*Dep::mwimp + m_proton);
306  result = gev2cm2/pi*pow(reduced_mass*gps,2.0);
307  }
308 
310  void sigma_SI_n_simple(double &result)
311  {
312  using namespace Pipes::sigma_SI_n_simple;
313  double gns = Dep::DD_couplings->gns;
314  double reduced_mass = *Dep::mwimp * m_neutron / (*Dep::mwimp + m_neutron);
315  result = gev2cm2/pi*pow(reduced_mass*gns,2.0);
316  }
317 
319  void sigma_SD_p_simple(double &result)
320  {
321  using namespace Pipes::sigma_SD_p_simple;
322  double gpa = Dep::DD_couplings->gpa;
323  double reduced_mass = *Dep::mwimp * m_proton / (*Dep::mwimp + m_proton);
324  result = 3.0*gev2cm2/pi*pow(reduced_mass*gpa,2.0);
325  }
326 
328  void sigma_SD_n_simple(double &result)
329  {
330  using namespace Pipes::sigma_SD_n_simple;
331  double gna = Dep::DD_couplings->gna;
332  double reduced_mass = *Dep::mwimp * m_neutron / (*Dep::mwimp + m_neutron);
333  result = 3.0*gev2cm2/pi*pow(reduced_mass*gna,2.0);
334  }
335 
339  {
340  using namespace Pipes::sigma_SI_vnqn;
341 
342  double q0 = 0.04; // reference momentum transfer: 40 MeV
343  double gps = Dep::DD_couplings_fermionic_HP->gps;
344  double gpq2 = Dep::DD_couplings_fermionic_HP->gp_q2;
345  double reduced_mass = *Dep::mwimp * m_proton / (*Dep::mwimp + m_proton);
346 
347  result[std::make_pair(0,0)] = gev2cm2/pi*pow(reduced_mass*gps,2.0);
348  result[std::make_pair(-2,0)] = 0.0;
349  result[std::make_pair(2,0)] = gev2cm2/pi*pow(reduced_mass*gpq2,2.0)*pow(q0/(*Dep::mwimp)/2.0,2.0);
350  result[std::make_pair(4,0)] = 0.0;
351  result[std::make_pair(0,-2)] = 0.0;
352  result[std::make_pair(0,2)] = 0.0;
353  result[std::make_pair(0,4)] = 0.0;
354  }
355 
357  {
358  using namespace Pipes::sigma_SD_vnqn;
359 
360  result[std::make_pair(0,0)] = 0.0;
361  result[std::make_pair(-2,0)] = 0.0;
362  result[std::make_pair(2,0)] = 0.0;
363  result[std::make_pair(4,0)] = 0.0;
364  result[std::make_pair(0,-2)] = 0.0;
365  result[std::make_pair(0,2)] = 0.0;
366  result[std::make_pair(0,4)] = 0.0;
367  }
368 
369 
371  //
372  // Direct detection rate and likelihood routines
373  //
375 
377  #define DDCALC_RESULT(EXPERIMENT, TYPE, NAME) \
378  void CAT_3(EXPERIMENT,_Get,NAME)(TYPE &result) \
379  { \
380  using namespace Pipes::CAT_3(EXPERIMENT,_Get,NAME); \
381  TYPE temp_result = BEreq::CAT(DD_,NAME)(BEreq::DD_Experiment(STRINGIFY(EXPERIMENT))); \
382  if (Utils::isnan(temp_result)) \
383  { \
384  /* DarkBit_error().raise(LOCAL_INFO, "Got NaN value from DDCalc."); */ \
385  /* TODO: Raise a proper error here -- NaNs should be fixed. */ \
386  invalid_point().raise("Got NaN value from DDCalc! This need fixing!"); \
387  } \
388  result = temp_result; \
389  }
390 
391  #define DDCALC_BIN(EXPERIMENT, TYPE, NAME) \
392  void CAT_3(EXPERIMENT,_GetBin,NAME)(std::vector<double> &result) \
393  { \
394  using namespace Pipes::CAT_3(EXPERIMENT,_GetBin,NAME); \
395  result.clear(); \
396  int nbins; \
397  nbins = BEreq::DD_Bins(BEreq::DD_Experiment(STRINGIFY(EXPERIMENT))); \
398  for (int ibin=1;ibin<=nbins;ibin++) { \
399  result.push_back( \
400  BEreq::CAT(DD_Bin,NAME)(BEreq::DD_Experiment(STRINGIFY(EXPERIMENT)),ibin)); } \
401  }
402 
405  #define DD_EX(EXPERIMENT) \
406  /* Calculations */ \
407  void CAT(EXPERIMENT,_Calc)(bool &result) \
408  { \
409  using namespace Pipes::CAT(EXPERIMENT,_Calc); \
410  BEreq::DD_CalcRates(BEreq::DD_Experiment(STRINGIFY(EXPERIMENT))); \
411  result = true; \
412  } \
413  /* Results */ \
414  DDCALC_RESULT(EXPERIMENT, int, Events) \
415  DDCALC_RESULT(EXPERIMENT, double, Background) \
416  DDCALC_RESULT(EXPERIMENT, double, Signal) \
417  DDCALC_RESULT(EXPERIMENT, double, SignalSI) \
418  DDCALC_RESULT(EXPERIMENT, double, SignalSD) \
419  DDCALC_RESULT(EXPERIMENT, int, Bins) \
420  DDCALC_RESULT(EXPERIMENT, double, LogLikelihood) \
421  DDCALC_BIN(EXPERIMENT, int, Events) \
422  DDCALC_BIN(EXPERIMENT, double, Background) \
423  DDCALC_BIN(EXPERIMENT, double, Signal) \
424 
425  // Experiments
426  DD_EX(XENON100_2012) // Aprile et al., PRL 109, 181301 (2013) [arxiv:1207.5988]
427  DD_EX(XENON1T_2017) // Aprile et al., PRL 119, 181301 (2017) [arxiv:1705.06655]
428  DD_EX(XENON1T_2018) // Aprile et al., May 28 talk at Gran Sasso.
429  DD_EX(DARWIN) // M. Schumann et al., [arXiv:1506.08309]
430  DD_EX(LUX_2013) // Akerib et al., PRL 112, 091303 (2014) [arxiv:1310.8214]
431  DD_EX(LUX_2015) // D.S. Akerib et al., PRL 116, 161301 (2016) [arXiv:1512.03506]
432  DD_EX(LUX_2016) // D.S. Akerib et al., PRL 118, 021303 (2017) [arxiv:1608.07648]
433  DD_EX(LZ) // LZ TDR, [arXiv:1509.02910]
434  DD_EX(PandaX_2016) // A. Tan et al., PRL 117, 121303 (2016) [arxiv:1607.07400]
435  DD_EX(PandaX_2017) // X. Cui et al., PRL 119, 181302 (2017) [arxiv:1708.06917]
436  DD_EX(DarkSide_50) // P. Agnes et al., [arXiv:1802.07198]
437  DD_EX(DarkSide_50_S2) // P. Agnes et al., [arXiv:1802.06994]
438  DD_EX(CRESST_II) // G. Angloher et al., [arXiv:1509.01515]
439  DD_EX(CRESST_III) // G. Angloher et al., [arXiv:1904.00498]
440  DD_EX(SuperCDMS_2014) // Agnese et al., PRL 112, 241302 (2014) [arxiv:1402.7137]
441  DD_EX(CDMSlite) // Agnese et al., PRL 116, 071301 (2015) [arxiv:1509.02448]
442  DD_EX(SIMPLE_2014) // Felizardo et al., PRD 89, 072013 (2014) [arxiv:1404.4309]
443  DD_EX(PICO_2L) // C. Amole et al., PRD 93, 061101 (2016) [arXiv:1601.03729]
444  DD_EX(PICO_60_F) // C. Amole et al., PRD 93, 052014 (2016) [arXiv:1510.07754]
445  DD_EX(PICO_60_I) // C. Amole et al., PRD 93, 052014 (2016) [arXiv:1510.07754]
446  DD_EX(PICO_60) // C. Amole et al., PRD 93, 052014 (2016) [arXiv:1510.07754]
447  DD_EX(PICO_60_2017) // C. Amole et al., arXiv:1702.07666
448  DD_EX(PICO_60_2019) // C. Amole et al., arXiv:1902.04031
449  DD_EX(PICO_500) // S. Fallows, talk at TAUP 2017
450 
451  // Just in case, to make sure we don't mess with other things elsewhere.
452  #undef DD_EX
453 
454  }
455 }
error & DarkBit_error()
void sigma_SD_n_simple(double &result)
Simple calculator of the spin-dependent WIMP-neutron cross-section.
const double m_proton
void sigma_SI_p_simple(double &result)
Simple calculator of the spin-independent WIMP-proton cross-section.
const double m_neutron
#define LOCAL_INFO
Definition: local_info.hpp:34
void DD_couplings_DarkSUSY_DS5(DM_nucleon_couplings &result)
Get direct detection couplings from initialized DarkSUSY 5.
void sigma_SI_n_simple(double &result)
Simple calculator of the spin-independent WIMP-neutron cross-section.
void DD_couplings_MicrOmegas(DM_nucleon_couplings &result)
Get direct detection couplings from initialized MicrOmegas.
void sigma_SI_vnqn(map_intpair_dbl &result)
Calculation of SI and SD cross sections at a reference momentum q0 for the fermionic Higgs portal mod...
GAMBIT error class.
Definition: exceptions.hpp:136
const double pi
std::map< std::pair< int, int >, double > map_intpair_dbl
Shorthand for an int-int pair to double map.
Definition: util_types.hpp:86
const Logging::endofmessage EOM
Explicit const instance of the end of message struct in Gambit namespace.
Definition: logger.hpp:100
#define DD_EX(EXPERIMENT)
Defines functions to perform the DDCalc internal rate calculations, and extract the results and log l...
Header file that includes all GAMBIT headers required for a module source file.
EXPORT_SYMBOLS Logging::LogMaster & logger()
Function to retrieve a reference to the Gambit global log object.
Definition: logger.cpp:95
void DD_couplings_DarkSUSY_MSSM(DM_nucleon_couplings &result)
Get direct detection couplings from DarkSUSY 6 initialized with MSSM module.
const double gev2cm2
void sigma_SD_vnqn(map_intpair_dbl &result)
Rollcall header for module DarkBit.
double pow(const double &a)
Outputs a^i.
void sigma_SD_p_simple(double &result)
Simple calculator of the spin-dependent WIMP-proton cross-section.
T byVal(T t)
Redirection function to turn an lvalue into an rvalue, so that it is correctly passed by value when d...
TODO: see if we can use this one:
Definition: Analysis.hpp:33