33 double spin_factor = (c.
spin() + 1) * (d.
spin() + 1);
34 spin_factor /= (a.
spin() + 1) * (b.
spin() + 1);
35 double symmetry_factor = (1 + (a == b));
36 symmetry_factor /= (1 + (c == d));
39 return spin_factor * symmetry_factor * momentum_factor;
55 double spin_factor = (c.
spin() + 1) * (d.
spin() + 1);
56 spin_factor /= (a.
spin() + 1) * (b.
spin() + 1);
57 double symmetry_factor = (1 + (a == b));
58 symmetry_factor /= (1 + (c == d));
59 const double momentum_factor =
62 return spin_factor * symmetry_factor * momentum_factor;
78 double spin_factor = (c.
spin() + 1) * (d.
spin() + 1);
79 spin_factor /= (a.
spin() + 1) * (b.
spin() + 1);
80 double symmetry_factor = (1 + (a == b));
81 symmetry_factor /= (1 + (c == d));
82 const double momentum_factor =
85 return spin_factor * symmetry_factor * momentum_factor;
93 CollisionBranchList in_list,
double weight = 1.) {
94 main_list.reserve(main_list.size() + in_list.size());
95 for (
auto& proc : in_list) {
96 proc->set_weight(proc->weight() * weight);
97 main_list.emplace_back(std::move(proc));
111 const std::string func_name) {
112 std::stringstream ss{};
115 ss <<
"Cross section for scattering of " << a.
name() <<
" and " << b.
name()
116 <<
" is not implemented in function 'CrossSections::" << func_name <<
"'.";
117 throw std::runtime_error(ss.str());
134 std::string func_name) {
139 std::stringstream ss{};
140 ss <<
"Negative cross section encountered in function 'CrossSections::"
141 << func_name <<
"':\na=" << a.
name() <<
" b=" << b.
name()
142 <<
" j_a=" << pdg_a.
spin() <<
" j_b=" << pdg_b.
spin() <<
" sigma=" << xsec
143 <<
" s=" << sqrts * sqrts <<
" sqrt(s)=" << sqrts;
144 throw std::runtime_error(ss.str());
159 const double m2,
const double m1_ref,
160 const double m2_ref) {
161 const double eff_sqrt_s = std::sqrt(mandelstam_s) - m1 - m2 + m1_ref + m2_ref;
162 return eff_sqrt_s * eff_sqrt_s;
178 const double AQM_scaling_factor_a,
const double AQM_scaling_factor_b) {
187 AQM_scaling_factor_a * AQM_scaling_factor_b;
203 std::ostringstream warn_msg{
204 "AQM is disabled and 'Charm_Rescattering_Method' is set to ",
207 warn_msg <<
"'T-matrix' with sqrt(s) = " << sqrts
208 <<
" GeV out of bounds of the underlying data";
210 warn_msg <<
"'resonances'";
212 warn_msg <<
".\nElastic interactions of " << type_a.
name() <<
" and "
214 <<
" are disabled under these circumstances.\nPlease enable AQM "
215 "if these interactions should occur.";
221 const std::pair<FourVector, FourVector>
potentials)
222 : incoming_particles_(incoming_particles),
225 is_BBbar_pair_(incoming_particles_[0].type().is_baryon() &&
226 incoming_particles_[1].type().is_baryon() &&
227 incoming_particles_[0].type().antiparticle_sign() ==
228 -incoming_particles_[1].type().antiparticle_sign()),
230 incoming_particles_[0].type().is_nucleon() &&
231 incoming_particles_[1].pdgcode() ==
232 incoming_particles_[0].type().get_antiparticle()->pdgcode()) {}
237 CollisionBranchList process_list;
241 double p_pythia = 0.;
248 const bool reject_by_nucleon_elastic_cutoff =
254 if (incl_elastic && !reject_by_nucleon_elastic_cutoff) {
255 process_list.emplace_back(
elastic(finder_parameters));
264 const double sig_current =
sum_xs_of(process_list);
265 const double sig_string = std::max(
273 p_pythia * finder_parameters.
scale_xs);
280 (1. - p_pythia) * finder_parameters.
scale_xs);
288 (1. - p_pythia) * finder_parameters.
scale_xs);
290 if (finder_parameters
295 (1. - p_pythia) * finder_parameters.
scale_xs);
297 if (finder_parameters
302 (1. - p_pythia) * finder_parameters.
scale_xs);
331 double total_xs = 0.;
391 std::optional<double> elastic_xs = std::nullopt;
392 double inelastic_xs = 0.;
401 elastic_xs.has_value()) {
402 total_xs = elastic_xs.value() + inelastic_xs;
440 throw std::runtime_error(
"wrong isospin in ππ scattering");
446 std::optional<double> elastic_xs = std::nullopt;
447 double inelastic_xs = 0.;
459 elastic_xs.has_value()) {
460 total_xs = elastic_xs.value() + inelastic_xs;
484 double elastic_xs = 0.;
496 return std::make_unique<CollisionBranch>(
504 CollisionBranchList process_list;
507 const auto& pdg_a = data_a.
pdgcode();
508 const auto& pdg_b = data_b.
pdgcode();
509 if ((pdg_a.is_nucleon() && pdg_b.is_pion()) ||
510 (pdg_b.is_nucleon() && pdg_a.is_pion())) {
518 const bool use_AQM = finder_parameters.
use_AQM;
519 const double pipi_offset =
523 double elastic_xs = 0.0;
531 elastic_xs =
nk_el();
535 std::optional<double> tmp_elastic_xs = std::nullopt;
542 tmp_elastic_xs.has_value()) {
543 elastic_xs = tmp_elastic_xs.value();
544 }
else if (use_AQM) {
565 elastic_xs =
nn_el();
573 const bool is_deuteron = pdg_nucleus.
is_deuteron();
574 if (is_deuteron && pdg_other.
is_pion()) {
577 }
else if (is_deuteron && pdg_other.
is_nucleon()) {
585 std::optional<double> tmp_elastic_xs = std::nullopt;
594 tmp_elastic_xs.has_value()) {
595 elastic_xs = tmp_elastic_xs.value();
596 }
else if (use_AQM) {
614 }
else if (use_AQM) {
619 elastic_xs =
nn_el();
630 (m1 + m2 + pipi_offset) >
sqrt_s_) {
640 if (elastic_xs < 0.) {
689 assert(pion != nucleon);
694 switch (nucleon.
code()) {
696 switch (pion.
code()) {
709 switch (pion.
code()) {
722 switch (pion.
code()) {
735 switch (pion.
code()) {
766 const auto pdg_nucleon = type_nucleon.
pdgcode().
code();
775 CollisionBranchList process_list;
776 switch (pdg_nucleon) {
784 sqrt_s_, type_K_p, type_Sigma_p);
795 sqrt_s_, type_K_p, type_Sigma_m);
798 type_K_z, type_Sigma_z);
801 type_K_z, type_Lambda);
817 sqrt_s_, type_K_p, type_Sigma_z);
820 type_K_z, type_Sigma_p);
823 sqrt_s_, type_K_p, type_Lambda);
839 sqrt_s_, type_K_z, type_Sigma_p);
842 type_K_p, type_Sigma_z);
845 type_K_p, type_Lambda);
853 sqrt_s_, type_K_z, type_Sigma_m);
869 sqrt_s_, type_K_z, type_Sigma_z);
872 type_K_p, type_Sigma_m);
875 sqrt_s_, type_K_z, type_Lambda);
891 sqrt_s_, type_K_m, type_Sigma_m_bar);
894 type_Kbar_z, type_Sigma_z_bar);
897 type_Kbar_z, type_Lambda_bar);
905 sqrt_s_, type_K_m, type_Sigma_p_bar);
921 sqrt_s_, type_K_m, type_Sigma_z_bar);
924 type_Kbar_z, type_Sigma_p_bar);
927 sqrt_s_, type_K_m, type_Lambda_bar);
940 sqrt_s_, type_Kbar_z, type_Sigma_m_bar);
951 sqrt_s_, type_Kbar_z, type_Sigma_p_bar);
954 type_K_m, type_Sigma_z_bar);
957 type_K_m, type_Lambda_bar);
973 sqrt_s_, type_Kbar_z, type_Sigma_z_bar);
976 type_K_m, type_Sigma_m_bar);
979 sqrt_s_, type_Kbar_z, type_Lambda_bar);
996 assert(kaon != nucleon);
1001 switch (nucleon.
code()) {
1003 switch (kaon.
code()) {
1019 switch (kaon.
code()) {
1035 switch (kaon.
code()) {
1051 switch (kaon.
code()) {
1084 const auto pdg_pion =
1087 std::optional<double> sig_el = std::nullopt;
1088 switch (
pack(pdg_D, pdg_pion)) {
1156 if (sig_el.has_value() && sig_el.value() < 0.) {
1169 const auto pdg_eta =
1172 std::optional<double> sig_el = std::nullopt;
1173 switch (
pack(pdg_D, pdg_eta)) {
1201 if (sig_el.has_value() && sig_el.value() < 0.) {
1214 const auto pdg_kaon =
1217 std::optional<double> sig_el = std::nullopt;
1218 switch (
pack(pdg_D, pdg_kaon)) {
1306 if (sig_el.has_value() && sig_el.value() < 0.) {
1320 std::optional<double> sig_el = std::nullopt;
1321 switch (
pack(pdg_D, pdg_nucleon)) {
1367 if (sig_el.has_value() && sig_el.value() < 0.) {
1381 std::optional<double> sig_el = std::nullopt;
1382 switch (
pack(pdg_D, pdg_Delta)) {
1468 if (sig_el.has_value() && sig_el.value() < 0.) {
1478 CollisionBranchList resonance_process_list;
1487 const bool light_meson_present = pdg_a.
is_pion() || pdg_b.
is_pion() ||
1490 const bool nucleon_or_Delta_present = pdg_a.
is_nucleon() ||
1493 if ((Dmeson_present && (light_meson_present || nucleon_or_Delta_present)) ||
1494 (Dstar_present && light_meson_present)) {
1495 return resonance_process_list;
1503 ParticleTypePtrList possible_resonances =
1508 double resonance_xsection =
formation(*type_resonance, p_cm_sqr);
1512 resonance_process_list.push_back(std::make_unique<CollisionBranch>(
1516 "->", type_resonance->name(),
1517 " at sqrt(s)[GeV] = ",
sqrt_s_,
1518 " with xs[mb] = ", resonance_xsection);
1521 return resonance_process_list;
1525 double cm_momentum_sqr)
const {
1532 if (partial_width <= 0.) {
1536 assert(type_resonance.
charge() ==
1541 const double spinfactor =
1542 static_cast<double>(type_resonance.
spin() + 1) /
1543 ((type_particle_a.
spin() + 1) * (type_particle_b.
spin() + 1));
1544 const int sym_factor =
1545 (type_particle_a.
pdgcode() == type_particle_b.
pdgcode()) ? 2 : 1;
1546 return spinfactor * sym_factor * 2. * M_PI * M_PI / cm_momentum_sqr *
1554 CollisionBranchList process_list;
1559 const auto& pdg_a = data_a.
pdgcode();
1560 const auto& pdg_b = data_b.
pdgcode();
1563 if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
1564 pdg_a.antiparticle_sign() == pdg_b.antiparticle_sign()) {
1566 process_list =
nn_xx(included_2to2);
1574 if ((pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
1575 (pdg_b.is_nucleon() && pdg_a.is_kaon())) {
1577 process_list =
nk_xx(included_2to2, KN_offset);
1578 }
else if ((pdg_a.is_hyperon() && pdg_b.is_pion()) ||
1579 (pdg_b.is_hyperon() && pdg_a.is_pion())) {
1581 process_list =
ypi_xx(included_2to2);
1582 }
else if ((pdg_a.is_Delta() && pdg_b.is_kaon()) ||
1583 (pdg_b.is_Delta() && pdg_a.is_kaon())) {
1585 process_list =
deltak_xx(included_2to2);
1586 }
else if ((pdg_a.is_nucleon() && pdg_b.is_Dmeson()) ||
1587 (pdg_b.is_nucleon() && pdg_a.is_Dmeson())) {
1589 process_list =
DN_xx(included_2to2, charm_rescattering);
1590 }
else if ((pdg_a.is_Delta() && pdg_b.is_Dmeson()) ||
1591 (pdg_b.is_Delta() && pdg_a.is_Dmeson())) {
1593 process_list =
DDelta_xx(included_2to2, charm_rescattering);
1596 if ((pdg_a.is_Dmeson() || pdg_b.is_Dmeson()) ||
1597 (pdg_a.is_Dstar2007() || pdg_b.is_Dstar2007())) {
1598 if (pdg_a.is_pion() || pdg_b.is_pion()) {
1601 }
else if (pdg_a.is_eta() || pdg_b.is_eta()) {
1603 return process_list;
1604 }
else if (pdg_a.is_kaon() || pdg_b.is_kaon()) {
1613 process_list =
dn_xx(included_2to2);
1619 process_list =
dpi_xx(included_2to2);
1622 return process_list;
1626 CollisionBranchList process_list;
1640 process_list.push_back(std::make_unique<CollisionBranch>(
1648 process_list.push_back(std::make_unique<CollisionBranch>(
1649 type_pi, type_anti_p, type_anti_n,
1664 process_list.push_back(std::make_unique<CollisionBranch>(
1672 process_list.push_back(std::make_unique<CollisionBranch>(
1673 type_N, type_anti_p, type_anti_n,
1677 return process_list;
1681 CollisionBranchList process_list;
1700 ParticleTypePtrList components;
1701 components.reserve(3);
1703 for (
int i = 0; i < nucleus_pdg.
nucleus_p(); i++) {
1704 components.push_back(type_p);
1706 for (
int i = 0; i < nucleus_pdg.
nucleus_n(); i++) {
1707 components.push_back(type_n);
1709 for (
int i = 0; i < nucleus_pdg.
nucleus_ap(); i++) {
1710 components.push_back(type_anti_p);
1712 for (
int i = 0; i < nucleus_pdg.
nucleus_an(); i++) {
1713 components.push_back(type_anti_n);
1715 for (
int i = 0; i < nucleus_pdg.
nucleus_La(); i++) {
1716 components.push_back(type_la);
1718 for (
int i = 0; i < nucleus_pdg.
nucleus_aLa(); i++) {
1719 components.push_back(type_anti_la);
1721 if (
sqrt_s_ > type_catalyzer->
mass() + components[0]->mass() +
1722 components[1]->mass() + components[2]->mass()) {
1723 process_list.push_back(std::make_unique<CollisionBranch>(
1724 *type_catalyzer, *(components[0]), *(components[1]), *(components[2]),
1729 return process_list;
1738 type_nucleus = &type_b;
1739 type_catalyzer = &type_a;
1742 bool nonzero_xs = type_nucleus->
is_nucleus() &&
1743 (type_catalyzer->is_pion() || type_catalyzer->is_nucleon());
1748 const double md = type_nucleus->
mass(), mcat = type_catalyzer->mass();
1749 const double Tkin = (sqrts * sqrts - (md + mcat) * (md + mcat)) / (2.0 * md);
1756 if (type_catalyzer->is_pion()) {
1758 }
else if (type_catalyzer->is_nucleon()) {
1760 type_catalyzer->pdgcode().antiparticle_sign()) {
1776 type_nucleus = &type_b;
1777 type_catalyzer = &type_a;
1779 bool nonzero_xs = type_nucleus->
is_nucleus() &&
1780 (type_catalyzer->is_pion() || type_catalyzer->is_nucleon());
1785 const double mA = type_nucleus->
mass(), mcat = type_catalyzer->mass();
1786 const double Tkin = (sqrts * sqrts - (mA + mcat) * (mA + mcat)) / (2.0 * mA);
1789 if (A != 3 || Tkin <= 0.0) {
1793 if (type_catalyzer->is_pion()) {
1795 }
else if (type_catalyzer->is_nucleon()) {
1797 type_catalyzer->pdgcode().antiparticle_sign()) {
1810 CollisionBranchList process_list;
1816 if (!same_sign && !any_nucleus) {
1817 return process_list;
1832 return process_list;
1837 CollisionBranchList process_list, channel_list;
1843 bool both_antinucleons =
1846 const ParticleTypePtrList& nuc_or_anti_nuc =
1849 const ParticleTypePtrList& delta_or_anti_delta =
1859 process_list.reserve(process_list.size() + channel_list.size());
1860 std::move(channel_list.begin(), channel_list.end(),
1861 std::inserter(process_list, process_list.end()));
1862 channel_list.clear();
1874 process_list.reserve(process_list.size() + channel_list.size());
1875 std::move(channel_list.begin(), channel_list.end(),
1876 std::inserter(process_list, process_list.end()));
1877 channel_list.clear();
1887 if (
deuteron && antideutron && pim && pi0 && pip &&
1889 const ParticleTypePtrList deutron_list = {
deuteron};
1890 const ParticleTypePtrList antideutron_list = {antideutron};
1891 const ParticleTypePtrList pion_list = {pim, pi0, pip};
1893 (both_antinucleons ? antideutron_list : deutron_list), pion_list,
1896 return pCM(sqrts, type_res_1.
mass(), type_res_2.
mass());
1898 process_list.reserve(process_list.size() + channel_list.size());
1899 std::move(channel_list.begin(), channel_list.end(),
1900 std::inserter(process_list, process_list.end()));
1901 channel_list.clear();
1904 return process_list;
1908 const double KN_offset)
const {
1914 const auto pdg_nucleon = type_nucleon.
pdgcode().
code();
1927 const double KN_to_KDelta_cutoff = KN_offset +
1932 bool incl_KN_to_KDelta =
1934 sqrt_s_ < KN_to_KDelta_cutoff;
1935 bool incl_Strangeness_exchange =
1938 CollisionBranchList process_list;
1943 switch (pdg_nucleon) {
1945 if (incl_Strangeness_exchange) {
1955 sqrt_s_, type_pi_m, type_Sigma_p);
1958 sqrt_s_, type_pi_p, type_Sigma_m);
1961 sqrt_s_, type_pi_z, type_Sigma_z);
1964 sqrt_s_, type_pi_z, type_Lambda);
1966 if (incl_KN_to_KN) {
1971 type_Kbar_z, type_n);
1976 if (incl_Strangeness_exchange) {
1984 sqrt_s_, type_pi_m, type_Sigma_z);
1987 sqrt_s_, type_pi_z, type_Sigma_m);
1990 sqrt_s_, type_pi_m, type_Lambda);
1995 if (incl_KN_to_KDelta) {
2004 type_nucleon, type_kaon,
2005 type_Kbar_z, type_Delta_pp_bar);
2007 sqrt_s_, type_Kbar_z, type_Delta_pp_bar);
2012 type_nucleon, type_kaon, type_K_m,
2015 sqrt_s_, type_K_m, type_Delta_p_bar);
2020 if (incl_KN_to_KDelta) {
2029 type_nucleon, type_kaon,
2030 type_Kbar_z, type_Delta_p_bar);
2032 sqrt_s_, type_Kbar_z, type_Delta_p_bar);
2037 type_nucleon, type_kaon, type_K_m,
2040 sqrt_s_, type_K_m, type_Delta_z_bar);
2042 if (incl_KN_to_KN) {
2047 type_Kbar_z, type_p_bar);
2057 switch (pdg_nucleon) {
2059 if (incl_KN_to_KDelta) {
2067 return sigma_kplusp *
2069 type_K_z, type_Delta_pp);
2071 sqrt_s_, type_K_z, type_Delta_pp);
2075 return sigma_kplusp *
2077 type_K_p, type_Delta_p);
2079 sqrt_s_, type_K_p, type_Delta_p);
2084 if (incl_KN_to_KDelta) {
2092 return sigma_kplusn *
2094 type_K_z, type_Delta_p);
2096 sqrt_s_, type_K_z, type_Delta_p);
2100 return sigma_kplusn *
2102 type_K_p, type_Delta_z);
2104 sqrt_s_, type_K_p, type_Delta_z);
2106 if (incl_KN_to_KN) {
2116 if (incl_Strangeness_exchange) {
2126 sqrt_s_, type_pi_p, type_Sigma_p_bar);
2129 sqrt_s_, type_pi_m, type_Sigma_m_bar);
2132 sqrt_s_, type_pi_z, type_Sigma_z_bar);
2135 sqrt_s_, type_pi_z, type_Lambda_bar);
2137 if (incl_KN_to_KN) {
2142 type_K_z, type_n_bar);
2147 if (incl_Strangeness_exchange) {
2155 sqrt_s_, type_pi_p, type_Sigma_z_bar);
2158 sqrt_s_, type_pi_z, type_Sigma_m_bar);
2161 sqrt_s_, type_pi_p, type_Lambda_bar);
2173 switch (pdg_nucleon) {
2175 if (incl_KN_to_KDelta) {
2183 return sigma_kplusn *
2185 type_K_z, type_Delta_p);
2187 sqrt_s_, type_K_z, type_Delta_p);
2191 return sigma_kplusn *
2193 type_K_p, type_Delta_z);
2195 sqrt_s_, type_K_p, type_Delta_z);
2197 if (incl_KN_to_KN) {
2211 if (incl_KN_to_KDelta) {
2219 return sigma_kplusp *
2221 type_K_z, type_Delta_z);
2223 sqrt_s_, type_K_z, type_Delta_z);
2227 return sigma_kplusp *
2229 type_K_p, type_Delta_m);
2231 sqrt_s_, type_K_p, type_Delta_m);
2236 if (incl_Strangeness_exchange) {
2244 sqrt_s_, type_pi_m, type_Sigma_z_bar);
2247 sqrt_s_, type_pi_z, type_Sigma_p_bar);
2250 sqrt_s_, type_pi_m, type_Lambda_bar);
2255 if (incl_Strangeness_exchange) {
2265 sqrt_s_, type_pi_m, type_Sigma_m_bar);
2268 sqrt_s_, type_pi_p, type_Sigma_p_bar);
2271 sqrt_s_, type_pi_z, type_Sigma_z_bar);
2274 sqrt_s_, type_pi_z, type_Lambda_bar);
2276 if (incl_KN_to_KN) {
2281 type_K_p, type_p_bar);
2289 switch (pdg_nucleon) {
2291 if (incl_Strangeness_exchange) {
2299 sqrt_s_, type_pi_z, type_Sigma_p);
2302 sqrt_s_, type_pi_p, type_Sigma_z);
2305 sqrt_s_, type_pi_p, type_Lambda);
2310 if (incl_Strangeness_exchange) {
2320 sqrt_s_, type_pi_p, type_Sigma_m);
2323 sqrt_s_, type_pi_m, type_Sigma_p);
2326 sqrt_s_, type_pi_z, type_Sigma_z);
2329 sqrt_s_, type_pi_z, type_Lambda);
2331 if (incl_KN_to_KN) {
2341 if (incl_KN_to_KDelta) {
2343 const auto& type_Kbar_z = type_kaon;
2350 type_nucleon, type_kaon,
2351 type_Kbar_z, type_Delta_bar_m);
2353 sqrt_s_, type_Kbar_z, type_Delta_bar_m);
2358 type_nucleon, type_kaon, type_K_m,
2361 sqrt_s_, type_K_m, type_Delta_bar_z);
2363 if (incl_KN_to_KN) {
2372 sqrt_s_, type_K_m, type_n_bar);
2377 if (incl_KN_to_KDelta) {
2386 type_nucleon, type_kaon,
2387 type_Kbar_z, type_Delta_z_bar);
2389 sqrt_s_, type_Kbar_z, type_Delta_z_bar);
2394 type_nucleon, type_kaon, type_K_m,
2397 sqrt_s_, type_K_m, type_Delta_m_bar);
2405 return process_list;
2410 CollisionBranchList process_list;
2412 return process_list;
2419 const auto pdg_delta = type_delta.
pdgcode().
code();
2426 switch (
pack(pdg_delta, pdg_kaon)) {
2435 type_kaon, type_p, type_K_p) *
2451 type_kaon, type_p_bar, type_K_m) *
2453 type_kaon, type_delta) *
2456 sqrt_s_, type_p_bar, type_K_m);
2469 type_kaon, type_n, type_K_p) *
2480 type_kaon, type_p, type_K_z) *
2498 type_kaon, type_n_bar, type_K_m) *
2500 type_kaon, type_delta) *
2503 sqrt_s_, type_n_bar, type_K_m);
2509 type_kaon, type_p_bar,
2512 type_kaon, type_delta) *
2515 sqrt_s_, type_p_bar, type_Kbar_z);
2526 type_kaon, type_n, type_K_z) *
2542 type_kaon, type_n_bar,
2545 type_kaon, type_delta) *
2548 sqrt_s_, type_n_bar, type_Kbar_z);
2555 return process_list;
2560 CollisionBranchList process_list;
2562 return process_list;
2569 const auto pdg_hyperon = type_hyperon.
pdgcode().
code();
2574 switch (
pack(pdg_hyperon, pdg_pion)) {
2595 type_p, type_Kbar_z) *
2598 sqrt_s_, type_p, type_Kbar_z);
2608 type_n_bar, type_K_p) *
2611 sqrt_s_, type_n_bar, type_K_p);
2621 type_p_bar, type_K_z) *
2624 sqrt_s_, type_p_bar, type_K_z);
2647 type_p, type_Kbar_z) *
2650 sqrt_s_, type_p, type_Kbar_z);
2660 type_n_bar, type_K_p) *
2663 sqrt_s_, type_n_bar, type_K_p);
2673 type_p_bar, type_K_z) *
2676 sqrt_s_, type_p_bar, type_K_z);
2699 type_p, type_Kbar_z) *
2702 sqrt_s_, type_p, type_Kbar_z);
2712 type_n_bar, type_K_p) *
2715 sqrt_s_, type_n_bar, type_K_p);
2725 type_p_bar, type_K_z) *
2728 sqrt_s_, type_p_bar, type_K_z);
2748 type_n, type_Kbar_z) *
2751 sqrt_s_, type_n, type_Kbar_z);
2763 type_p_bar, type_K_p) *
2766 sqrt_s_, type_p_bar, type_K_p);
2771 type_n_bar, type_K_z) *
2774 sqrt_s_, type_n_bar, type_K_z);
2794 type_n, type_Kbar_z) *
2797 sqrt_s_, type_n, type_Kbar_z);
2809 type_p_bar, type_K_p) *
2812 sqrt_s_, type_p_bar, type_K_p);
2817 type_n_bar, type_K_z) *
2820 sqrt_s_, type_n_bar, type_K_z);
2840 type_n, type_Kbar_z) *
2843 sqrt_s_, type_n, type_Kbar_z);
2855 type_p_bar, type_K_p) *
2858 sqrt_s_, type_p_bar, type_K_p);
2863 type_n_bar, type_K_z) *
2866 sqrt_s_, type_n_bar, type_K_z);
2886 type_n, type_Kbar_z) *
2889 sqrt_s_, type_n, type_Kbar_z);
2901 type_p_bar, type_K_p) *
2904 sqrt_s_, type_p_bar, type_K_p);
2909 type_n_bar, type_K_z) *
2912 sqrt_s_, type_n_bar, type_K_z);
2919 return process_list;
2925 const double s = sqrts * sqrts;
2932 const double matrix_element =
2933 295.5 + 2.862 / (0.00283735 +
pow_int(sqrts - 2.181, 2)) +
2934 0.0672 /
pow_int(tmp, 2) - 6.61753 / tmp;
2936 const double spin_factor =
2937 (produced_nucleus->
spin() + 1) * (type_pi.
spin() + 1);
2941 double xsection = matrix_element * spin_factor / (s * cm_mom);
2945 const double resonance_integral =
2947 xsection *= resonance_integral;
2949 ", matrix element: ", matrix_element,
2950 ", cm_momentum: ", cm_mom);
2957 CollisionBranchList process_list;
2967 ParticleTypePtrList nuc = (baryon_number > 0)
2974 nuc_a->charge() + nuc_b->charge()) {
2978 for (
const int twoI :
I_tot_range(*nuc_a, *nuc_b)) {
2980 type_a, type_b, *nuc_a, *nuc_b, twoI);
2987 const double matrix_element =
2989 if (matrix_element <= 0.) {
2993 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
2994 const int sym_fac_in =
2996 const int sym_fac_out =
2997 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
2998 double p_cm_final =
pCM_from_s(s, nuc_a->mass(), nuc_b->mass());
2999 const double xsection = isospin_factor * spin_factor * sym_fac_in /
3000 sym_fac_out * p_cm_final * matrix_element /
3004 process_list.push_back(std::make_unique<CollisionBranch>(
3007 nuc_a->name(), nuc_b->name(),
3008 " at sqrts [GeV] = ", sqrts,
3009 " with cs[mb] = ", xsection);
3021 if (is_pid_or_pidprime &&
3028 if (produced_nucleus == &type_nucleus ||
3030 produced_nucleus->baryon_number() != type_nucleus.
baryon_number()) {
3033 const double xsection =
3035 process_list.push_back(std::make_unique<CollisionBranch>(
3038 type_pi.
name(), produced_nucleus->name(),
3039 " at ", sqrts,
" GeV, xs[mb] = ", xsection);
3042 return process_list;
3049 const double s = sqrts * sqrts;
3050 double matrix_element = 0.0;
3059 matrix_element = 79.0474 / std::pow(tmp, 0.7897) + 654.596 * tmp;
3066 matrix_element = 342.572 / std::pow(tmp, 0.6);
3068 const double spin_factor =
3069 (produced_nucleus->
spin() + 1) * (type_N.
spin() + 1);
3073 double xsection = matrix_element * spin_factor / (s * cm_mom);
3079 const double resonance_integral =
3081 xsection *= resonance_integral;
3092 CollisionBranchList process_list;
3094 return process_list;
3100 if (produced_nucleus == &type_nucleus ||
3102 produced_nucleus->baryon_number() != type_nucleus.
baryon_number()) {
3107 process_list.push_back(std::make_unique<CollisionBranch>(
3110 type_N.
name(), produced_nucleus->name(),
" at ",
3111 sqrt_s_,
" GeV, xs[mb] = ", xsection);
3113 return process_list;
3121 const auto pdg_pion =
3124 double sig_inel = -1.;
3125 switch (
pack(pdg_D, pdg_pion)) {
3184 if (sig_inel < 0.) {
3197 const auto pdg_kaon =
3200 double sig_inel = -1.;
3201 switch (
pack(pdg_D, pdg_kaon)) {
3269 if (sig_inel < 0.) {
3283 double sig_inel = -1.;
3284 switch (
pack(pdg_D, pdg_nucleon)) {
3322 if (sig_inel < 0.) {
3336 double sig_inel = -1.;
3337 switch (
pack(pdg_D, pdg_Delta)) {
3415 if (sig_inel < 0.) {
3426 CollisionBranchList process_list;
3429 return process_list;
3435 const auto pdg_pion =
3440 switch (
pack(pdg_D, pdg_pion)) {
3448 sqrt_s_, type_D_p, type_pi_z);
3457 sqrt_s_, type_D_m, type_pi_z);
3466 sqrt_s_, type_D_p, type_pi_m);
3475 sqrt_s_, type_D_m, type_pi_p);
3484 sqrt_s_, type_D_z, type_pi_z);
3493 sqrt_s_, type_Dbar_z, type_pi_z);
3502 sqrt_s_, type_D_z, type_pi_p);
3511 sqrt_s_, type_Dbar_z, type_pi_m);
3522 type_Dstar_p, type_pi_z);
3533 type_Dstar_m, type_pi_z);
3543 type_Dstar_p, type_pi_m);
3554 type_Dstar_m, type_pi_p);
3564 type_Dstar_z, type_pi_z);
3575 type_Dstarbar_z, type_pi_z);
3585 type_Dstar_z, type_pi_p);
3596 type_Dstarbar_z, type_pi_m);
3603 return process_list;
3609 CollisionBranchList process_list;
3612 return process_list;
3618 const auto pdg_kaon =
3623 switch (
pack(pdg_D, pdg_kaon)) {
3631 type_D_z, type_K_p);
3640 type_Dbar_z, type_K_m);
3649 type_D_p, type_K_z);
3658 type_D_m, type_Kbar_z);
3667 sqrt_s_, type_D_z, type_Kbar_z);
3676 sqrt_s_, type_Dbar_z, type_K_z);
3704 sqrt_s_, type_Dstar_z, type_K_p);
3714 sqrt_s_, type_Dstarbar_z, type_K_m);
3723 sqrt_s_, type_Dstar_p, type_K_z);
3733 sqrt_s_, type_Dstar_m, type_Kbar_z);
3743 type_Dstar_z, type_Kbar_z);
3754 type_Dstarbar_z, type_K_z);
3764 type_Dstar_p, type_K_m);
3775 type_Dstar_m, type_K_p);
3782 return process_list;
3788 CollisionBranchList process_list;
3791 return process_list;
3800 switch (
pack(pdg_D, pdg_nucleon)) {
3816 type_Dbar_z, type_pbar);
3834 type_D_m, type_nbar);
3843 type_Dbar_z, type_n);
3852 type_D_z, type_nbar);
3870 type_D_p, type_pbar);
3877 return process_list;
3883 CollisionBranchList process_list;
3886 return process_list;
3895 switch (
pack(pdg_D, pdg_Delta)) {
3903 type_D_z, type_Delta_pp);
3913 type_Dbar_z, type_Deltabar_mm);
3922 sqrt_s_, type_D_z, type_Delta_z);
3931 sqrt_s_, type_Dbar_z, type_Deltabar_z);
3940 sqrt_s_, type_D_z, type_Delta_p);
3949 sqrt_s_, type_Dbar_z, type_Deltabar_m);
3958 sqrt_s_, type_D_p, type_Delta_z);
3967 sqrt_s_, type_D_m, type_Deltabar_z);
3977 type_D_p, type_Delta_p);
3987 type_D_m, type_Deltabar_m);
3996 sqrt_s_, type_D_p, type_Delta_m);
4005 sqrt_s_, type_D_m, type_Deltabar_p);
4015 type_Dbar_z, type_Delta_z);
4025 type_D_z, type_Deltabar_z);
4035 sqrt_s_, type_Dbar_z, type_Delta_p);
4045 sqrt_s_, type_D_z, type_Deltabar_m);
4055 type_Dbar_z, type_Delta_m);
4065 type_D_z, type_Deltabar_p);
4075 sqrt_s_, type_D_m, type_Delta_pp);
4085 sqrt_s_, type_D_p, type_Deltabar_mm);
4095 type_D_m, type_Delta_z);
4105 type_D_p, type_Deltabar_z);
4115 type_D_m, type_Delta_p);
4125 type_D_p, type_Deltabar_m);
4132 return process_list;
4138 if (!string_process) {
4139 throw std::runtime_error(
"string_process should be initialized.");
4142 CollisionBranchList channel_list;
4143 if (total_string_xs <= 0.) {
4144 return channel_list;
4152 std::array<int, 2> pdgid;
4153 double AQM_scaling = 1.;
4154 for (
int i = 0; i < 2; i++) {
4162 bool can_annihilate =
false;
4165 for (
int iq = 1; iq <= n_q_types; iq++) {
4166 std::array<int, 2> nquark;
4167 for (
int i = 0; i < 2; i++) {
4171 if (nquark[0] != 0 && nquark[1] != 0) {
4172 can_annihilate =
true;
4182 double sig_annihilation = 0.0;
4183 if (can_annihilate) {
4190 if (finder_parameters.
use_AQM) {
4191 xs_param *= AQM_scaling;
4193 sig_annihilation = std::min(total_string_xs, xs_param);
4205 std::array<double, 3> xs_diffractive =
4207 std::sqrt(mandelstam_s));
4209 if (finder_parameters.
use_AQM) {
4210 for (
double& x : xs_diffractive) {
4215 double single_diffr_AX = xs_diffractive[0];
4216 double single_diffr_XB = xs_diffractive[1];
4217 double double_diffr = xs_diffractive[2];
4219 double single_diffr = single_diffr_AX + single_diffr_XB;
4220 double diffractive = single_diffr + double_diffr;
4222 const double nondiffractive =
4223 std::max(0., total_string_xs - sig_annihilation - diffractive);
4225 diffractive = total_string_xs - sig_annihilation - nondiffractive;
4226 double_diffr = std::max(0., diffractive - single_diffr);
4229 single_diffr > 0.0 ? (diffractive - double_diffr) / single_diffr : 0.0;
4231 single_diffr_AX *= a;
4232 single_diffr_XB *= a;
4234 assert(std::abs(single_diffr_AX + single_diffr_XB + double_diffr +
4235 sig_annihilation + nondiffractive - total_string_xs) < 1.e-6);
4236 enum class Proc { ND, SD_AX, SD_XB, DD, N };
4237 enum class Comp { Soft, Hard, N };
4239 constexpr std::size_t n_proc =
static_cast<std::size_t
>(Proc::N);
4240 constexpr std::size_t n_comp =
static_cast<std::size_t
>(Comp::N);
4242 std::array<std::array<double, n_comp>, n_proc> split_xs{};
4244 auto proc_idx = [](Proc
p) {
return static_cast<std::size_t
>(
p); };
4246 auto comp_idx = [](Comp c) {
return static_cast<std::size_t
>(c); };
4248 auto soft = [&](Proc
p) ->
double& {
4249 return split_xs[proc_idx(
p)][comp_idx(Comp::Soft)];
4252 auto hard = [&](Proc
p) ->
double& {
4253 return split_xs[proc_idx(
p)][comp_idx(Comp::Hard)];
4256 auto set_all_soft = [&](Proc
p,
double total) {
4261 auto split = [&](Proc
p,
double total,
double weight_hard) {
4262 hard(
p) = total * weight_hard;
4263 soft(
p) = total - hard(
p);
4265 auto split_all_string_processes = [&](
double weight_hard) {
4266 split(Proc::ND, nondiffractive, weight_hard);
4267 split(Proc::SD_AX, single_diffr_AX, weight_hard);
4268 split(Proc::SD_XB, single_diffr_XB, weight_hard);
4269 split(Proc::DD, double_diffr, weight_hard);
4274 const auto& [hard_transition_start, hard_transition_end] =
4278 hard_transition_start, hard_transition_end);
4279 split_all_string_processes(weight_hard);
4280 }
else if (nondiffractive > 0.0) {
4287 const double weight_soft = std::exp(-hard_xsec / nondiffractive);
4288 const double weight_hard = std::clamp(1.0 - weight_soft, 0.0, 1.0);
4289 split_all_string_processes(weight_hard);
4291 set_all_soft(Proc::ND, nondiffractive);
4292 set_all_soft(Proc::SD_AX, single_diffr_AX);
4293 set_all_soft(Proc::SD_XB, single_diffr_XB);
4294 set_all_soft(Proc::DD, double_diffr);
4316 const double sig_string_soft = soft(Proc::SD_AX) + soft(Proc::SD_XB) +
4317 soft(Proc::DD) + soft(Proc::ND) +
4321 if (sig_string_soft > 0.) {
4322 channel_list.push_back(std::make_unique<CollisionBranch>(
4324 channel_list.push_back(std::make_unique<CollisionBranch>(
4326 channel_list.push_back(std::make_unique<CollisionBranch>(
4328 channel_list.push_back(std::make_unique<CollisionBranch>(
4331 if (can_annihilate) {
4332 channel_list.push_back(std::make_unique<CollisionBranch>(
4337 if (hard(Proc::SD_AX) > 0.) {
4338 channel_list.push_back(std::make_unique<CollisionBranch>(
4341 if (hard(Proc::SD_XB) > 0.) {
4342 channel_list.push_back(std::make_unique<CollisionBranch>(
4345 if (hard(Proc::DD) > 0.) {
4346 channel_list.push_back(std::make_unique<CollisionBranch>(
4349 if (hard(Proc::ND) > 0.) {
4350 channel_list.push_back(std::make_unique<CollisionBranch>(
4354 return channel_list;
4369 if (pdg_a == pdg_b) {
4386 auto [region_lower, region_upper] =
4390 xs = xs_l * (1. - prob_high) + xs_h * prob_high;
4426 double cross_sec = 0.;
4436 const double eff_s =
4463 return std::make_unique<CollisionBranch>(
4464 type_pip, type_pim, type_pip, type_pim, type_piz, nnbar_xsec * scale_xs,
4469 const double current_xs,
const double scale_xs)
const {
4473 double nnbar_xsec = std::max(0.,
ppbar_total(s) * scale_xs - current_xs);
4482 CollisionBranchList channel_list;
4496 if (
sqrt_s_ - 2 * type_N.mass() < 0) {
4497 return channel_list;
4501 type_N, type_Nbar) *
4504 channel_list.push_back(std::make_unique<CollisionBranch>(
4506 channel_list.push_back(std::make_unique<CollisionBranch>(
4510 return channel_list;
4514 const bool is_anti_particles)
const {
4517 CollisionBranchList process_list;
4523 ParticleTypePtrList nuc_or_anti_nuc;
4524 if (is_anti_particles) {
4535 nuc_a->charge() + nuc_b->charge()) {
4539 for (
const int twoI :
I_tot_range(*nuc_a, *nuc_b)) {
4541 type_a, type_b, *nuc_a, *nuc_b, twoI);
4548 const double matrix_element =
4550 if (matrix_element <= 0.) {
4556 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
4557 const int sym_fac_in =
4559 const int sym_fac_out =
4560 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
4561 const double xsection = isospin_factor * spin_factor * sym_fac_in /
4562 sym_fac_out * p_cm_final * matrix_element /
4566 process_list.push_back(std::make_unique<CollisionBranch>(
4569 "2->2 absorption with original particles: ", type_a, type_b);
4574 return process_list;
4581 const double m_a = type_a.
mass();
4582 const double m_b = type_b.
mass();
4583 const double msqr = 2. * (m_a * m_a + m_b * m_b);
4590 const double uplmt = m_a + m_b + 3.0 * (w_a + w_b) + 3.0;
4591 if (sqrts > uplmt) {
4598 return 68. / std::pow(sqrts - 1.104, 1.951);
4609 }
else if (twoI == 0) {
4610 const double parametrization = 14. / msqr;
4619 return 6.5 * parametrization;
4621 return parametrization;
4634 }
else if (twoI == 0) {
4648 }
else if (twoI == 0) {
4658 (1.0 - std::exp(-(sqrts - 2.0) * 20.0));
4665 template <
class IntegrationMethod>
4667 const ParticleTypePtrList& list_res_1,
4668 const ParticleTypePtrList& list_res_2,
4669 const IntegrationMethod integrator)
const {
4673 CollisionBranchList channel_list;
4681 if (type_res_1->charge() + type_res_2->charge() !=
4687 for (
const int twoI :
I_tot_range(type_particle_a, type_particle_b)) {
4689 type_particle_a, type_particle_b, *type_res_1, *type_res_2, twoI);
4696 const double lower_limit = type_res_1->min_mass_kinematic();
4697 const double upper_limit =
sqrt_s_ - type_res_2->mass();
4701 if (upper_limit - lower_limit < 1E-3) {
4707 sqrt_s_, *type_res_1, *type_res_2, twoI);
4708 if (matrix_element <= 0.) {
4715 const double resonance_integral = integrator(*type_res_1, *type_res_2);
4722 const double spin_factor =
4723 (type_res_1->spin() + 1) * (type_res_2->spin() + 1);
4724 const double xsection = isospin_factor * spin_factor * matrix_element *
4728 channel_list.push_back(std::make_unique<CollisionBranch>(
4731 "Found 2->2 creation process for resonance ", type_res_1,
", ",
4734 type_particle_a, type_particle_b);
4739 return channel_list;
4752 const bool treat_BBbar_with_strings =
4754 const bool is_NN_scattering =
4757 const bool is_BBbar_scattering =
4766 const bool is_AQM_scattering =
4773 const double mass_sum =
4776 if (!is_NN_scattering && !is_BBbar_scattering && !is_Npi_scattering &&
4777 !is_AQM_scattering) {
4781 }
else if (is_BBbar_scattering) {
4788 const bool is_KplusP =
4801 }
else if (pdg1.
is_pion() && pdg2.is_pion()) {
4807 return static_cast<double>(
sqrt_s_ > mass_sum + aqm_offset);
4811 double region_lower, region_upper;
4812 if (is_Npi_scattering) {
4813 std::tie(region_lower, region_upper) =
4815 }
else if (is_NN_scattering) {
4816 std::tie(region_lower, region_upper) =
4821 region_lower = mass_sum + aqm_offset;
4822 region_upper = mass_sum + aqm_offset +
4831 double region_lower,
double region_upper)
const {
4834 }
else if (
sqrt_s_ > region_upper) {
4840 const double x = (
sqrt_s_ - 0.5 * (region_lower + region_upper)) /
4841 (region_upper - region_lower);
4842 assert(x >= -0.5 && x <= 0.5);
4843 double prob = 0.5 * (std::sin(M_PI * x) + 1.0);
4844 assert(prob >= 0. && prob <= 1.);
const double sqrt_s_
Total energy in the center-of-mass frame.
CollisionBranchList two_to_two(const ReactionsBitSet &included_2to2, double KN_offset, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for the given scattering.
double transition_probability_at_sqrts(double region_lower, double region_upper) const
Computes a smooth transition probability as a function of sqrt(s).
CollisionBranchList DK_and_DstarK_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-kaon (DK) and D*-kaon (D*K) scattering.
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,...
double DK_and_DstarK_inelastic() const
Determine the inelastic cross section for a D meson-kaon (DK) or a D*-kaon (D*K) collision.
CollisionBranchPtr NNbar_to_5pi(double scale_xs) const
Create collision branch for NNbar annihilation going directly into 5 pions.
std::optional< double > DDelta_elastic() const
Determine the elastic cross section for a D meson-Delta (DΔ) collision, If the center-of-mass energy ...
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,...
std::optional< double > Dpi_and_Dstarpi_elastic() const
Determine the elastic cross section for a D meson-pion (Dpi) or a D*-pion (D*pi) collision.
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 DDelta_inelastic() const
Determine the inelastic cross section for a D meson-Delta (DΔ) collision.
double cm_momentum() const
Determine the momenta of the incoming particles in the center-of-mass system.
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.
static double nn_to_resonance_matrix_element(double sqrts, const ParticleType &type_a, const ParticleType &type_b, int twoI)
Scattering matrix amplitude squared (divided by 16π) for resonance production processes like NN → NR ...
double DN_inelastic() const
Determine the inelastic cross section for a D meson-nucleon (DN) collision.
std::optional< double > DK_and_DstarK_elastic() const
Determine the elastic cross section for a D meson-kaon (DK) or a D*-kaon (D*K) collision.
double Dpi_and_Dstarpi_inelastic() const
Determine the inelastic cross section for a D meson-pion (Dpi) or a D*-pion (D*pi) collision.
CrossSections(const ParticleList &incoming_particles, double sqrt_s, const std::pair< FourVector, FourVector > potentials)
Construct CrossSections instance.
CollisionBranchList Dpi_and_Dstarpi_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-pion (Dpi) and D*-pion (D*pi) scattering.
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 DN_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-nucleon (DN) scatterings.
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
Calculates the 2-to-1 resonance production cross section for a given resonance using the Breit-Wigner...
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.
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 DDelta_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-Delta (DΔ) scatterings.
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...
CollisionBranchList two_to_one(CharmRescattering charm_rescattering) const
Find all resonances that can be produced in a 2->1 collision of the two input particles and the produ...
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)
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.
CollisionBranchList bar_bar_to_nuc_nuc(bool is_anti_particles) const
Calculate cross sections for 2 → 2 resonance absorption (i.e.
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....
std::optional< double > DN_elastic() const
Determine the elastic cross section for a D meson-nucleon (DN) collision, If the center-of-mass energ...
std::optional< double > Deta_and_Dstareta_elastic() const
Determine the elastic cross section for a D meson-eta (Deta) or a D*-eta (D*eta) collision.
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.
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.
double full_spectral_function(double m) const
Full spectral function of the resonance (relativistic Breit-Wigner distribution with mass-dependent ...
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.
bool is_Dstar2007() const
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 std::pair< double, double > hard_string_transition_energy_range
Invariant energy range for the soft-to-hard string transition (in measured in GeV).
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.
const HardStringTransitionMode hard_string_transition_mode
Mode used to control the transition from soft to hard string excitation.
const CharmRescattering charm_rescattering
Specifies kind of charm rescattering.
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.
@ TwoToFive
Directly create 5 pions, use with multi-particle reactions.
@ Resonances
Use intermediate Resonances.
@ Strings
Use string fragmentation.
CharmRescattering
Possible charm scattering options.
@ T_Matrix
Charm interactions via T-matrix approach.
@ Resonances
Charm interactions via resonances.
@ Custom_Range
Smooth transition within a user-defined invariant energy range.
std::bitset< 11 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
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 Dstar_p
D*(2010)⁺.
constexpr int h1
h₁(1170).
constexpr int Dstarbar_z
D̄*(2007)⁰.
constexpr int64_t deuteron
Deuteron.
constexpr int Dstar_m
D*(2010)⁻.
constexpr int Dstar_z
D*(2007)⁰.
double kplusn_k0p(double mandelstam_s)
K+ n charge exchange cross section parametrization.
std::optional< double > Dzeron_elastic(double sqrts)
D⁰n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > Dplusn_elastic(double sqrts)
D⁺n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double kplusp_total(double mandelstam_s)
K+ p total cross section parametrization.
std::optional< double > DplusKzero_elastic(double sqrts)
D⁺K⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double deuteron_pion_inelastic(double pion_kinetic_energy)
Parametrization of deuteron-pion inelastic cross section.
double DzeroDeltazero_DplusDeltaminus(double sqrts)
D⁰Δ⁰ -> D⁺Δ⁻ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DstarzeroKzero_elastic(double sqrts)
D*(2007)⁰K⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
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.
double Dpluspiminus_Dzeropizero(double sqrts)
D⁺π⁻ -> D⁰π⁰ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
double Dstarzeropiplus_Dstarpluspizero(double sqrts)
D*(2007)⁰π⁺ -> D*(2010)⁺π⁰ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
double DplusDeltaplus_DzeroDeltaplusplus(double sqrts)
D⁺Δ⁺ -> D⁰Δ⁺⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double Dminusp_Dbarzeron(double sqrts)
D⁻p -> D̄⁰n cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
static void throw_xsec_is_not_implemented(const ParticleData &data_a, const ParticleData &data_b, const std::string func_name)
Helper function: Throw if cross section between two particles is not implemented.
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 Dstarzeropizero_Dstarpluspiminus(double sqrts)
D*(2007)⁰π⁰ -> D*(2010)⁺π⁻ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
double DstarplusKzero_DstarzeroKplus(double sqrts)
D*(2010)⁺K⁰ -> D*(2007)⁰K⁺ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
double DstarplusKminus_DstarzeroKbarzero(double sqrts)
D*(2010)⁺K⁻ -> D*(2007)⁰K̄⁰ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double piminusp_elastic(double mandelstam_s)
pi-p elastic cross section parametrization Source: GiBUU:parametrizationBarMes_HighEnergy....
std::optional< double > Dbarzeron_elastic(double sqrts)
D̄⁰n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DzeroDeltaplus_elastic(double sqrts)
D⁰Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double Dpluspizero_Dzeropiplus(double sqrts)
D⁺π⁰ -> D⁰π⁺ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
std::vector< std::string > split(const std::string &s, char delim)
Split string by delimiter.
double npbar_high_energy(double mandelstam_s)
npbar total cross section at high energies
double Dstarpluspiminus_Dstarzeropizero(double sqrts)
D*(2010)⁺π⁻ -> D*(2007)⁰π⁰ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
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 DzeroKbarzero_DplusKminus(double sqrts)
D⁰K̄⁰ -> D⁺K⁻ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double kbar0p_elastic_background(double mandelstam_s)
Kbar0 p elastic background cross section parametrization Source: Buss:2011mx , B.3....
std::optional< double > DplusKplus_elastic(double sqrts)
D⁺K⁺ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double DstarzeroKbarzero_DstarplusKminus(double sqrts)
D*(2007)⁰K̄⁰ -> D*(2010)⁺K⁻ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
std::optional< double > DplusDeltazero_elastic(double sqrts)
D⁺Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
KaonNucleonRatios kaon_nucleon_ratios
double ppbar_elastic(double mandelstam_s)
ppbar elastic cross section parametrization Source: Bass:1998ca
std::optional< double > Dbarzerop_elastic(double sqrts)
D̄⁰p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DzeroKplus_elastic(double sqrts)
D⁰K⁺ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
std::optional< double > Dstarzeropiminus_elastic(double sqrts)
D*(2007)⁰π- elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
std::optional< double > Dstarzeroeta_elastic(double sqrts)
D*(2007)⁰η elastic cross section (data provided by Juan Torres-Rincon).
std::optional< double > Dstarpluspizero_elastic(double sqrts)
D*(2010)⁺π⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
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
std::optional< double > Dminusn_elastic(double sqrts)
D⁻n elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
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 DstarzeroKplus_DstarplusKzero(double sqrts)
D*(2007)⁰K⁺ -> D*(2010)⁺K⁰ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
double Npi_string_hard(double mandelstam_s)
nucleon-pion hard scattering cross section (with partonic scattering)
double Dstarpluspizero_Dstarzeropiplus(double sqrts)
D*(2010)⁺π⁰ -> D*(2007)⁰π⁺ cross section (closest reference Song:2015sfa , data provided by Juan Torr...
std::optional< double > DzeroDeltaminus_elastic(double sqrts)
D⁰Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double kminusn_piminuslambda(double sqrts)
K- n <-> pi- Lambda cross section parametrization Follow from the parametrization with the same stran...
std::optional< double > Dpluspiplus_elastic(double sqrts)
D⁺π⁺ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
std::optional< double > DplusKbarzero_elastic(double sqrts)
D⁺K̄⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
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.
@ StringHardSingleDiffractiveAX
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.
@ StringHardNonDiffractive
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.
@ StringHardSingleDiffractiveXB
See here for a short description.
@ StringHardDoubleDiffractive
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.
std::optional< double > Dplusp_elastic(double sqrts)
D⁺p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double ppbar_high_energy(double mandelstam_s)
ppbar total cross section at high energies
std::optional< double > DstarzeroKplus_elastic(double sqrts)
D*(2007)⁰K⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
double pp_high_energy(double mandelstam_s)
pp total cross section at high energies
std::optional< double > Dminusp_elastic(double sqrts)
D⁻p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double Dbarzeron_Dminusp(double sqrts)
D̄⁰n -> D⁻p cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DzeroKzero_elastic(double sqrts)
D⁰K⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
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)
std::optional< double > Dstarpluspiplus_elastic(double sqrts)
D*(2010)⁺π⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
double piplusp_high_energy(double mandelstam_s)
pi+p total cross section at high energies
std::optional< double > Dpluseta_elastic(double sqrts)
D⁺η elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double kminusp_piminussigmaplus(double sqrts)
K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra ).
std::optional< double > Dpluspiminus_elastic(double sqrts)
D⁺π⁻ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
double DplusKminus_DzeroKbarzero(double sqrts)
D⁺K⁻ -> D⁰K̄⁰ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double DbarzeroDeltaminus_DminusDeltazero(double sqrts)
D̄⁰Δ⁻ -> D⁻Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double DminusDeltaplusplus_DbarzeroDeltaplus(double sqrts)
D⁻Δ⁺⁺ -> D̄⁰Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DminusDeltazero_elastic(double sqrts)
D⁻Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double piplusp_sigmapluskplus_pdg(double mandelstam_s)
pi+ p to Sigma+ K+ cross section parametrization, PDG data.
static void throw_xsec_is_negative(const double sqrts, const double xsec, const ParticleData &data_a, const ParticleData &data_b, std::string func_name)
Helper function: Throw if cross section is negative.
double DplusKzero_DzeroKplus(double sqrts)
D⁺K⁰ -> D⁰K⁺ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
std::optional< double > DzeroDeltaplusplus_elastic(double sqrts)
D⁰Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DminusDeltaplus_elastic(double sqrts)
D⁻Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double Dplusn_Dzerop(double sqrts)
D⁺n -> D⁰p cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DstarzeroKminus_elastic(double sqrts)
D*(2007)⁰K⁻ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
std::optional< double > Dzeropizero_elastic(double sqrts)
D⁰π⁰ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
static double AQM_based_on_piminusp_high_energy(const double sqrts, const PdgCode &pdg_a, const PdgCode &pdg_b, const double AQM_scaling_factor_a, const double AQM_scaling_factor_b)
Helper function: Approximate cross section using AQM based on function piminusp_high_energy.
static constexpr int LCrossSections
double piminusp_total(double sqrts)
pi- p total cross section parametrized from PDG2018, smoothed using the LOWESS algorithm.
static void warn_if_charm_rescattering_enabled_and_AQM_disabled(const double sqrts, const ParticleType &type_a, const ParticleType &type_b, const CharmRescattering charm_rescattering)
Helper function: Print a warning message if Charm_Rescattering_Method is not set to none and AQM is d...
constexpr double deuteron_mass
Deuteron mass in GeV.
double DzeroDeltaplus_DplusDeltazero(double sqrts)
D⁰Δ⁺ -> D⁺Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
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.
std::optional< double > DplusDeltaminus_elastic(double sqrts)
D⁺Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DzeroKminus_elastic(double sqrts)
D⁰K⁻ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
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.
std::optional< double > Dzeropiminus_elastic(double sqrts)
D⁰π⁻ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
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.
std::optional< double > Dstarzeropiplus_elastic(double sqrts)
D*(2007)⁰π⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
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.
std::optional< double > DplusDeltaplusplus_elastic(double sqrts)
D⁺Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DminusDeltaplusplus_elastic(double sqrts)
D⁻Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double DplusDeltaminus_DzeroDeltazero(double sqrts)
D⁺Δ⁻ -> D⁰Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DbarzeroDeltaplusplus_elastic(double sqrts)
D̄⁰Δ⁺⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double deuteron_antinucleon_inelastic(double aN_kinetic_energy)
Parametrization of deuteron-antinucleon inelastic cross section.
double k0p_elastic_background(double mandelstam_s)
K0 p elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
std::optional< double > Dpluspizero_elastic(double sqrts)
D⁺π⁰ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
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...
std::optional< double > DzeroKbarzero_elastic(double sqrts)
D⁰K̄⁰ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double DminusDeltazero_DbarzeroDeltaminus(double sqrts)
D⁻Δ⁰ -> D̄⁰Δ⁻ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double NN_string_hard(double mandelstam_s)
nucleon-nucleon hard scattering cross section (with partonic scattering)
double Dzerop_Dplusn(double sqrts)
D⁰p -> D⁺n cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double xs_ppbar_annihilation(double mandelstam_s)
parametrized cross-section for proton-antiproton annihilation used in the UrQMD model
double DbarzeroDeltaplus_DminusDeltaplusplus(double sqrts)
D̄⁰Δ⁺ -> D⁻Δ⁺⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DplusDeltaplus_elastic(double sqrts)
D⁺Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double kplusp_inelastic_background(double mandelstam_s)
K+ p inelastic background cross section parametrization Source: Buss:2011mx , B.3....
std::optional< double > Dzerop_elastic(double sqrts)
D⁰p elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double DminusDeltaplus_DbarzeroDeltazero(double sqrts)
D⁻Δ⁺ -> D̄⁰Δ⁰ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
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....
double pp_total(double mandelstam_s)
pp total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx
double DplusDeltazero_DzeroDeltaplus(double sqrts)
D⁺Δ⁰ -> D⁰Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept
std::optional< double > Dstarpluseta_elastic(double sqrts)
D*(2010)⁺η elastic cross section (data provided by Juan Torres-Rincon).
std::optional< double > DplusKminus_elastic(double sqrts)
D⁺K⁻ elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double kplusn_total(double mandelstam_s)
K+ n total cross section parametrization.
constexpr double really_small
Numerical error tolerance.
std::optional< double > DstarplusKzero_elastic(double sqrts)
D*(2010)⁺K⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
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.
std::optional< double > DbarzeroDeltaminus_elastic(double sqrts)
D̄⁰Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > DbarzeroDeltazero_elastic(double sqrts)
D̄⁰Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
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 ).
static double effective_AQM_s(const double mandelstam_s, const double m1, const double m2, const double m1_ref, const double m2_ref)
Helper function: Shift the energy of a collision for AQM rescaled cross sections.
double kminusp_total(double mandelstam_s)
K- p total cross section parametrization.
double Dzeropiplus_Dpluspizero(double sqrts)
D⁰π⁺ -> D⁺π⁰ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
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.
std::optional< double > DstarplusKplus_elastic(double sqrts)
D*(2010)⁺K⁺ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
double DzeroKplus_DplusKzero(double sqrts)
D⁰K⁺ -> D⁺K⁰ cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
double deuteron_nucleon_inelastic(double N_kinetic_energy)
Parametrization of deuteron-nucleon inelastic cross section.
std::optional< double > DminusDeltaminus_elastic(double sqrts)
D⁻Δ⁻ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
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
std::optional< double > DstarzeroKbarzero_elastic(double sqrts)
D*(2007)⁰K̄⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rin...
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.
std::optional< double > Dzeropiplus_elastic(double sqrts)
D⁰π⁺ elastic cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
double pp_elastic(double mandelstam_s)
pp elastic cross section parametrization Source: Weil:2013mya , eq.
double DzeroDeltaplusplus_DplusDeltaplus(double sqrts)
D⁰Δ⁺⁺ -> D⁺Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > Dstarpluspiminus_elastic(double sqrts)
D*(2010)⁺π⁻ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
std::optional< double > DstarplusKbarzero_elastic(double sqrts)
D*(2010)⁺K̄⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rin...
double Dzeropizero_Dpluspiminus(double sqrts)
D⁰π⁰ -> D⁺π⁻ cross section (Abreu:2011ic , data provided by Juan Torres-Rincon).
double kplusn_inelastic_background(double mandelstam_s)
K+ n inelastic background cross section parametrization Source: Buss:2011mx , B.3....
std::optional< double > DstarplusKminus_elastic(double sqrts)
D*(2010)⁺K⁻ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
double DbarzeroDeltazero_DminusDeltaplus(double sqrts)
D̄⁰Δ⁰ -> D⁻Δ⁺ cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
std::optional< double > DbarzeroDeltaplus_elastic(double sqrts)
D̄⁰Δ⁺ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
double piplusp_elastic_AQM(double mandelstam_s, double m1, double m2)
pi+p elactic cross section parametrization.
double piplusp_elastic(double mandelstam_s)
pi+p elastic cross section parametrization, PDG data.
std::optional< double > Dstarzeropizero_elastic(double sqrts)
D*(2007)⁰π⁰ elastic cross section (closest reference Song:2015sfa , data provided by Juan Torres-Rinc...
std::optional< double > DzeroDeltazero_elastic(double sqrts)
D⁰Δ⁰ elastic cross section (Tolos:2013kva ), data provided by Juan Torres-Rincon.
std::optional< double > Dzeroeta_elastic(double sqrts)
D⁰η elastic cross section (Tolos:2013kva , data provided by Juan Torres-Rincon).
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 + ...