Version: SMASH-3.4
parametrizations.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2013-2026
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #include "smash/parametrizations.h"
11 
12 #include <cmath>
13 #include <initializer_list>
14 #include <iostream>
15 #include <memory>
16 #include <set>
17 #include <vector>
18 
19 #include "smash/average.h"
20 #include "smash/clebschgordan.h"
21 #include "smash/constants.h"
22 #include "smash/interpolation.h"
23 #include "smash/kinematics.h"
24 #include "smash/lowess.h"
26 #include "smash/pow.h"
27 
28 namespace smash {
29 
30 bool parametrization_exists(const PdgCode& pdg_a, const PdgCode& pdg_b) {
31  const bool two_nucleons = pdg_a.is_nucleon() && pdg_b.is_nucleon();
32  const bool nucleon_and_kaon = (pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
33  (pdg_a.is_kaon() && pdg_b.is_nucleon());
34  const bool nucleon_and_pion = (pdg_a.is_nucleon() && pdg_b.is_pion()) ||
35  (pdg_a.is_pion() && pdg_b.is_nucleon());
36  const bool two_pions = pdg_a.is_pion() && pdg_b.is_pion();
37  return two_nucleons || nucleon_and_kaon || nucleon_and_pion || two_pions;
38 }
39 
40 double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma,
41  double mb, double P, double R1, double R2) {
42  const double M = 2.1206;
43  const double H = 0.272;
44  const double eta1 = 0.4473;
45  const double eta2 = 0.5486;
46  const double s_sab = mandelstam_s / (ma + mb + M) / (ma + mb + M);
47  double xs =
48  H * std::log(s_sab) * std::log(s_sab) + P + R1 * std::pow(s_sab, -eta1);
49  xs = is_opposite_charge ? xs + R2 * std::pow(s_sab, -eta2)
50  : xs - R2 * std::pow(s_sab, -eta2);
51  return xs;
52 }
53 
54 double pp_high_energy(double mandelstam_s) {
55  return xs_high_energy(mandelstam_s, false, 0.939, 0.939, 34.41, 13.07, 7.394);
56 }
57 
58 double ppbar_high_energy(double mandelstam_s) {
59  return xs_high_energy(mandelstam_s, true, 0.939, 0.939, 34.41, 13.07, 7.394);
60 }
61 
62 double np_high_energy(double mandelstam_s) {
63  return xs_high_energy(mandelstam_s, false, 0.939, 0.939, 34.41, 12.52, 6.66);
64 }
65 
66 double npbar_high_energy(double mandelstam_s) {
67  return xs_high_energy(mandelstam_s, true, 0.939, 0.939, 34.41, 12.52, 6.66);
68 }
69 
70 double piplusp_high_energy(double mandelstam_s) {
71  return xs_high_energy(mandelstam_s, false, 0.939, 0.138, 18.75, 9.56, 1.767);
72 }
73 
74 double piminusp_high_energy(double mandelstam_s) {
75  return xs_high_energy(mandelstam_s, true, 0.939, 0.138, 18.75, 9.56, 1.767);
76 }
77 
78 double xs_ppbar_annihilation(double mandelstam_s) {
79  const double xs_ref = 120.;
80  const double s_ref = 4. * nucleon_mass * nucleon_mass;
81  const double constant_a = 0.05;
82  const double constant_b = 0.6;
83  const double factor = constant_a * constant_a * s_ref /
84  ((mandelstam_s - s_ref) * (mandelstam_s - s_ref) +
85  constant_a * constant_a * s_ref) +
86  constant_b;
87  return xs_ref * (s_ref / mandelstam_s) * factor;
88 }
89 
90 double xs_string_hard(double mandelstam_s, double xs_0, double e_0,
91  double lambda_pow) {
92  const double sqrts = std::sqrt(mandelstam_s);
93  if (sqrts < e_0) {
94  return 0.;
95  } else {
96  double xs = xs_0 * std::pow(std::log(sqrts / e_0), lambda_pow);
97  return xs;
98  }
99 }
100 
101 double NN_string_hard(double mandelstam_s) {
102  return xs_string_hard(mandelstam_s, 0.087, 4.1, 3.8);
103 }
104 
105 double Npi_string_hard(double mandelstam_s) {
106  return xs_string_hard(mandelstam_s, 0.042, 3.5, 4.2);
107 }
108 
109 double pipi_string_hard(double mandelstam_s) {
110  return xs_string_hard(mandelstam_s, 0.013, 2.3, 4.7);
111 }
112 
113 double pipluspiminus_total(double sqrts) {
114  if (pipluspiminus_total_interpolation == nullptr) {
115  auto [dedup_x, dedup_y] =
117  dedup_y = smooth(dedup_x, dedup_y, 0.01, 10);
119  std::make_unique<InterpolateDataLinear<double>>(
120  dedup_x, dedup_y, ExtrapolationType::Constant);
121  }
122  const double last = *(PIPLUSPIMINUS_TOT_SQRTS.end() - 1);
123  if (sqrts < last)
124  return (*pipluspiminus_total_interpolation)(sqrts);
125  else
126  return pipi_string_hard(sqrts * sqrts);
127 }
128 
129 double pizeropizero_total(double sqrts) {
130  if (pizeropizero_total_interpolation == nullptr) {
131  auto [dedup_x, dedup_y] =
132  dedup_avg<double>(PIZEROPIZERO_TOT_SQRTS, PIZEROPIZERO_TOT_SIG);
133  dedup_y = smooth(dedup_x, dedup_y, 0.01, 10);
135  std::make_unique<InterpolateDataLinear<double>>(
136  dedup_x, dedup_y, ExtrapolationType::Constant);
137  }
138  const double last = *(PIZEROPIZERO_TOT_SQRTS.end() - 1);
139  if (sqrts < last)
140  return (*pizeropizero_total_interpolation)(sqrts);
141  else
142  return pipi_string_hard(sqrts * sqrts);
143 }
144 
145 double piplusp_total(double sqrts) {
146  if (piplusp_total_interpolation == nullptr) {
147  auto [dedup_x, dedup_y] =
148  dedup_avg<double>(PIPLUSP_TOT_SQRTS, PIPLUSP_TOT_SIG);
149  dedup_y = smooth(dedup_x, dedup_y, 0.01, 10);
151  std::make_unique<InterpolateDataLinear<double>>(
152  dedup_x, dedup_y, ExtrapolationType::Constant);
153  }
154  const double last = *(PIPLUSP_TOT_SQRTS.end() - 1);
155  if (sqrts < last)
156  return (*piplusp_total_interpolation)(sqrts);
157  else
158  return piplusp_high_energy(sqrts * sqrts);
159 }
160 
161 /* pi+ p elastic cross section parametrization, PDG data.
162  *
163  * The PDG data is smoothed using the LOWESS algorithm. If more than one
164  * cross section was given for one p_lab value, the corresponding cross sections
165  * are averaged. */
166 static double piplusp_elastic_pdg(double mandelstam_s) {
167  if (piplusp_elastic_interpolation == nullptr) {
168  auto [dedup_x, dedup_y] =
169  dedup_avg<double>(PIPLUSP_ELASTIC_P_LAB, PIPLUSP_ELASTIC_SIG);
170  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
172  std::make_unique<InterpolateDataLinear<double>>(
173  dedup_x, dedup_y, ExtrapolationType::Constant);
174  }
175  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
176  return (*piplusp_elastic_interpolation)(p_lab);
177 }
178 
179 double piplusp_elastic_AQM(double mandelstam_s, double m1, double m2) {
180  const double p_lab =
181  plab_from_s_heavier_particle_at_rest(mandelstam_s, m1, m2);
182  if (p_lab < 3.05) { // the plab from which the param starts to explode
183  return 7.5; // this will be scaled down by 2/3 for meson-meson
184  } else {
185  const auto logp = std::log(p_lab);
186  return 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
187  }
188 }
189 
190 double piplusp_elastic(double mandelstam_s) {
191  double sigma;
192  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
193  if (mandelstam_s < 2.25) {
194  sigma = really_small;
195  } else if (mandelstam_s > 4.84) {
196  const auto logp = std::log(p_lab);
197  sigma = 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
198  } else {
199  sigma = piplusp_elastic_pdg(mandelstam_s);
200  }
201 
202  // The elastic contributions from decays still need to be subtracted.
203  if (piplusp_elastic_res_interpolation == nullptr) {
204  std::vector<double> x = PIPLUSP_RES_SQRTS;
205  for (auto& i : x) {
206  i = i * i;
207  }
208  std::vector<double> y = PIPLUSP_RES_SIG;
209  piplusp_elastic_res_interpolation = std::make_unique<InterpolateDataSpline>(
211  }
212  sigma -= (*piplusp_elastic_res_interpolation)(mandelstam_s);
213  if (sigma < 0) {
214  sigma = really_small;
215  }
216  return sigma;
217 }
218 
219 /* pi+ p to Sigma+ K+ cross section parametrization, PDG data.
220  *
221  * The PDG data is smoothed using the LOWESS algorithm. If more than one
222  * cross section was given for one p_lab value, the corresponding cross sections
223  * are averaged. */
224 double piplusp_sigmapluskplus_pdg(double mandelstam_s) {
225  if (piplusp_sigmapluskplus_interpolation == nullptr) {
226  auto [dedup_x, dedup_y] = dedup_avg<double>(PIPLUSP_SIGMAPLUSKPLUS_P_LAB,
228  dedup_y = smooth(dedup_x, dedup_y, 0.2, 5);
230  std::make_unique<InterpolateDataLinear<double>>(
231  dedup_x, dedup_y, ExtrapolationType::Constant);
232  }
233  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
234  /* If p_lab is beyond the upper bound of the linear interpolation,
235  * InterpolateDataLinear will return the value at the upper bound if
236  * ExtrapolationType::Constant is set and this is what we want here. */
237  return (*piplusp_sigmapluskplus_interpolation)(p_lab);
238 }
239 
240 double piminusp_total(double sqrts) {
241  if (piminusp_total_interpolation == nullptr) {
242  auto [dedup_x, dedup_y] =
243  dedup_avg<double>(PIMINUSP_TOT_SQRTS, PIMINUSP_TOT_SIG);
244  dedup_y = smooth(dedup_x, dedup_y, 0.01, 6);
246  std::make_unique<InterpolateDataLinear<double>>(
247  dedup_x, dedup_y, ExtrapolationType::Constant);
248  }
249  const double last = *(PIMINUSP_TOT_SQRTS.end() - 1);
250  if (sqrts < last)
251  return (*piminusp_total_interpolation)(sqrts);
252  else
253  return piminusp_high_energy(sqrts * sqrts);
254 }
255 
256 /* pi- p elastic cross section parametrization, PDG data.
257  *
258  * The PDG data is smoothed using the LOWESS algorithm. If more than one
259  * cross section was given for one p_lab value, the corresponding cross sections
260  * are averaged. */
261 static double piminusp_elastic_pdg(double mandelstam_s) {
262  if (piminusp_elastic_interpolation == nullptr) {
263  auto [dedup_x, dedup_y] =
264  dedup_avg<double>(PIMINUSP_ELASTIC_P_LAB, PIMINUSP_ELASTIC_SIG);
265  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
267  std::make_unique<InterpolateDataLinear<double>>(
268  dedup_x, dedup_y, ExtrapolationType::Constant);
269  }
270  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
271  return (*piminusp_elastic_interpolation)(p_lab);
272 }
273 
274 double piminusp_elastic(double mandelstam_s) {
275  double sigma;
276  if (mandelstam_s < 1.69) {
277  sigma = really_small;
278  } else if (mandelstam_s > 4.84) {
279  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
280  /* std::log(0) = -∞ and std::pow(0, negative) = +∞ both raise FE_DIVBYZERO.
281  * Handle this case explicitly to preserve the mathematical result without
282  * raising a floating-point exception. */
283  if (p_lab == 0.0) {
284  sigma = std::numeric_limits<double>::infinity();
285  } else {
286  const auto logp = std::log(p_lab);
287  sigma = 1.76 + 11.2 * std::pow(p_lab, -0.64) + 0.043 * logp * logp;
288  }
289  } else {
290  sigma = piminusp_elastic_pdg(mandelstam_s);
291  }
292  /* Tune down the elastic cross section when sqrt s is between 1.8 GeV
293  * and 1.97 GeV so that the total cross section can fit the data. The
294  * scaling factor is chosen so that the it's equal to one and its
295  * derivate vanishes at the both ends. The minimum scaling factor in this
296  * region is 0.88-0.12=0.76. */
297  if (mandelstam_s > 3.24 && mandelstam_s < 3.8809) {
298  sigma *= (0.12 * std::cos(2 * M_PI * (std::sqrt(mandelstam_s) - 1.8) /
299  (1.97 - 1.8)) +
300  0.88);
301  }
302  // The elastic contributions from decays still need to be subtracted.
303  if (piminusp_elastic_res_interpolation == nullptr) {
304  std::vector<double> x = PIMINUSP_RES_SQRTS;
305  for (auto& i : x) {
306  i = i * i;
307  }
308  std::vector<double> y = PIMINUSP_RES_SIG;
309  auto [dedup_x, dedup_y] = dedup_avg(x, y);
311  std::make_unique<InterpolateDataSpline>(dedup_x, dedup_y,
313  }
314  sigma -= (*piminusp_elastic_res_interpolation)(mandelstam_s);
315  if (sigma < 0) {
316  sigma = really_small;
317  }
318  return sigma;
319 }
320 
321 /* pi- p -> Lambda K0 cross section parametrization, PDG data.
322  *
323  * The PDG data is smoothed using the LOWESS algorithm. If more than one
324  * cross section was given for one p_lab value, the corresponding cross sections
325  * are averaged. */
326 double piminusp_lambdak0_pdg(double mandelstam_s) {
327  if (piminusp_lambdak0_interpolation == nullptr) {
328  auto [dedup_x, dedup_y] =
330  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
332  std::make_unique<InterpolateDataLinear<double>>(
333  dedup_x, dedup_y, ExtrapolationType::Constant);
334  }
335  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
336  return (*piminusp_lambdak0_interpolation)(p_lab);
337 }
338 
339 /* pi- p -> Sigma- K+ cross section parametrization, PDG data.
340  *
341  * The PDG data is smoothed using the LOWESS algorithm. If more than one
342  * cross section was given for one p_lab value, the corresponding cross sections
343  * are averaged. */
344 double piminusp_sigmaminuskplus_pdg(double mandelstam_s) {
346  auto [dedup_x, dedup_y] = dedup_avg<double>(PIMINUSP_SIGMAMINUSKPLUS_P_LAB,
348  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
350  std::make_unique<InterpolateDataLinear<double>>(
351  dedup_x, dedup_y, ExtrapolationType::Constant);
352  }
353  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
355 }
356 
357 /* pi- p -> Sigma0 K0 cross section parametrization, resonance contribution.
358  *
359  * The data is smoothed using the LOWESS algorithm. If more than one
360  * cross section was given for one sqrts value, the corresponding cross sections
361  * are averaged. */
362 double piminusp_sigma0k0_res(double mandelstam_s) {
363  if (piminusp_sigma0k0_interpolation == nullptr) {
364  auto [dedup_x, dedup_y] = dedup_avg<double>(PIMINUSP_SIGMA0K0_RES_SQRTS,
366  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
368  std::make_unique<InterpolateDataLinear<double>>(
369  dedup_x, dedup_y, ExtrapolationType::Constant);
370  }
371  const double sqrts = std::sqrt(mandelstam_s);
372  return (*piminusp_sigma0k0_interpolation)(sqrts);
373 }
374 
375 double pp_elastic(double mandelstam_s) {
376  const double p_lab = plab_from_s(mandelstam_s);
377  if (p_lab < 0.435) {
378  return 5.12 * nucleon_mass /
379  (mandelstam_s - 4 * nucleon_mass * nucleon_mass) +
380  1.67;
381  } else if (p_lab < 0.8) {
382  return 23.5 + 1000 * pow_int(p_lab - 0.7, 4);
383  } else if (p_lab < 2.0) {
384  return 1250 / (p_lab + 50) - 4 * (p_lab - 1.3) * (p_lab - 1.3);
385  } else if (p_lab < 2.776) {
386  return 77 / (p_lab + 1.5);
387  } else {
388  const auto logp = std::log(p_lab);
389  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
390  1.85 * logp;
391  }
392 }
393 
394 double pp_elastic_high_energy(double mandelstam_s, double m1, double m2) {
395  const double p_lab =
396  plab_from_s_heavier_particle_at_rest(mandelstam_s, m1, m2);
397  /* std::log(0) = -∞ and std::pow(0, negative) = +∞ both raise FE_DIVBYZERO.
398  * Handle this case explicitly to preserve the mathematical result without
399  * raising a floating-point exception. */
400  if (p_lab == 0.0) {
401  return std::numeric_limits<double>::infinity();
402  } else {
403  const auto logp = std::log(p_lab);
404  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
405  1.85 * logp;
406  }
407 }
408 
409 double pp_total(double mandelstam_s) {
410  const double p_lab = plab_from_s(mandelstam_s);
411  if (p_lab < 0.4) {
412  return 34 * std::pow(p_lab / 0.4, -2.104);
413  } else if (p_lab < 0.8) {
414  return 23.5 + 1000 * pow_int(p_lab - 0.7, 4);
415  } else if (p_lab < 1.5) {
416  return 23.5 + 24.6 / (1 + std::exp(-(p_lab - 1.2) / 0.1));
417  } else if (p_lab < 5.0) {
418  return 41 + 60 * (p_lab - 0.9) * std::exp(-1.2 * p_lab);
419  } else {
420  const auto logp = std::log(p_lab);
421  return 48.0 + 0.522 * logp * logp - 4.51 * logp;
422  }
423 }
424 
425 double np_elastic(double mandelstam_s) {
426  const double p_lab = plab_from_s(mandelstam_s);
427  if (p_lab < 0.525) {
428  return 17.05 * nucleon_mass /
429  (mandelstam_s - 4 * nucleon_mass * nucleon_mass) -
430  6.83;
431  } else if (p_lab < 0.8) {
432  return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
433  } else if (p_lab < 2.0) {
434  return 31 / std::sqrt(p_lab);
435  } else if (p_lab < 2.776) {
436  return 77 / (p_lab + 1.5);
437  } else {
438  const auto logp = std::log(p_lab);
439  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
440  1.85 * logp;
441  }
442 }
443 
444 double np_total(double mandelstam_s) {
445  const double p_lab = plab_from_s(mandelstam_s);
446  const auto logp = std::log(p_lab);
447  if (p_lab < 0.4) {
448  return 6.3555 * std::pow(p_lab, -3.2481) * std::exp(-0.377 * logp * logp);
449  } else if (p_lab < 1.0) {
450  return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
451  } else if (p_lab < 2.0) {
452  return 24.2 + 8.9 * p_lab;
453  } else if (p_lab < 5.0) {
454  return 42;
455  } else {
456  return 48.0 + 0.522 * logp * logp - 4.51 * logp;
457  }
458 }
459 
460 double ppbar_elastic(double mandelstam_s) {
461  if (mandelstam_s < 4 * nucleon_mass * nucleon_mass) {
462  // Needed, since called directly from p_52
463  return 0.0;
464  }
465  const double p_lab = plab_from_s(mandelstam_s);
466  if (p_lab < 0.3) {
467  return 78.6;
468  } else if (p_lab < 5.0) {
469  return 31.6 + 18.3 / p_lab - 1.1 / (p_lab * p_lab) - 3.8 * p_lab;
470  } else {
471  const auto logp = std::log(p_lab);
472  return 10.2 + 52.7 * std::pow(p_lab, -1.16) + 0.125 * logp * logp -
473  1.28 * logp;
474  }
475 }
476 
477 double ppbar_total(double mandelstam_s) {
478  if (mandelstam_s < 4 * nucleon_mass * nucleon_mass) {
479  // Needed, since called directly from p_52
480  return 0.0;
481  }
482  const double p_lab = plab_from_s(mandelstam_s);
483  if (p_lab < 0.3) {
484  return 271.6 * std::exp(-1.1 * p_lab * p_lab);
485  } else if (p_lab < 5.0) {
486  return 75.0 + 43.1 / p_lab + 2.6 / (p_lab * p_lab) - 3.9 * p_lab;
487  } else {
488  const auto logp = std::log(p_lab);
489  return 38.4 + 77.6 * std::pow(p_lab, -0.64) + 0.26 * logp * logp -
490  1.2 * logp;
491  }
492 }
493 
494 double deuteron_pion_elastic(double mandelstam_s) {
495  const double tmp = std::sqrt(mandelstam_s) - 2.172;
496  return 4.0 + 0.27 / (tmp * tmp + 0.065 * 0.065);
497 }
498 
499 double deuteron_nucleon_elastic(double mandelstam_s) {
500  const double excess = (mandelstam_s - 7.93);
501  const double excess_sqr = excess * excess;
502  return 2500.0 * std::exp(-excess_sqr / 0.003) +
503  600.0 * std::exp(-excess_sqr / 0.1) + 10.0;
504 }
505 
506 double deuteron_pion_inelastic(double pion_kinetic_energy) {
507  const double x = pion_kinetic_energy;
508  return x * (4.3 + 10.0 * x) / ((x - 0.16) * (x - 0.16) + 0.007);
509 }
510 
511 double deuteron_nucleon_inelastic(double N_kinetic_energy) {
512  const double x = N_kinetic_energy;
513  return x * (1.0 + 50 * x) / (x * x + 0.01) +
514  4 * x / ((x - 0.008) * (x - 0.008) + 0.0004);
515 }
516 
517 double deuteron_antinucleon_inelastic(double aN_kinetic_energy) {
518  return 55.0 / (aN_kinetic_energy + 0.17);
519 }
520 
521 double kplusp_total(double mandelstam_s) {
522  if (kplusp_total_interpolation == nullptr) {
523  auto [dedup_x, dedup_y] =
524  dedup_avg<double>(KPLUSP_TOT_PLAB, KPLUSP_TOT_SIG);
525  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
527  std::make_unique<InterpolateDataLinear<double>>(
528  dedup_x, dedup_y, ExtrapolationType::Constant);
529  }
530  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
531  return (*kplusp_total_interpolation)(p_lab);
532 }
533 
534 double kplusn_total(double mandelstam_s) {
535  if (kplusn_total_interpolation == nullptr) {
536  auto [dedup_x, dedup_y] =
537  dedup_avg<double>(KPLUSN_TOT_PLAB, KPLUSN_TOT_SIG);
538  dedup_y = smooth(dedup_x, dedup_y, 0.05, 5);
540  std::make_unique<InterpolateDataLinear<double>>(
541  dedup_x, dedup_y, ExtrapolationType::Constant);
542  }
543  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
544  return (*kplusn_total_interpolation)(p_lab);
545 }
546 
547 double kminusp_total(double mandelstam_s) {
548  if (kminusp_total_interpolation == nullptr) {
549  auto [dedup_x, dedup_y] =
550  dedup_avg<double>(KMINUSP_TOT_PLAB, KMINUSP_TOT_SIG);
551  // Parametrization data KMINUSP_TOT_PLAB, KMINUSP_TOT_SIG is pre-smoothed
552  dedup_y = smooth(dedup_x, dedup_y, 0.01, 5);
554  std::make_unique<InterpolateDataLinear<double>>(
555  dedup_x, dedup_y, ExtrapolationType::Constant);
556  }
557  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
558  return (*kminusp_total_interpolation)(p_lab);
559 }
560 
561 double kminusn_total(double mandelstam_s) {
562  if (kminusn_total_interpolation == nullptr) {
563  auto [dedup_x, dedup_y] =
564  dedup_avg<double>(KMINUSN_TOT_PLAB, KMINUSN_TOT_SIG);
565  dedup_y = smooth(dedup_x, dedup_y, 0.05, 5);
567  std::make_unique<InterpolateDataLinear<double>>(
568  dedup_x, dedup_y, ExtrapolationType::Constant);
569  }
570  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
571  return (*kminusn_total_interpolation)(p_lab);
572 }
573 
574 double kplusp_elastic_background(double mandelstam_s) {
575  constexpr double a0 = 10.508; // mb
576  constexpr double a1 = -3.716; // mb/GeV
577  constexpr double a2 = 1.845; // mb/GeV^2
578  constexpr double a3 = -0.764; // GeV^-1
579  constexpr double a4 = 0.508; // GeV^-2
580 
581  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
582  const double p_lab2 = p_lab * p_lab;
583 
584  return (a0 + a1 * p_lab + a2 * p_lab2) / (1 + a3 * p_lab + a4 * p_lab2);
585 }
586 
587 double kplusn_elastic_background(double mandelstam_s) {
588  return 0.25 * kplusp_elastic_background(mandelstam_s);
589 }
590 
591 double kplusn_k0p(double mandelstam_s) {
592  return 0.25 * kplusp_elastic_background(mandelstam_s);
593 }
594 
595 /* K- p elastic cross section parametrization, PDG data.
596  *
597  * The PDG data is smoothed using the LOWESS algorithm. If more than one
598  * cross section was given for one p_lab value, the corresponding cross sections
599  * are averaged. */
600 static double kminusp_elastic_pdg(double mandelstam_s) {
601  if (kminusp_elastic_interpolation == nullptr) {
602  auto [dedup_x, dedup_y] =
603  dedup_avg<double>(KMINUSP_ELASTIC_P_LAB, KMINUSP_ELASTIC_SIG);
604  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
606  std::make_unique<InterpolateDataLinear<double>>(
607  dedup_x, dedup_y, ExtrapolationType::Constant);
608  }
609  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
610  return (*kminusp_elastic_interpolation)(p_lab);
611 }
612 
613 double kminusp_elastic_background(double mandelstam_s) {
614  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
615  double sigma;
616  if (std::sqrt(mandelstam_s) < 1.68) {
617  /* The parametrization here also works for anti-K0 n, Lambda pi0,
618  * Sigma+ pi-, Sigma- pi+, Sigma0 pi0 with different parameters a0, a1, a2.
619  *
620  * The values of the parameters are *not* taken from the source above,
621  * they come from a fit to PDG data. */
622  constexpr double a0 = 186.03567644; // mb GeV^2
623  constexpr double a1 = 0.22002795; // Gev
624  constexpr double a2 = 0.64907116;
625 
626  /* In sigma a ratio p_i/p_f is omitted as both are set to p_lab. Keeping it
627  * is unnecessary and it would trigger a FPE if p_lab were zero. */
628  const double ratio = a1 * a1 / (a1 * a1 + p_lab * p_lab);
629  sigma = a0 / mandelstam_s * std::pow(ratio, a2);
630  } else {
631  sigma = kminusp_elastic_pdg(mandelstam_s);
632  }
633  // The elastic contributions from decays still need to be subtracted.
634  if (kminusp_elastic_res_interpolation == nullptr) {
635  std::vector<double> x = KMINUSP_RES_SQRTS;
636  for (auto& i : x) {
637  i = plab_from_s(i * i, kaon_mass, nucleon_mass);
638  }
639  std::vector<double> y = KMINUSP_RES_SIG;
640  kminusp_elastic_res_interpolation = std::make_unique<InterpolateDataSpline>(
642  }
643  const auto old_sigma = sigma;
644  sigma -= (*kminusp_elastic_res_interpolation)(p_lab);
645  if (sigma < 0) {
646  std::cout << "NEGATIVE SIGMA: sigma=" << sigma
647  << ", sqrt(s)=" << std::sqrt(mandelstam_s)
648  << ", sig_el_exp=" << old_sigma
649  << ", sig_el_res=" << (*kminusp_elastic_res_interpolation)(p_lab)
650  << std::endl;
651  }
652  assert(sigma >= 0);
653  return sigma;
654 }
655 
656 double kminusn_elastic_background(double) { return 4.0; }
657 
658 double k0p_elastic_background(double mandelstam_s) {
659  // by isospin symmetry
660  return kplusn_elastic_background(mandelstam_s);
661 }
662 
663 double k0n_elastic_background(double mandelstam_s) {
664  // by isospin symmetry
665  return kplusp_elastic_background(mandelstam_s);
666 }
667 
668 double kbar0p_elastic_background(double mandelstam_s) {
669  // by isospin symmetry
670  return kminusn_elastic_background(mandelstam_s);
671 }
672 
673 double kbar0n_elastic_background(double mandelstam_s) {
674  // by isospin symmetry
675  return kminusp_elastic_background(mandelstam_s);
676 }
677 
678 double kplusp_inelastic_background(double mandelstam_s) {
679  if (kplusp_total_interpolation == nullptr) {
680  auto [dedup_x, dedup_y] =
681  dedup_avg<double>(KPLUSP_TOT_PLAB, KPLUSP_TOT_SIG);
682  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
684  std::make_unique<InterpolateDataLinear<double>>(
685  dedup_x, dedup_y, ExtrapolationType::Constant);
686  }
687  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
689  mandelstam_s);
690 }
691 
692 double kplusn_inelastic_background(double mandelstam_s) {
693  if (kplusn_total_interpolation == nullptr) {
694  auto [dedup_x, dedup_y] =
695  dedup_avg<double>(KPLUSN_TOT_PLAB, KPLUSN_TOT_SIG);
696  dedup_y = smooth(dedup_x, dedup_y, 0.05, 5);
698  std::make_unique<InterpolateDataLinear<double>>(
699  dedup_x, dedup_y, ExtrapolationType::Constant);
700  }
701  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
703  mandelstam_s) -
704  kplusn_k0p(mandelstam_s);
705 }
706 
707 /**
708  * Calculate and store isospin ratios for K N -> K Delta reactions.
709  *
710  * See the documentation of `KaonNucleonRatios` for details.
711  *
712  * \param[in] ratios An empty map where the ratios for K N -> K Delta
713  * reactions are stored.
714  */
715 static void initialize(std::unordered_map<std::pair<uint64_t, uint64_t>, double,
716  pair_hash>& ratios) {
717  const auto& type_p = ParticleType::find(pdg::p);
718  const auto& type_n = ParticleType::find(pdg::n);
719  const auto& type_K_p = ParticleType::find(pdg::K_p);
720  const auto& type_K_z = ParticleType::find(pdg::K_z);
721  const auto& type_Delta_pp = ParticleType::find(pdg::Delta_pp);
722  const auto& type_Delta_p = ParticleType::find(pdg::Delta_p);
723  const auto& type_Delta_z = ParticleType::find(pdg::Delta_z);
724  const auto& type_Delta_m = ParticleType::find(pdg::Delta_m);
725 
726  /* Store the isospin ratio of the given reaction relative to all other
727  * possible isospin-symmetric reactions. */
728  auto add_to_ratios = [&](const ParticleType& a, const ParticleType& b,
729  const ParticleType& c, const ParticleType& d,
730  double weight_numerator, double weight_other) {
731  assert(weight_numerator + weight_other != 0);
732  const auto key =
733  std::make_pair(pack(a.pdgcode().code(), b.pdgcode().code()),
734  pack(c.pdgcode().code(), d.pdgcode().code()));
735  const double ratio = weight_numerator / (weight_numerator + weight_other);
736  ratios[key] = ratio;
737  };
738 
739  /* All inelastic channels are K N -> K Delta -> K pi N or charge exchange,
740  * with identical cross section, weighted by the isospin factor.
741  *
742  * For charge exchange, the isospin factors are 1,
743  * so they are excluded here. */
744  {
745  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
746  type_p, type_K_p, type_K_z, type_Delta_pp);
747  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
748  type_p, type_K_p, type_K_p, type_Delta_p);
749 
750  add_to_ratios(type_p, type_K_p, type_K_z, type_Delta_pp, weight1, weight2);
751  add_to_ratios(type_p, type_K_p, type_K_p, type_Delta_p, weight2, weight1);
752  }
753  {
754  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
755  type_n, type_K_p, type_K_z, type_Delta_p);
756  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
757  type_n, type_K_p, type_K_p, type_Delta_z);
758 
759  add_to_ratios(type_n, type_K_p, type_K_z, type_Delta_p, weight1, weight2);
760  add_to_ratios(type_n, type_K_p, type_K_p, type_Delta_z, weight2, weight1);
761  }
762  /* K+ and K0 have the same mass and spin, their cross sections are assumed to
763  * only differ in isospin factors. */
764  {
765  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
766  type_p, type_K_z, type_K_z, type_Delta_p);
767  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
768  type_p, type_K_z, type_K_p, type_Delta_z);
769 
770  add_to_ratios(type_p, type_K_z, type_K_z, type_Delta_p, weight1, weight2);
771  add_to_ratios(type_p, type_K_z, type_K_p, type_Delta_z, weight2, weight1);
772  }
773  {
774  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
775  type_n, type_K_z, type_K_z, type_Delta_z);
776  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
777  type_n, type_K_z, type_K_p, type_Delta_m);
778 
779  add_to_ratios(type_n, type_K_z, type_K_z, type_Delta_z, weight1, weight2);
780  add_to_ratios(type_n, type_K_z, type_K_p, type_Delta_m, weight2, weight1);
781  }
782 }
783 
785  const ParticleType& b,
786  const ParticleType& c,
787  const ParticleType& d) const {
788  /* If this method is called with anti-nucleons, flip all particles to
789  * anti-particles; the ratio is equal */
790  int flip = 0;
791  for (const auto& p : {&a, &b, &c, &d}) {
792  if (p->is_nucleon()) {
793  if (flip == 0) {
794  flip = p->antiparticle_sign();
795  } else {
796  assert(p->antiparticle_sign() == flip);
797  }
798  }
799  }
800  const auto key = std::make_pair(
801  pack(a.pdgcode().code() * flip, b.pdgcode().code() * flip),
802  pack(c.pdgcode().code() * flip, d.pdgcode().code() * flip));
803  if (ratios_.empty()) {
805  }
806  return ratios_.at(key);
807 }
808 
809 /*thread_local (see commit 897d0b8)*/ KaonNucleonRatios kaon_nucleon_ratios;
810 
811 double kminusp_kbar0n(double mandelstam_s) {
812  constexpr double a0 = 100; // mb GeV^2
813  constexpr double a1 = 0.15; // GeV
814  constexpr unsigned a2 = 2;
815 
816  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
817 
818  /* In this expression a ratio p_i/p_f is omitted as both are set to p_lab.
819  * Keeping it is unnecessary and it would trigger a FPE if p_lab were zero. */
820  return a0 / mandelstam_s * pow_int(a1 * a1 / (a1 * a1 + p_lab * p_lab), a2);
821 }
822 
823 double kminusp_piminussigmaplus(double sqrts) {
824  return 0.0788265 / ((sqrts - 1.38841) * (sqrts - 1.38841));
825 }
826 
827 double kminusp_piplussigmaminus(double sqrts) {
828  return 0.0196741 / ((sqrts - 1.42318) * (sqrts - 1.42318));
829 }
830 
831 double kminusp_pi0sigma0(double sqrts) {
832  return 0.0403364 / ((sqrts - 1.39830305) * (sqrts - 1.39830305));
833 }
834 
835 double kminusp_pi0lambda(double sqrts) {
836  return 0.05932562 / ((sqrts - 1.38786692) * (sqrts - 1.38786692));
837 }
838 
839 double kminusn_piminussigma0(double sqrts) {
840  return kminusp_piminussigmaplus(sqrts) + kminusp_piplussigmaminus(sqrts) -
841  2. * kminusp_pi0sigma0(sqrts);
842 }
843 
844 double kminusn_piminuslambda(double sqrts) {
845  return 2. * kminusp_pi0lambda(sqrts);
846 }
847 
848 // All K+ p and K+ n channels are forbidden by isospin.
849 
850 double lambdalambda_ximinusp(double sqrts_sqrts0, double p_N, double p_lambda) {
851  assert(p_lambda != 0);
852  assert(sqrts_sqrts0 >= 0);
853  return 37.15 / 2 * p_N / p_lambda * std::pow(sqrts_sqrts0, -0.16);
854 }
855 
856 double lambdalambda_xi0n(double sqrts_sqrts0, double p_N, double p_lambda) {
857  return lambdalambda_ximinusp(sqrts_sqrts0, p_N, p_lambda);
858 }
859 
860 double lambdasigmaplus_xi0p(double sqrts_sqrts0) {
861  assert(sqrts_sqrts0 >= 0);
862  return 24.3781 * std::pow(sqrts_sqrts0, -0.479);
863 }
864 
865 double lambdasigmaminus_ximinusn(double sqrts_sqrts0) {
866  return lambdasigmaplus_xi0p(sqrts_sqrts0);
867 }
868 
869 double lambdasigma0_ximinusp(double sqrts_sqrts0) {
870  assert(sqrts_sqrts0 >= 0);
871  if (sqrts_sqrts0 < 0.03336) {
872  return 6.475 * std::pow(sqrts_sqrts0, -0.4167);
873  } else {
874  return 14.5054 * std::pow(sqrts_sqrts0, -0.1795);
875  }
876 }
877 
878 double lambdasigma0_xi0n(double sqrts_sqrts0) {
879  return lambdasigma0_ximinusp(sqrts_sqrts0);
880 }
881 
882 double sigma0sigma0_ximinusp(double sqrts_sqrts0) {
883  assert(sqrts_sqrts0 >= 0);
884  if (sqrts_sqrts0 < 0.09047) {
885  return 5.625 * std::pow(sqrts_sqrts0, -0.318);
886  } else {
887  return 4.174 * std::pow(sqrts_sqrts0, -0.4421);
888  }
889 }
890 
891 double sigma0sigma0_xi0n(double sqrts_sqrts0) {
892  return sigma0sigma0_ximinusp(sqrts_sqrts0);
893 }
894 
895 double sigmaplussigmaminus_xi0p(double sqrts_sqrts0) {
896  return 4 * sigma0sigma0_ximinusp(sqrts_sqrts0);
897 }
898 
899 double sigma0sigmaminus_ximinusn(double sqrts_sqrts0) {
900  return 4 * sigma0sigma0_ximinusp(sqrts_sqrts0);
901 }
902 
903 double sigmaplussigmaminus_ximinusp(double sqrts_sqrts0) {
904  return 14.194 * std::pow(sqrts_sqrts0, -0.442);
905 }
906 
907 double sigmaplussigmaminus_xi0n(double sqrts_sqrts0) {
908  return sigmaplussigmaminus_ximinusp(sqrts_sqrts0);
909 }
910 
911 std::optional<double> Dzeropiplus_elastic(double sqrts) {
912  if (sqrts > *(DPI_SQRTS.end() - 1)) {
913  return std::nullopt;
914  } else {
915  if (Dzeropiplus_elastic_interpolation == nullptr) {
916  auto [dedup_x, dedup_y] =
917  dedup_avg<double>(DPI_SQRTS, DZEROPIPLUS_ELASTIC_SIG);
919  std::make_unique<InterpolateDataLinear<double>>(
920  dedup_x, dedup_y, ExtrapolationType::Zero);
921  }
922  return (*Dzeropiplus_elastic_interpolation)(sqrts);
923  }
924 }
925 
926 double Dzeropiplus_Dpluspizero(double sqrts) {
927  if (Dzeropiplus_Dpluspizero_interpolation == nullptr) {
928  auto [dedup_x, dedup_y] =
929  dedup_avg<double>(DPI_SQRTS, DZEROPIPLUS_DPLUSPIZERO_SIG);
931  std::make_unique<InterpolateDataLinear<double>>(
932  dedup_x, dedup_y, ExtrapolationType::Constant);
933  }
934  return (*Dzeropiplus_Dpluspizero_interpolation)(sqrts);
935 }
936 
937 std::optional<double> Dzeropiminus_elastic(double sqrts) {
938  if (sqrts > *(DPI_SQRTS.end() - 1)) {
939  return std::nullopt;
940  } else {
941  if (Dzeropiminus_elastic_interpolation == nullptr) {
942  auto [dedup_x, dedup_y] =
943  dedup_avg<double>(DPI_SQRTS, DZEROPIMINUS_ELASTIC_SIG);
945  std::make_unique<InterpolateDataLinear<double>>(
946  dedup_x, dedup_y, ExtrapolationType::Zero);
947  }
948  return (*Dzeropiminus_elastic_interpolation)(sqrts);
949  }
950 }
951 
952 std::optional<double> Dzeropizero_elastic(double sqrts) {
953  if (sqrts > *(DPI_SQRTS.end() - 1)) {
954  return std::nullopt;
955  } else {
956  if (Dzeropizero_elastic_interpolation == nullptr) {
957  auto [dedup_x, dedup_y] =
958  dedup_avg<double>(DPI_SQRTS, DZEROPIZERO_ELASTIC_SIG);
960  std::make_unique<InterpolateDataLinear<double>>(
961  dedup_x, dedup_y, ExtrapolationType::Zero);
962  }
963  return (*Dzeropizero_elastic_interpolation)(sqrts);
964  }
965 }
966 
967 double Dzeropizero_Dpluspiminus(double sqrts) {
969  auto [dedup_x, dedup_y] =
970  dedup_avg<double>(DPI_SQRTS, DZEROPIZERO_DPLUSPIMINUS_SIG);
972  std::make_unique<InterpolateDataLinear<double>>(
973  dedup_x, dedup_y, ExtrapolationType::Constant);
974  }
976 }
977 
978 std::optional<double> Dpluspiplus_elastic(double sqrts) {
979  if (sqrts > *(DPI_SQRTS.end() - 1)) {
980  return std::nullopt;
981  } else {
982  if (Dpluspiplus_elastic_interpolation == nullptr) {
983  auto [dedup_x, dedup_y] =
984  dedup_avg<double>(DPI_SQRTS, DPLUSPIPLUS_ELASTIC_SIG);
986  std::make_unique<InterpolateDataLinear<double>>(
987  dedup_x, dedup_y, ExtrapolationType::Zero);
988  }
989  return (*Dpluspiplus_elastic_interpolation)(sqrts);
990  }
991 }
992 
993 std::optional<double> Dpluspiminus_elastic(double sqrts) {
994  if (sqrts > *(DPI_SQRTS.end() - 1)) {
995  return std::nullopt;
996  } else {
997  if (Dpluspiminus_elastic_interpolation == nullptr) {
998  auto [dedup_x, dedup_y] =
999  dedup_avg<double>(DPI_SQRTS, DPLUSPIMINUS_ELASTIC_SIG);
1001  std::make_unique<InterpolateDataLinear<double>>(
1002  dedup_x, dedup_y, ExtrapolationType::Zero);
1003  }
1004  return (*Dpluspiminus_elastic_interpolation)(sqrts);
1005  }
1006 }
1007 
1008 double Dpluspiminus_Dzeropizero(double sqrts) {
1009  if (Dpluspiminus_Dzeropizero_interpolation == nullptr) {
1010  auto [dedup_x, dedup_y] =
1011  dedup_avg<double>(DPI_SQRTS, DPLUSPIMINUS_DZEROPIZERO_SIG);
1013  std::make_unique<InterpolateDataLinear<double>>(
1014  dedup_x, dedup_y, ExtrapolationType::Constant);
1015  }
1016  return (*Dpluspiminus_Dzeropizero_interpolation)(sqrts);
1017 }
1018 
1019 std::optional<double> Dpluspizero_elastic(double sqrts) {
1020  if (sqrts > *(DPI_SQRTS.end() - 1)) {
1021  return std::nullopt;
1022  } else {
1023  if (Dpluspizero_elastic_interpolation == nullptr) {
1024  auto [dedup_x, dedup_y] =
1025  dedup_avg<double>(DPI_SQRTS, DPLUSPIZERO_ELASTIC_SIG);
1027  std::make_unique<InterpolateDataLinear<double>>(
1028  dedup_x, dedup_y, ExtrapolationType::Zero);
1029  }
1030  return (*Dpluspizero_elastic_interpolation)(sqrts);
1031  }
1032 }
1033 
1034 double Dpluspizero_Dzeropiplus(double sqrts) {
1035  if (Dpluspizero_Dzeropiplus_interpolation == nullptr) {
1036  auto [dedup_x, dedup_y] =
1037  dedup_avg<double>(DPI_SQRTS, DPLUSPIZERO_DZEROPIPLUS_SIG);
1039  std::make_unique<InterpolateDataLinear<double>>(
1040  dedup_x, dedup_y, ExtrapolationType::Constant);
1041  }
1042  return (*Dpluspizero_Dzeropiplus_interpolation)(sqrts);
1043 }
1044 
1045 std::optional<double> Dpluseta_elastic(double sqrts) {
1046  if (sqrts > *(DETA_SQRTS.end() - 1)) {
1047  return std::nullopt;
1048  } else {
1049  if (Dpluseta_elastic_interpolation == nullptr) {
1050  auto [dedup_x, dedup_y] =
1051  dedup_avg<double>(DETA_SQRTS, DPLUSETA_ELASTIC_SIG);
1053  std::make_unique<InterpolateDataLinear<double>>(
1054  dedup_x, dedup_y, ExtrapolationType::Zero);
1055  }
1056  return (*Dpluseta_elastic_interpolation)(sqrts);
1057  }
1058 }
1059 
1060 std::optional<double> Dzeroeta_elastic(double sqrts) {
1061  if (sqrts > *(DETA_SQRTS.end() - 1)) {
1062  return std::nullopt;
1063  } else {
1064  if (Dzeroeta_elastic_interpolation == nullptr) {
1065  auto [dedup_x, dedup_y] =
1066  dedup_avg<double>(DETA_SQRTS, DZEROETA_ELASTIC_SIG);
1068  std::make_unique<InterpolateDataLinear<double>>(
1069  dedup_x, dedup_y, ExtrapolationType::Zero);
1070  }
1071  return (*Dzeroeta_elastic_interpolation)(sqrts);
1072  }
1073 }
1074 
1075 std::optional<double> DplusKplus_elastic(double sqrts) {
1076  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1077  return std::nullopt;
1078  } else {
1079  if (DplusKplus_elastic_interpolation == nullptr) {
1080  auto [dedup_x, dedup_y] =
1081  dedup_avg<double>(DKAON_SQRTS, DPLUSKPLUS_ELASTIC_SIG);
1083  std::make_unique<InterpolateDataLinear<double>>(
1084  dedup_x, dedup_y, ExtrapolationType::Zero);
1085  }
1086  return (*DplusKplus_elastic_interpolation)(sqrts);
1087  }
1088 }
1089 
1090 std::optional<double> DplusKzero_elastic(double sqrts) {
1091  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1092  return std::nullopt;
1093  } else {
1094  if (DplusKzero_elastic_interpolation == nullptr) {
1095  auto [dedup_x, dedup_y] =
1096  dedup_avg<double>(DKAON_SQRTS, DPLUSKZERO_ELASTIC_SIG);
1098  std::make_unique<InterpolateDataLinear<double>>(
1099  dedup_x, dedup_y, ExtrapolationType::Zero);
1100  }
1101  return (*DplusKzero_elastic_interpolation)(sqrts);
1102  }
1103 }
1104 
1105 double DplusKzero_DzeroKplus(double sqrts) {
1106  if (DplusKzero_DzeroKplus_interpolation == nullptr) {
1107  auto [dedup_x, dedup_y] =
1108  dedup_avg<double>(DKAON_SQRTS, DPLUSKZERO_DZEROKPLUS_SIG);
1110  std::make_unique<InterpolateDataLinear<double>>(
1111  dedup_x, dedup_y, ExtrapolationType::Constant);
1112  }
1113  return (*DplusKzero_DzeroKplus_interpolation)(sqrts);
1114 }
1115 
1116 double DzeroKplus_DplusKzero(double sqrts) {
1117  if (DzeroKplus_DplusKzero_interpolation == nullptr) {
1118  auto [dedup_x, dedup_y] =
1119  dedup_avg<double>(DKAON_SQRTS, DZEROKPLUS_DPLUSKZERO_SIG);
1121  std::make_unique<InterpolateDataLinear<double>>(
1122  dedup_x, dedup_y, ExtrapolationType::Constant);
1123  }
1124  return (*DzeroKplus_DplusKzero_interpolation)(sqrts);
1125 }
1126 
1127 std::optional<double> DzeroKplus_elastic(double sqrts) {
1128  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1129  return std::nullopt;
1130  } else {
1131  if (DzeroKplus_elastic_interpolation == nullptr) {
1132  auto [dedup_x, dedup_y] =
1133  dedup_avg<double>(DKAON_SQRTS, DZEROKPLUS_ELASTIC_SIG);
1135  std::make_unique<InterpolateDataLinear<double>>(
1136  dedup_x, dedup_y, ExtrapolationType::Zero);
1137  }
1138  return (*DzeroKplus_elastic_interpolation)(sqrts);
1139  }
1140 }
1141 
1142 std::optional<double> DzeroKzero_elastic(double sqrts) {
1143  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1144  return std::nullopt;
1145  } else {
1146  if (DzeroKzero_elastic_interpolation == nullptr) {
1147  auto [dedup_x, dedup_y] =
1148  dedup_avg<double>(DKAON_SQRTS, DZEROKZERO_ELASTIC_SIG);
1150  std::make_unique<InterpolateDataLinear<double>>(
1151  dedup_x, dedup_y, ExtrapolationType::Zero);
1152  }
1153  return (*DzeroKzero_elastic_interpolation)(sqrts);
1154  }
1155 }
1156 
1157 std::optional<double> DplusKbarzero_elastic(double sqrts) {
1158  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1159  return std::nullopt;
1160  } else {
1161  if (DplusKbarzero_elastic_interpolation == nullptr) {
1162  auto [dedup_x, dedup_y] =
1163  dedup_avg<double>(DKAON_SQRTS, DPLUSKBARZERO_ELASTIC_SIG);
1165  std::make_unique<InterpolateDataLinear<double>>(
1166  dedup_x, dedup_y, ExtrapolationType::Zero);
1167  }
1168  return (*DplusKbarzero_elastic_interpolation)(sqrts);
1169  }
1170 }
1171 
1172 std::optional<double> DplusKminus_elastic(double sqrts) {
1173  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1174  return std::nullopt;
1175  } else {
1176  if (DplusKminus_elastic_interpolation == nullptr) {
1177  auto [dedup_x, dedup_y] =
1178  dedup_avg<double>(DKAON_SQRTS, DPLUSKMINUS_ELASTIC_SIG);
1180  std::make_unique<InterpolateDataLinear<double>>(
1181  dedup_x, dedup_y, ExtrapolationType::Zero);
1182  }
1183  return (*DplusKminus_elastic_interpolation)(sqrts);
1184  }
1185 }
1186 
1187 double DplusKminus_DzeroKbarzero(double sqrts) {
1188  if (DplusKminus_DzeroKbarzero_interpolation == nullptr) {
1189  auto [dedup_x, dedup_y] =
1190  dedup_avg<double>(DKAON_SQRTS, DPLUSKMINUS_DZEROKBARZERO_SIG);
1192  std::make_unique<InterpolateDataLinear<double>>(
1193  dedup_x, dedup_y, ExtrapolationType::Constant);
1194  }
1195  return (*DplusKminus_DzeroKbarzero_interpolation)(sqrts);
1196 }
1197 
1198 double DzeroKbarzero_DplusKminus(double sqrts) {
1199  if (DzeroKbarzero_DplusKminus_interpolation == nullptr) {
1200  auto [dedup_x, dedup_y] =
1201  dedup_avg<double>(DKAON_SQRTS, DZEROKBARZERO_DPLUSKMINUS_SIG);
1203  std::make_unique<InterpolateDataLinear<double>>(
1204  dedup_x, dedup_y, ExtrapolationType::Constant);
1205  }
1206  return (*DzeroKbarzero_DplusKminus_interpolation)(sqrts);
1207 }
1208 
1209 std::optional<double> DzeroKbarzero_elastic(double sqrts) {
1210  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1211  return std::nullopt;
1212  } else {
1213  if (DzeroKbarzero_elastic_interpolation == nullptr) {
1214  auto [dedup_x, dedup_y] =
1215  dedup_avg<double>(DKAON_SQRTS, DZEROKBARZERO_ELASTIC_SIG);
1217  std::make_unique<InterpolateDataLinear<double>>(
1218  dedup_x, dedup_y, ExtrapolationType::Zero);
1219  }
1220  return (*DzeroKbarzero_elastic_interpolation)(sqrts);
1221  }
1222 }
1223 
1224 std::optional<double> DzeroKminus_elastic(double sqrts) {
1225  if (sqrts > *(DKAON_SQRTS.end() - 1)) {
1226  return std::nullopt;
1227  } else {
1228  if (DzeroKminus_elastic_interpolation == nullptr) {
1229  auto [dedup_x, dedup_y] =
1230  dedup_avg<double>(DKAON_SQRTS, DZEROKMINUS_ELASTIC_SIG);
1232  std::make_unique<InterpolateDataLinear<double>>(
1233  dedup_x, dedup_y, ExtrapolationType::Zero);
1234  }
1235  return (*DzeroKminus_elastic_interpolation)(sqrts);
1236  }
1237 }
1238 
1239 std::optional<double> Dstarpluspiplus_elastic(double sqrts) {
1240  if (sqrts > *(DSTARPI_SQRTS.end() - 1)) {
1241  return std::nullopt;
1242  } else {
1243  if (Dstarpluspiplus_elastic_interpolation == nullptr) {
1244  auto [dedup_x, dedup_y] =
1245  dedup_avg<double>(DSTARPI_SQRTS, DSTARPLUSPIPLUS_ELASTIC_SIG);
1247  std::make_unique<InterpolateDataLinear<double>>(
1248  dedup_x, dedup_y, ExtrapolationType::Zero);
1249  }
1250  return (*Dstarpluspiplus_elastic_interpolation)(sqrts);
1251  }
1252 }
1253 
1254 std::optional<double> Dstarpluspiminus_elastic(double sqrts) {
1255  if (sqrts > *(DSTARPI_SQRTS.end() - 1)) {
1256  return std::nullopt;
1257  } else {
1258  if (Dstarpluspiminus_elastic_interpolation == nullptr) {
1259  auto [dedup_x, dedup_y] =
1260  dedup_avg<double>(DSTARPI_SQRTS, DSTARPLUSPIMINUS_ELASTIC_SIG);
1262  std::make_unique<InterpolateDataLinear<double>>(
1263  dedup_x, dedup_y, ExtrapolationType::Zero);
1264  }
1265  return (*Dstarpluspiminus_elastic_interpolation)(sqrts);
1266  }
1267 }
1268 
1269 double Dstarpluspiminus_Dstarzeropizero(double sqrts) {
1271  auto [dedup_x, dedup_y] =
1274  std::make_unique<InterpolateDataLinear<double>>(
1275  dedup_x, dedup_y, ExtrapolationType::Constant);
1276  }
1278 }
1279 
1280 std::optional<double> Dstarpluspizero_elastic(double sqrts) {
1281  if (sqrts > *(DSTARPI_SQRTS.end() - 1)) {
1282  return std::nullopt;
1283  } else {
1284  if (Dstarpluspizero_elastic_interpolation == nullptr) {
1285  auto [dedup_x, dedup_y] =
1286  dedup_avg<double>(DSTARPI_SQRTS, DSTARPLUSPIZERO_ELASTIC_SIG);
1288  std::make_unique<InterpolateDataLinear<double>>(
1289  dedup_x, dedup_y, ExtrapolationType::Zero);
1290  }
1291  return (*Dstarpluspizero_elastic_interpolation)(sqrts);
1292  }
1293 }
1294 
1295 double Dstarpluspizero_Dstarzeropiplus(double sqrts) {
1297  auto [dedup_x, dedup_y] =
1300  std::make_unique<InterpolateDataLinear<double>>(
1301  dedup_x, dedup_y, ExtrapolationType::Constant);
1302  }
1304 }
1305 
1306 double Dstarzeropiplus_Dstarpluspizero(double sqrts) {
1308  auto [dedup_x, dedup_y] =
1311  std::make_unique<InterpolateDataLinear<double>>(
1312  dedup_x, dedup_y, ExtrapolationType::Constant);
1313  }
1315 }
1316 
1317 std::optional<double> Dstarzeropiplus_elastic(double sqrts) {
1318  if (sqrts > *(DSTARPI_SQRTS.end() - 1)) {
1319  return std::nullopt;
1320  } else {
1321  if (Dstarzeropiplus_elastic_interpolation == nullptr) {
1322  auto [dedup_x, dedup_y] =
1323  dedup_avg<double>(DSTARPI_SQRTS, DSTARZEROPIPLUS_ELASTIC_SIG);
1325  std::make_unique<InterpolateDataLinear<double>>(
1326  dedup_x, dedup_y, ExtrapolationType::Zero);
1327  }
1328  return (*Dstarzeropiplus_elastic_interpolation)(sqrts);
1329  }
1330 }
1331 
1332 std::optional<double> Dstarzeropiminus_elastic(double sqrts) {
1333  if (sqrts > *(DSTARPI_SQRTS.end() - 1)) {
1334  return std::nullopt;
1335  } else {
1336  if (Dstarzeropiminus_elastic_interpolation == nullptr) {
1337  auto [dedup_x, dedup_y] =
1338  dedup_avg<double>(DSTARPI_SQRTS, DSTARZEROPIMINUS_ELASTIC_SIG);
1340  std::make_unique<InterpolateDataLinear<double>>(
1341  dedup_x, dedup_y, ExtrapolationType::Zero);
1342  }
1343  return (*Dstarzeropiminus_elastic_interpolation)(sqrts);
1344  }
1345 }
1346 
1347 double Dstarzeropizero_Dstarpluspiminus(double sqrts) {
1349  auto [dedup_x, dedup_y] =
1352  std::make_unique<InterpolateDataLinear<double>>(
1353  dedup_x, dedup_y, ExtrapolationType::Constant);
1354  }
1356 }
1357 
1358 std::optional<double> Dstarzeropizero_elastic(double sqrts) {
1359  if (sqrts > *(DSTARPI_SQRTS.end() - 1)) {
1360  return std::nullopt;
1361  } else {
1362  if (Dstarzeropizero_elastic_interpolation == nullptr) {
1363  auto [dedup_x, dedup_y] =
1364  dedup_avg<double>(DSTARPI_SQRTS, DSTARZEROPIZERO_ELASTIC_SIG);
1366  std::make_unique<InterpolateDataLinear<double>>(
1367  dedup_x, dedup_y, ExtrapolationType::Zero);
1368  }
1369  return (*Dstarzeropizero_elastic_interpolation)(sqrts);
1370  }
1371 }
1372 
1373 std::optional<double> Dstarpluseta_elastic(double sqrts) {
1374  if (sqrts > *(DSTARETA_SQRTS.end() - 1)) {
1375  return std::nullopt;
1376  } else {
1377  if (Dstarpluseta_elastic_interpolation == nullptr) {
1378  auto [dedup_x, dedup_y] =
1379  dedup_avg<double>(DSTARETA_SQRTS, DSTARPLUSETA_ELASTIC_SIG);
1381  std::make_unique<InterpolateDataLinear<double>>(
1382  dedup_x, dedup_y, ExtrapolationType::Zero);
1383  }
1384  return (*Dstarpluseta_elastic_interpolation)(sqrts);
1385  }
1386 }
1387 
1388 std::optional<double> Dstarzeroeta_elastic(double sqrts) {
1389  if (sqrts > *(DSTARETA_SQRTS.end() - 1)) {
1390  return std::nullopt;
1391  } else {
1392  if (Dstarzeroeta_elastic_interpolation == nullptr) {
1393  auto [dedup_x, dedup_y] =
1394  dedup_avg<double>(DSTARETA_SQRTS, DSTARZEROETA_ELASTIC_SIG);
1396  std::make_unique<InterpolateDataLinear<double>>(
1397  dedup_x, dedup_y, ExtrapolationType::Zero);
1398  }
1399  return (*Dstarzeroeta_elastic_interpolation)(sqrts);
1400  }
1401 }
1402 
1403 std::optional<double> DstarplusKplus_elastic(double sqrts) {
1404  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1405  return std::nullopt;
1406  } else {
1407  if (DstarplusKplus_elastic_interpolation == nullptr) {
1408  auto [dedup_x, dedup_y] =
1409  dedup_avg<double>(DSTARKAON_SQRTS, DSTARPLUSKPLUS_ELASTIC_SIG);
1411  std::make_unique<InterpolateDataLinear<double>>(
1412  dedup_x, dedup_y, ExtrapolationType::Zero);
1413  }
1414  return (*DstarplusKplus_elastic_interpolation)(sqrts);
1415  }
1416 }
1417 
1418 std::optional<double> DstarplusKzero_elastic(double sqrts) {
1419  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1420  return std::nullopt;
1421  } else {
1422  if (DstarplusKzero_elastic_interpolation == nullptr) {
1423  auto [dedup_x, dedup_y] =
1424  dedup_avg<double>(DSTARKAON_SQRTS, DSTARPLUSKZERO_ELASTIC_SIG);
1426  std::make_unique<InterpolateDataLinear<double>>(
1427  dedup_x, dedup_y, ExtrapolationType::Zero);
1428  }
1429  return (*DstarplusKzero_elastic_interpolation)(sqrts);
1430  }
1431 }
1432 
1433 double DstarplusKzero_DstarzeroKplus(double sqrts) {
1435  auto [dedup_x, dedup_y] =
1438  std::make_unique<InterpolateDataLinear<double>>(
1439  dedup_x, dedup_y, ExtrapolationType::Constant);
1440  }
1442 }
1443 
1444 double DstarzeroKplus_DstarplusKzero(double sqrts) {
1446  auto [dedup_x, dedup_y] =
1449  std::make_unique<InterpolateDataLinear<double>>(
1450  dedup_x, dedup_y, ExtrapolationType::Constant);
1451  }
1453 }
1454 
1455 std::optional<double> DstarzeroKplus_elastic(double sqrts) {
1456  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1457  return std::nullopt;
1458  } else {
1459  if (DstarzeroKplus_elastic_interpolation == nullptr) {
1460  auto [dedup_x, dedup_y] =
1461  dedup_avg<double>(DSTARKAON_SQRTS, DSTARZEROKPLUS_ELASTIC_SIG);
1463  std::make_unique<InterpolateDataLinear<double>>(
1464  dedup_x, dedup_y, ExtrapolationType::Zero);
1465  }
1466  return (*DstarzeroKplus_elastic_interpolation)(sqrts);
1467  }
1468 }
1469 
1470 std::optional<double> DstarzeroKzero_elastic(double sqrts) {
1471  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1472  return std::nullopt;
1473  } else {
1474  if (DstarzeroKzero_elastic_interpolation == nullptr) {
1475  auto [dedup_x, dedup_y] =
1476  dedup_avg<double>(DSTARKAON_SQRTS, DSTARZEROKZERO_ELASTIC_SIG);
1478  std::make_unique<InterpolateDataLinear<double>>(
1479  dedup_x, dedup_y, ExtrapolationType::Zero);
1480  }
1481  return (*DstarzeroKzero_elastic_interpolation)(sqrts);
1482  }
1483 }
1484 
1485 std::optional<double> DstarplusKbarzero_elastic(double sqrts) {
1486  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1487  return std::nullopt;
1488  } else {
1489  if (DstarplusKbarzero_elastic_interpolation == nullptr) {
1490  auto [dedup_x, dedup_y] =
1491  dedup_avg<double>(DSTARKAON_SQRTS, DSTARPLUSKBARZERO_ELASTIC_SIG);
1493  std::make_unique<InterpolateDataLinear<double>>(
1494  dedup_x, dedup_y, ExtrapolationType::Zero);
1495  }
1496  return (*DstarplusKbarzero_elastic_interpolation)(sqrts);
1497  }
1498 }
1499 
1500 std::optional<double> DstarplusKminus_elastic(double sqrts) {
1501  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1502  return std::nullopt;
1503  } else {
1504  if (DstarplusKminus_elastic_interpolation == nullptr) {
1505  auto [dedup_x, dedup_y] =
1506  dedup_avg<double>(DSTARKAON_SQRTS, DSTARPLUSKMINUS_ELASTIC_SIG);
1508  std::make_unique<InterpolateDataLinear<double>>(
1509  dedup_x, dedup_y, ExtrapolationType::Zero);
1510  }
1511  return (*DstarplusKminus_elastic_interpolation)(sqrts);
1512  }
1513 }
1514 
1517  auto [dedup_x, dedup_y] = dedup_avg<double>(
1520  std::make_unique<InterpolateDataLinear<double>>(
1521  dedup_x, dedup_y, ExtrapolationType::Constant);
1522  }
1524 }
1525 
1528  auto [dedup_x, dedup_y] = dedup_avg<double>(
1531  std::make_unique<InterpolateDataLinear<double>>(
1532  dedup_x, dedup_y, ExtrapolationType::Constant);
1533  }
1535 }
1536 
1537 std::optional<double> DstarzeroKbarzero_elastic(double sqrts) {
1538  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1539  return std::nullopt;
1540  } else {
1541  if (DstarzeroKbarzero_elastic_interpolation == nullptr) {
1542  auto [dedup_x, dedup_y] =
1543  dedup_avg<double>(DSTARKAON_SQRTS, DSTARZEROKBARZERO_ELASTIC_SIG);
1545  std::make_unique<InterpolateDataLinear<double>>(
1546  dedup_x, dedup_y, ExtrapolationType::Zero);
1547  }
1548  return (*DstarzeroKbarzero_elastic_interpolation)(sqrts);
1549  }
1550 }
1551 
1552 std::optional<double> DstarzeroKminus_elastic(double sqrts) {
1553  if (sqrts > *(DSTARKAON_SQRTS.end() - 1)) {
1554  return std::nullopt;
1555  } else {
1556  if (DstarzeroKminus_elastic_interpolation == nullptr) {
1557  auto [dedup_x, dedup_y] =
1558  dedup_avg<double>(DSTARKAON_SQRTS, DSTARZEROKMINUS_ELASTIC_SIG);
1560  std::make_unique<InterpolateDataLinear<double>>(
1561  dedup_x, dedup_y, ExtrapolationType::Zero);
1562  }
1563  return (*DstarzeroKminus_elastic_interpolation)(sqrts);
1564  }
1565 }
1566 
1567 std::optional<double> Dplusn_elastic(double sqrts) {
1568  if (sqrts > *(DN_SQRTS.end() - 1)) {
1569  return std::nullopt;
1570  } else {
1571  if (Dplusn_elastic_interpolation == nullptr) {
1572  auto [dedup_x, dedup_y] = dedup_avg<double>(DN_SQRTS, DPLUSN_ELASTIC_SIG);
1574  std::make_unique<InterpolateDataLinear<double>>(
1575  dedup_x, dedup_y, ExtrapolationType::Zero);
1576  }
1577  return (*Dplusn_elastic_interpolation)(sqrts);
1578  }
1579 }
1580 
1581 double Dplusn_Dzerop(double sqrts) {
1582  if (Dplusn_Dzerop_interpolation == nullptr) {
1583  auto [dedup_x, dedup_y] = dedup_avg<double>(DN_SQRTS, DPLUSN_DZEROP_SIG);
1585  std::make_unique<InterpolateDataLinear<double>>(
1586  dedup_x, dedup_y, ExtrapolationType::Constant);
1587  }
1588  return (*Dplusn_Dzerop_interpolation)(sqrts);
1589 }
1590 
1591 std::optional<double> Dplusp_elastic(double sqrts) {
1592  if (sqrts > *(DN_SQRTS.end() - 1)) {
1593  return std::nullopt;
1594  } else {
1595  if (Dplusp_elastic_interpolation == nullptr) {
1596  auto [dedup_x, dedup_y] = dedup_avg<double>(DN_SQRTS, DPLUSP_ELASTIC_SIG);
1598  std::make_unique<InterpolateDataLinear<double>>(
1599  dedup_x, dedup_y, ExtrapolationType::Zero);
1600  }
1601  return (*Dplusp_elastic_interpolation)(sqrts);
1602  }
1603 }
1604 
1605 std::optional<double> Dzeron_elastic(double sqrts) {
1606  if (sqrts > *(DN_SQRTS.end() - 1)) {
1607  return std::nullopt;
1608  } else {
1609  if (Dzeron_elastic_interpolation == nullptr) {
1610  auto [dedup_x, dedup_y] = dedup_avg<double>(DN_SQRTS, DZERON_ELASTIC_SIG);
1612  std::make_unique<InterpolateDataLinear<double>>(
1613  dedup_x, dedup_y, ExtrapolationType::Zero);
1614  }
1615  return (*Dzeron_elastic_interpolation)(sqrts);
1616  }
1617 }
1618 
1619 double Dzerop_Dplusn(double sqrts) {
1620  if (Dzerop_Dplusn_interpolation == nullptr) {
1621  auto [dedup_x, dedup_y] = dedup_avg<double>(DN_SQRTS, DZEROP_DPLUSN_SIG);
1623  std::make_unique<InterpolateDataLinear<double>>(
1624  dedup_x, dedup_y, ExtrapolationType::Constant);
1625  }
1626  return (*Dzerop_Dplusn_interpolation)(sqrts);
1627 }
1628 
1629 std::optional<double> Dzerop_elastic(double sqrts) {
1630  if (sqrts > *(DN_SQRTS.end() - 1)) {
1631  return std::nullopt;
1632  } else {
1633  if (Dzerop_elastic_interpolation == nullptr) {
1634  auto [dedup_x, dedup_y] = dedup_avg<double>(DN_SQRTS, DZEROP_ELASTIC_SIG);
1636  std::make_unique<InterpolateDataLinear<double>>(
1637  dedup_x, dedup_y, ExtrapolationType::Zero);
1638  }
1639  return (*Dzerop_elastic_interpolation)(sqrts);
1640  }
1641 }
1642 
1643 std::optional<double> Dminusn_elastic(double sqrts) {
1644  if (sqrts > *(DBARN_SQRTS.end() - 1)) {
1645  return std::nullopt;
1646  } else {
1647  if (Dminusn_elastic_interpolation == nullptr) {
1648  auto [dedup_x, dedup_y] =
1649  dedup_avg<double>(DBARN_SQRTS, DMINUSN_ELASTIC_SIG);
1651  std::make_unique<InterpolateDataLinear<double>>(
1652  dedup_x, dedup_y, ExtrapolationType::Zero);
1653  }
1654  return (*Dminusn_elastic_interpolation)(sqrts);
1655  }
1656 }
1657 
1658 std::optional<double> Dminusp_elastic(double sqrts) {
1659  if (sqrts > *(DBARN_SQRTS.end() - 1)) {
1660  return std::nullopt;
1661  } else {
1662  if (Dminusp_elastic_interpolation == nullptr) {
1663  auto [dedup_x, dedup_y] =
1664  dedup_avg<double>(DBARN_SQRTS, DMINUSP_ELASTIC_SIG);
1666  std::make_unique<InterpolateDataLinear<double>>(
1667  dedup_x, dedup_y, ExtrapolationType::Zero);
1668  }
1669  return (*Dminusp_elastic_interpolation)(sqrts);
1670  }
1671 }
1672 
1673 double Dminusp_Dbarzeron(double sqrts) {
1674  if (Dminusp_Dbarzeron_interpolation == nullptr) {
1675  auto [dedup_x, dedup_y] =
1676  dedup_avg<double>(DBARN_SQRTS, DMINUSP_DBARZERON_SIG);
1678  std::make_unique<InterpolateDataLinear<double>>(
1679  dedup_x, dedup_y, ExtrapolationType::Constant);
1680  }
1681  return (*Dminusp_Dbarzeron_interpolation)(sqrts);
1682 }
1683 
1684 double Dbarzeron_Dminusp(double sqrts) {
1685  if (Dbarzeron_Dminusp_interpolation == nullptr) {
1686  auto [dedup_x, dedup_y] =
1687  dedup_avg<double>(DBARN_SQRTS, DBARZERON_DMINUSP_SIG);
1689  std::make_unique<InterpolateDataLinear<double>>(
1690  dedup_x, dedup_y, ExtrapolationType::Constant);
1691  }
1692  return (*Dbarzeron_Dminusp_interpolation)(sqrts);
1693 }
1694 
1695 std::optional<double> Dbarzeron_elastic(double sqrts) {
1696  if (sqrts > *(DBARN_SQRTS.end() - 1)) {
1697  return std::nullopt;
1698  } else {
1699  if (Dbarzeron_elastic_interpolation == nullptr) {
1700  auto [dedup_x, dedup_y] =
1701  dedup_avg<double>(DBARN_SQRTS, DBARZERON_ELASTIC_SIG);
1703  std::make_unique<InterpolateDataLinear<double>>(
1704  dedup_x, dedup_y, ExtrapolationType::Zero);
1705  }
1706  return (*Dbarzeron_elastic_interpolation)(sqrts);
1707  }
1708 }
1709 
1710 std::optional<double> Dbarzerop_elastic(double sqrts) {
1711  if (sqrts > *(DBARN_SQRTS.end() - 1)) {
1712  return std::nullopt;
1713  } else {
1714  if (Dbarzerop_elastic_interpolation == nullptr) {
1715  auto [dedup_x, dedup_y] =
1716  dedup_avg<double>(DBARN_SQRTS, DBARZEROP_ELASTIC_SIG);
1718  std::make_unique<InterpolateDataLinear<double>>(
1719  dedup_x, dedup_y, ExtrapolationType::Zero);
1720  }
1721  return (*Dbarzerop_elastic_interpolation)(sqrts);
1722  }
1723 }
1724 
1725 std::optional<double> DplusDeltaplus_elastic(double sqrts) {
1726  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1727  return std::nullopt;
1728  } else {
1729  if (DplusDeltaplus_elastic_interpolation == nullptr) {
1730  auto [dedup_x, dedup_y] =
1731  dedup_avg<double>(DDELTA_SQRTS, DPLUSDELTAPLUS_ELASTIC_SIG);
1733  std::make_unique<InterpolateDataLinear<double>>(
1734  dedup_x, dedup_y, ExtrapolationType::Zero);
1735  }
1736  return (*DplusDeltaplus_elastic_interpolation)(sqrts);
1737  }
1738 }
1739 
1742  auto [dedup_x, dedup_y] =
1745  std::make_unique<InterpolateDataLinear<double>>(
1746  dedup_x, dedup_y, ExtrapolationType::Constant);
1747  }
1749 }
1750 
1751 std::optional<double> DplusDeltaplusplus_elastic(double sqrts) {
1752  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1753  return std::nullopt;
1754  } else {
1756  auto [dedup_x, dedup_y] =
1757  dedup_avg<double>(DDELTA_SQRTS, DPLUSDELTAPLUSPLUS_ELASTIC_SIG);
1759  std::make_unique<InterpolateDataLinear<double>>(
1760  dedup_x, dedup_y, ExtrapolationType::Zero);
1761  }
1763  }
1764 }
1765 
1766 std::optional<double> DplusDeltaminus_elastic(double sqrts) {
1767  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1768  return std::nullopt;
1769  } else {
1770  if (DplusDeltaminus_elastic_interpolation == nullptr) {
1771  auto [dedup_x, dedup_y] =
1772  dedup_avg<double>(DDELTA_SQRTS, DPLUSDELTAMINUS_ELASTIC_SIG);
1774  std::make_unique<InterpolateDataLinear<double>>(
1775  dedup_x, dedup_y, ExtrapolationType::Zero);
1776  }
1777  return (*DplusDeltaminus_elastic_interpolation)(sqrts);
1778  }
1779 }
1780 
1781 double DplusDeltaminus_DzeroDeltazero(double sqrts) {
1783  auto [dedup_x, dedup_y] =
1786  std::make_unique<InterpolateDataLinear<double>>(
1787  dedup_x, dedup_y, ExtrapolationType::Constant);
1788  }
1790 }
1791 
1792 std::optional<double> DplusDeltazero_elastic(double sqrts) {
1793  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1794  return std::nullopt;
1795  } else {
1796  if (DplusDeltazero_elastic_interpolation == nullptr) {
1797  auto [dedup_x, dedup_y] =
1798  dedup_avg<double>(DDELTA_SQRTS, DPLUSDELTAZERO_ELASTIC_SIG);
1800  std::make_unique<InterpolateDataLinear<double>>(
1801  dedup_x, dedup_y, ExtrapolationType::Zero);
1802  }
1803  return (*DplusDeltazero_elastic_interpolation)(sqrts);
1804  }
1805 }
1806 
1807 double DplusDeltazero_DzeroDeltaplus(double sqrts) {
1809  auto [dedup_x, dedup_y] =
1810  dedup_avg<double>(DDELTA_SQRTS, DPLUSDELTAZERO_DZERODELTAPLUS_SIG);
1812  std::make_unique<InterpolateDataLinear<double>>(
1813  dedup_x, dedup_y, ExtrapolationType::Constant);
1814  }
1816 }
1817 
1818 double DzeroDeltaplus_DplusDeltazero(double sqrts) {
1820  auto [dedup_x, dedup_y] =
1821  dedup_avg<double>(DDELTA_SQRTS, DZERODELTAPLUS_DPLUSDELTAZERO_SIG);
1823  std::make_unique<InterpolateDataLinear<double>>(
1824  dedup_x, dedup_y, ExtrapolationType::Constant);
1825  }
1827 }
1828 
1829 std::optional<double> DzeroDeltaplus_elastic(double sqrts) {
1830  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1831  return std::nullopt;
1832  } else {
1833  if (DzeroDeltaplus_elastic_interpolation == nullptr) {
1834  auto [dedup_x, dedup_y] =
1835  dedup_avg<double>(DDELTA_SQRTS, DZERODELTAPLUS_ELASTIC_SIG);
1837  std::make_unique<InterpolateDataLinear<double>>(
1838  dedup_x, dedup_y, ExtrapolationType::Zero);
1839  }
1840  return (*DzeroDeltaplus_elastic_interpolation)(sqrts);
1841  }
1842 }
1843 
1846  auto [dedup_x, dedup_y] =
1849  std::make_unique<InterpolateDataLinear<double>>(
1850  dedup_x, dedup_y, ExtrapolationType::Constant);
1851  }
1853 }
1854 
1855 std::optional<double> DzeroDeltaplusplus_elastic(double sqrts) {
1856  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1857  return std::nullopt;
1858  } else {
1860  auto [dedup_x, dedup_y] =
1861  dedup_avg<double>(DDELTA_SQRTS, DZERODELTAPLUSPLUS_ELASTIC_SIG);
1863  std::make_unique<InterpolateDataLinear<double>>(
1864  dedup_x, dedup_y, ExtrapolationType::Zero);
1865  }
1867  }
1868 }
1869 
1870 std::optional<double> DzeroDeltaminus_elastic(double sqrts) {
1871  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1872  return std::nullopt;
1873  } else {
1874  if (DzeroDeltaminus_elastic_interpolation == nullptr) {
1875  auto [dedup_x, dedup_y] =
1876  dedup_avg<double>(DDELTA_SQRTS, DZERODELTAMINUS_ELASTIC_SIG);
1878  std::make_unique<InterpolateDataLinear<double>>(
1879  dedup_x, dedup_y, ExtrapolationType::Zero);
1880  }
1881  return (*DzeroDeltaminus_elastic_interpolation)(sqrts);
1882  }
1883 }
1884 
1885 double DzeroDeltazero_DplusDeltaminus(double sqrts) {
1887  auto [dedup_x, dedup_y] =
1890  std::make_unique<InterpolateDataLinear<double>>(
1891  dedup_x, dedup_y, ExtrapolationType::Constant);
1892  }
1894 }
1895 
1896 std::optional<double> DzeroDeltazero_elastic(double sqrts) {
1897  if (sqrts > *(DDELTA_SQRTS.end() - 1)) {
1898  return std::nullopt;
1899  } else {
1900  if (DzeroDeltazero_elastic_interpolation == nullptr) {
1901  auto [dedup_x, dedup_y] =
1902  dedup_avg<double>(DDELTA_SQRTS, DZERODELTAZERO_ELASTIC_SIG);
1904  std::make_unique<InterpolateDataLinear<double>>(
1905  dedup_x, dedup_y, ExtrapolationType::Zero);
1906  }
1907  return (*DzeroDeltazero_elastic_interpolation)(sqrts);
1908  }
1909 }
1910 
1911 std::optional<double> DminusDeltaplus_elastic(double sqrts) {
1912  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
1913  return std::nullopt;
1914  } else {
1915  if (DminusDeltaplus_elastic_interpolation == nullptr) {
1916  auto [dedup_x, dedup_y] =
1917  dedup_avg<double>(DBARDELTA_SQRTS, DMINUSDELTAPLUS_ELASTIC_SIG);
1919  std::make_unique<InterpolateDataLinear<double>>(
1920  dedup_x, dedup_y, ExtrapolationType::Zero);
1921  }
1922  return (*DminusDeltaplus_elastic_interpolation)(sqrts);
1923  }
1924 }
1925 
1928  auto [dedup_x, dedup_y] = dedup_avg<double>(
1931  std::make_unique<InterpolateDataLinear<double>>(
1932  dedup_x, dedup_y, ExtrapolationType::Constant);
1933  }
1935 }
1936 
1937 std::optional<double> DminusDeltaplusplus_elastic(double sqrts) {
1938  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
1939  return std::nullopt;
1940  } else {
1942  auto [dedup_x, dedup_y] =
1945  std::make_unique<InterpolateDataLinear<double>>(
1946  dedup_x, dedup_y, ExtrapolationType::Zero);
1947  }
1949  }
1950 }
1951 
1954  auto [dedup_x, dedup_y] = dedup_avg<double>(
1957  std::make_unique<InterpolateDataLinear<double>>(
1958  dedup_x, dedup_y, ExtrapolationType::Constant);
1959  }
1961 }
1962 
1963 std::optional<double> DminusDeltaminus_elastic(double sqrts) {
1964  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
1965  return std::nullopt;
1966  } else {
1967  if (DminusDeltaminus_elastic_interpolation == nullptr) {
1968  auto [dedup_x, dedup_y] =
1969  dedup_avg<double>(DBARDELTA_SQRTS, DMINUSDELTAMINUS_ELASTIC_SIG);
1971  std::make_unique<InterpolateDataLinear<double>>(
1972  dedup_x, dedup_y, ExtrapolationType::Zero);
1973  }
1974  return (*DminusDeltaminus_elastic_interpolation)(sqrts);
1975  }
1976 }
1977 
1978 std::optional<double> DminusDeltazero_elastic(double sqrts) {
1979  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
1980  return std::nullopt;
1981  } else {
1982  if (DminusDeltazero_elastic_interpolation == nullptr) {
1983  auto [dedup_x, dedup_y] =
1984  dedup_avg<double>(DBARDELTA_SQRTS, DMINUSDELTAZERO_ELASTIC_SIG);
1986  std::make_unique<InterpolateDataLinear<double>>(
1987  dedup_x, dedup_y, ExtrapolationType::Zero);
1988  }
1989  return (*DminusDeltazero_elastic_interpolation)(sqrts);
1990  }
1991 }
1992 
1995  auto [dedup_x, dedup_y] = dedup_avg<double>(
1998  std::make_unique<InterpolateDataLinear<double>>(
1999  dedup_x, dedup_y, ExtrapolationType::Constant);
2000  }
2002 }
2003 
2006  auto [dedup_x, dedup_y] = dedup_avg<double>(
2009  std::make_unique<InterpolateDataLinear<double>>(
2010  dedup_x, dedup_y, ExtrapolationType::Constant);
2011  }
2013 }
2014 
2015 std::optional<double> DbarzeroDeltaplus_elastic(double sqrts) {
2016  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
2017  return std::nullopt;
2018  } else {
2019  if (DbarzeroDeltaplus_elastic_interpolation == nullptr) {
2020  auto [dedup_x, dedup_y] =
2021  dedup_avg<double>(DBARDELTA_SQRTS, DBARZERODELTAPLUS_ELASTIC_SIG);
2023  std::make_unique<InterpolateDataLinear<double>>(
2024  dedup_x, dedup_y, ExtrapolationType::Zero);
2025  }
2026  return (*DbarzeroDeltaplus_elastic_interpolation)(sqrts);
2027  }
2028 }
2029 
2030 std::optional<double> DbarzeroDeltaplusplus_elastic(double sqrts) {
2031  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
2032  return std::nullopt;
2033  } else {
2035  auto [dedup_x, dedup_y] =
2038  std::make_unique<InterpolateDataLinear<double>>(
2039  dedup_x, dedup_y, ExtrapolationType::Zero);
2040  }
2042  }
2043 }
2044 
2047  auto [dedup_x, dedup_y] = dedup_avg<double>(
2050  std::make_unique<InterpolateDataLinear<double>>(
2051  dedup_x, dedup_y, ExtrapolationType::Constant);
2052  }
2054 }
2055 
2056 std::optional<double> DbarzeroDeltaminus_elastic(double sqrts) {
2057  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
2058  return std::nullopt;
2059  } else {
2061  auto [dedup_x, dedup_y] =
2062  dedup_avg<double>(DBARDELTA_SQRTS, DBARZERODELTAMINUS_ELASTIC_SIG);
2064  std::make_unique<InterpolateDataLinear<double>>(
2065  dedup_x, dedup_y, ExtrapolationType::Zero);
2066  }
2068  }
2069 }
2070 
2073  auto [dedup_x, dedup_y] = dedup_avg<double>(
2076  std::make_unique<InterpolateDataLinear<double>>(
2077  dedup_x, dedup_y, ExtrapolationType::Constant);
2078  }
2080 }
2081 
2082 std::optional<double> DbarzeroDeltazero_elastic(double sqrts) {
2083  if (sqrts > *(DBARDELTA_SQRTS.end() - 1)) {
2084  return std::nullopt;
2085  } else {
2086  if (DbarzeroDeltazero_elastic_interpolation == nullptr) {
2087  auto [dedup_x, dedup_y] =
2088  dedup_avg<double>(DBARDELTA_SQRTS, DBARZERODELTAZERO_ELASTIC_SIG);
2090  std::make_unique<InterpolateDataLinear<double>>(
2091  dedup_x, dedup_y, ExtrapolationType::Zero);
2092  }
2093  return (*DbarzeroDeltazero_elastic_interpolation)(sqrts);
2094  }
2095 }
2096 
2097 } // namespace smash
Calculate and store isospin ratios for K N -> K Delta reactions.
std::unordered_map< std::pair< uint64_t, uint64_t >, double, pair_hash > ratios_
Internal representation of isospin weights once calculated.
double get_ratio(const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d) const
Return the isospin ratio of the given K N -> K Delta cross section.
Particle type contains the static properties of a particle species.
Definition: particletype.h:100
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
PdgCode pdgcode() const
Definition: particletype.h:159
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
Definition: pdgcode.h:108
std::int32_t code() const
Definition: pdgcode.h:319
bool is_pion() const
Definition: pdgcode.h:471
bool is_kaon() const
Definition: pdgcode.h:465
bool is_nucleon() const
Definition: pdgcode.h:404
Collection of useful constants that are known at compile time.
@ Constant
Extrapolate using a constant value.
@ Zero
Extrapolate with zero.
constexpr int Delta_p
Δ⁺.
constexpr int Delta_pp
Δ⁺⁺.
constexpr int K_p
K⁺.
constexpr int K_z
K⁰.
constexpr int p
Proton.
constexpr int n
Neutron.
constexpr int Delta_m
Δ⁻.
constexpr int Delta_z
Δ⁰.
Definition: action.h:24
const std::initializer_list< double > DZEROPIZERO_DPLUSPIMINUS_SIG
D⁰π⁰ -> D⁺π⁻ cross section Abreu:2011ic .
const std::initializer_list< double > DZEROKZERO_ELASTIC_SIG
Elastic D⁰K⁰ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltazero_DminusDeltaplus_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAZERO_DMINUSDELTAPLUS data.
double kplusn_k0p(double mandelstam_s)
K+ n charge exchange cross section parametrization.
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
std::optional< double > Dzeron_elastic(double sqrts)
D⁰n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltaminus_elastic_interpolation
An interpolation that gets lazily filled using the DZERODELTAMINUS_ELASTIC data.
std::optional< double > Dplusn_elastic(double sqrts)
D⁺n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltaminus_elastic_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAMINUS_ELASTIC data.
bool parametrization_exists(const PdgCode &pdg_a, const PdgCode &pdg_b)
Checks if supplied codes have existing parametrizations of total cross sections.
const std::initializer_list< double > DPLUSKMINUS_DZEROKBARZERO_SIG
D⁺K⁻ -> D⁰K̄⁰ cross section Tolos:2013kva .
double kplusp_total(double mandelstam_s)
K+ p total cross section parametrization.
std::optional< double > DplusKzero_elastic(double sqrts)
D⁺K⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static double piplusp_elastic_pdg(double mandelstam_s)
double deuteron_pion_inelastic(double pion_kinetic_energy)
Parametrization of deuteron-pion inelastic cross section.
double DzeroDeltazero_DplusDeltaminus(double sqrts)
D⁰Δ⁰ -> D⁺Δ⁻ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DstarzeroKzero_elastic(double sqrts)
D*(2007)⁰K⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
const std::initializer_list< double > DZEROP_DPLUSN_SIG
D⁰p -> D⁺n cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltazero_elastic_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAZERO_ELASTIC data.
const std::initializer_list< double > KMINUSN_TOT_PLAB
PDG data on K- n total cross section: momentum in lab frame.
const std::initializer_list< double > DPLUSKPLUS_ELASTIC_SIG
Elastic D⁺K⁺ cross section Tolos:2013kva .
double pizeropizero_total(double sqrts)
pi0 pi0 total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
double kminusp_pi0lambda(double sqrts)
K- p <-> pi0 Lambda cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.
const std::initializer_list< double > DZEROKBARZERO_DPLUSKMINUS_SIG
D⁰K̄⁰ -> D⁺K⁻ cross section Tolos:2013kva .
double Dpluspiminus_Dzeropizero(double sqrts)
D⁺π⁻ -> D⁰π⁰ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
const std::initializer_list< double > PIPLUSP_RES_SQRTS
Center-of-mass energy.
const std::initializer_list< double > KMINUSP_RES_SQRTS
Center-of-mass energy list for K̅⁻ N⁺
double Dstarzeropiplus_Dstarpluspizero(double sqrts)
D*(2007)⁰π⁺ -> D*(2010)⁺π⁰ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
const std::initializer_list< double > PIMINUSP_ELASTIC_P_LAB
PDG data on pi- p elastic cross section: momentum in lab frame.
double DplusDeltaplus_DzeroDeltaplusplus(double sqrts)
D⁺Δ⁺ -> D⁰Δ⁺⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
static std::unique_ptr< InterpolateDataLinear< double > > DstarplusKzero_DstarzeroKplus_interpolation
An interpolation that gets lazily filled using the DSTARPLUSKZERO_DSTARZEROKPLUS data.
double Dminusp_Dbarzeron(double sqrts)
D⁻p -> D̄⁰n cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > DSTARKAON_SQRTS
Center-of-mass energy.
const std::initializer_list< double > DBARN_SQRTS
Center-of-mass energy.
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltaplusplus_DbarzeroDeltaplus_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAPLUSPLUS_DBARZERODELTAPLUS data.
const std::initializer_list< double > PIPLUSPIMINUS_TOT_SQRTS
Center-of-mass energy.
const std::initializer_list< double > DPLUSPIMINUS_DZEROPIZERO_SIG
D⁺π⁻ -> D⁰π⁰ cross section Abreu:2011ic .
static std::unique_ptr< InterpolateDataLinear< double > > DplusKzero_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSKZERO_ELASTIC data.
const std::initializer_list< double > DSTARPLUSKBARZERO_ELASTIC_SIG
Elastic D*(2010)⁺K̄⁰ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > Dminusp_elastic_interpolation
An interpolation that gets lazily filled using the DMINUSP_ELASTIC data.
double pipluspiminus_total(double sqrts)
pi+ pi- total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
const std::initializer_list< double > DSTARPLUSKMINUS_DSTARZEROKBARZERO_SIG
D*(2010)⁺K⁻ -> D*(2007)⁰K̄⁰ cross section.
const std::initializer_list< double > DSTARZEROETA_ELASTIC_SIG
Elastic D*(2007)⁰η cross section. Data provided by Juan Torres-Rincon.
double piminusp_sigma0k0_res(double mandelstam_s)
pi- p -> Sigma0 K0 cross section parametrization, resonance contribution.
double ppbar_total(double mandelstam_s)
ppbar total cross section parametrization Source: Bass:1998ca
static std::unique_ptr< InterpolateDataLinear< double > > Dstarzeropiplus_Dstarpluspizero_interpolation
An interpolation that gets lazily filled using the DSTARZEROPIPLUS_DSTARPLUSPIZERO data.
double np_total(double mandelstam_s)
np total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx
double Dstarzeropizero_Dstarpluspiminus(double sqrts)
D*(2007)⁰π⁰ -> D*(2010)⁺π⁻ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
double DstarplusKzero_DstarzeroKplus(double sqrts)
D*(2010)⁺K⁰ -> D*(2007)⁰K⁺ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
static std::unique_ptr< InterpolateDataLinear< double > > Dstarzeropizero_Dstarpluspiminus_interpolation
An interpolation that gets lazily filled using the DSTARZEROPIZERO_DSTARPLUSPIMINUS data.
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_sigmapluskplus_interpolation
An interpolation that gets lazily filled using the PIPLUSP_SIGMAPLUSKPLUS_SIG data.
const std::initializer_list< double > DPLUSETA_ELASTIC_SIG
Elastic D⁺η cross section Tolos:2013kva .
const std::initializer_list< double > DSTARZEROKPLUS_ELASTIC_SIG
Elastic D*(2007)⁰K⁺ cross section.
static std::unique_ptr< InterpolateDataSpline > piplusp_elastic_res_interpolation
A null interpolation that gets filled using the PIPLUSP_RES data.
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltazero_DzeroDeltaplus_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAZERO_DZERODELTAPLUS data.
const std::initializer_list< double > DSTARZEROPIPLUS_DSTARPLUSPIZERO_SIG
D*(2007)⁰π⁺ -> D*(2010)⁺π⁰ cross section.
double DstarplusKminus_DstarzeroKbarzero(double sqrts)
D*(2010)⁺K⁻ -> D*(2007)⁰K̄⁰ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double piminusp_elastic(double mandelstam_s)
pi-p elastic cross section parametrization Source: GiBUU:parametrizationBarMes_HighEnergy....
std::optional< double > Dbarzeron_elastic(double sqrts)
D̄⁰n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > DPLUSKMINUS_ELASTIC_SIG
Elastic D⁺K⁻ cross section Tolos:2013kva .
std::optional< double > DzeroDeltaplus_elastic(double sqrts)
D⁰Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > DPLUSDELTAPLUS_ELASTIC_SIG
Elastic D⁺Δ⁺ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > Dpluspiminus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSPIMINUS_ELASTIC data.
const std::initializer_list< double > DSTARPLUSKZERO_DSTARZEROKPLUS_SIG
D*(2010)⁺K⁰ -> D*(2007)⁰K⁺ cross section.
double Dpluspizero_Dzeropiplus(double sqrts)
D⁺π⁰ -> D⁰π⁺ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
double npbar_high_energy(double mandelstam_s)
npbar total cross section at high energies
double Dstarpluspiminus_Dstarzeropizero(double sqrts)
D*(2010)⁺π⁻ -> D*(2007)⁰π⁰ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
static std::unique_ptr< InterpolateDataLinear< double > > Dstarpluspiminus_Dstarzeropizero_interpolation
An interpolation that gets lazily filled using the DSTARPLUSPIMINUS_DSTARZEROPIZERO data.
const std::initializer_list< double > DMINUSDELTAZERO_ELASTIC_SIG
Elastic D⁻Δ⁰ cross section Tolos:2013kva .
const std::initializer_list< double > KPLUSP_TOT_SIG
PDG data on K+ p total cross section: cross section.
static std::unique_ptr< InterpolateDataLinear< double > > DplusKbarzero_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSKBARZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltaplus_elastic_interpolation
An interpolation that gets lazily filled using the DZERODELTAPLUS_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > Dzeropizero_elastic_interpolation
An interpolation that gets lazily filled using the DZEROPIZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > Dstarzeropizero_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROPIZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DplusKzero_DzeroKplus_interpolation
An interpolation that gets lazily filled using the DPLUSKZERO_DZEROKPLUS data.
const std::initializer_list< double > KMINUSP_TOT_PLAB
PDG smoothed data on K- p total cross section: momentum in lab frame.
static std::unique_ptr< InterpolateDataLinear< double > > Dminusn_elastic_interpolation
An interpolation that gets lazily filled using the DMINUSN_ELASTIC data.
const std::initializer_list< double > DBARZERODELTAPLUSPLUS_ELASTIC_SIG
Elastic D̄⁰Δ⁺⁺ cross section Tolos:2013kva .
double kminusn_piminussigma0(double sqrts)
K- n <-> pi- Sigma0 cross section parametrization Follow from the parametrization with the same stran...
double DzeroKbarzero_DplusKminus(double sqrts)
D⁰K̄⁰ -> D⁺K⁻ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
const std::initializer_list< double > KMINUSP_RES_SIG
Elastic K̅⁻ N⁺ cross section contributions from decays.
double kbar0p_elastic_background(double mandelstam_s)
Kbar0 p elastic background cross section parametrization Source: Buss:2011mx , B.3....
const std::initializer_list< double > PIPLUSP_SIGMAPLUSKPLUS_SIG
PDG data on pi+ p to Sigma+ K+ section: cross section.
const std::initializer_list< double > PIMINUSP_RES_SIG
Elastic π⁻N⁺ cross section contributions from decays.
const std::initializer_list< double > PIPLUSP_SIGMAPLUSKPLUS_P_LAB
PDG data on pi+ p to Sigma+ K+ cross section: momentum in lab frame.
std::optional< double > DplusKplus_elastic(double sqrts)
D⁺K⁺ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double DstarzeroKbarzero_DstarplusKminus(double sqrts)
D*(2007)⁰K̄⁰ -> D*(2010)⁺K⁻ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
std::optional< double > DplusDeltazero_elastic(double sqrts)
D⁺Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataSpline > kminusp_elastic_res_interpolation
An interpolation that gets lazily filled using the KMINUSP_RES data.
const std::initializer_list< double > KPLUSN_TOT_SIG
PDG data on K+ n total cross section: cross section.
KaonNucleonRatios kaon_nucleon_ratios
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltaminus_elastic_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAMINUS_ELASTIC data.
const std::initializer_list< double > DMINUSDELTAZERO_DBARZERODELTAMINUS_SIG
D⁻Δ⁰ -> D̄⁰Δ⁻ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > Dpluspizero_Dzeropiplus_interpolation
An interpolation that gets lazily filled using the DPLUSPIZERO_DZEROPIPLUS data.
double sigma0sigma0_ximinusp(double sqrts_sqrts0)
Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
static std::unique_ptr< InterpolateDataLinear< double > > Dstarpluspizero_Dstarzeropiplus_interpolation
An interpolation that gets lazily filled using the DSTARPLUSPIZERO_DSTARZEROPIPLUS data.
const std::initializer_list< double > DN_SQRTS
Center-of-mass energy.
const std::initializer_list< double > DPLUSPIMINUS_ELASTIC_SIG
Elastic D⁺π⁻ cross section Abreu:2011ic .
static std::unique_ptr< InterpolateDataLinear< double > > DstarzeroKbarzero_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROKBARZERO_ELASTIC data.
const std::initializer_list< double > DSTARZEROPIMINUS_ELASTIC_SIG
Elastic D*(2007)⁰π⁻ cross section.
double ppbar_elastic(double mandelstam_s)
ppbar elastic cross section parametrization Source: Bass:1998ca
std::optional< double > Dbarzerop_elastic(double sqrts)
D̄⁰p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > Dstarpluspiplus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSPIPLUS_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltaplus_DplusDeltazero_interpolation
An interpolation that gets lazily filled using the DZERODELTAPLUS_DPLUSDELTAZERO data.
std::optional< double > DzeroKplus_elastic(double sqrts)
D⁰K⁺ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
std::optional< double > Dstarzeropiminus_elastic(double sqrts)
D*(2007)⁰π- elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
const std::initializer_list< double > DETA_SQRTS
Center-of-mass energy.
std::optional< double > Dstarzeroeta_elastic(double sqrts)
D*(2007)⁰η elastic cross section (data provided by Juan Torres-Rincon).
const std::initializer_list< double > PIPLUSP_RES_SIG
Elastic π⁺N⁺ cross section contributions from decays.
std::optional< double > Dstarpluspizero_elastic(double sqrts)
D*(2010)⁺π⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
static std::unique_ptr< InterpolateDataLinear< double > > Dstarpluseta_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSETA_ELASTIC data.
static double piminusp_elastic_pdg(double mandelstam_s)
double lambdasigmaplus_xi0p(double sqrts_sqrts0)
Lambda Sigma+ <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model ...
double kminusp_elastic_background(double mandelstam_s)
K- p elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
const std::initializer_list< double > DSTARPI_SQRTS
Center-of-mass energy.
double lambdasigma0_xi0n(double sqrts_sqrts0)
Lambda Sigma0 <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model ...
double np_high_energy(double mandelstam_s)
np total cross section at high energies
const std::initializer_list< double > DMINUSP_ELASTIC_SIG
Elastic D⁻p cross section Tolos:2013kva .
std::optional< double > Dminusn_elastic(double sqrts)
D⁻n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltaminus_DzeroDeltazero_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAMINUS_DZERODELTAZERO data.
double pp_elastic_high_energy(double mandelstam_s, double m1, double m2)
pp elastic cross section parametrization, with only the high energy part generalized to all energy re...
const std::initializer_list< double > PIMINUSP_ELASTIC_SIG
PDG data on pi- p elastic cross section: cross section.
static std::unique_ptr< InterpolateDataLinear< double > > DstarzeroKbarzero_DstarplusKminus_interpolation
An interpolation that gets lazily filled using the DSTARZEROKBARZERO_DSTARPLUSKMINUS data.
const std::initializer_list< double > KPLUSN_TOT_PLAB
PDG data on K+ n total cross section: momentum in lab frame.
double xs_string_hard(double mandelstam_s, double xs_0, double e_0, double lambda_pow)
Utility function called by specific other parametrizations Parametrized hard scattering cross section...
const std::initializer_list< double > DDELTA_SQRTS
Center-of-mass energy.
double DstarzeroKplus_DstarplusKzero(double sqrts)
D*(2007)⁰K⁺ -> D*(2010)⁺K⁰ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
const std::initializer_list< double > DBARZERODELTAMINUS_DMINUSDELTAZERO_SIG
D̄⁰Δ⁻ -> D⁻Δ⁰ cross section Tolos:2013kva .
double Npi_string_hard(double mandelstam_s)
nucleon-pion hard scattering cross section (with partonic scattering)
const std::initializer_list< double > DMINUSP_DBARZERON_SIG
D⁻p -> D̄⁰n cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > kminusp_total_interpolation
An interpolation that gets lazily filled using the KMINUSP_TOT data.
const std::initializer_list< double > DMINUSDELTAPLUSPLUS_ELASTIC_SIG
Elastic D⁻Δ⁺⁺ cross section Tolos:2013kva .
double Dstarpluspizero_Dstarzeropiplus(double sqrts)
D*(2010)⁺π⁰ -> D*(2007)⁰π⁺ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
std::optional< double > DzeroDeltaminus_elastic(double sqrts)
D⁰Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static double kminusp_elastic_pdg(double mandelstam_s)
double kminusn_piminuslambda(double sqrts)
K- n <-> pi- Lambda cross section parametrization Follow from the parametrization with the same stran...
double lambdasigmaminus_ximinusn(double sqrts_sqrts0)
Lambda Sigma- <-> Xi- n cross section parametrization Two hyperon exchange, based on effective model ...
std::optional< double > Dpluspiplus_elastic(double sqrts)
D⁺π⁺ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
std::optional< double > DplusKbarzero_elastic(double sqrts)
D⁺K̄⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > DzeroKbarzero_elastic_interpolation
An interpolation that gets lazily filled using the DZEROKBARZERO_ELASTIC data.
double isospin_clebsch_gordan_sqr_2to2(const ParticleType &p_a, const ParticleType &p_b, const ParticleType &p_c, const ParticleType &p_d, const int I=-1)
Calculate the squared isospin Clebsch-Gordan coefficient for a 2-to-2 reaction A + B -> C + D.
static std::unique_ptr< InterpolateDataLinear< double > > Dbarzeron_Dminusp_interpolation
An interpolation that gets lazily filled using the DBARZERON_DMINUSP data.
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_elastic_interpolation
An interpolation that gets lazily filled using the PIPLUSP_ELASTIC_SIG data.
const std::initializer_list< double > DZEROPIPLUS_DPLUSPIZERO_SIG
D⁰π⁺ -> D⁺π⁰ cross section Abreu:2011ic .
static std::unique_ptr< InterpolateDataLinear< double > > Dzeropiplus_elastic_interpolation
An interpolation that gets lazily filled using the DZEROPIPLUS_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltazero_DplusDeltaminus_interpolation
An interpolation that gets lazily filled using the DZERODELTAZERO_DPLUSDELTAMINUS data.
const std::initializer_list< double > DMINUSDELTAPLUSPLUS_DBARZERODELTAPLUS_SIG
D⁻Δ⁺⁺ -> D̄⁰Δ⁺ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DplusKplus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSKPLUS_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > Dzeropiminus_elastic_interpolation
An interpolation that gets lazily filled using the DZEROPIMINUS_ELASTIC data.
const std::initializer_list< double > DZERODELTAPLUSPLUS_DPLUSDELTAPLUS_SIG
D⁰Δ⁺⁺ -> D⁺Δ⁺ cross section Tolos:2013kva .
const std::initializer_list< double > PIMINUSP_TOT_SQRTS
Center-of-mass energy.
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltaplusplus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAPLUSPLUS_ELASTIC data.
std::optional< double > Dplusp_elastic(double sqrts)
D⁺p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double ppbar_high_energy(double mandelstam_s)
ppbar total cross section at high energies
std::optional< double > DstarzeroKplus_elastic(double sqrts)
D*(2007)⁰K⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
static std::unique_ptr< InterpolateDataLinear< double > > Dplusp_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSP_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_elastic_interpolation
An interpolation that gets lazily filled using the PIMINUSP_ELASTIC data.
const std::initializer_list< double > DPLUSPIZERO_DZEROPIPLUS_SIG
D⁺π⁰ -> D⁰π⁺ cross section Abreu:2011ic .
double pp_high_energy(double mandelstam_s)
pp total cross section at high energies
static std::unique_ptr< InterpolateDataLinear< double > > Dzerop_elastic_interpolation
An interpolation that gets lazily filled using the DZEROP_ELASTIC data.
const std::initializer_list< double > DZEROP_ELASTIC_SIG
Elastic D⁰p cross section Tolos:2013kva .
std::optional< double > Dminusp_elastic(double sqrts)
D⁻p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double Dbarzeron_Dminusp(double sqrts)
D̄⁰n -> D⁻p cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book (http://pdg....
const std::initializer_list< double > KMINUSP_ELASTIC_P_LAB
PDG data on K- p elastic cross section: momentum in lab frame.
static std::unique_ptr< InterpolateDataLinear< double > > Dpluspizero_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSPIZERO_ELASTIC data.
std::optional< double > DzeroKzero_elastic(double sqrts)
D⁰K⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double pipi_string_hard(double mandelstam_s)
pion-pion hard scattering cross section (with partonic scattering)
std::optional< double > Dstarpluspiplus_elastic(double sqrts)
D*(2010)⁺π⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltaminus_DminusDeltazero_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAMINUS_DMINUSDELTAZERO data.
double piplusp_high_energy(double mandelstam_s)
pi+p total cross section at high energies
std::optional< double > Dpluseta_elastic(double sqrts)
D⁺η elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > Dzeroeta_elastic_interpolation
An interpolation that gets lazily filled using the DZEROETA_ELASTIC data.
const std::initializer_list< double > DZEROPIPLUS_ELASTIC_SIG
Elastic D⁰π⁺ cross section Abreu:2011ic .
const std::initializer_list< double > DBARZEROP_ELASTIC_SIG
Elastic D̄⁰p cross section Tolos:2013kva .
double lambdalambda_xi0n(double sqrts_sqrts0, double p_N, double p_lambda)
Lambda Lambda <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model ...
double kminusp_piminussigmaplus(double sqrts)
K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra ).
const std::initializer_list< double > DPLUSKZERO_ELASTIC_SIG
Elastic D⁺K⁰ cross section Tolos:2013kva .
const std::initializer_list< double > DMINUSDELTAPLUS_ELASTIC_SIG
Elastic D⁻Δ⁺ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > kplusn_total_interpolation
An interpolation that gets lazily filled using the KPLUSN_TOT data.
const std::initializer_list< double > DSTARPLUSKZERO_ELASTIC_SIG
Elastic D*(2010)⁺K⁰ cross section.
const std::initializer_list< double > DBARZERON_DMINUSP_SIG
D̄⁰n -> D⁻p cross section Tolos:2013kva .
const std::initializer_list< double > DPLUSN_ELASTIC_SIG
Elastic D⁺n cross section Tolos:2013kva .
std::optional< double > Dpluspiminus_elastic(double sqrts)
D⁺π⁻ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
const std::initializer_list< double > DBARZERON_ELASTIC_SIG
Elastic D̄⁰n cross section Tolos:2013kva .
double lambdalambda_ximinusp(double sqrts_sqrts0, double p_N, double p_lambda)
Lambda Lambda <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
const std::initializer_list< double > PIMINUSP_LAMBDAK0_P_LAB
PDG data on pi- p to Lambda K0 cross section: momentum in lab frame.
const std::initializer_list< double > KPLUSP_TOT_PLAB
PDG data on K+ p total cross section: momentum in lab frame.
double DplusKminus_DzeroKbarzero(double sqrts)
D⁺K⁻ -> D⁰K̄⁰ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltaplus_elastic_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAPLUS_ELASTIC data.
const std::initializer_list< double > DBARZERODELTAZERO_ELASTIC_SIG
Elastic D̄⁰Δ⁰ cross section Tolos:2013kva .
double DbarzeroDeltaminus_DminusDeltazero(double sqrts)
D̄⁰Δ⁻ -> D⁻Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltazero_elastic_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > kplusp_total_interpolation
An interpolation that gets lazily filled using the KPLUSP_TOT data.
static std::unique_ptr< InterpolateDataLinear< double > > Dstarzeropiplus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROPIPLUS_ELASTIC data.
double DminusDeltaplusplus_DbarzeroDeltaplus(double sqrts)
D⁻Δ⁺⁺ -> D̄⁰Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > PIPLUSPIMINUS_TOT_SIG
Total π⁺ π⁻ cross section parametrized from bottom-up SMASH-3.0, using the hadronic list from PDG2018...
std::optional< double > DminusDeltazero_elastic(double sqrts)
D⁻Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double piplusp_sigmapluskplus_pdg(double mandelstam_s)
pi+ p to Sigma+ K+ cross section parametrization, PDG data.
const std::initializer_list< double > DSTARPLUSPIZERO_ELASTIC_SIG
Elastic D*(2010)⁺π⁰ cross section.
const std::initializer_list< double > DPLUSPIZERO_ELASTIC_SIG
Elastic D⁺π⁰ cross section Abreu:2011ic .
double DplusKzero_DzeroKplus(double sqrts)
D⁺K⁰ -> D⁰K⁺ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
const std::initializer_list< double > DSTARZEROKMINUS_ELASTIC_SIG
Elastic D*(2007)⁰K⁻ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > kminusp_elastic_interpolation
An interpolation that gets lazily filled using the KMINUSP_ELASTIC data.
std::optional< double > DzeroDeltaplusplus_elastic(double sqrts)
D⁰Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DminusDeltaplus_elastic(double sqrts)
D⁻Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double Dplusn_Dzerop(double sqrts)
D⁺n -> D⁰p cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DstarzeroKminus_elastic(double sqrts)
D*(2007)⁰K⁻ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
const std::initializer_list< double > DSTARZEROPIPLUS_ELASTIC_SIG
Elastic D*(2007)⁰π⁺ cross section.
const std::initializer_list< double > DZEROKPLUS_ELASTIC_SIG
Elastic D⁰K⁺ cross section Tolos:2013kva .
const std::initializer_list< double > DBARDELTA_SQRTS
Center-of-mass energy.
std::optional< double > Dzeropizero_elastic(double sqrts)
D⁰π⁰ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
const std::initializer_list< double > DPLUSP_ELASTIC_SIG
Elastic D⁺p cross section Tolos:2013kva .
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_P_LAB
PDG data on pi- p to Sigma- K+ cross section: momentum in lab frame.
const std::initializer_list< double > KMINUSN_TOT_SIG
PDG data on K- n total cross section: cross section.
double piminusp_total(double sqrts)
pi- p total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
double DzeroDeltaplus_DplusDeltazero(double sqrts)
D⁰Δ⁺ -> D⁺Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double deuteron_nucleon_elastic(double mandelstam_s)
Deuteron nucleon elastic cross-section [mb] parametrized by Oh:2009gx .
const std::initializer_list< double > DPLUSKBARZERO_ELASTIC_SIG
Elastic D⁺K̄⁰ cross section Tolos:2013kva .
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:69
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltaplus_DzeroDeltaplusplus_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAPLUS_DZERODELTAPLUSPLUS data.
const std::initializer_list< double > DZEROPIZERO_ELASTIC_SIG
Elastic D⁰π⁰ cross section Abreu:2011ic .
static std::unique_ptr< InterpolateDataLinear< double > > Dbarzeron_elastic_interpolation
An interpolation that gets lazily filled using the DBARZERON_ELASTIC data.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
const std::initializer_list< double > PIMINUSP_SIGMA0K0_RES_SIG
pi- p to Sigma0 K0 cross section: cross section
std::optional< double > DplusDeltaminus_elastic(double sqrts)
D⁺Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DzeroKminus_elastic(double sqrts)
D⁰K⁻ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > DstarzeroKplus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROKPLUS_ELASTIC data.
double piminusp_sigmaminuskplus_pdg(double mandelstam_s)
pi- p -> Sigma- K+ cross section parametrization, PDG data.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroKzero_elastic_interpolation
An interpolation that gets lazily filled using the DZEROKZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DplusKminus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSKMINUS_ELASTIC data.
double piminusp_lambdak0_pdg(double mandelstam_s)
pi- p -> Lambda K0 cross section parametrization, PDG data.
std::optional< double > Dzeropiminus_elastic(double sqrts)
D⁰π⁻ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > DstarplusKminus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSKMINUS_ELASTIC data.
const std::initializer_list< double > DSTARPLUSPIPLUS_ELASTIC_SIG
Elastic D*(2010)⁺π⁺ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > Dzerop_Dplusn_interpolation
An interpolation that gets lazily filled using the DZEROP_DPLUSN data.
std::optional< double > Dstarzeropiplus_elastic(double sqrts)
D*(2007)⁰π⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
static std::unique_ptr< InterpolateDataLinear< double > > Dzeron_elastic_interpolation
An interpolation that gets lazily filled using the DZERON_ELASTIC data.
const std::initializer_list< double > DZEROKPLUS_DPLUSKZERO_SIG
D⁰K⁺ -> D⁺K⁰ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DstarzeroKminus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROKMINUS_ELASTIC data.
std::optional< double > DplusDeltaplusplus_elastic(double sqrts)
D⁺Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DminusDeltaplusplus_elastic(double sqrts)
D⁻Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltazero_elastic_interpolation
An interpolation that gets lazily filled using the DZERODELTAZERO_ELASTIC data.
const std::initializer_list< double > DMINUSN_ELASTIC_SIG
Elastic D⁻n cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > Dstarzeroeta_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROETA_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltazero_DbarzeroDeltaminus_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAZERO_DBARZERODELTAMINUS data.
const std::initializer_list< double > DPLUSDELTAPLUSPLUS_ELASTIC_SIG
Elastic D⁺Δ⁺⁺ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > Dstarpluspizero_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSPIZERO_ELASTIC data.
const std::initializer_list< double > PIPLUSP_ELASTIC_P_LAB
PDG data on pi+ p elastic cross section: momentum in lab frame.
double DplusDeltaminus_DzeroDeltazero(double sqrts)
D⁺Δ⁻ -> D⁰Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DbarzeroDeltaplusplus_elastic(double sqrts)
D̄⁰Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static void initialize(std::unordered_map< std::pair< uint64_t, uint64_t >, double, pair_hash > &ratios)
Calculate and store isospin ratios for K N -> K Delta reactions.
double deuteron_antinucleon_inelastic(double aN_kinetic_energy)
Parametrization of deuteron-antinucleon inelastic cross section.
const std::initializer_list< double > DZERODELTAZERO_ELASTIC_SIG
Elastic D⁰Δ⁰ cross section Tolos:2013kva .
const std::initializer_list< double > DSTARZEROKBARZERO_ELASTIC_SIG
Elastic D*(2007)⁰K̄⁰ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltaminus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAMINUS_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > Dpluseta_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSETA_ELASTIC data.
double k0p_elastic_background(double mandelstam_s)
K0 p elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
std::optional< double > Dpluspizero_elastic(double sqrts)
D⁺π⁰ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
const std::initializer_list< double > DPLUSPIPLUS_ELASTIC_SIG
Elastic D⁺π⁺ cross section Abreu:2011ic .
double deuteron_pion_elastic(double mandelstam_s)
Deuteron pion elastic cross-section [mb] parametrized to fit pi-d elastic scattering data (the data c...
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltaplus_DbarzeroDeltazero_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAPLUS_DBARZERODELTAZERO data.
const std::initializer_list< double > DSTARZEROKZERO_ELASTIC_SIG
Elastic D*(2007)⁰K⁰ cross section.
const std::initializer_list< double > PIZEROPIZERO_TOT_SIG
Total π⁰ π⁰ cross section parametrized from bottom-up SMASH-3.0 using the hadronic list from PDG2018.
std::optional< double > DzeroKbarzero_elastic(double sqrts)
D⁰K̄⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double lambdasigma0_ximinusp(double sqrts_sqrts0)
Lambda Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
const std::initializer_list< double > PIMINUSP_TOT_SIG
Total p π⁻ cross section parametrized from bottom-up SMASH-3.0, using the hadronic list from PDG2018.
double DminusDeltazero_DbarzeroDeltaminus(double sqrts)
D⁻Δ⁰ -> D̄⁰Δ⁻ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double NN_string_hard(double mandelstam_s)
nucleon-nucleon hard scattering cross section (with partonic scattering)
double Dzerop_Dplusn(double sqrts)
D⁰p -> D⁺n cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > DPI_SQRTS
Center-of-mass energy.
double xs_ppbar_annihilation(double mandelstam_s)
parametrized cross-section for proton-antiproton annihilation used in the UrQMD model
const std::initializer_list< double > DBARZERODELTAPLUS_DMINUSDELTAPLUSPLUS_SIG
D̄⁰Δ⁺ -> D⁻Δ⁺⁺ cross section Tolos:2013kva .
double DbarzeroDeltaplus_DminusDeltaplusplus(double sqrts)
D̄⁰Δ⁺ -> D⁻Δ⁺⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DplusDeltaplus_elastic(double sqrts)
D⁺Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_total_interpolation
An interpolation that gets lazily filled using the PIPLUSP_TOT data.
const std::initializer_list< double > PIPLUSP_ELASTIC_SIG
PDG data on pi+ p elastic cross section: cross section.
static std::unique_ptr< InterpolateDataLinear< double > > DstarplusKminus_DstarzeroKbarzero_interpolation
An interpolation that gets lazily filled using the DSTARPLUSKMINUS_DSTARZEROKBARZERO data.
double kplusp_inelastic_background(double mandelstam_s)
K+ p inelastic background cross section parametrization Source: Buss:2011mx , B.3....
std::optional< double > Dzerop_elastic(double sqrts)
D⁰p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltaplusplus_DplusDeltaplus_interpolation
An interpolation that gets lazily filled using the DZERODELTAPLUSPLUS_DPLUSDELTAPLUS data.
const std::initializer_list< double > DSTARETA_SQRTS
Center-of-mass energy.
const std::initializer_list< double > PIMINUSP_SIGMA0K0_RES_SQRTS
pi- p to Sigma0 K0 cross section: square root s
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_SIG
PDG data on pi- p to Sigma- K+ cross section: cross section.
double DminusDeltaplus_DbarzeroDeltazero(double sqrts)
D⁻Δ⁺ -> D̄⁰Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double sigmaplussigmaminus_xi0n(double sqrts_sqrts0)
Sigma+ Sigma- <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model ...
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:76
const std::initializer_list< double > PIPLUSP_TOT_SQRTS
Center-of-mass energy.
const std::initializer_list< double > DBARZERODELTAPLUS_ELASTIC_SIG
Elastic D̄⁰Δ⁺ cross section Tolos:2013kva .
double plab_from_s_heavier_particle_at_rest(double mandelstam_s, double m1, double m2)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:211
static std::unique_ptr< InterpolateDataLinear< double > > Dstarzeropiminus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROPIMINUS_ELASTIC data.
double kminusp_pi0sigma0(double sqrts)
K- p <-> pi0 Sigma0 cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.
double kplusn_elastic_background(double mandelstam_s)
K+ n elastic background cross section parametrization sigma(K+n->K+n) = sigma(K+n->K0p) = 0....
const std::initializer_list< double > DPLUSN_DZEROP_SIG
D⁺n -> D⁰p cross section Tolos:2013kva .
double pp_total(double mandelstam_s)
pp total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx
const std::initializer_list< double > DKAON_SQRTS
Center-of-mass energy.
double DplusDeltazero_DzeroDeltaplus(double sqrts)
D⁺Δ⁰ -> D⁰Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > KMINUSP_ELASTIC_SIG
PDG data on K- p elastic cross section: cross section.
const std::initializer_list< double > DPLUSDELTAZERO_DZERODELTAPLUS_SIG
D⁺Δ⁰ -> D⁰Δ⁺ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigma0k0_interpolation
An interpolation that gets lazily filled using the PIMINUSP_SIGMA0K0_RES data.
const std::initializer_list< double > DSTARPLUSKPLUS_ELASTIC_SIG
Elastic D*(2010)⁺K⁺ cross section.
const std::initializer_list< double > DSTARPLUSPIMINUS_ELASTIC_SIG
Elastic D*(2010)⁺π⁻ cross section.
const std::initializer_list< double > DPLUSDELTAPLUS_DZERODELTAPLUSPLUS_SIG
D⁺Δ⁺ -> D⁰Δ⁺⁺ cross section Tolos:2013kva .
const std::initializer_list< double > PIPLUSP_TOT_SIG
Total p π⁺ cross section parametrized from bottom-up SMASH-3.0, using the hadronic list from PDG2018.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_total_interpolation
An interpolation that gets lazily filled using the PIMINUSP_TOT data.
const std::initializer_list< double > DMINUSDELTAPLUS_DBARZERODELTAZERO_SIG
D⁻Δ⁺ -> D̄⁰Δ⁰ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DzeroKplus_DplusKzero_interpolation
An interpolation that gets lazily filled using the DZEROKPLUS_DPLUSKZERO data.
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltaplusplus_elastic_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAPLUSPLUS_ELASTIC data.
std::optional< double > Dstarpluseta_elastic(double sqrts)
D*(2010)⁺η elastic cross section (data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > DzeroKbarzero_DplusKminus_interpolation
An interpolation that gets lazily filled using the DZEROKBARZERO_DPLUSKMINUS data.
const std::initializer_list< double > PIMINUSP_RES_SQRTS
Center-of-mass energy.
const std::initializer_list< double > DBARZERODELTAZERO_DMINUSDELTAPLUS_SIG
D̄⁰Δ⁰ -> D⁻Δ⁺ cross section Tolos:2013kva .
std::optional< double > DplusKminus_elastic(double sqrts)
D⁺K⁻ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double kplusn_total(double mandelstam_s)
K+ n total cross section parametrization.
const std::initializer_list< double > DZERODELTAMINUS_ELASTIC_SIG
Elastic D⁰Δ⁻ cross section Tolos:2013kva .
const std::initializer_list< double > DSTARZEROPIZERO_DSTARPLUSPIMINUS_SIG
D*(2007)⁰π⁰ -> D*(2010)⁺π⁻ cross section.
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:41
std::optional< double > DstarplusKzero_elastic(double sqrts)
D*(2010)⁺K⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
static std::unique_ptr< InterpolateDataLinear< double > > DzeroKplus_elastic_interpolation
An interpolation that gets lazily filled using the DZEROKPLUS_ELASTIC data.
double np_elastic(double mandelstam_s)
np elastic cross section parametrization Source: Weil:2013mya , eq.
const std::initializer_list< double > DZEROKBARZERO_ELASTIC_SIG
Elastic D⁰K̄⁰ cross section Tolos:2013kva .
const std::initializer_list< double > DZERODELTAZERO_DPLUSDELTAMINUS_SIG
D⁰Δ⁰ -> D⁺Δ⁻ cross section Tolos:2013kva .
std::optional< double > DbarzeroDeltaminus_elastic(double sqrts)
D̄⁰Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > DPLUSDELTAZERO_ELASTIC_SIG
Elastic D⁺Δ⁰ cross section Tolos:2013kva .
std::optional< double > DbarzeroDeltazero_elastic(double sqrts)
D̄⁰Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double k0n_elastic_background(double mandelstam_s)
K0 n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
static std::unique_ptr< InterpolateDataLinear< double > > Dminusp_Dbarzeron_interpolation
An interpolation that gets lazily filled using the DMINUSP_DBARZERON data.
double sigma0sigma0_xi0n(double sqrts_sqrts0)
Sigma0 Sigma0 <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model ...
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:83
const std::initializer_list< double > DPLUSDELTAMINUS_DZERODELTAZERO_SIG
D⁺Δ⁻ -> D⁰Δ⁰ cross section Tolos:2013kva .
const std::initializer_list< double > DZEROKMINUS_ELASTIC_SIG
Elastic D⁰K⁻ cross section Tolos:2013kva .
double kminusp_piplussigmaminus(double sqrts)
K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra ).
double kminusp_total(double mandelstam_s)
K- p total cross section parametrization.
const std::initializer_list< double > DZERODELTAPLUS_ELASTIC_SIG
Elastic D⁰Δ⁺ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltaplus_elastic_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAPLUS_ELASTIC data.
double Dzeropiplus_Dpluspizero(double sqrts)
D⁰π⁺ -> D⁺π⁰ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
const std::initializer_list< double > DSTARZEROKBARZERO_DSTARPLUSKMINUS_SIG
D*(2007)⁰K̄⁰ -> D*(2010)⁺K⁻ cross section.
double kbar0n_elastic_background(double mandelstam_s)
Kbar0 n elastic background cross section parametrization Source: Buss:2011mx , B.3....
const std::initializer_list< double > DMINUSDELTAMINUS_ELASTIC_SIG
Elastic D⁻Δ⁻ cross section Tolos:2013kva .
double kminusp_kbar0n(double mandelstam_s)
K- p <-> Kbar0 n cross section parametrization.
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltazero_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAZERO_ELASTIC data.
std::optional< double > DstarplusKplus_elastic(double sqrts)
D*(2010)⁺K⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
double sigmaplussigmaminus_ximinusp(double sqrts_sqrts0)
Sigma+ Sigma- <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
static std::unique_ptr< InterpolateDataLinear< double > > pizeropizero_total_interpolation
An interpolation that gets lazily filled using the PIZEROPIZERO_TOT data.
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
double DzeroKplus_DplusKzero(double sqrts)
D⁰K⁺ -> D⁺K⁰ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > Dplusn_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSN_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DminusDeltaplusplus_elastic_interpolation
An interpolation that gets lazily filled using the DMINUSDELTAPLUSPLUS_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DplusDeltaplus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSDELTAPLUS_ELASTIC data.
const std::initializer_list< double > DSTARPLUSETA_ELASTIC_SIG
Elastic D*(2010)⁺η cross section. Data provided by Juan Torres-Rincon.
const std::initializer_list< double > DSTARPLUSPIMINUS_DSTARZEROPIZERO_SIG
D*(2010)⁺π⁻ -> D*(2007)⁰π⁰ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > pipluspiminus_total_interpolation
An interpolation that gets lazily filled using the PIPLUSPIMINUS_TOT data.
double deuteron_nucleon_inelastic(double N_kinetic_energy)
Parametrization of deuteron-nucleon inelastic cross section.
static std::unique_ptr< InterpolateDataLinear< double > > DstarplusKbarzero_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSKBARZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > kminusn_total_interpolation
An interpolation that gets lazily filled using the KMINUSN_TOT data.
static std::unique_ptr< InterpolateDataLinear< double > > Dbarzerop_elastic_interpolation
An interpolation that gets lazily filled using the DBARZEROP_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DbarzeroDeltaplus_DminusDeltaplusplus_interpolation
An interpolation that gets lazily filled using the DBARZERODELTAPLUS_DMINUSDELTAPLUSPLUS data.
static std::unique_ptr< InterpolateDataLinear< double > > Dpluspiminus_Dzeropizero_interpolation
An interpolation that gets lazily filled using the DPLUSPIMINUS_DZEROPIZERO data.
const std::initializer_list< double > DSTARPLUSPIZERO_DSTARZEROPIPLUS_SIG
D*(2010)⁺π⁰ -> D*(2007)⁰π⁺ cross section.
std::optional< double > DminusDeltaminus_elastic(double sqrts)
D⁻Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double piplusp_total(double sqrts)
pi+ p total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
static std::unique_ptr< InterpolateDataLinear< double > > DstarzeroKplus_DstarplusKzero_interpolation
An interpolation that gets lazily filled using the DSTARZEROKPLUS_DSTARPLUSKZERO data.
static std::unique_ptr< InterpolateDataLinear< double > > Dzeropiplus_Dpluspizero_interpolation
An interpolation that gets lazily filled using the DZEROPIPLUS_DPLUSPIZERO data.
static std::unique_ptr< InterpolateDataLinear< double > > DstarzeroKzero_elastic_interpolation
An interpolation that gets lazily filled using the DSTARZEROKZERO_ELASTIC data.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroDeltaplusplus_elastic_interpolation
An interpolation that gets lazily filled using the DZERODELTAPLUSPLUS_ELASTIC data.
double piminusp_high_energy(double mandelstam_s)
pi-p total cross section at high energies
std::optional< double > DstarzeroKbarzero_elastic(double sqrts)
D*(2007)⁰K̄⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rin...
double kminusn_total(double mandelstam_s)
K- n total cross section parametrization.
double kminusn_elastic_background(double mandelstam_s)
K- n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
std::optional< double > Dzeropiplus_elastic(double sqrts)
D⁰π⁺ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
const std::initializer_list< double > DSTARZEROPIZERO_ELASTIC_SIG
Elastic D*(2007)⁰π⁰ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > Dstarpluspiminus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSPIMINUS_ELASTIC data.
const std::initializer_list< double > DPLUSKZERO_DZEROKPLUS_SIG
D⁺K⁰ -> D⁰K⁺ cross section Tolos:2013kva .
double pp_elastic(double mandelstam_s)
pp elastic cross section parametrization Source: Weil:2013mya , eq.
double DzeroDeltaplusplus_DplusDeltaplus(double sqrts)
D⁰Δ⁺⁺ -> D⁺Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static std::unique_ptr< InterpolateDataLinear< double > > DplusKminus_DzeroKbarzero_interpolation
An interpolation that gets lazily filled using the DPLUSKMINUS_DZEROKBARZERO data.
const std::initializer_list< double > KMINUSP_TOT_SIG
PDG smoothed data on K- p total cross section: cross section.
std::optional< double > Dstarpluspiminus_elastic(double sqrts)
D*(2010)⁺π⁻ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
const std::initializer_list< double > DZERODELTAPLUS_DPLUSDELTAZERO_SIG
D⁰Δ⁺ -> D⁺Δ⁰ cross section Tolos:2013kva .
static std::unique_ptr< InterpolateDataLinear< double > > DstarplusKplus_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSKPLUS_ELASTIC data.
std::optional< double > DstarplusKbarzero_elastic(double sqrts)
D*(2010)⁺K̄⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rin...
const std::initializer_list< double > DBARZERODELTAMINUS_ELASTIC_SIG
Elastic D̄⁰Δ⁻ cross section Tolos:2013kva .
double Dzeropizero_Dpluspiminus(double sqrts)
D⁰π⁰ -> D⁺π⁻ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
double kplusn_inelastic_background(double mandelstam_s)
K+ n inelastic background cross section parametrization Source: Buss:2011mx , B.3....
const std::initializer_list< double > DSTARPLUSKMINUS_ELASTIC_SIG
Elastic D*(2010)⁺K⁻ cross section.
const std::initializer_list< double > PIZEROPIZERO_TOT_SQRTS
Center-of-mass energy.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_lambdak0_interpolation
An interpolation that gets lazily filled using the PIMINUSP_LAMBDAK0 data.
std::optional< double > DstarplusKminus_elastic(double sqrts)
D*(2010)⁺K⁻ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
const std::initializer_list< double > DZERODELTAPLUSPLUS_ELASTIC_SIG
Elastic D⁰Δ⁺⁺ cross section Tolos:2013kva .
const std::initializer_list< double > DPLUSDELTAMINUS_ELASTIC_SIG
Elastic D⁺Δ⁻ cross section Tolos:2013kva .
const std::initializer_list< double > DSTARZEROKPLUS_DSTARPLUSKZERO_SIG
D*(2007)⁰K⁺ -> D*(2010)⁺K⁰ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigmaminuskplus_interpolation
An interpolation that gets lazily filled using the PIMINUSP_SIGMAMINUSKPLUS data.
double DbarzeroDeltazero_DminusDeltaplus(double sqrts)
D̄⁰Δ⁰ -> D⁻Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
static std::unique_ptr< InterpolateDataLinear< double > > DzeroKminus_elastic_interpolation
An interpolation that gets lazily filled using the DZEROKMINUS_ELASTIC data.
std::optional< double > DbarzeroDeltaplus_elastic(double sqrts)
D̄⁰Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double piplusp_elastic_AQM(double mandelstam_s, double m1, double m2)
pi+p elactic cross section parametrization.
double piplusp_elastic(double mandelstam_s)
pi+p elastic cross section parametrization, PDG data.
std::optional< double > Dstarzeropizero_elastic(double sqrts)
D*(2007)⁰π⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
static std::unique_ptr< InterpolateDataSpline > piminusp_elastic_res_interpolation
An interpolation that gets lazily filled using the PIMINUSP_RES data.
static std::unique_ptr< InterpolateDataLinear< double > > Dzeropizero_Dpluspiminus_interpolation
An interpolation that gets lazily filled using the DZEROPIZERO_DPLUSPIMINUS data.
double sigma0sigmaminus_ximinusn(double sqrts_sqrts0)
Sigma0 Sigma- <-> Xi- n cross section parametrization Two hyperon exchange, based on effective model ...
double sigmaplussigmaminus_xi0p(double sqrts_sqrts0)
Sigma+ Sigma- <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model ...
static std::unique_ptr< InterpolateDataLinear< double > > Dplusn_Dzerop_interpolation
An interpolation that gets lazily filled using the DPLUSN_DZEROP data.
const std::initializer_list< double > DZERON_ELASTIC_SIG
Elastic D⁰n cross section Tolos:2013kva .
const std::initializer_list< double > DZEROPIMINUS_ELASTIC_SIG
Elastic D⁰π⁻ cross section Abreu:2011ic .
static std::unique_ptr< InterpolateDataLinear< double > > DstarplusKzero_elastic_interpolation
An interpolation that gets lazily filled using the DSTARPLUSKZERO_ELASTIC data.
std::optional< double > DzeroDeltazero_elastic(double sqrts)
D⁰Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
const std::initializer_list< double > DZEROETA_ELASTIC_SIG
Elastic D⁰η cross section Tolos:2013kva .
std::optional< double > Dzeroeta_elastic(double sqrts)
D⁰η elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
static std::unique_ptr< InterpolateDataLinear< double > > Dpluspiplus_elastic_interpolation
An interpolation that gets lazily filled using the DPLUSPIPLUS_ELASTIC data.
const std::initializer_list< double > PIMINUSP_LAMBDAK0_SIG
PDG data on pi- p to Lambda K0 cross section: cross section.
Hash a pair of integers.