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