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