32 double spin_factor = (c.
spin() + 1) * (d.
spin() + 1);
33 spin_factor /= (a.
spin() + 1) * (b.
spin() + 1);
34 double symmetry_factor = (1 + (a == b));
35 symmetry_factor /= (1 + (c == d));
38 return spin_factor * symmetry_factor * momentum_factor;
54 double spin_factor = (c.
spin() + 1) * (d.
spin() + 1);
55 spin_factor /= (a.
spin() + 1) * (b.
spin() + 1);
56 double symmetry_factor = (1 + (a == b));
57 symmetry_factor /= (1 + (c == d));
58 const double momentum_factor =
61 return spin_factor * symmetry_factor * momentum_factor;
77 double spin_factor = (c.
spin() + 1) * (d.
spin() + 1);
78 spin_factor /= (a.
spin() + 1) * (b.
spin() + 1);
79 double symmetry_factor = (1 + (a == b));
80 symmetry_factor /= (1 + (c == d));
81 const double momentum_factor =
84 return spin_factor * symmetry_factor * momentum_factor;
92 CollisionBranchList in_list,
double weight = 1.) {
93 main_list.reserve(main_list.size() + in_list.size());
94 for (
auto& proc : in_list) {
95 proc->set_weight(proc->weight() * weight);
96 main_list.emplace_back(std::move(proc));
112 double m1_ref,
double m2_ref) {
113 const double eff_sqrt_s = std::sqrt(mandelstam_s) - m1 - m2 + m1_ref + m2_ref;
114 return eff_sqrt_s * eff_sqrt_s;
119 const std::pair<FourVector, FourVector> potentials)
120 : incoming_particles_(incoming_particles),
122 potentials_(potentials),
123 is_BBbar_pair_(incoming_particles_[0].type().is_baryon() &&
124 incoming_particles_[1].type().is_baryon() &&
125 incoming_particles_[0].type().antiparticle_sign() ==
126 -incoming_particles_[1].type().antiparticle_sign()),
128 incoming_particles_[0].type().is_nucleon() &&
129 incoming_particles_[1].pdgcode() ==
130 incoming_particles_[0].type().get_antiparticle()->pdgcode()) {}
135 CollisionBranchList process_list;
139 double p_pythia = 0.;
146 const bool reject_by_nucleon_elastic_cutoff =
152 if (incl_elastic && !reject_by_nucleon_elastic_cutoff) {
153 process_list.emplace_back(
elastic(finder_parameters));
162 const double sig_current =
sum_xs_of(process_list);
163 const double sig_string = std::max(
171 p_pythia * finder_parameters.
scale_xs);
177 (1. - p_pythia) * finder_parameters.
scale_xs);
185 (1. - p_pythia) * finder_parameters.
scale_xs);
187 if (finder_parameters
192 (1. - p_pythia) * finder_parameters.
scale_xs);
194 if (finder_parameters
199 (1. - p_pythia) * finder_parameters.
scale_xs);
228 double total_xs = 0.;
312 throw std::runtime_error(
"wrong isospin in ππ scattering");
327 double elastic_xs = 0.;
339 return std::make_unique<CollisionBranch>(
347 CollisionBranchList process_list;
350 const auto& pdg_a = data_a.
pdgcode();
351 const auto& pdg_b = data_b.
pdgcode();
352 if ((pdg_a.is_nucleon() && pdg_b.is_pion()) ||
353 (pdg_b.is_nucleon() && pdg_a.is_pion())) {
361 const bool use_AQM = finder_parameters.
use_AQM;
362 const double pipi_offset =
366 double elastic_xs = 0.0;
374 elastic_xs =
nk_el();
378 elastic_xs =
nn_el();
386 const bool is_deuteron = pdg_nucleus.
is_deuteron();
387 if (is_deuteron && pdg_other.
is_pion()) {
390 }
else if (is_deuteron && pdg_other.
is_nucleon()) {
394 }
else if (use_AQM) {
399 elastic_xs =
nn_el();
410 (m1 + m2 + pipi_offset) >
sqrt_s_) {
453 std::stringstream ss;
456 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
457 <<
" j_a=" << pdg_a.
spin() <<
" j_b=" << pdg_b.
spin()
458 <<
" sigma=" << sig_el <<
" s=" << s;
459 throw std::runtime_error(ss.str());
469 assert(pion != nucleon);
474 switch (nucleon.
code()) {
476 switch (pion.
code()) {
489 switch (pion.
code()) {
502 switch (pion.
code()) {
515 switch (pion.
code()) {
528 throw std::runtime_error(
529 "only the elastic cross section for proton-pion "
536 std::stringstream ss;
539 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
540 <<
" j_a=" << pdg_a.
spin() <<
" j_b=" << pdg_b.
spin()
541 <<
" sigma=" << sig_el <<
" s=" << s;
542 throw std::runtime_error(ss.str());
552 const auto pdg_nucleon = type_nucleon.
pdgcode().
code();
561 CollisionBranchList process_list;
562 switch (pdg_nucleon) {
570 sqrt_s_, type_K_p, type_Sigma_p);
581 sqrt_s_, type_K_p, type_Sigma_m);
584 type_K_z, type_Sigma_z);
587 type_K_z, type_Lambda);
603 sqrt_s_, type_K_p, type_Sigma_z);
606 type_K_z, type_Sigma_p);
609 sqrt_s_, type_K_p, type_Lambda);
625 sqrt_s_, type_K_z, type_Sigma_p);
628 type_K_p, type_Sigma_z);
631 type_K_p, type_Lambda);
639 sqrt_s_, type_K_z, type_Sigma_m);
655 sqrt_s_, type_K_z, type_Sigma_z);
658 type_K_p, type_Sigma_m);
661 sqrt_s_, type_K_z, type_Lambda);
677 sqrt_s_, type_K_m, type_Sigma_m_bar);
680 type_Kbar_z, type_Sigma_z_bar);
683 type_Kbar_z, type_Lambda_bar);
691 sqrt_s_, type_K_m, type_Sigma_p_bar);
707 sqrt_s_, type_K_m, type_Sigma_z_bar);
710 type_Kbar_z, type_Sigma_p_bar);
713 sqrt_s_, type_K_m, type_Lambda_bar);
726 sqrt_s_, type_Kbar_z, type_Sigma_m_bar);
737 sqrt_s_, type_Kbar_z, type_Sigma_p_bar);
740 type_K_m, type_Sigma_z_bar);
743 type_K_m, type_Lambda_bar);
759 sqrt_s_, type_Kbar_z, type_Sigma_z_bar);
762 type_K_m, type_Sigma_m_bar);
765 sqrt_s_, type_Kbar_z, type_Lambda_bar);
782 assert(kaon != nucleon);
787 switch (nucleon.
code()) {
789 switch (kaon.
code()) {
805 switch (kaon.
code()) {
821 switch (kaon.
code()) {
837 switch (kaon.
code()) {
853 throw std::runtime_error(
854 "elastic cross section for antinucleon-kaon "
861 std::stringstream ss;
864 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
865 <<
" j_a=" << pdg_a.
spin() <<
" j_b=" << pdg_b.
spin()
866 <<
" sigma=" << sig_el <<
" s=" << s;
867 throw std::runtime_error(ss.str());
872 CollisionBranchList resonance_process_list;
880 ParticleTypePtrList possible_resonances =
885 double resonance_xsection =
formation(*type_resonance, p_cm_sqr);
889 resonance_process_list.push_back(std::make_unique<CollisionBranch>(
893 "->", type_resonance->name(),
894 " at sqrt(s)[GeV] = ",
sqrt_s_,
895 " with xs[mb] = ", resonance_xsection);
898 return resonance_process_list;
902 double cm_momentum_sqr)
const {
909 if (partial_width <= 0.) {
913 assert(type_resonance.
charge() ==
919 const double spinfactor =
920 static_cast<double>(type_resonance.
spin() + 1) /
921 ((type_particle_a.
spin() + 1) * (type_particle_b.
spin() + 1));
922 const int sym_factor =
927 return spinfactor * sym_factor * 2. * M_PI * M_PI / cm_momentum_sqr *
934 CollisionBranchList process_list;
939 const auto& pdg_a = data_a.
pdgcode();
940 const auto& pdg_b = data_b.
pdgcode();
943 if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
944 pdg_a.antiparticle_sign() == pdg_b.antiparticle_sign()) {
946 process_list =
nn_xx(included_2to2);
954 if ((pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
955 (pdg_b.is_nucleon() && pdg_a.is_kaon())) {
957 process_list =
nk_xx(included_2to2, KN_offset);
958 }
else if ((pdg_a.is_hyperon() && pdg_b.is_pion()) ||
959 (pdg_b.is_hyperon() && pdg_a.is_pion())) {
961 process_list =
ypi_xx(included_2to2);
962 }
else if ((pdg_a.is_Delta() && pdg_b.is_kaon()) ||
963 (pdg_b.is_Delta() && pdg_a.is_kaon())) {
971 process_list =
dn_xx(included_2to2);
977 process_list =
dpi_xx(included_2to2);
984 CollisionBranchList process_list;
998 process_list.push_back(std::make_unique<CollisionBranch>(
1006 process_list.push_back(std::make_unique<CollisionBranch>(
1007 type_pi, type_anti_p, type_anti_n,
1022 process_list.push_back(std::make_unique<CollisionBranch>(
1030 process_list.push_back(std::make_unique<CollisionBranch>(
1031 type_N, type_anti_p, type_anti_n,
1035 return process_list;
1039 CollisionBranchList process_list;
1058 ParticleTypePtrList components;
1059 components.reserve(3);
1061 for (
int i = 0; i < nucleus_pdg.
nucleus_p(); i++) {
1062 components.push_back(type_p);
1064 for (
int i = 0; i < nucleus_pdg.
nucleus_n(); i++) {
1065 components.push_back(type_n);
1067 for (
int i = 0; i < nucleus_pdg.
nucleus_ap(); i++) {
1068 components.push_back(type_anti_p);
1070 for (
int i = 0; i < nucleus_pdg.
nucleus_an(); i++) {
1071 components.push_back(type_anti_n);
1073 for (
int i = 0; i < nucleus_pdg.
nucleus_La(); i++) {
1074 components.push_back(type_la);
1076 for (
int i = 0; i < nucleus_pdg.
nucleus_aLa(); i++) {
1077 components.push_back(type_anti_la);
1079 if (
sqrt_s_ > type_catalyzer->
mass() + components[0]->mass() +
1080 components[1]->mass() + components[2]->mass()) {
1081 process_list.push_back(std::make_unique<CollisionBranch>(
1082 *type_catalyzer, *(components[0]), *(components[1]), *(components[2]),
1087 return process_list;
1091 const double x = pion_kinetic_energy;
1092 return x * (4.3 + 10.0 * x) / ((x - 0.16) * (x - 0.16) + 0.007);
1096 const double x = N_kinetic_energy;
1097 return x * (1.0 + 50 * x) / (x * x + 0.01) +
1098 4 * x / ((x - 0.008) * (x - 0.008) + 0.0004);
1102 return 55.0 / (aN_kinetic_energy + 0.17);
1111 type_nucleus = &type_b;
1112 type_catalyzer = &type_a;
1115 bool nonzero_xs = type_nucleus->
is_nucleus() &&
1116 (type_catalyzer->is_pion() || type_catalyzer->is_nucleon());
1121 const double md = type_nucleus->
mass(), mcat = type_catalyzer->mass();
1122 const double Tkin = (sqrts * sqrts - (md + mcat) * (md + mcat)) / (2.0 * md);
1129 if (type_catalyzer->is_pion()) {
1131 }
else if (type_catalyzer->is_nucleon()) {
1133 type_catalyzer->pdgcode().antiparticle_sign()) {
1149 type_nucleus = &type_b;
1150 type_catalyzer = &type_a;
1152 bool nonzero_xs = type_nucleus->
is_nucleus() &&
1153 (type_catalyzer->is_pion() || type_catalyzer->is_nucleon());
1158 const double mA = type_nucleus->
mass(), mcat = type_catalyzer->mass();
1159 const double Tkin = (sqrts * sqrts - (mA + mcat) * (mA + mcat)) / (2.0 * mA);
1162 if (A != 3 || Tkin <= 0.0) {
1166 if (type_catalyzer->is_pion()) {
1168 }
else if (type_catalyzer->is_nucleon()) {
1170 type_catalyzer->pdgcode().antiparticle_sign()) {
1183 CollisionBranchList process_list;
1189 if (!same_sign && !any_nucleus) {
1190 return process_list;
1205 return process_list;
1210 CollisionBranchList process_list, channel_list;
1216 bool both_antinucleons =
1219 const ParticleTypePtrList& nuc_or_anti_nuc =
1222 const ParticleTypePtrList& delta_or_anti_delta =
1232 process_list.reserve(process_list.size() + channel_list.size());
1233 std::move(channel_list.begin(), channel_list.end(),
1234 std::inserter(process_list, process_list.end()));
1235 channel_list.clear();
1247 process_list.reserve(process_list.size() + channel_list.size());
1248 std::move(channel_list.begin(), channel_list.end(),
1249 std::inserter(process_list, process_list.end()));
1250 channel_list.clear();
1260 if (
deuteron && antideutron && pim && pi0 && pip &&
1262 const ParticleTypePtrList deutron_list = {
deuteron};
1263 const ParticleTypePtrList antideutron_list = {antideutron};
1264 const ParticleTypePtrList pion_list = {pim, pi0, pip};
1266 (both_antinucleons ? antideutron_list : deutron_list), pion_list,
1269 return pCM(sqrts, type_res_1.
mass(), type_res_2.
mass());
1271 process_list.reserve(process_list.size() + channel_list.size());
1272 std::move(channel_list.begin(), channel_list.end(),
1273 std::inserter(process_list, process_list.end()));
1274 channel_list.clear();
1277 return process_list;
1281 const double KN_offset)
const {
1287 const auto pdg_nucleon = type_nucleon.
pdgcode().
code();
1300 const double KN_to_KDelta_cutoff = KN_offset +
1305 bool incl_KN_to_KDelta =
1307 sqrt_s_ < KN_to_KDelta_cutoff;
1308 bool incl_Strangeness_exchange =
1311 CollisionBranchList process_list;
1316 switch (pdg_nucleon) {
1318 if (incl_Strangeness_exchange) {
1328 sqrt_s_, type_pi_m, type_Sigma_p);
1331 sqrt_s_, type_pi_p, type_Sigma_m);
1334 sqrt_s_, type_pi_z, type_Sigma_z);
1337 sqrt_s_, type_pi_z, type_Lambda);
1339 if (incl_KN_to_KN) {
1344 type_Kbar_z, type_n);
1349 if (incl_Strangeness_exchange) {
1357 sqrt_s_, type_pi_m, type_Sigma_z);
1360 sqrt_s_, type_pi_z, type_Sigma_m);
1363 sqrt_s_, type_pi_m, type_Lambda);
1368 if (incl_KN_to_KDelta) {
1377 type_nucleon, type_kaon,
1378 type_Kbar_z, type_Delta_pp_bar);
1380 sqrt_s_, type_Kbar_z, type_Delta_pp_bar);
1385 type_nucleon, type_kaon, type_K_m,
1388 sqrt_s_, type_K_m, type_Delta_p_bar);
1393 if (incl_KN_to_KDelta) {
1402 type_nucleon, type_kaon,
1403 type_Kbar_z, type_Delta_p_bar);
1405 sqrt_s_, type_Kbar_z, type_Delta_p_bar);
1410 type_nucleon, type_kaon, type_K_m,
1413 sqrt_s_, type_K_m, type_Delta_z_bar);
1415 if (incl_KN_to_KN) {
1420 type_Kbar_z, type_p_bar);
1430 switch (pdg_nucleon) {
1432 if (incl_KN_to_KDelta) {
1440 return sigma_kplusp *
1442 type_K_z, type_Delta_pp);
1444 sqrt_s_, type_K_z, type_Delta_pp);
1448 return sigma_kplusp *
1450 type_K_p, type_Delta_p);
1452 sqrt_s_, type_K_p, type_Delta_p);
1457 if (incl_KN_to_KDelta) {
1465 return sigma_kplusn *
1467 type_K_z, type_Delta_p);
1469 sqrt_s_, type_K_z, type_Delta_p);
1473 return sigma_kplusn *
1475 type_K_p, type_Delta_z);
1477 sqrt_s_, type_K_p, type_Delta_z);
1479 if (incl_KN_to_KN) {
1489 if (incl_Strangeness_exchange) {
1499 sqrt_s_, type_pi_p, type_Sigma_p_bar);
1502 sqrt_s_, type_pi_m, type_Sigma_m_bar);
1505 sqrt_s_, type_pi_z, type_Sigma_z_bar);
1508 sqrt_s_, type_pi_z, type_Lambda_bar);
1510 if (incl_KN_to_KN) {
1515 type_K_z, type_n_bar);
1520 if (incl_Strangeness_exchange) {
1528 sqrt_s_, type_pi_p, type_Sigma_z_bar);
1531 sqrt_s_, type_pi_z, type_Sigma_m_bar);
1534 sqrt_s_, type_pi_p, type_Lambda_bar);
1547 switch (pdg_nucleon) {
1549 if (incl_KN_to_KDelta) {
1557 return sigma_kplusn *
1559 type_K_z, type_Delta_p);
1561 sqrt_s_, type_K_z, type_Delta_p);
1565 return sigma_kplusn *
1567 type_K_p, type_Delta_z);
1569 sqrt_s_, type_K_p, type_Delta_z);
1571 if (incl_KN_to_KN) {
1586 if (incl_KN_to_KDelta) {
1594 return sigma_kplusp *
1596 type_K_z, type_Delta_z);
1598 sqrt_s_, type_K_z, type_Delta_z);
1602 return sigma_kplusp *
1604 type_K_p, type_Delta_m);
1606 sqrt_s_, type_K_p, type_Delta_m);
1611 if (incl_Strangeness_exchange) {
1619 sqrt_s_, type_pi_m, type_Sigma_z_bar);
1622 sqrt_s_, type_pi_z, type_Sigma_p_bar);
1625 sqrt_s_, type_pi_m, type_Lambda_bar);
1630 if (incl_Strangeness_exchange) {
1640 sqrt_s_, type_pi_m, type_Sigma_m_bar);
1643 sqrt_s_, type_pi_p, type_Sigma_p_bar);
1646 sqrt_s_, type_pi_z, type_Sigma_z_bar);
1649 sqrt_s_, type_pi_z, type_Lambda_bar);
1651 if (incl_KN_to_KN) {
1656 type_K_p, type_p_bar);
1664 switch (pdg_nucleon) {
1666 if (incl_Strangeness_exchange) {
1674 sqrt_s_, type_pi_z, type_Sigma_p);
1677 sqrt_s_, type_pi_p, type_Sigma_z);
1680 sqrt_s_, type_pi_p, type_Lambda);
1685 if (incl_Strangeness_exchange) {
1695 sqrt_s_, type_pi_p, type_Sigma_m);
1698 sqrt_s_, type_pi_m, type_Sigma_p);
1701 sqrt_s_, type_pi_z, type_Sigma_z);
1704 sqrt_s_, type_pi_z, type_Lambda);
1706 if (incl_KN_to_KN) {
1716 if (incl_KN_to_KDelta) {
1718 const auto& type_Kbar_z = type_kaon;
1725 type_nucleon, type_kaon,
1726 type_Kbar_z, type_Delta_bar_m);
1728 sqrt_s_, type_Kbar_z, type_Delta_bar_m);
1733 type_nucleon, type_kaon, type_K_m,
1736 sqrt_s_, type_K_m, type_Delta_bar_z);
1738 if (incl_KN_to_KN) {
1748 sqrt_s_, type_K_m, type_n_bar);
1753 if (incl_KN_to_KDelta) {
1762 type_nucleon, type_kaon,
1763 type_Kbar_z, type_Delta_z_bar);
1765 sqrt_s_, type_Kbar_z, type_Delta_z_bar);
1770 type_nucleon, type_kaon, type_K_m,
1773 sqrt_s_, type_K_m, type_Delta_m_bar);
1781 return process_list;
1786 CollisionBranchList process_list;
1788 return process_list;
1795 const auto pdg_delta = type_delta.
pdgcode().
code();
1803 switch (
pack(pdg_delta, pdg_kaon)) {
1812 type_kaon, type_p, type_K_p) *
1828 type_kaon, type_p_bar, type_K_m) *
1830 type_kaon, type_delta) *
1833 sqrt_s_, type_p_bar, type_K_m);
1846 type_kaon, type_n, type_K_p) *
1857 type_kaon, type_p, type_K_z) *
1875 type_kaon, type_n_bar, type_K_m) *
1877 type_kaon, type_delta) *
1880 sqrt_s_, type_n_bar, type_K_m);
1886 type_kaon, type_p_bar,
1889 type_kaon, type_delta) *
1892 sqrt_s_, type_p_bar, type_Kbar_z);
1903 type_kaon, type_n, type_K_z) *
1919 type_kaon, type_n_bar,
1922 type_kaon, type_delta) *
1925 sqrt_s_, type_n_bar, type_Kbar_z);
1932 return process_list;
1937 CollisionBranchList process_list;
1939 return process_list;
1946 const auto pdg_hyperon = type_hyperon.
pdgcode().
code();
1951 switch (
pack(pdg_hyperon, pdg_pion)) {
1972 type_p, type_Kbar_z) *
1975 sqrt_s_, type_p, type_Kbar_z);
1985 type_n_bar, type_K_p) *
1988 sqrt_s_, type_n_bar, type_K_p);
1998 type_p_bar, type_K_z) *
2001 sqrt_s_, type_p_bar, type_K_z);
2024 type_p, type_Kbar_z) *
2027 sqrt_s_, type_p, type_Kbar_z);
2037 type_n_bar, type_K_p) *
2040 sqrt_s_, type_n_bar, type_K_p);
2050 type_p_bar, type_K_z) *
2053 sqrt_s_, type_p_bar, type_K_z);
2076 type_p, type_Kbar_z) *
2079 sqrt_s_, type_p, type_Kbar_z);
2089 type_n_bar, type_K_p) *
2092 sqrt_s_, type_n_bar, type_K_p);
2102 type_p_bar, type_K_z) *
2105 sqrt_s_, type_p_bar, type_K_z);
2125 type_n, type_Kbar_z) *
2128 sqrt_s_, type_n, type_Kbar_z);
2140 type_p_bar, type_K_p) *
2143 sqrt_s_, type_p_bar, type_K_p);
2148 type_n_bar, type_K_z) *
2151 sqrt_s_, type_n_bar, type_K_z);
2171 type_n, type_Kbar_z) *
2174 sqrt_s_, type_n, type_Kbar_z);
2186 type_p_bar, type_K_p) *
2189 sqrt_s_, type_p_bar, type_K_p);
2194 type_n_bar, type_K_z) *
2197 sqrt_s_, type_n_bar, type_K_z);
2217 type_n, type_Kbar_z) *
2220 sqrt_s_, type_n, type_Kbar_z);
2232 type_p_bar, type_K_p) *
2235 sqrt_s_, type_p_bar, type_K_p);
2240 type_n_bar, type_K_z) *
2243 sqrt_s_, type_n_bar, type_K_z);
2263 type_n, type_Kbar_z) *
2266 sqrt_s_, type_n, type_Kbar_z);
2278 type_p_bar, type_K_p) *
2281 sqrt_s_, type_p_bar, type_K_p);
2286 type_n_bar, type_K_z) *
2289 sqrt_s_, type_n_bar, type_K_z);
2296 return process_list;
2302 const double s = sqrts * sqrts;
2307 const double matrix_element =
2308 295.5 + 2.862 / (0.00283735 +
pow_int(sqrts - 2.181, 2)) +
2309 0.0672 /
pow_int(tmp, 2) - 6.61753 / tmp;
2311 const double spin_factor =
2312 (produced_nucleus->
spin() + 1) * (type_pi.
spin() + 1);
2317 double xsection = matrix_element * spin_factor / (s * cm_mom);
2321 const double resonance_integral =
2323 xsection *= resonance_integral;
2325 ", matrix element: ", matrix_element,
2326 ", cm_momentum: ", cm_mom);
2333 CollisionBranchList process_list;
2343 ParticleTypePtrList nuc = (baryon_number > 0)
2350 nuc_a->charge() + nuc_b->charge()) {
2354 for (
const int twoI :
I_tot_range(*nuc_a, *nuc_b)) {
2356 type_a, type_b, *nuc_a, *nuc_b, twoI);
2363 const double matrix_element =
2365 if (matrix_element <= 0.) {
2369 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
2370 const int sym_fac_in =
2372 const int sym_fac_out =
2373 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
2374 double p_cm_final =
pCM_from_s(s, nuc_a->mass(), nuc_b->mass());
2375 const double xsection = isospin_factor * spin_factor * sym_fac_in /
2376 sym_fac_out * p_cm_final * matrix_element /
2380 process_list.push_back(std::make_unique<CollisionBranch>(
2383 nuc_a->name(), nuc_b->name(),
2384 " at sqrts [GeV] = ", sqrts,
2385 " with cs[mb] = ", xsection);
2397 if (is_pid_or_pidprime &&
2404 if (produced_nucleus == &type_nucleus ||
2406 produced_nucleus->baryon_number() != type_nucleus.
baryon_number()) {
2409 const double xsection =
2411 process_list.push_back(std::make_unique<CollisionBranch>(
2414 type_pi.
name(), produced_nucleus->name(),
2415 " at ", sqrts,
" GeV, xs[mb] = ", xsection);
2418 return process_list;
2425 const double s = sqrts * sqrts;
2426 double matrix_element = 0.0;
2434 matrix_element = 79.0474 / std::pow(tmp, 0.7897) + 654.596 * tmp;
2439 matrix_element = 342.572 / std::pow(tmp, 0.6);
2441 const double spin_factor =
2442 (produced_nucleus->
spin() + 1) * (type_N.
spin() + 1);
2446 double xsection = matrix_element * spin_factor / (s * cm_mom);
2452 const double resonance_integral =
2454 xsection *= resonance_integral;
2465 CollisionBranchList process_list;
2467 return process_list;
2473 if (produced_nucleus == &type_nucleus ||
2475 produced_nucleus->baryon_number() != type_nucleus.
baryon_number()) {
2480 process_list.push_back(std::make_unique<CollisionBranch>(
2483 type_N.
name(), produced_nucleus->name(),
" at ",
2484 sqrt_s_,
" GeV, xs[mb] = ", xsection);
2486 return process_list;
2492 if (!string_process) {
2493 throw std::runtime_error(
"string_process should be initialized.");
2496 CollisionBranchList channel_list;
2497 if (total_string_xs <= 0.) {
2498 return channel_list;
2508 std::array<int, 2> pdgid;
2509 double AQM_scaling = 1.;
2510 for (
int i = 0; i < 2; i++) {
2518 bool can_annihilate =
false;
2521 for (
int iq = 1; iq <= n_q_types; iq++) {
2522 std::array<int, 2> nquark;
2523 for (
int i = 0; i < 2; i++) {
2527 if (nquark[0] != 0 && nquark[1] != 0) {
2528 can_annihilate =
true;
2538 double sig_annihilation = 0.0;
2539 if (can_annihilate) {
2547 if (finder_parameters.
use_AQM) {
2548 xs_param *= AQM_scaling;
2550 sig_annihilation = std::min(total_string_xs, xs_param);
2564 pdgid[0], pdgid[1], std::sqrt(mandelstam_s));
2565 if (finder_parameters.
use_AQM) {
2566 for (
int ip = 0; ip < 3; ip++) {
2567 xs[ip] *= AQM_scaling;
2570 double single_diffr_AX = xs[0], single_diffr_XB = xs[1], double_diffr = xs[2];
2571 double single_diffr = single_diffr_AX + single_diffr_XB;
2572 double diffractive = single_diffr + double_diffr;
2574 const double nondiffractive_all =
2575 std::max(0., total_string_xs - sig_annihilation - diffractive);
2576 diffractive = total_string_xs - sig_annihilation - nondiffractive_all;
2577 double_diffr = std::max(0., diffractive - single_diffr);
2578 const double a = (diffractive - double_diffr) / single_diffr;
2579 single_diffr_AX *= a;
2580 single_diffr_XB *= a;
2581 assert(std::abs(single_diffr_AX + single_diffr_XB + double_diffr +
2582 sig_annihilation + nondiffractive_all - total_string_xs) <
2585 double nondiffractive_soft = 0.;
2586 double nondiffractive_hard = 0.;
2587 if (nondiffractive_all > 0.) {
2592 nondiffractive_soft =
2593 nondiffractive_all * std::exp(-hard_xsec / nondiffractive_all);
2594 nondiffractive_hard = nondiffractive_all - nondiffractive_soft;
2605 const double sig_string_soft = total_string_xs - nondiffractive_hard;
2608 if (sig_string_soft > 0.) {
2609 channel_list.push_back(std::make_unique<CollisionBranch>(
2611 channel_list.push_back(std::make_unique<CollisionBranch>(
2613 channel_list.push_back(std::make_unique<CollisionBranch>(
2615 channel_list.push_back(std::make_unique<CollisionBranch>(
2617 if (can_annihilate) {
2618 channel_list.push_back(std::make_unique<CollisionBranch>(
2622 if (nondiffractive_hard > 0.) {
2623 channel_list.push_back(std::make_unique<CollisionBranch>(
2626 return channel_list;
2642 if (pdg_a == pdg_b) {
2659 auto [region_lower, region_upper] =
2662 xs = xs_l * (1. - prob_high) + xs_h * prob_high;
2698 double cross_sec = 0.;
2709 const double eff_s =
2736 return std::make_unique<CollisionBranch>(
2737 type_pip, type_pim, type_pip, type_pim, type_piz, nnbar_xsec * scale_xs,
2742 const double current_xs,
const double scale_xs)
const {
2746 double nnbar_xsec = std::max(0.,
ppbar_total(s) * scale_xs - current_xs);
2755 CollisionBranchList channel_list;
2769 if (
sqrt_s_ - 2 * type_N.mass() < 0) {
2770 return channel_list;
2774 type_N, type_Nbar) *
2777 channel_list.push_back(std::make_unique<CollisionBranch>(
2779 channel_list.push_back(std::make_unique<CollisionBranch>(
2783 return channel_list;
2787 const bool is_anti_particles)
const {
2790 CollisionBranchList process_list;
2796 ParticleTypePtrList nuc_or_anti_nuc;
2797 if (is_anti_particles) {
2808 nuc_a->charge() + nuc_b->charge()) {
2812 for (
const int twoI :
I_tot_range(*nuc_a, *nuc_b)) {
2814 type_a, type_b, *nuc_a, *nuc_b, twoI);
2821 const double matrix_element =
2823 if (matrix_element <= 0.) {
2831 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
2832 const int sym_fac_in =
2834 const int sym_fac_out =
2835 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
2836 const double xsection = isospin_factor * spin_factor * sym_fac_in /
2837 sym_fac_out * p_cm_final * matrix_element /
2841 process_list.push_back(std::make_unique<CollisionBranch>(
2844 "2->2 absorption with original particles: ", type_a, type_b);
2849 return process_list;
2856 const double m_a = type_a.
mass();
2857 const double m_b = type_b.
mass();
2858 const double msqr = 2. * (m_a * m_a + m_b * m_b);
2868 const double uplmt = m_a + m_b + 3.0 * (w_a + w_b) + 3.0;
2869 if (sqrts > uplmt) {
2876 return 68. / std::pow(sqrts - 1.104, 1.951);
2885 }
else if (twoI == 0) {
2886 const double parametrization = 14. / msqr;
2893 return 6.5 * parametrization;
2895 return parametrization;
2908 }
else if (twoI == 0) {
2922 }
else if (twoI == 0) {
2932 (1.0 - std::exp(-(sqrts - 2.0) * 20.0));
2939 template <
class IntegrationMethod>
2941 const ParticleTypePtrList& list_res_1,
2942 const ParticleTypePtrList& list_res_2,
2943 const IntegrationMethod integrator)
const {
2947 CollisionBranchList channel_list;
2955 if (type_res_1->charge() + type_res_2->charge() !=
2961 for (
const int twoI :
I_tot_range(type_particle_a, type_particle_b)) {
2963 type_particle_a, type_particle_b, *type_res_1, *type_res_2, twoI);
2970 const double lower_limit = type_res_1->min_mass_kinematic();
2971 const double upper_limit =
sqrt_s_ - type_res_2->mass();
2975 if (upper_limit - lower_limit < 1E-3) {
2981 sqrt_s_, *type_res_1, *type_res_2, twoI);
2982 if (matrix_element <= 0.) {
2989 const double resonance_integral = integrator(*type_res_1, *type_res_2);
2994 const double spin_factor =
2995 (type_res_1->spin() + 1) * (type_res_2->spin() + 1);
2996 const double xsection = isospin_factor * spin_factor * matrix_element *
3000 channel_list.push_back(std::make_unique<CollisionBranch>(
3003 "Found 2->2 creation process for resonance ", type_res_1,
", ",
3006 type_particle_a, type_particle_b);
3011 return channel_list;
3024 const bool treat_BBbar_with_strings =
3026 const bool is_NN_scattering =
3029 const bool is_BBbar_scattering =
3038 const bool is_AQM_scattering =
3045 const double mass_sum =
3048 if (!is_NN_scattering && !is_BBbar_scattering && !is_Npi_scattering &&
3049 !is_AQM_scattering) {
3053 }
else if (is_BBbar_scattering) {
3060 const bool is_KplusP =
3073 }
else if (pdg1.
is_pion() && pdg2.is_pion()) {
3079 return static_cast<double>(
sqrt_s_ > mass_sum + aqm_offset);
3083 double region_lower, region_upper;
3084 if (is_Npi_scattering) {
3085 std::tie(region_lower, region_upper) =
3087 }
else if (is_NN_scattering) {
3088 std::tie(region_lower, region_upper) =
3093 region_lower = mass_sum + aqm_offset;
3094 region_upper = mass_sum + aqm_offset +
3100 }
else if (
sqrt_s_ < region_lower) {
3110 const double region_lower,
const double region_upper)
const {
3119 double x = (
sqrt_s_ - 0.5 * (region_lower + region_upper)) /
3120 (region_upper - region_lower);
3121 assert(x >= -0.5 && x <= 0.5);
3122 double prob = 0.5 * (std::sin(M_PI * x) + 1.0);
3123 assert(prob >= 0. && prob <= 1.);
const double sqrt_s_
Total energy in the center-of-mass frame.
static double d_N_inelastic_xs(double N_kinetic_energy)
Parametrization of deuteron-nucleon inelastic cross section.
static double xs_dpi_dprimepi(double sqrts, double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_pi)
Parametrized cross section for πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse,...
CollisionBranchList two_to_two(const ReactionsBitSet &included_2to2, double KN_offset) const
Find all inelastic 2->2 processes for the given scattering.
CollisionBranchPtr NNbar_to_5pi(double scale_xs) const
Create collision branch for NNbar annihilation going directly into 5 pions.
double probability_transit_high(double region_lower, double region_upper) const
CollisionBranchList NNbar_creation() const
Determine the cross section for NNbar creation, which is given by detailed balance from the reverse r...
CollisionBranchList dpi_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron (dpi), specifically dπ→ NN,...
double high_energy(const ScatterActionsFinderParameters &finder_parameters) const
Determine the parametrized total cross section at high energies for the given collision,...
CollisionBranchList bb_xx_except_nn(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering except the more specific Nucleon-...
CollisionBranchList npi_yk() const
Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering.
CollisionBranchList find_nn_xsection_from_type(const ParticleTypePtrList &type_res_1, const ParticleTypePtrList &type_res_2, const IntegrationMethod integrator) const
Utility function to avoid code replication in nn_xx().
double cm_momentum() const
Determine the momenta of the incoming particles in the center-of-mass system.
CollisionBranchList bar_bar_to_nuc_nuc(const bool is_anti_particles) const
Calculate cross sections for resonance absorption (i.e.
double string_probability(const ScatterActionsFinderParameters &finder_parameters) const
CollisionBranchList deltak_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering.
CrossSections(const ParticleList &incoming_particles, double sqrt_s, const std::pair< FourVector, FourVector > potentials)
Construct CrossSections instance.
static double xs_dn_dprimen(double sqrts, double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_nucleus, const ParticleType &type_N)
Parametrized cross section for Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e....
double elastic_parametrization(const ScatterActionsFinderParameters &finder_parameters) const
Choose the appropriate parametrizations for given incoming particles and return the (parametrized) el...
CollisionBranchList two_to_four() const
Find all 2->4 processes for the given scattering.
CollisionBranchPtr elastic(const ScatterActionsFinderParameters &finder_parameters) const
Determine the elastic cross section for this collision.
double formation(const ParticleType &type_resonance, double cm_momentum_sqr) const
Return the 2-to-1 resonance production cross section for a given resonance.
void add_channel(CollisionBranchList &process_list, F &&get_xsection, double sqrts, const ParticleType &type_a, const ParticleType &type_b) const
Helper function: Add a 2-to-2 channel to a collision branch list given a cross section.
double string_hard_cross_section() const
Determine the (parametrized) hard non-diffractive string cross section for this collision.
static double two_to_three_xs(const ParticleType &type_in1, const ParticleType &type_in2, double sqrts)
Determine 2->3 cross section for the scattering of the given particle types.
double nk_el() const
Determine the elastic cross section for a nucleon-kaon (NK) collision.
CollisionBranchList nk_xx(const ReactionsBitSet &included_2to2, double KN_offset) const
Find all inelastic 2->2 background processes for Nucleon-Kaon (NK) Scattering.
CollisionBranchList two_to_one() const
Find all resonances that can be produced in a 2->1 collision of the two input particles and the produ...
const ParticleList incoming_particles_
List with data of scattering particles.
double npi_el() const
Determine the elastic cross section for a nucleon-pion (Npi) collision.
double nn_el() const
Determine the (parametrized) elastic cross section for a nucleon-nucleon (NN) collision.
const bool is_BBbar_pair_
Whether incoming particles are a pair of a baryon and an antibaryon (could be different baryon types)
CollisionBranchList dn_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron (dN), specifically Nd → Nd',...
static double two_to_four_xs(const ParticleType &type_in1, const ParticleType &type_in2, double sqrts)
Determine 2->4 cross section for the scattering of the given particle types.
CollisionBranchList ypi_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering.
CollisionBranchList string_excitation(double total_string_xs, StringProcess *string_process, const ScatterActionsFinderParameters &finder_parameters) const
Determine the cross section for string excitations, which is given by the difference between the para...
double parametrized_total(const ScatterActionsFinderParameters &finder_parameters) const
Select the parametrization for the total cross section, given the types of incoming particles.
const bool is_NNbar_pair_
Whether incoming particles are a nulecon-antinucleon pair (same isospin)
static double nn_to_resonance_matrix_element(double sqrts, const ParticleType &type_a, const ParticleType &type_b, const int twoI)
Scattering matrix amplitude squared (divided by 16π) for resonance production processes like NN → NR ...
CollisionBranchList rare_two_to_two() const
Find all 2->2 processes which are suppressed at high energies when strings are turned on with probabi...
static double sum_xs_of(const CollisionBranchList &list)
Helper function: Sum all cross sections of the given process list.
CollisionBranchList two_to_three() const
Find all 2->3 processes for the given scattering.
static double d_aN_inelastic_xs(double aN_kinetic_energy)
Parametrization of deuteron-antinucleon inelastic cross section.
CollisionBranchPtr NNbar_annihilation(double current_xs, double scale_xs) const
Determine the cross section for NNbar annihilation, which is given by the difference between the para...
CollisionBranchList generate_collision_list(const ScatterActionsFinderParameters &finder_parameters, StringProcess *string_process) const
Generate a list of all possible collisions between the incoming particles with the given c....
static double d_pi_inelastic_xs(double pion_kinetic_energy)
Parametrization of deuteron-pion inelastic cross section.
CollisionBranchList nn_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering.
Range of total isospin for reaction of particle a with particle b.
double get_integral_RR(IsoParticleType *type_res_2, double sqrts)
Look up the tabulated resonance integral for the XX -> RR cross section.
double get_integral_NR(double sqrts)
Look up the tabulated resonance integral for the XX -> NR cross section.
double get_integral_RK(double sqrts)
Look up the tabulated resonance integral for the XX -> RK cross section.
double get_integral_piR(double sqrts)
Look up the tabulated resonance integral for the XX -> piR 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.
ParticleData contains the dynamic information of a certain particle.
PdgCode pdgcode() const
Get the pdgcode of the particle.
const ParticleType & type() const
Get the type of the particle.
double effective_mass() const
Get the particle's effective mass.
A pointer-like interface to global references to ParticleType objects.
Particle type contains the static properties of a particle species.
double spectral_function(double m) const
Full spectral function of the resonance (relativistic Breit-Wigner distribution with mass-dependent ...
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
const std::string & name() const
int32_t charge() const
The charge of the particle.
int antiparticle_sign() const
static ParticleTypePtrList & list_nucleons()
static ParticleTypePtrList & list_anti_nucleons()
bool is_Nstar1535() const
double width_at_pole() const
static ParticleTypePtrList & list_anti_Deltas()
static ParticleTypePtrList & list_baryon_resonances()
static ParticleTypePtrList & list_Deltas()
double get_partial_in_width(const double m, const ParticleData &p_a, const ParticleData &p_b) const
Get the mass-dependent partial in-width of a resonance with mass m, decaying into two given daughter ...
unsigned int spin() const
int baryon_number() const
bool is_Deltastar() const
IsoParticleType * iso_multiplet() const
static ParticleTypePtrList & list_light_nuclei()
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
std::int32_t code() const
int antiparticle_sign() const
int nucleus_n() const
Number of neutrons in nucleus.
int nucleus_ap() const
Number of antiprotons in nucleus.
int nucleus_an() const
Number of antineutrons in nucleus.
unsigned int spin() const
bool is_antiparticle_of(const PdgCode rhs) const
int nucleus_p() const
Number of protons in nucleus.
int nucleus_La() const
Number of Lambdas in nucleus.
int nucleus_A() const
Nucleus mass number.
int nucleus_aLa() const
Number of anti-Lambdas in nucleus.
Helper class for ScatterActionsFinder.
const bool strings_with_probability
This indicates whether the string fragmentation is swiched on with a probability smoothly increasing ...
const ReactionsBitSet included_2to2
List of included 2<->2 reactions.
const bool use_AQM
Switch to control whether to use AQM or not.
const double scale_xs
Factor by which all (partial) cross sections are scaled.
const double elastic_parameter
Elastic cross section parameter (in mb).
const bool strings_switch
Indicates whether string fragmentation is switched on.
const StringTransitionParameters transition_high_energy
Constants related to transition between low collision energies - mediated via resonances - and high c...
const double additional_el_xs
Additional constant contribution (in mb) to the elastic cross sections.
double AQM_scaling_factor(const PdgCode &pdg) const
AQM scaling factor for a hadron.
const NNbarTreatment nnbar_treatment
Switch for NNbar reactions.
const double low_snn_cut
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
const bool two_to_one
Enables resonance production.
String excitation processes used in SMASH.
static int pdg_map_for_pythia(PdgCode &pdg)
Take pdg code and map onto particle specie which can be handled by PYTHIA.
std::array< double, 3 > cross_sections_diffractive(int pdg_a, int pdg_b, double sqrt_s)
Interface to pythia_sigmatot_ to compute cross-sections of A+B-> different final states Schuler:1993w...
Collection of useful constants that are known at compile time.
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
@ TwoToFive
Directly create 5 pions, use with multi-particle reactions.
@ Resonances
Use intermediate Resonances.
@ Strings
Use string fragmentation.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
constexpr int Delta_pp
Δ⁺⁺.
constexpr int64_t antideuteron
Anti-deuteron in decimal digits.
constexpr int h1
h₁(1170).
constexpr int64_t deuteron
Deuteron.
double kplusn_k0p(double mandelstam_s)
K+ n charge exchange cross section parametrization.
double kplusp_total(double mandelstam_s)
K+ p total cross section parametrization.
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.
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
double pipluspiminus_total(double sqrts)
pi+ pi- total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
ParticleTypePtrList list_possible_resonances(const ParticleTypePtr type_a, const ParticleTypePtr type_b)
Lists the possible resonances that decay into two particles.
double piminusp_sigma0k0_res(double mandelstam_s)
pi- p -> Sigma0 K0 cross section parametrization, resonance contribution.
T pCM_sqr(const T sqrts, const T mass_a, const T mass_b) noexcept
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
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
static double detailed_balance_factor_RR(double sqrts, double pcm, const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d)
Helper function: Calculate the detailed balance factor R such that.
double kminusn_piminussigma0(double sqrts)
K- n <-> pi- Sigma0 cross section parametrization Follow from the parametrization with the same stran...
double kbar0p_elastic_background(double mandelstam_s)
Kbar0 p elastic background cross section parametrization Source: Buss:2011mx , B.3....
KaonNucleonRatios kaon_nucleon_ratios
double ppbar_elastic(double mandelstam_s)
ppbar elastic cross section parametrization Source: Bass:1998ca
double kminusp_elastic_background(double mandelstam_s)
K- p elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
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...
double Npi_string_hard(double mandelstam_s)
nucleon-pion hard scattering cross section (with partonic scattering)
double kminusn_piminuslambda(double sqrts)
K- n <-> pi- Lambda cross section parametrization Follow from the parametrization with the same stran...
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.
@ TwoToOne
See here for a short description.
@ StringSoftDoubleDiffractive
See here for a short description.
@ TwoToFive
See here for a short description.
@ StringSoftSingleDiffractiveXB
See here for a short description.
@ TwoToTwo
See here for a short description.
@ Elastic
See here for a short description.
@ TwoToFour
See here for a short description.
@ StringSoftAnnihilation
See here for a short description.
@ StringSoftNonDiffractive
See here for a short description.
@ StringSoftSingleDiffractiveAX
See here for a short description.
@ StringHard
See here for a short description.
@ TwoToThree
See here for a short description.
constexpr double minimum_sqrts_pythia_can_handle
Energy in GeV, below which hard reactions via pythia are impossible.
double ppbar_high_energy(double mandelstam_s)
ppbar total cross section at high energies
double pp_high_energy(double mandelstam_s)
pp total cross section at high energies
T pCM_sqr_from_s(const T s, const T mass_a, const T mass_b) noexcept
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 kminusp_piminussigmaplus(double sqrts)
K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra ).
double piplusp_elastic_high_energy(double mandelstam_s, double m1, double m2)
pi+p elactic cross section parametrization.
double piplusp_sigmapluskplus_pdg(double mandelstam_s)
pi+ p to Sigma+ K+ cross section parametrization, PDG data.
static constexpr int LCrossSections
double piminusp_total(double sqrts)
pi- p total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
constexpr double deuteron_mass
Deuteron mass in GeV.
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.
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.
static void append_list(CollisionBranchList &main_list, CollisionBranchList in_list, double weight=1.)
Helper function: Append a list of processes to another (main) list of processes.
static double detailed_balance_factor_stable(double s, const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d)
Helper function: Calculate the detailed balance factor R such that.
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 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
double kplusp_inelastic_background(double mandelstam_s)
K+ p inelastic background cross section parametrization Source: Buss:2011mx , B.3....
constexpr double pion_mass
Pion mass in GeV.
constexpr double hbarc
GeV <-> fm conversion factor.
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....
static double effective_AQM_s(double mandelstam_s, double m1, double m2, double m1_ref, double m2_ref)
Helper function: Shift the energy of a collision for AQM rescaled cross sections.
double pp_total(double mandelstam_s)
pp total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept
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.
static double detailed_balance_factor_RK(double sqrts, double pcm, const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d)
Helper function: Calculate the detailed balance factor R such that.
double k0n_elastic_background(double mandelstam_s)
K0 n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
static constexpr int LScatterAction
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.
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 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.
double kplusn_inelastic_background(double mandelstam_s)
K+ n inelastic background cross section parametrization Source: Buss:2011mx , B.3....
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.
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
const std::pair< double, double > sqrts_range_Npi
Transition range in N collisions.
const double pipi_offset
Constant offset as to where to turn on the strings and elastic processes for reactions (this is an e...
const double sqrts_add_lower
Constant for the lower end of transition region in the case of AQM this is added to the sum of masses...
const double KN_offset
Constant offset as to where to shift from 2to2 to string processes (in GeV) in the case of KN reactio...
const std::pair< double, double > sqrts_range_NN
Transition range in NN collisions.
const double sqrts_range_width
Constant for the range of transition region, in the case of AQM this is added to the sum of masses + ...