13 #include <initializer_list>
37 return two_nucleons || nucleon_and_kaon || nucleon_and_pion || two_pions;
40 double xs_high_energy(
double mandelstam_s,
bool is_opposite_charge,
double ma,
41 double mb,
double P,
double R1,
double R2) {
42 const double M = 2.1206;
43 const double H = 0.272;
44 const double eta1 = 0.4473;
45 const double eta2 = 0.5486;
46 const double s_sab = mandelstam_s / (ma + mb + M) / (ma + mb + M);
48 H * std::log(s_sab) * std::log(s_sab) + P + R1 * std::pow(s_sab, -eta1);
49 xs = is_opposite_charge ? xs + R2 * std::pow(s_sab, -eta2)
50 : xs - R2 * std::pow(s_sab, -eta2);
55 return xs_high_energy(mandelstam_s,
false, 0.939, 0.939, 34.41, 13.07, 7.394);
59 return xs_high_energy(mandelstam_s,
true, 0.939, 0.939, 34.41, 13.07, 7.394);
63 return xs_high_energy(mandelstam_s,
false, 0.939, 0.939, 34.41, 12.52, 6.66);
67 return xs_high_energy(mandelstam_s,
true, 0.939, 0.939, 34.41, 12.52, 6.66);
71 return xs_high_energy(mandelstam_s,
false, 0.939, 0.138, 18.75, 9.56, 1.767);
75 return xs_high_energy(mandelstam_s,
true, 0.939, 0.138, 18.75, 9.56, 1.767);
79 const double xs_ref = 120.;
81 const double constant_a = 0.05;
82 const double constant_b = 0.6;
83 const double factor = constant_a * constant_a * s_ref /
84 ((mandelstam_s - s_ref) * (mandelstam_s - s_ref) +
85 constant_a * constant_a * s_ref) +
87 return xs_ref * (s_ref / mandelstam_s) * factor;
92 const double sqrts = std::sqrt(mandelstam_s);
96 double xs = xs_0 * std::pow(std::log(sqrts / e_0), lambda_pow);
115 auto [dedup_x, dedup_y] =
117 dedup_y =
smooth(dedup_x, dedup_y, 0.01, 10);
119 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
130 auto [dedup_x, dedup_y] =
132 dedup_y =
smooth(dedup_x, dedup_y, 0.01, 10);
134 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
145 auto [dedup_x, dedup_y] =
147 dedup_y =
smooth(dedup_x, dedup_y, 0.01, 10);
149 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
165 auto [dedup_x, dedup_y] =
167 dedup_y =
smooth(dedup_x, dedup_y, 0.1, 5);
169 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
176 const double p_lab = (m1 > m2) ?
plab_from_s(mandelstam_s, m2, m1)
178 const auto logp = std::log(p_lab);
179 return 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
183 const double p_lab = (m1 > m2) ?
plab_from_s(mandelstam_s, m2, m1)
195 if (mandelstam_s < 2.25) {
197 }
else if (mandelstam_s > 4.84) {
198 const auto logp = std::log(p_lab);
199 sigma = 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
212 std::make_unique<InterpolateDataSpline>(x, y);
214 sigma -= (*piplusp_elastic_res_interpolation)(mandelstam_s);
230 dedup_y =
smooth(dedup_x, dedup_y, 0.2, 5);
232 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
243 auto [dedup_x, dedup_y] =
245 dedup_y =
smooth(dedup_x, dedup_y, 0.01, 6);
247 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
263 auto [dedup_x, dedup_y] =
265 dedup_y =
smooth(dedup_x, dedup_y, 0.2, 6);
267 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
276 const auto logp = std::log(p_lab);
277 if (mandelstam_s < 1.69) {
279 }
else if (mandelstam_s > 4.84) {
280 sigma = 1.76 + 11.2 * std::pow(p_lab, -0.64) + 0.043 * logp * logp;
289 if (mandelstam_s > 3.24 && mandelstam_s < 3.8809) {
290 sigma *= (0.12 * std::cos(2 * M_PI * (std::sqrt(mandelstam_s) - 1.8) /
301 auto [dedup_x, dedup_y] =
dedup_avg(x, y);
303 std::make_unique<InterpolateDataSpline>(dedup_x, dedup_y);
305 sigma -= (*piminusp_elastic_res_interpolation)(mandelstam_s);
319 auto [dedup_x, dedup_y] =
321 dedup_y =
smooth(dedup_x, dedup_y, 0.2, 6);
323 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
338 dedup_y =
smooth(dedup_x, dedup_y, 0.2, 6);
340 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
355 dedup_y =
smooth(dedup_x, dedup_y, 0.2, 6);
357 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
359 const double sqrts = std::sqrt(mandelstam_s);
369 }
else if (p_lab < 0.8) {
370 return 23.5 + 1000 *
pow_int(p_lab - 0.7, 4);
371 }
else if (p_lab < 2.0) {
372 return 1250 / (p_lab + 50) - 4 * (p_lab - 1.3) * (p_lab - 1.3);
373 }
else if (p_lab < 2.776) {
374 return 77 / (p_lab + 1.5);
376 const auto logp = std::log(p_lab);
377 return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
383 const double p_lab = (m1 > m2) ?
plab_from_s(mandelstam_s, m2, m1)
385 const auto logp = std::log(p_lab);
386 return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
393 return 34 * std::pow(p_lab / 0.4, -2.104);
394 }
else if (p_lab < 0.8) {
395 return 23.5 + 1000 *
pow_int(p_lab - 0.7, 4);
396 }
else if (p_lab < 1.5) {
397 return 23.5 + 24.6 / (1 + std::exp(-(p_lab - 1.2) / 0.1));
398 }
else if (p_lab < 5.0) {
399 return 41 + 60 * (p_lab - 0.9) * std::exp(-1.2 * p_lab);
401 const auto logp = std::log(p_lab);
402 return 48.0 + 0.522 * logp * logp - 4.51 * logp;
412 }
else if (p_lab < 0.8) {
413 return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
414 }
else if (p_lab < 2.0) {
415 return 31 / std::sqrt(p_lab);
416 }
else if (p_lab < 2.776) {
417 return 77 / (p_lab + 1.5);
419 const auto logp = std::log(p_lab);
420 return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
427 const auto logp = std::log(p_lab);
429 return 6.3555 * std::pow(p_lab, -3.2481) * std::exp(-0.377 * logp * logp);
430 }
else if (p_lab < 1.0) {
431 return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
432 }
else if (p_lab < 2.0) {
433 return 24.2 + 8.9 * p_lab;
434 }
else if (p_lab < 5.0) {
437 return 48.0 + 0.522 * logp * logp - 4.51 * logp;
449 }
else if (p_lab < 5.0) {
450 return 31.6 + 18.3 / p_lab - 1.1 / (p_lab * p_lab) - 3.8 * p_lab;
452 const auto logp = std::log(p_lab);
453 return 10.2 + 52.7 * std::pow(p_lab, -1.16) + 0.125 * logp * logp -
465 return 271.6 * std::exp(-1.1 * p_lab * p_lab);
466 }
else if (p_lab < 5.0) {
467 return 75.0 + 43.1 / p_lab + 2.6 / (p_lab * p_lab) - 3.9 * p_lab;
469 const auto logp = std::log(p_lab);
470 return 38.4 + 77.6 * std::pow(p_lab, -0.64) + 0.26 * logp * logp -
476 const double tmp = std::sqrt(mandelstam_s) - 2.172;
477 return 4.0 + 0.27 / (tmp * tmp + 0.065 * 0.065);
481 const double s = mandelstam_s;
488 auto [dedup_x, dedup_y] =
490 dedup_y =
smooth(dedup_x, dedup_y, 0.1, 5);
492 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
500 auto [dedup_x, dedup_y] =
502 dedup_y =
smooth(dedup_x, dedup_y, 0.05, 5);
504 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
512 auto [dedup_x, dedup_y] =
515 dedup_y =
smooth(dedup_x, dedup_y, 0.01, 5);
517 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
525 auto [dedup_x, dedup_y] =
527 dedup_y =
smooth(dedup_x, dedup_y, 0.05, 5);
529 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
536 constexpr
double a0 = 10.508;
537 constexpr
double a1 = -3.716;
538 constexpr
double a2 = 1.845;
539 constexpr
double a3 = -0.764;
540 constexpr
double a4 = 0.508;
543 const double p_lab2 = p_lab * p_lab;
545 return (a0 + a1 * p_lab + a2 * p_lab2) / (1 + a3 * p_lab + a4 * p_lab2);
563 auto [dedup_x, dedup_y] =
565 dedup_y =
smooth(dedup_x, dedup_y, 0.1, 5);
567 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
576 if (std::sqrt(mandelstam_s) < 1.68) {
582 constexpr
double a0 = 186.03567644;
583 constexpr
double a1 = 0.22002795;
584 constexpr
double a2 = 0.64907116;
586 const double p_i = p_lab;
587 const double p_f = p_lab;
589 const double ratio = a1 * a1 / (a1 * a1 + p_f * p_f);
590 sigma = a0 * p_f / (p_i * mandelstam_s) * std::pow(ratio, a2);
602 std::make_unique<InterpolateDataSpline>(x, y);
604 const auto old_sigma = sigma;
605 sigma -= (*kminusp_elastic_res_interpolation)(p_lab);
607 std::cout <<
"NEGATIVE SIGMA: sigma=" << sigma
608 <<
", sqrt(s)=" << std::sqrt(mandelstam_s)
609 <<
", sig_el_exp=" << old_sigma
610 <<
", sig_el_res=" << (*kminusp_elastic_res_interpolation)(p_lab)
641 auto [dedup_x, dedup_y] =
643 dedup_y =
smooth(dedup_x, dedup_y, 0.1, 5);
645 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
654 auto [dedup_x, dedup_y] =
656 dedup_y =
smooth(dedup_x, dedup_y, 0.05, 5);
658 std::make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
674 static void initialize(std::unordered_map<std::pair<uint64_t, uint64_t>,
double,
689 double weight_numerator,
double weight_other) {
690 assert(weight_numerator + weight_other != 0);
693 pack(c.pdgcode().code(), d.pdgcode().code()));
694 const double ratio = weight_numerator / (weight_numerator + weight_other);
705 type_p, type_K_p, type_K_z, type_Delta_pp);
707 type_p, type_K_p, type_K_p, type_Delta_p);
709 add_to_ratios(type_p, type_K_p, type_K_z, type_Delta_pp, weight1, weight2);
710 add_to_ratios(type_p, type_K_p, type_K_p, type_Delta_p, weight2, weight1);
714 type_n, type_K_p, type_K_z, type_Delta_p);
716 type_n, type_K_p, type_K_p, type_Delta_z);
718 add_to_ratios(type_n, type_K_p, type_K_z, type_Delta_p, weight1, weight2);
719 add_to_ratios(type_n, type_K_p, type_K_p, type_Delta_z, weight2, weight1);
725 type_p, type_K_z, type_K_z, type_Delta_p);
727 type_p, type_K_z, type_K_p, type_Delta_z);
729 add_to_ratios(type_p, type_K_z, type_K_z, type_Delta_p, weight1, weight2);
730 add_to_ratios(type_p, type_K_z, type_K_p, type_Delta_z, weight2, weight1);
734 type_n, type_K_z, type_K_z, type_Delta_z);
736 type_n, type_K_z, type_K_p, type_Delta_m);
738 add_to_ratios(type_n, type_K_z, type_K_z, type_Delta_z, weight1, weight2);
739 add_to_ratios(type_n, type_K_z, type_K_p, type_Delta_m, weight2, weight1);
751 for (
const auto&
p : {&a, &b, &c, &d}) {
752 if (
p->is_nucleon()) {
754 flip =
p->antiparticle_sign();
756 assert(
p->antiparticle_sign() == flip);
760 const auto key = std::make_pair(
772 constexpr
double a0 = 100;
773 constexpr
double a1 = 0.15;
774 constexpr
unsigned a2 = 2;
777 const double p_i = p_lab;
778 const double p_f = p_lab;
780 return a0 * p_f / (p_i * mandelstam_s) *
781 pow_int(a1 * a1 / (a1 * a1 + p_f * p_f), a2);
812 assert(p_lambda != 0);
813 assert(sqrts_sqrts0 >= 0);
814 return 37.15 / 2 * p_N / p_lambda * std::pow(sqrts_sqrts0, -0.16);
822 assert(sqrts_sqrts0 >= 0);
823 return 24.3781 * std::pow(sqrts_sqrts0, -0.479);
831 assert(sqrts_sqrts0 >= 0);
832 if (sqrts_sqrts0 < 0.03336) {
833 return 6.475 * std::pow(sqrts_sqrts0, -0.4167);
835 return 14.5054 * std::pow(sqrts_sqrts0, -0.1795);
844 assert(sqrts_sqrts0 >= 0);
845 if (sqrts_sqrts0 < 0.09047) {
846 return 5.625 * std::pow(sqrts_sqrts0, -0.318);
848 return 4.174 * std::pow(sqrts_sqrts0, -0.4421);
865 return 14.194 * std::pow(sqrts_sqrts0, -0.442);
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.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
std::int32_t code() const
Collection of useful constants that are known at compile time.
constexpr int Delta_pp
Δ⁺⁺.
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.
bool parametrization_exists(const PdgCode &pdg_a, const PdgCode &pdg_b)
Checks if supplied codes have existing parametrizations of total cross sections.
double kplusp_total(double mandelstam_s)
K+ p total cross section parametrization.
static double piplusp_elastic_pdg(double mandelstam_s)
const std::initializer_list< double > KMINUSN_TOT_PLAB
PDG data on K- n total cross section: momentum in lab frame.
double pizeropizero_total(double sqrts)
pi0 pi0 total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
double kminusp_pi0lambda(double sqrts)
K- p <-> pi0 Lambda cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.
const std::initializer_list< double > 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).
const std::initializer_list< double > PIPLUSPIMINUS_TOT_SQRTS
Center-of-mass energy.
double pipluspiminus_total(double sqrts)
pi+ pi- total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
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.
const std::initializer_list< double > KMINUSP_TOT_PLAB
PDG smoothed data on K- p total cross section: momentum in lab frame.
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 std::unique_ptr< InterpolateDataLinear< double > > kminusp_total_interpolation
An interpolation that gets lazily filled using the KMINUSP_TOT data.
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.
const std::initializer_list< double > PIMINUSP_TOT_SQRTS
Center-of-mass energy.
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.
const std::initializer_list< double > PIPLUSPIMINUS_TOT_SIG
Total π⁺ π⁻ cross section parametrized from bottom-up SMASH-3.0, using the hadronic list from PDG2018...
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.
const std::initializer_list< double > KMINUSN_TOT_SIG
PDG data on K- n total cross section: cross section.
double piminusp_total(double sqrts)
pi- p total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
double deuteron_nucleon_elastic(double mandelstam_s)
Deuteron nucleon elastic cross-section [mb] parametrized by Oh:2009gx .
constexpr double nucleon_mass
Nucleon mass in GeV.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
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...
const std::initializer_list< double > PIZEROPIZERO_TOT_SIG
Total π⁰ π⁰ cross section parametrized from bottom-up SMASH-3.0 using the hadronic list from PDG2018.
double lambdasigma0_ximinusp(double sqrts_sqrts0)
Lambda Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
const std::initializer_list< double > PIMINUSP_TOT_SIG
Total p π⁻ cross section parametrized from bottom-up SMASH-3.0, using the hadronic list from PDG2018.
double 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
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_total_interpolation
An interpolation that gets lazily filled using the PIPLUSP_TOT data.
const std::initializer_list< double > PIPLUSP_ELASTIC_SIG
PDG data on pi+ p elastic cross section: cross section.
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.
const std::initializer_list< double > PIPLUSP_TOT_SQRTS
Center-of-mass energy.
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 > PIPLUSP_TOT_SIG
Total p π⁺ cross section parametrized from bottom-up SMASH-3.0, using the hadronic list from PDG2018.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_total_interpolation
An interpolation that gets lazily filled using the PIMINUSP_TOT data.
const std::initializer_list< double > PIMINUSP_RES_SQRTS
Center-of-mass energy.
double kplusn_total(double mandelstam_s)
K+ n total cross section parametrization.
constexpr double really_small
Numerical error tolerance.
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.
double kminusp_piplussigmaminus(double sqrts)
K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra ).
double kminusp_total(double mandelstam_s)
K- p total cross section parametrization.
constexpr T square(const T base)
Efficient template for calculating the square.
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 ...
static std::unique_ptr< InterpolateDataLinear< double > > pizeropizero_total_interpolation
An interpolation that gets lazily filled using the PIZEROPIZERO_TOT data.
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
static std::unique_ptr< InterpolateDataLinear< double > > pipluspiminus_total_interpolation
An interpolation that gets lazily filled using the PIPLUSPIMINUS_TOT data.
static std::unique_ptr< InterpolateDataLinear< double > > kminusn_total_interpolation
An interpolation that gets lazily filled using the KMINUSN_TOT data.
double piplusp_total(double sqrts)
pi+ p total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
double piminusp_high_energy(double mandelstam_s)
pi-p total cross section at high energies
double kminusn_total(double mandelstam_s)
K- n total cross section parametrization.
double kminusn_elastic_background(double mandelstam_s)
K- n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
double pp_elastic(double mandelstam_s)
pp elastic cross section parametrization Source: Weil:2013mya , eq.
const std::initializer_list< double > KMINUSP_TOT_SIG
PDG smoothed data on K- p total cross section: cross section.
double kplusn_inelastic_background(double mandelstam_s)
K+ n inelastic background cross section parametrization Source: Buss:2011mx , B.3....
const std::initializer_list< double > PIZEROPIZERO_TOT_SQRTS
Center-of-mass energy.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_lambdak0_interpolation
An interpolation that gets lazily filled using the PIMINUSP_LAMBDAK0 data.
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.