Version: SMASH-2.2
parametrizations.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2013-2021
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #include "smash/parametrizations.h"
12 
13 #include <cmath>
14 #include <initializer_list>
15 #include <iostream>
16 #include <memory>
17 #include <vector>
18 
19 #include "smash/average.h"
20 #include "smash/clebschgordan.h"
21 #include "smash/constants.h"
22 #include "smash/cxx14compat.h"
23 #include "smash/kinematics.h"
24 #include "smash/lowess.h"
25 #include "smash/pow.h"
26 
27 namespace smash {
28 
29 double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma,
30  double mb, double P, double R1, double R2) {
31  const double M = 2.1206;
32  const double H = 0.272;
33  const double eta1 = 0.4473;
34  const double eta2 = 0.5486;
35  const double s_sab = mandelstam_s / (ma + mb + M) / (ma + mb + M);
36  double xs =
37  H * std::log(s_sab) * std::log(s_sab) + P + R1 * std::pow(s_sab, -eta1);
38  xs = is_opposite_charge ? xs + R2 * std::pow(s_sab, -eta2)
39  : xs - R2 * std::pow(s_sab, -eta2);
40  return xs;
41 }
42 
43 double pp_high_energy(double mandelstam_s) {
44  return xs_high_energy(mandelstam_s, false, 0.939, 0.939, 34.41, 13.07, 7.394);
45 }
46 
47 double ppbar_high_energy(double mandelstam_s) {
48  return xs_high_energy(mandelstam_s, true, 0.939, 0.939, 34.41, 13.07, 7.394);
49 }
50 
51 double np_high_energy(double mandelstam_s) {
52  return xs_high_energy(mandelstam_s, false, 0.939, 0.939, 34.41, 12.52, 6.66);
53 }
54 
55 double npbar_high_energy(double mandelstam_s) {
56  return xs_high_energy(mandelstam_s, true, 0.939, 0.939, 34.41, 12.52, 6.66);
57 }
58 
59 double piplusp_high_energy(double mandelstam_s) {
60  return xs_high_energy(mandelstam_s, false, 0.939, 0.138, 18.75, 9.56, 1.767);
61 }
62 
63 double piminusp_high_energy(double mandelstam_s) {
64  return xs_high_energy(mandelstam_s, true, 0.939, 0.138, 18.75, 9.56, 1.767);
65 }
66 
67 double xs_ppbar_annihilation(double mandelstam_s) {
68  const double xs_ref = 120.;
69  const double s_ref = 4. * nucleon_mass * nucleon_mass;
70  const double constant_a = 0.05;
71  const double constant_b = 0.6;
72  const double factor = constant_a * constant_a * s_ref /
73  ((mandelstam_s - s_ref) * (mandelstam_s - s_ref) +
74  constant_a * constant_a * s_ref) +
75  constant_b;
76  return xs_ref * (s_ref / mandelstam_s) * factor;
77 }
78 
79 double xs_string_hard(double mandelstam_s, double xs_0, double e_0,
80  double lambda_pow) {
81  const double sqrts = std::sqrt(mandelstam_s);
82  if (sqrts < e_0) {
83  return 0.;
84  } else {
85  double xs = xs_0 * std::pow(std::log(sqrts / e_0), lambda_pow);
86  return xs;
87  }
88 }
89 
90 double NN_string_hard(double mandelstam_s) {
91  return xs_string_hard(mandelstam_s, 0.087, 4.1, 3.8);
92 }
93 
94 double Npi_string_hard(double mandelstam_s) {
95  return xs_string_hard(mandelstam_s, 0.042, 3.5, 4.2);
96 }
97 
98 double pipi_string_hard(double mandelstam_s) {
99  return xs_string_hard(mandelstam_s, 0.013, 2.3, 4.7);
100 }
101 
102 /* pi+ p elastic cross section parametrization, PDG data.
103  *
104  * The PDG data is smoothed using the LOWESS algorithm. If more than one
105  * cross section was given for one p_lab value, the corresponding cross sections
106  * are averaged. */
107 static double piplusp_elastic_pdg(double mandelstam_s) {
108  if (piplusp_elastic_interpolation == nullptr) {
109  std::vector<double> x = PIPLUSP_ELASTIC_P_LAB;
110  std::vector<double> y = PIPLUSP_ELASTIC_SIG;
111  std::vector<double> dedup_x;
112  std::vector<double> dedup_y;
113  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
114  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
116  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
117  }
118  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
119  return (*piplusp_elastic_interpolation)(p_lab);
120 }
121 
122 double piplusp_elastic_high_energy(double mandelstam_s, double m1, double m2) {
123  const double p_lab = (m1 > m2) ? plab_from_s(mandelstam_s, m2, m1)
124  : plab_from_s(mandelstam_s, m1, m2);
125  const auto logp = std::log(p_lab);
126  return 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
127 }
128 
129 double piplusp_elastic_AQM(double mandelstam_s, double m1, double m2) {
130  const double p_lab = (m1 > m2) ? plab_from_s(mandelstam_s, m2, m1)
131  : plab_from_s(mandelstam_s, m1, m2);
132  if (p_lab < 3.05) { // the plab from which the param starts to explode
133  return 7.5; // this will be scaled down by 2/3 for meson-meson
134  } else {
135  return piplusp_elastic_high_energy(mandelstam_s, m1, m2);
136  }
137 }
138 
139 double piplusp_elastic(double mandelstam_s) {
140  double sigma;
141  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
142  if (mandelstam_s < 2.25) {
143  sigma = really_small;
144  } else if (mandelstam_s > 4.84) {
145  const auto logp = std::log(p_lab);
146  sigma = 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
147  } else {
148  sigma = piplusp_elastic_pdg(mandelstam_s);
149  }
150 
151  // The elastic contributions from decays still need to be subtracted.
152  if (piplusp_elastic_res_interpolation == nullptr) {
153  std::vector<double> x = PIPLUSP_RES_SQRTS;
154  for (auto& i : x) {
155  i = i * i;
156  }
157  std::vector<double> y = PIPLUSP_RES_SIG;
159  make_unique<InterpolateDataSpline>(x, y);
160  }
161  sigma -= (*piplusp_elastic_res_interpolation)(mandelstam_s);
162  if (sigma < 0) {
163  sigma = really_small;
164  }
165  return sigma;
166 }
167 
168 /* pi+ p to Sigma+ K+ cross section parametrization, PDG data.
169  *
170  * The PDG data is smoothed using the LOWESS algorithm. If more than one
171  * cross section was given for one p_lab value, the corresponding cross sections
172  * are averaged. */
173 double piplusp_sigmapluskplus_pdg(double mandelstam_s) {
174  if (piplusp_sigmapluskplus_interpolation == nullptr) {
175  std::vector<double> x = PIPLUSP_SIGMAPLUSKPLUS_P_LAB;
176  std::vector<double> y = PIPLUSP_SIGMAPLUSKPLUS_SIG;
177  std::vector<double> dedup_x;
178  std::vector<double> dedup_y;
179  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
180  dedup_y = smooth(dedup_x, dedup_y, 0.2, 5);
182  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
183  }
184  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
185  return (*piplusp_sigmapluskplus_interpolation)(p_lab);
186 }
187 
188 /* pi- p elastic cross section parametrization, PDG data.
189  *
190  * The PDG data is smoothed using the LOWESS algorithm. If more than one
191  * cross section was given for one p_lab value, the corresponding cross sections
192  * are averaged. */
193 static double piminusp_elastic_pdg(double mandelstam_s) {
194  if (piminusp_elastic_interpolation == nullptr) {
195  std::vector<double> x = PIMINUSP_ELASTIC_P_LAB;
196  std::vector<double> y = PIMINUSP_ELASTIC_SIG;
197  std::vector<double> dedup_x;
198  std::vector<double> dedup_y;
199  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
200  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
202  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
203  }
204  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
205  return (*piminusp_elastic_interpolation)(p_lab);
206 }
207 
208 double piminusp_elastic(double mandelstam_s) {
209  double sigma;
210  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
211  const auto logp = std::log(p_lab);
212  if (mandelstam_s < 1.69) {
213  sigma = really_small;
214  } else if (mandelstam_s > 4.84) {
215  sigma = 1.76 + 11.2 * std::pow(p_lab, -0.64) + 0.043 * logp * logp;
216  } else {
217  sigma = piminusp_elastic_pdg(mandelstam_s);
218  }
219  /* Tune down the elastic cross section when sqrt s is between 1.8 GeV
220  * and 1.97 GeV so that the total cross section can fit the data. The
221  * scaling factor is chosen so that the it's equal to one and its
222  * derivate vanishes at the both ends. The minimum scaling factor in this
223  * region is 0.88-0.12=0.76. */
224  if (mandelstam_s > 3.24 && mandelstam_s < 3.8809) {
225  sigma *= (0.12 * std::cos(2 * M_PI * (std::sqrt(mandelstam_s) - 1.8) /
226  (1.97 - 1.8)) +
227  0.88);
228  }
229  // The elastic contributions from decays still need to be subtracted.
230  if (piminusp_elastic_res_interpolation == nullptr) {
231  std::vector<double> x = PIMINUSP_RES_SQRTS;
232  for (auto& i : x) {
233  i = i * i;
234  }
235  std::vector<double> y = PIMINUSP_RES_SIG;
236  std::vector<double> dedup_x;
237  std::vector<double> dedup_y;
238  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
240  make_unique<InterpolateDataSpline>(dedup_x, dedup_y);
241  }
242  sigma -= (*piminusp_elastic_res_interpolation)(mandelstam_s);
243  if (sigma < 0) {
244  sigma = really_small;
245  }
246  return sigma;
247 }
248 
249 /* pi- p -> Lambda K0 cross section parametrization, PDG data.
250  *
251  * The PDG data is smoothed using the LOWESS algorithm. If more than one
252  * cross section was given for one p_lab value, the corresponding cross sections
253  * are averaged. */
254 double piminusp_lambdak0_pdg(double mandelstam_s) {
255  if (piminusp_lambdak0_interpolation == nullptr) {
256  std::vector<double> x = PIMINUSP_LAMBDAK0_P_LAB;
257  std::vector<double> y = PIMINUSP_LAMBDAK0_SIG;
258  std::vector<double> dedup_x;
259  std::vector<double> dedup_y;
260  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
261  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
263  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
264  }
265  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
266  return (*piminusp_lambdak0_interpolation)(p_lab);
267 }
268 
269 /* pi- p -> Sigma- K+ cross section parametrization, PDG data.
270  *
271  * The PDG data is smoothed using the LOWESS algorithm. If more than one
272  * cross section was given for one p_lab value, the corresponding cross sections
273  * are averaged. */
274 double piminusp_sigmaminuskplus_pdg(double mandelstam_s) {
276  std::vector<double> x = PIMINUSP_SIGMAMINUSKPLUS_P_LAB;
277  std::vector<double> y = PIMINUSP_SIGMAMINUSKPLUS_SIG;
278  std::vector<double> dedup_x;
279  std::vector<double> dedup_y;
280  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
281  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
283  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
284  }
285  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
287 }
288 
289 /* pi- p -> Sigma0 K0 cross section parametrization, resonance contribution.
290  *
291  * The data is smoothed using the LOWESS algorithm. If more than one
292  * cross section was given for one sqrts value, the corresponding cross sections
293  * are averaged. */
294 double piminusp_sigma0k0_res(double mandelstam_s) {
295  if (piminusp_sigma0k0_interpolation == nullptr) {
296  std::vector<double> x = PIMINUSP_SIGMA0K0_RES_SQRTS;
297  std::vector<double> y = PIMINUSP_SIGMA0K0_RES_SIG;
298  std::vector<double> dedup_x;
299  std::vector<double> dedup_y;
300  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
301  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
303  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
304  }
305  const double sqrts = std::sqrt(mandelstam_s);
306  return (*piminusp_sigma0k0_interpolation)(sqrts);
307 }
308 
309 double pp_elastic(double mandelstam_s) {
310  const double p_lab = plab_from_s(mandelstam_s);
311  if (p_lab < 0.435) {
312  return 5.12 * nucleon_mass /
313  (mandelstam_s - 4 * nucleon_mass * nucleon_mass) +
314  1.67;
315  } else if (p_lab < 0.8) {
316  return 23.5 + 1000 * pow_int(p_lab - 0.7, 4);
317  } else if (p_lab < 2.0) {
318  return 1250 / (p_lab + 50) - 4 * (p_lab - 1.3) * (p_lab - 1.3);
319  } else if (p_lab < 2.776) {
320  return 77 / (p_lab + 1.5);
321  } else {
322  const auto logp = std::log(p_lab);
323  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
324  1.85 * logp;
325  }
326 }
327 
328 double pp_elastic_high_energy(double mandelstam_s, double m1, double m2) {
329  const double p_lab = (m1 > m2) ? plab_from_s(mandelstam_s, m2, m1)
330  : plab_from_s(mandelstam_s, m1, m2);
331  const auto logp = std::log(p_lab);
332  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
333  1.85 * logp;
334 }
335 
336 double pp_total(double mandelstam_s) {
337  const double p_lab = plab_from_s(mandelstam_s);
338  if (p_lab < 0.4) {
339  return 34 * std::pow(p_lab / 0.4, -2.104);
340  } else if (p_lab < 0.8) {
341  return 23.5 + 1000 * pow_int(p_lab - 0.7, 4);
342  } else if (p_lab < 1.5) {
343  return 23.5 + 24.6 / (1 + std::exp(-(p_lab - 1.2) / 0.1));
344  } else if (p_lab < 5.0) {
345  return 41 + 60 * (p_lab - 0.9) * std::exp(-1.2 * p_lab);
346  } else {
347  const auto logp = std::log(p_lab);
348  return 48.0 + 0.522 * logp * logp - 4.51 * logp;
349  }
350 }
351 
352 double np_elastic(double mandelstam_s) {
353  const double p_lab = plab_from_s(mandelstam_s);
354  if (p_lab < 0.525) {
355  return 17.05 * nucleon_mass /
356  (mandelstam_s - 4 * nucleon_mass * nucleon_mass) -
357  6.83;
358  } else if (p_lab < 0.8) {
359  return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
360  } else if (p_lab < 2.0) {
361  return 31 / std::sqrt(p_lab);
362  } else if (p_lab < 2.776) {
363  return 77 / (p_lab + 1.5);
364  } else {
365  const auto logp = std::log(p_lab);
366  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
367  1.85 * logp;
368  }
369 }
370 
371 double np_total(double mandelstam_s) {
372  const double p_lab = plab_from_s(mandelstam_s);
373  const auto logp = std::log(p_lab);
374  if (p_lab < 0.4) {
375  return 6.3555 * std::pow(p_lab, -3.2481) * std::exp(-0.377 * logp * logp);
376  } else if (p_lab < 1.0) {
377  return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
378  } else if (p_lab < 2.0) {
379  return 24.2 + 8.9 * p_lab;
380  } else if (p_lab < 5.0) {
381  return 42;
382  } else {
383  return 48.0 + 0.522 * logp * logp - 4.51 * logp;
384  }
385 }
386 
387 double ppbar_elastic(double mandelstam_s) {
388  if (mandelstam_s < 4 * nucleon_mass * nucleon_mass) {
389  // Needed, since called directly from p_52
390  return 0.0;
391  }
392  const double p_lab = plab_from_s(mandelstam_s);
393  if (p_lab < 0.3) {
394  return 78.6;
395  } else if (p_lab < 5.0) {
396  return 31.6 + 18.3 / p_lab - 1.1 / (p_lab * p_lab) - 3.8 * p_lab;
397  } else {
398  const auto logp = std::log(p_lab);
399  return 10.2 + 52.7 * std::pow(p_lab, -1.16) + 0.125 * logp * logp -
400  1.28 * logp;
401  }
402 }
403 
404 double ppbar_total(double mandelstam_s) {
405  if (mandelstam_s < 4 * nucleon_mass * nucleon_mass) {
406  // Needed, since called directly from p_52
407  return 0.0;
408  }
409  const double p_lab = plab_from_s(mandelstam_s);
410  if (p_lab < 0.3) {
411  return 271.6 * std::exp(-1.1 * p_lab * p_lab);
412  } else if (p_lab < 5.0) {
413  return 75.0 + 43.1 / p_lab + 2.6 / (p_lab * p_lab) - 3.9 * p_lab;
414  } else {
415  const auto logp = std::log(p_lab);
416  return 38.4 + 77.6 * std::pow(p_lab, -0.64) + 0.26 * logp * logp -
417  1.2 * logp;
418  }
419 }
420 
421 double deuteron_pion_elastic(double mandelstam_s) {
422  const double tmp = std::sqrt(mandelstam_s) - 2.172;
423  return 4.0 + 0.27 / (tmp * tmp + 0.065 * 0.065);
424 }
425 
426 double deuteron_nucleon_elastic(double mandelstam_s) {
427  const double s = mandelstam_s;
428  return 2500.0 * std::exp(-smash::square(s - 7.93) / 0.003) +
429  600.0 * std::exp(-smash::square(s - 7.93) / 0.1) + 10.0;
430 }
431 
432 double kplusp_elastic_background(double mandelstam_s) {
433  constexpr double a0 = 10.508; // mb
434  constexpr double a1 = -3.716; // mb/GeV
435  constexpr double a2 = 1.845; // mb/GeV^2
436  constexpr double a3 = -0.764; // GeV^-1
437  constexpr double a4 = 0.508; // GeV^-2
438 
439  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
440  const double p_lab2 = p_lab * p_lab;
441 
442  return (a0 + a1 * p_lab + a2 * p_lab2) / (1 + a3 * p_lab + a4 * p_lab2);
443 }
444 
445 double kplusn_elastic_background(double mandelstam_s) {
446  return 0.25 * kplusp_elastic_background(mandelstam_s);
447 }
448 
449 double kplusn_k0p(double mandelstam_s) {
450  return 0.25 * kplusp_elastic_background(mandelstam_s);
451 }
452 
453 /* K- p elastic cross section parametrization, PDG data.
454  *
455  * The PDG data is smoothed using the LOWESS algorithm. If more than one
456  * cross section was given for one p_lab value, the corresponding cross sections
457  * are averaged. */
458 static double kminusp_elastic_pdg(double mandelstam_s) {
459  if (kminusp_elastic_interpolation == nullptr) {
460  std::vector<double> x = KMINUSP_ELASTIC_P_LAB;
461  std::vector<double> y = KMINUSP_ELASTIC_SIG;
462  std::vector<double> dedup_x;
463  std::vector<double> dedup_y;
464  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
465  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
467  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
468  }
469  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
470  return (*kminusp_elastic_interpolation)(p_lab);
471 }
472 
473 double kminusp_elastic_background(double mandelstam_s) {
474  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
475  double sigma;
476  if (std::sqrt(mandelstam_s) < 1.68) {
477  /* The parametrization here also works for anti-K0 n, Lambda pi0,
478  * Sigma+ pi-, Sigma- pi+, Sigma0 pi0 with different parameters a0, a1, a2.
479  *
480  * The values of the parameters are *not* taken from the source above,
481  * they come from a fit to PDG data. */
482  constexpr double a0 = 186.03567644; // mb GeV^2
483  constexpr double a1 = 0.22002795; // Gev
484  constexpr double a2 = 0.64907116;
485 
486  const double p_i = p_lab;
487  const double p_f = p_lab;
488 
489  const double ratio = a1 * a1 / (a1 * a1 + p_f * p_f);
490  sigma = a0 * p_f / (p_i * mandelstam_s) * std::pow(ratio, a2);
491  } else {
492  sigma = kminusp_elastic_pdg(mandelstam_s);
493  }
494  // The elastic contributions from decays still need to be subtracted.
495  if (kminusp_elastic_res_interpolation == nullptr) {
496  std::vector<double> x = KMINUSP_RES_SQRTS;
497  for (auto& i : x) {
498  i = plab_from_s(i * i, kaon_mass, nucleon_mass);
499  }
500  std::vector<double> y = KMINUSP_RES_SIG;
502  make_unique<InterpolateDataSpline>(x, y);
503  }
504  const auto old_sigma = sigma;
505  sigma -= (*kminusp_elastic_res_interpolation)(p_lab);
506  if (sigma < 0) {
507  std::cout << "NEGATIVE SIGMA: sigma=" << sigma
508  << ", sqrt(s)=" << std::sqrt(mandelstam_s)
509  << ", sig_el_exp=" << old_sigma
510  << ", sig_el_res=" << (*kminusp_elastic_res_interpolation)(p_lab)
511  << std::endl;
512  }
513  assert(sigma >= 0);
514  return sigma;
515 }
516 
517 double kminusn_elastic_background(double) { return 4.0; }
518 
519 double k0p_elastic_background(double mandelstam_s) {
520  // by isospin symmetry
521  return kplusn_elastic_background(mandelstam_s);
522 }
523 
524 double k0n_elastic_background(double mandelstam_s) {
525  // by isospin symmetry
526  return kplusp_elastic_background(mandelstam_s);
527 }
528 
529 double kbar0p_elastic_background(double mandelstam_s) {
530  // by isospin symmetry
531  return kminusn_elastic_background(mandelstam_s);
532 }
533 
534 double kbar0n_elastic_background(double mandelstam_s) {
535  // by isospin symmetry
536  return kminusp_elastic_background(mandelstam_s);
537 }
538 
539 double kplusp_inelastic_background(double mandelstam_s) {
540  if (kplusp_total_interpolation == nullptr) {
541  std::vector<double> x = KPLUSP_TOT_PLAB;
542  std::vector<double> y = KPLUSP_TOT_SIG;
543  std::vector<double> dedup_x;
544  std::vector<double> dedup_y;
545  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
546  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
548  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
549  }
550  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
552  mandelstam_s);
553 }
554 
555 double kplusn_inelastic_background(double mandelstam_s) {
556  if (kplusn_total_interpolation == nullptr) {
557  std::vector<double> x = KPLUSN_TOT_PLAB;
558  std::vector<double> y = KPLUSN_TOT_SIG;
559  std::vector<double> dedup_x;
560  std::vector<double> dedup_y;
561  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
562  dedup_y = smooth(dedup_x, dedup_y, 0.05, 5);
564  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
565  }
566  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
568  mandelstam_s) -
569  kplusn_k0p(mandelstam_s);
570 }
571 
580 static void initialize(std::unordered_map<std::pair<uint64_t, uint64_t>, double,
581  pair_hash>& ratios) {
582  const auto& type_p = ParticleType::find(pdg::p);
583  const auto& type_n = ParticleType::find(pdg::n);
584  const auto& type_K_p = ParticleType::find(pdg::K_p);
585  const auto& type_K_z = ParticleType::find(pdg::K_z);
586  const auto& type_Delta_pp = ParticleType::find(pdg::Delta_pp);
587  const auto& type_Delta_p = ParticleType::find(pdg::Delta_p);
588  const auto& type_Delta_z = ParticleType::find(pdg::Delta_z);
589  const auto& type_Delta_m = ParticleType::find(pdg::Delta_m);
590 
591  /* Store the isospin ratio of the given reaction relative to all other
592  * possible isospin-symmetric reactions. */
593  auto add_to_ratios = [&](const ParticleType& a, const ParticleType& b,
594  const ParticleType& c, const ParticleType& d,
595  double weight_numerator, double weight_other) {
596  assert(weight_numerator + weight_other != 0);
597  const auto key =
598  std::make_pair(pack(a.pdgcode().code(), b.pdgcode().code()),
599  pack(c.pdgcode().code(), d.pdgcode().code()));
600  const double ratio = weight_numerator / (weight_numerator + weight_other);
601  ratios[key] = ratio;
602  };
603 
604  /* All inelastic channels are K N -> K Delta -> K pi N or charge exchange,
605  * with identical cross section, weighted by the isospin factor.
606  *
607  * For charge exchange, the isospin factors are 1,
608  * so they are excluded here. */
609  {
610  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
611  type_p, type_K_p, type_K_z, type_Delta_pp);
612  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
613  type_p, type_K_p, type_K_p, type_Delta_p);
614 
615  add_to_ratios(type_p, type_K_p, type_K_z, type_Delta_pp, weight1, weight2);
616  add_to_ratios(type_p, type_K_p, type_K_p, type_Delta_p, weight2, weight1);
617  }
618  {
619  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
620  type_n, type_K_p, type_K_z, type_Delta_p);
621  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
622  type_n, type_K_p, type_K_p, type_Delta_z);
623 
624  add_to_ratios(type_n, type_K_p, type_K_z, type_Delta_p, weight1, weight2);
625  add_to_ratios(type_n, type_K_p, type_K_p, type_Delta_z, weight2, weight1);
626  }
627  /* K+ and K0 have the same mass and spin, their cross sections are assumed to
628  * only differ in isospin factors. */
629  {
630  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
631  type_p, type_K_z, type_K_z, type_Delta_p);
632  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
633  type_p, type_K_z, type_K_p, type_Delta_z);
634 
635  add_to_ratios(type_p, type_K_z, type_K_z, type_Delta_p, weight1, weight2);
636  add_to_ratios(type_p, type_K_z, type_K_p, type_Delta_z, weight2, weight1);
637  }
638  {
639  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
640  type_n, type_K_z, type_K_z, type_Delta_z);
641  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
642  type_n, type_K_z, type_K_p, type_Delta_m);
643 
644  add_to_ratios(type_n, type_K_z, type_K_z, type_Delta_z, weight1, weight2);
645  add_to_ratios(type_n, type_K_z, type_K_p, type_Delta_m, weight2, weight1);
646  }
647 }
648 
650  const ParticleType& b,
651  const ParticleType& c,
652  const ParticleType& d) const {
653  /* If this method is called with anti-nucleons, flip all particles to
654  * anti-particles;
655  * the ratio is equal */
656  int flip = 0;
657  for (const auto& p : {&a, &b, &c, &d}) {
658  if (p->is_nucleon()) {
659  if (flip == 0) {
660  flip = p->antiparticle_sign();
661  } else {
662  assert(p->antiparticle_sign() == flip);
663  }
664  }
665  }
666  const auto key = std::make_pair(
667  pack(a.pdgcode().code() * flip, b.pdgcode().code() * flip),
668  pack(c.pdgcode().code() * flip, d.pdgcode().code() * flip));
669  if (ratios_.empty()) {
671  }
672  return ratios_.at(key);
673 }
674 
675 /*thread_local (see #3075)*/ KaonNucleonRatios kaon_nucleon_ratios;
676 
677 double kminusp_kbar0n(double mandelstam_s) {
678  constexpr double a0 = 100; // mb GeV^2
679  constexpr double a1 = 0.15; // GeV
680  constexpr unsigned a2 = 2;
681 
682  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
683  const double p_i = p_lab;
684  const double p_f = p_lab;
685 
686  return a0 * p_f / (p_i * mandelstam_s) *
687  pow_int(a1 * a1 / (a1 * a1 + p_f * p_f), a2);
688 }
689 
690 double kminusp_piminussigmaplus(double sqrts) {
691  return 0.0788265 / smash::square(sqrts - 1.38841);
692 }
693 
694 double kminusp_piplussigmaminus(double sqrts) {
695  return 0.0196741 / smash::square(sqrts - 1.42318);
696 }
697 
698 double kminusp_pi0sigma0(double sqrts) {
699  return 0.0403364 / smash::square(sqrts - 1.39830305);
700 }
701 
702 double kminusp_pi0lambda(double sqrts) {
703  return 0.05932562 / smash::square(sqrts - 1.38786692);
704 }
705 
706 double kminusn_piminussigma0(double sqrts) {
707  return kminusp_piminussigmaplus(sqrts) + kminusp_piplussigmaminus(sqrts) -
708  2. * kminusp_pi0sigma0(sqrts);
709 }
710 
711 double kminusn_piminuslambda(double sqrts) {
712  return 2. * kminusp_pi0lambda(sqrts);
713 }
714 
715 // All K+ p and K+ n channels are forbidden by isospin.
716 
717 double lambdalambda_ximinusp(double sqrts_sqrts0, double p_N, double p_lambda) {
718  assert(p_lambda != 0);
719  assert(sqrts_sqrts0 >= 0);
720  return 37.15 / 2 * p_N / p_lambda * std::pow(sqrts_sqrts0, -0.16);
721 }
722 
723 double lambdalambda_xi0n(double sqrts_sqrts0, double p_N, double p_lambda) {
724  return lambdalambda_ximinusp(sqrts_sqrts0, p_N, p_lambda);
725 }
726 
727 double lambdasigmaplus_xi0p(double sqrts_sqrts0) {
728  assert(sqrts_sqrts0 >= 0);
729  return 24.3781 * std::pow(sqrts_sqrts0, -0.479);
730 }
731 
732 double lambdasigmaminus_ximinusn(double sqrts_sqrts0) {
733  return lambdasigmaplus_xi0p(sqrts_sqrts0);
734 }
735 
736 double lambdasigma0_ximinusp(double sqrts_sqrts0) {
737  assert(sqrts_sqrts0 >= 0);
738  if (sqrts_sqrts0 < 0.03336) {
739  return 6.475 * std::pow(sqrts_sqrts0, -0.4167);
740  } else {
741  return 14.5054 * std::pow(sqrts_sqrts0, -0.1795);
742  }
743 }
744 
745 double lambdasigma0_xi0n(double sqrts_sqrts0) {
746  return lambdasigma0_ximinusp(sqrts_sqrts0);
747 }
748 
749 double sigma0sigma0_ximinusp(double sqrts_sqrts0) {
750  assert(sqrts_sqrts0 >= 0);
751  if (sqrts_sqrts0 < 0.09047) {
752  return 5.625 * std::pow(sqrts_sqrts0, -0.318);
753  } else {
754  return 4.174 * std::pow(sqrts_sqrts0, -0.4421);
755  }
756 }
757 
758 double sigma0sigma0_xi0n(double sqrts_sqrts0) {
759  return sigma0sigma0_ximinusp(sqrts_sqrts0);
760 }
761 
762 double sigmaplussigmaminus_xi0p(double sqrts_sqrts0) {
763  return 4 * sigma0sigma0_ximinusp(sqrts_sqrts0);
764 }
765 
766 double sigma0sigmaminus_ximinusn(double sqrts_sqrts0) {
767  return 4 * sigma0sigma0_ximinusp(sqrts_sqrts0);
768 }
769 
770 double sigmaplussigmaminus_ximinusp(double sqrts_sqrts0) {
771  return 14.194 * std::pow(sqrts_sqrts0, -0.442);
772 }
773 
774 double sigmaplussigmaminus_xi0n(double sqrts_sqrts0) {
775  return sigmaplussigmaminus_ximinusp(sqrts_sqrts0);
776 }
777 
778 } // 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:97
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
PdgCode pdgcode() const
Definition: particletype.h:156
std::int32_t code() const
Definition: pdgcode.h:249
Collection of useful constants that are known at compile time.
constexpr int Delta_p
Δ⁺.
constexpr int Delta_pp
Δ⁺⁺.
constexpr int K_p
K⁺.
constexpr int K_z
K⁰.
constexpr int p
Proton.
const PdgCode d(PdgCode::from_decimal(1000010020))
Deuteron.
constexpr int n
Neutron.
constexpr int Delta_m
Δ⁻.
constexpr int Delta_z
Δ⁰.
Definition: action.h:24
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
static double piplusp_elastic_pdg(double mandelstam_s)
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 > PIPLUSP_RES_SQRTS
Center-of-mass energy.
const std::initializer_list< double > KMINUSP_RES_SQRTS
Center-of-mass energy list for K̅⁻ N⁺
const std::initializer_list< double > PIMINUSP_ELASTIC_P_LAB
PDG data on pi- p elastic cross section: momentum in lab frame.
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
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
double np_total(double mandelstam_s)
np total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_sigmapluskplus_interpolation
An interpolation that gets lazily filled using the PIPLUSP_SIGMAPLUSKPLUS_SIG data.
static std::unique_ptr< InterpolateDataSpline > piplusp_elastic_res_interpolation
A null interpolation that gets filled using the PIPLUSP_RES data.
double piminusp_elastic(double mandelstam_s)
pi-p elastic cross section parametrization Source: GiBUU:parametrizationBarMes_HighEnergy....
double npbar_high_energy(double mandelstam_s)
npbar total cross section at high energies
const std::initializer_list< double > KPLUSP_TOT_SIG
PDG data on K+ p total cross section: cross section.
double kminusn_piminussigma0(double sqrts)
K- n <-> pi- Sigma0 cross section parametrization Follow from the parametrization with the same stran...
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.
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
double sigma0sigma0_ximinusp(double sqrts_sqrts0)
Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
double ppbar_elastic(double mandelstam_s)
ppbar elastic cross section parametrization Source: Bass:1998ca
const std::initializer_list< double > PIPLUSP_RES_SIG
Elastic π⁺N⁺ cross section contributions from decays.
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.
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
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.
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...
double Npi_string_hard(double mandelstam_s)
nucleon-pion hard scattering cross section (with partonic scattering)
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 ...
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 > > piplusp_elastic_interpolation
An interpolation that gets lazily filled using the PIPLUSP_ELASTIC_SIG data.
double ppbar_high_energy(double mandelstam_s)
ppbar total cross section at high energies
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_elastic_interpolation
An interpolation that gets lazily filled using the PIMINUSP_ELASTIC data.
double pp_high_energy(double mandelstam_s)
pp total cross section at high energies
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.
double pipi_string_hard(double mandelstam_s)
pion-pion hard scattering cross section (with partonic scattering)
double piplusp_high_energy(double mandelstam_s)
pi+p total cross section at high energies
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 ).
static std::unique_ptr< InterpolateDataLinear< double > > kplusn_total_interpolation
An interpolation that gets lazily filled using the KPLUSN_TOT data.
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 piplusp_elastic_high_energy(double mandelstam_s, double m1, double m2)
pi+p elactic cross section parametrization.
static std::unique_ptr< InterpolateDataLinear< double > > kplusp_total_interpolation
An interpolation that gets lazily filled using the KPLUSP_TOT data.
double piplusp_sigmapluskplus_pdg(double mandelstam_s)
pi+ p to Sigma+ K+ cross section parametrization, PDG data.
static std::unique_ptr< InterpolateDataLinear< double > > kminusp_elastic_interpolation
An interpolation that gets lazily filled using the KMINUSP_ELASTIC data.
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_P_LAB
PDG data on pi- p to Sigma- K+ cross section: momentum in lab frame.
double deuteron_nucleon_elastic(double mandelstam_s)
Deuteron nucleon elastic cross-section [mb] parametrized by Oh:2009gx .
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:58
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
double piminusp_sigmaminuskplus_pdg(double mandelstam_s)
pi- p -> Sigma- K+ cross section parametrization, PDG data.
double piminusp_lambdak0_pdg(double mandelstam_s)
pi- p -> Lambda K0 cross section parametrization, PDG data.
const std::initializer_list< double > PIPLUSP_ELASTIC_P_LAB
PDG data on pi+ p elastic cross section: momentum in lab frame.
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 k0p_elastic_background(double mandelstam_s)
K0 p elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
double deuteron_pion_elastic(double mandelstam_s)
Deuteron pion elastic cross-section [mb] parametrized to fit pi-d elastic scattering data (the data c...
double lambdasigma0_ximinusp(double sqrts_sqrts0)
Lambda Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
double NN_string_hard(double mandelstam_s)
nucleon-nucleon hard scattering cross section (with partonic scattering)
double xs_ppbar_annihilation(double mandelstam_s)
parametrized cross-section for proton-antiproton annihilation used in the UrQMD model
const std::initializer_list< double > PIPLUSP_ELASTIC_SIG
PDG data on pi+ p elastic cross section: cross section.
double kplusp_inelastic_background(double mandelstam_s)
K+ p inelastic background cross section parametrization Source: Buss:2011mx , B.3....
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 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:65
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....
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 > KMINUSP_ELASTIC_SIG
PDG data on K- p elastic cross section: cross section.
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 > PIMINUSP_RES_SQRTS
Center-of-mass energy.
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
double np_elastic(double mandelstam_s)
np elastic cross section parametrization Source: Weil:2013mya , eq.
double k0n_elastic_background(double mandelstam_s)
K0 n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
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:72
double kminusp_piplussigmaminus(double sqrts)
K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra ).
constexpr T square(const T base)
Efficient template for calculating the square.
Definition: pow.h:38
double kbar0n_elastic_background(double mandelstam_s)
Kbar0 n elastic background cross section parametrization Source: Buss:2011mx , B.3....
double kminusp_kbar0n(double mandelstam_s)
K- p <-> Kbar0 n cross section parametrization.
double sigmaplussigmaminus_ximinusp(double sqrts_sqrts0)
Sigma+ Sigma- <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
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 piminusp_high_energy(double mandelstam_s)
pi-p total cross section at high energies
double kminusn_elastic_background(double mandelstam_s)
K- n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
double pp_elastic(double mandelstam_s)
pp elastic cross section parametrization Source: Weil:2013mya , eq.
double kplusn_inelastic_background(double mandelstam_s)
K+ n inelastic background cross section parametrization Source: Buss:2011mx , B.3....
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_lambdak0_interpolation
An interpolation that gets lazily filled using the PIMINUSP_LAMBDAK0 data.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigmaminuskplus_interpolation
An interpolation that gets lazily filled using the PIMINUSP_SIGMAMINUSKPLUS data.
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
double piplusp_elastic_AQM(double mandelstam_s, double m1, double m2)
An overload of piplusp_elastic_high_energy in which the very low part is replaced by a flat 5 mb cros...
double piplusp_elastic(double mandelstam_s)
pi+p elastic cross section parametrization, PDG data.
static std::unique_ptr< InterpolateDataSpline > piminusp_elastic_res_interpolation
An interpolation that gets lazily filled using the PIMINUSP_RES 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 ...
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.