 |
Version: SMASH-1.8
|
|
#include <crosssections.h>
The cross section class assembels everything that is needed to calculate the cross section and returns a list of all possible reactions for the incoming particles at the given energy with the calculated cross sections.
Definition at line 62 of file crosssections.h.
|
| CrossSections (const ParticleList &incoming_particles, const double sqrt_s, const std::pair< FourVector, FourVector > potentials) |
| Construct CrossSections instance. More...
|
|
CollisionBranchList | generate_collision_list (double elastic_parameter, bool two_to_one_switch, ReactionsBitSet included_2to2, double low_snn_cut, bool strings_switch, bool use_AQM, bool strings_with_probability, NNbarTreatment nnbar_treatment, StringProcess *string_process) const |
| Generate a list of all possible collisions between the incoming particles with the given c.m. More...
|
|
CollisionBranchPtr | elastic (double elast_par, bool use_AQM) const |
| Determine the elastic cross section for this collision. More...
|
|
CollisionBranchList | two_to_one () const |
| Find all resonances that can be produced in a 2->1 collision of the two input particles and the production cross sections of these resonances. More...
|
|
double | formation (const ParticleType &type_resonance, double cm_momentum_sqr) const |
| Return the 2-to-1 resonance production cross section for a given resonance. More...
|
|
CollisionBranchList | rare_two_to_two () const |
| Find all 2->2 processes which are suppressed at high energies when strings are turned on with probabilites, but important for the production of rare species such as strange particles. More...
|
|
CollisionBranchList | two_to_two (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes for the given scattering. More...
|
|
CollisionBranchList | string_excitation (double total_string_xs, StringProcess *string_process, bool use_AQM) const |
| Determine the cross section for string excitations, which is given by the difference between the parametrized total cross section and all the explicitly implemented channels at low energy (elastic, resonance excitation, etc). More...
|
|
CollisionBranchPtr | NNbar_annihilation (const double current_xs) const |
| Determine the cross section for NNbar annihilation, which is given by the difference between the parametrized total cross section and all the explicitly implemented channels at low energy (in this case only elastic). More...
|
|
CollisionBranchList | NNbar_creation () const |
| Determine the cross section for NNbar creation, which is given by detailed balance from the reverse reaction. More...
|
|
double | high_energy () const |
| Determine the parametrized total cross section at high energies for the given collision, which is non-zero for Baryon-Baryon and Nucleon-Pion scatterings currently. More...
|
|
double | string_probability (bool strings_switch, bool use_transition_probability, bool use_AQM, bool treat_nnbar_with_strings) const |
|
double | probability_transit_high (const double region_lower, const double region_upper) const |
|
|
double | elastic_parametrization (bool use_AQM) const |
| Choose the appropriate parametrizations for given incoming particles and return the (parametrized) elastic cross section. More...
|
|
double | nn_el () const |
| Determine the (parametrized) elastic cross section for a nucleon-nucleon (NN) collision. More...
|
|
double | npi_el () const |
| Determine the elastic cross section for a nucleon-pion (Npi) collision. More...
|
|
double | nk_el () const |
| Determine the elastic cross section for a nucleon-kaon (NK) collision. More...
|
|
CollisionBranchList | npi_yk () const |
| Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering. More...
|
|
CollisionBranchList | bb_xx_except_nn (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering except the more specific Nucleon-Nucleon Scattering. More...
|
|
CollisionBranchList | nn_xx (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering. More...
|
|
CollisionBranchList | nk_xx (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 background processes for Nucleon-Kaon (NK) Scattering. More...
|
|
CollisionBranchList | deltak_xx (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering. More...
|
|
CollisionBranchList | ypi_xx (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering. More...
|
|
CollisionBranchList | dpi_xx (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron (dpi), specifically dπ→ NN, d̅π→ N̅N̅; πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse. More...
|
|
CollisionBranchList | dn_xx (ReactionsBitSet included_2to2) const |
| Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron (dN), specifically Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e.g. More...
|
|
double | string_hard_cross_section () const |
| Determine the (parametrized) hard non-diffractive string cross section for this collision. More...
|
|
CollisionBranchList | bar_bar_to_nuc_nuc (const bool is_anti_particles) const |
| Calculate cross sections for resonance absorption (i.e. More...
|
|
template<class IntegrationMethod > |
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(). More...
|
|
double | cm_momentum () const |
| Determine the momenta of the incoming particles in the center-of-mass system. More...
|
|
template<typename F > |
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. More...
|
|
◆ CrossSections()
smash::CrossSections::CrossSections |
( |
const ParticleList & |
incoming_particles, |
|
|
const double |
sqrt_s, |
|
|
const std::pair< FourVector, FourVector > |
potentials |
|
) |
| |
Construct CrossSections instance.
- Parameters
-
[in] | incoming_particles | Particles that are reacting. |
[in] | sqrt_s | Center-of-mass energy of the reaction. |
[in] | potentials | Potentials at the interacting point. they are used to calculate the corrections on the thresholds. |
Definition at line 114 of file crosssections.cc.
◆ generate_collision_list()
CollisionBranchList smash::CrossSections::generate_collision_list |
( |
double |
elastic_parameter, |
|
|
bool |
two_to_one_switch, |
|
|
ReactionsBitSet |
included_2to2, |
|
|
double |
low_snn_cut, |
|
|
bool |
strings_switch, |
|
|
bool |
use_AQM, |
|
|
bool |
strings_with_probability, |
|
|
NNbarTreatment |
nnbar_treatment, |
|
|
StringProcess * |
string_process |
|
) |
| const |
Generate a list of all possible collisions between the incoming particles with the given c.m.
energy and the calculated cross sections. The string processes are not added at this step if it's not triggerd according to the probability. It will then be added in add_all_scatterings in scatteraction.cc
- Parameters
-
[in] | elastic_parameter | Value of the constant global elastic cross section, if it is non-zero. The parametrized elastic cross section is used otherwise. |
[in] | two_to_one_switch | 2->1 reactions enabled? |
[in] | included_2to2 | Which 2->2 ractions are enabled? |
[in] | low_snn_cut | Elastic collisions with CME below are forbidden. |
[in] | strings_switch | Are string processes enabled? |
[in] | use_AQM | Is the Additive Quark Model enabled? |
[in] | strings_with_probability | Are string processes triggered according to a probability? |
[in] | nnbar_treatment | NNbar treatment through resonance, strings or none |
[in] | string_process | a pointer to the StringProcess object, which is used for string excitation and fragmentation. |
- Returns
- List of all possible collisions.
Definition at line 125 of file crosssections.cc.
130 CollisionBranchList process_list;
134 double p_pythia = 0.;
135 if (strings_with_probability) {
143 const bool reject_by_nucleon_elastic_cutoff =
144 t1.is_nucleon() && t2.is_nucleon() &&
145 t1.antiparticle_sign() == t2.antiparticle_sign() &&
sqrt_s_ < low_snn_cut;
147 if (incl_elastic && !reject_by_nucleon_elastic_cutoff) {
148 process_list.emplace_back(
elastic(elastic_parameter, use_AQM));
154 const double sig_current =
sum_xs_of(process_list);
155 const double sig_string = std::max(0.,
high_energy() - sig_current);
162 if (two_to_one_switch) {
166 if (included_2to2.any()) {
176 throw std::runtime_error(
177 "'NNbar' has to be in the list of allowed 2 to 2 processes "
178 "to enable annihilation to go through resonances");
180 if (t1.is_nucleon() && t2.pdgcode() == t1.get_antiparticle()->pdgcode()) {
◆ elastic()
CollisionBranchPtr smash::CrossSections::elastic |
( |
double |
elast_par, |
|
|
bool |
use_AQM |
|
) |
| const |
Determine the elastic cross section for this collision.
If elastic_par is given (and positive), we just use a constant cross section of that size, otherwise a parametrization of the elastic cross section is used (if available).
- Parameters
-
[in] | elast_par | Elastic cross section parameter from the input file. |
[in] | use_AQM | Whether to extend elastic cross-sections with AQM. |
- Returns
- A ProcessBranch object containing the cross section and final-state IDs.
Definition at line 193 of file crosssections.cc.
195 double elastic_xs = 0.;
196 if (elast_par >= 0.) {
198 elastic_xs = elast_par;
◆ two_to_one()
CollisionBranchList smash::CrossSections::two_to_one |
( |
| ) |
const |
Find all resonances that can be produced in a 2->1 collision of the two input particles and the production cross sections of these resonances.
Given the data and type information of two colliding particles, create a list of possible resonance production processes and their cross sections.
- Returns
- A list of processes with resonance in the final state. Each element in the list contains the type of the final-state particle and the cross section for that particular process.
Definition at line 705 of file crosssections.cc.
706 CollisionBranchList resonance_process_list;
717 if (type_resonance.is_stable()) {
722 if ((!type_particle_a.is_stable() &&
723 type_resonance.pdgcode() == type_particle_a.pdgcode()) ||
724 (!type_particle_b.is_stable() &&
725 type_resonance.pdgcode() == type_particle_b.pdgcode())) {
729 double resonance_xsection =
formation(type_resonance, p_cm_sqr);
733 resonance_process_list.push_back(make_unique<CollisionBranch>(
737 "->", type_resonance.name(),
738 " at sqrt(s)[GeV] = ",
sqrt_s_,
739 " with xs[mb] = ", resonance_xsection);
742 return resonance_process_list;
◆ formation()
double smash::CrossSections::formation |
( |
const ParticleType & |
type_resonance, |
|
|
double |
cm_momentum_sqr |
|
) |
| const |
Return the 2-to-1 resonance production cross section for a given resonance.
- Parameters
-
[in] | type_resonance | Type information for the resonance to be produced. |
[in] | cm_momentum_sqr | Square of the center-of-mass momentum of the two initial particles. |
- Returns
- The cross section for the process [initial particle a] + [initial particle b] -> resonance.
Calculate resonance production cross section using the Breit-Wigner distribution as probability amplitude. See Eq. (176) in Buss:2011mx [10].
Definition at line 745 of file crosssections.cc.
750 if (type_resonance.charge() !=
751 type_particle_a.charge() + type_particle_b.charge()) {
756 if (type_resonance.baryon_number() !=
757 type_particle_a.baryon_number() + type_particle_b.baryon_number()) {
762 const double partial_width = type_resonance.get_partial_in_width(
764 if (partial_width <= 0.) {
769 const double spinfactor =
770 static_cast<double>(type_resonance.spin() + 1) /
771 ((type_particle_a.spin() + 1) * (type_particle_b.spin() + 1));
772 const int sym_factor =
773 (type_particle_a.pdgcode() == type_particle_b.pdgcode()) ? 2 : 1;
777 return spinfactor * sym_factor * 2. * M_PI * M_PI / cm_momentum_sqr *
778 type_resonance.spectral_function(
sqrt_s_) * partial_width *
hbarc *
◆ rare_two_to_two()
CollisionBranchList smash::CrossSections::rare_two_to_two |
( |
| ) |
const |
Find all 2->2 processes which are suppressed at high energies when strings are turned on with probabilites, but important for the production of rare species such as strange particles.
This function should call the different, more specific functions for the different scatterings. But so far, only Nucleon-Pion to Hyperon- Kaon scattering is implemented.
- Returns
- List of all possibe rare 2->2 processes.
Definition at line 208 of file crosssections.cc.
209 CollisionBranchList process_list;
212 const auto& pdg_a = data_a.pdgcode();
213 const auto& pdg_b = data_b.pdgcode();
214 if ((pdg_a.is_nucleon() && pdg_b.is_pion()) ||
215 (pdg_b.is_nucleon() && pdg_a.is_pion())) {
◆ two_to_two()
CollisionBranchList smash::CrossSections::two_to_two |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
Find all inelastic 2->2 processes for the given scattering.
This function calls the different, more specific functions for the different scatterings.
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possibe inelastic 2->2 processes.
Definition at line 782 of file crosssections.cc.
784 CollisionBranchList process_list;
787 const ParticleType& type_a = data_a.type();
788 const ParticleType& type_b = data_b.type();
789 const auto& pdg_a = data_a.pdgcode();
790 const auto& pdg_b = data_b.pdgcode();
791 if (data_a.is_baryon() && data_b.is_baryon()) {
792 if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
793 pdg_a.antiparticle_sign() == pdg_b.antiparticle_sign()) {
795 process_list =
nn_xx(included_2to2);
800 }
else if ((type_a.is_baryon() && type_b.is_meson()) ||
801 (type_a.is_meson() && type_b.is_baryon())) {
803 if ((pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
804 (pdg_b.is_nucleon() && pdg_a.is_kaon())) {
806 process_list =
nk_xx(included_2to2);
807 }
else if ((pdg_a.is_hyperon() && pdg_b.is_pion()) ||
808 (pdg_b.is_hyperon() && pdg_a.is_pion())) {
810 process_list =
ypi_xx(included_2to2);
811 }
else if ((pdg_a.is_Delta() && pdg_b.is_kaon()) ||
812 (pdg_b.is_Delta() && pdg_a.is_kaon())) {
816 }
else if (type_a.is_nucleus() || type_b.is_nucleus()) {
817 if ((type_a.is_nucleon() && type_b.is_nucleus()) ||
818 (type_b.is_nucleon() && type_a.is_nucleus())) {
820 process_list =
dn_xx(included_2to2);
821 }
else if (((type_a.is_deuteron() || type_a.is_dprime()) &&
823 ((type_b.is_deuteron() || type_b.is_dprime()) &&
826 process_list =
dpi_xx(included_2to2);
◆ string_excitation()
CollisionBranchList smash::CrossSections::string_excitation |
( |
double |
total_string_xs, |
|
|
StringProcess * |
string_process, |
|
|
bool |
use_AQM |
|
) |
| const |
Determine the cross section for string excitations, which is given by the difference between the parametrized total cross section and all the explicitly implemented channels at low energy (elastic, resonance excitation, etc).
- Parameters
-
[in] | total_string_xs | Total cross section for the string process [mb]. |
[in] | string_process | a pointer to the StringProcess object, which is used for string excitation and fragmentation. |
[in] | use_AQM | whether to extend string cross-sections with AQM |
- Returns
- List of subprocesses (single-diffractive, double-diffractive and non-diffractive) with their cross sections.
- Exceptions
-
std::runtime_error | if string_process is a null pointer. |
This method has to be called after all other processes have been determined.
- Todo:
- Same assumption made by NNbar_annihilation. Resolve.
Definition at line 2093 of file crosssections.cc.
2095 if (!string_process) {
2096 throw std::runtime_error(
"string_process should be initialized.");
2099 CollisionBranchList channel_list;
2100 if (total_string_xs <= 0.) {
2101 return channel_list;
2110 std::array<int, 2> pdgid;
2111 double AQM_factor = 1.;
2112 for (
int i = 0; i < 2; i++) {
2115 AQM_factor *= (1. - 0.4 * pdg.frac_strange());
2120 bool can_annihilate =
false;
2123 for (
int iq = 1; iq <= n_q_types; iq++) {
2124 std::array<int, 2> nquark;
2125 for (
int i = 0; i < 2; i++) {
2129 if (nquark[0] != 0 && nquark[1] != 0) {
2130 can_annihilate =
true;
2146 std::array<double, 3> xs =
2147 string_process->cross_sections_diffractive(pdgid[0], pdgid[1],
sqrt_s_);
2149 for (
int ip = 0; ip < 3; ip++) {
2150 xs[ip] *= AQM_factor;
2153 double single_diffr_AX = xs[0], single_diffr_XB = xs[1], double_diffr = xs[2];
2154 double single_diffr = single_diffr_AX + single_diffr_XB;
2155 double diffractive = single_diffr + double_diffr;
2161 double sig_annihilation = 0.0;
2162 if (can_annihilate) {
2168 xs_param *= AQM_factor;
2170 sig_annihilation = std::min(total_string_xs, xs_param);
2173 const double nondiffractive_all =
2174 std::max(0., total_string_xs - sig_annihilation - diffractive);
2175 diffractive = total_string_xs - sig_annihilation - nondiffractive_all;
2176 double_diffr = std::max(0., diffractive - single_diffr);
2177 const double a = (diffractive - double_diffr) / single_diffr;
2178 single_diffr_AX *= a;
2179 single_diffr_XB *= a;
2180 assert(std::abs(single_diffr_AX + single_diffr_XB + double_diffr +
2181 sig_annihilation + nondiffractive_all - total_string_xs) <
2184 double nondiffractive_soft = 0.;
2185 double nondiffractive_hard = 0.;
2186 if (nondiffractive_all > 0.) {
2191 nondiffractive_soft =
2192 nondiffractive_all * std::exp(-hard_xsec / nondiffractive_all);
2193 nondiffractive_hard = nondiffractive_all - nondiffractive_soft;
2204 const double sig_string_soft = total_string_xs - nondiffractive_hard;
2207 if (sig_string_soft > 0.) {
2208 channel_list.push_back(make_unique<CollisionBranch>(
2210 channel_list.push_back(make_unique<CollisionBranch>(
2212 channel_list.push_back(make_unique<CollisionBranch>(
2214 channel_list.push_back(make_unique<CollisionBranch>(
2216 if (can_annihilate) {
2217 channel_list.push_back(make_unique<CollisionBranch>(
2221 if (nondiffractive_hard > 0.) {
2222 channel_list.push_back(make_unique<CollisionBranch>(
2225 return channel_list;
◆ NNbar_annihilation()
CollisionBranchPtr smash::CrossSections::NNbar_annihilation |
( |
const double |
current_xs | ) |
const |
Determine the cross section for NNbar annihilation, which is given by the difference between the parametrized total cross section and all the explicitly implemented channels at low energy (in this case only elastic).
- Parameters
-
[in] | current_xs | Sum of all cross sections of already determined processes |
- Returns
- Collision Branch with NNbar annihilation process and its cross section
This method has to be called after all other processes have been determined.
- Todo:
- Same assumption made by string_excitation. Resolve.
Definition at line 2315 of file crosssections.cc.
2320 double nnbar_xsec = std::max(0.,
ppbar_total(s) - current_xs);
◆ NNbar_creation()
CollisionBranchList smash::CrossSections::NNbar_creation |
( |
| ) |
const |
Determine the cross section for NNbar creation, which is given by detailed balance from the reverse reaction.
See NNbar_annihilation.
- Returns
- Collision Branch with NNbar creation process and its cross section
Definition at line 2328 of file crosssections.cc.
2329 CollisionBranchList channel_list;
2339 if (
sqrt_s_ - 2 * type_N.mass() < 0) {
2340 return channel_list;
2348 channel_list.push_back(make_unique<CollisionBranch>(
2350 channel_list.push_back(make_unique<CollisionBranch>(
2353 return channel_list;
◆ high_energy()
double smash::CrossSections::high_energy |
( |
| ) |
const |
Determine the parametrized total cross section at high energies for the given collision, which is non-zero for Baryon-Baryon and Nucleon-Pion scatterings currently.
This is rescaled by AQM factors.
Definition at line 2228 of file crosssections.cc.
2236 if (pdg_a.is_baryon() && pdg_b.is_baryon()) {
2237 if (pdg_a == pdg_b) {
2239 }
else if (pdg_a.antiparticle_sign() * pdg_b.antiparticle_sign() == 1) {
2241 }
else if (pdg_a.antiparticle_sign() * pdg_b.antiparticle_sign() == -1) {
2247 if (pdg_a.is_antiparticle_of(pdg_b)) {
2257 xs = xs_l * (1. - prob_high) + xs_h * prob_high;
2272 }
else if ((pdg_a.is_meson() && pdg_b.is_baryon()) ||
2273 (pdg_b.is_meson() && pdg_a.is_baryon())) {
2279 if (pdg_a.is_meson() && pdg_b.is_meson()) {
2286 xs *= (1. - 0.4 * pdg_a.frac_strange()) * (1. - 0.4 * pdg_b.frac_strange());
◆ string_probability()
double smash::CrossSections::string_probability |
( |
bool |
strings_switch, |
|
|
bool |
use_transition_probability, |
|
|
bool |
use_AQM, |
|
|
bool |
treat_nnbar_with_strings |
|
) |
| const |
- Returns
- the probability whether the scattering between the incoming particles is via string fragmentation or not.
If use_transition_probability is true: The string fragmentation is implemented in the same way in GiBUU (Physics Reports 512(2012), 1-124, pg. 33). If the center of mass energy is low, two particles scatter through the resonance channels. If high, the outgoing particles are generated by string fragmentation. If in between, the out- going particles are generated either through the resonance channels or string fragmentation by chance. In detail, the low energy region is from the threshold to (mix_scatter_type_energy - mix_scatter_type_window_width), while the high energy region is from (mix_scatter_type_energy + mix_scatter_type_window_width) to infinity. In between, the probability for string fragmentation increases smoothly from 0 to 1 as the c.m. energy.
If use_transition_probability is false: The string fragmentation is implemented similarly to what is in UrQMD (Bass:1998ca [4]). If sqrts is lower than some cutoff value, there are no strings. If higher, strings are allowed, with the cross-section being the difference between some parametrized total cross-section and the sum of all other channels, if this parametrization is larger than the sum of the channels. If not, strings are not allowed (this cross-section check is performed directly after the function is called, for technical reasons).
Both of these methods are initially implemented for NN and Npi cross- sections, and extended using the AQM to all BB, BM and MM interactions.
Baryon-antibaryon annihilation also uses this function to decide whether to produce strings or not. Since there are no other contributions for this process, there are no cutoffs or gradual increase in the probability of this process happening or not, it just requires the proper combination of incoming particles and config parameters.
- Parameters
-
[in] | strings_switch | Is string fragmentation enabled? |
[in] | use_transition_probability | which algorithm to use for string treatment (see Switch_on_String_with_Probability) |
[in] | use_AQM | whether AQM is activated |
[in] | treat_nnbar_with_strings | use strings for nnbar treatment? |
Definition at line 2584 of file crosssections.cc.
2590 if (!strings_switch) {
2597 const bool is_NN_scattering =
2598 t1.is_nucleon() && t2.is_nucleon() &&
2599 t1.antiparticle_sign() == t2.antiparticle_sign();
2600 const bool is_BBbar_scattering =
2602 (t1.is_nucleon() && t2.is_nucleon() &&
2603 t1.antiparticle_sign() != t2.antiparticle_sign());
2604 const bool is_Npi_scattering = (t1.pdgcode().is_pion() && t2.is_nucleon()) ||
2605 (t1.is_nucleon() && t2.pdgcode().is_pion());
2608 const bool is_AQM_scattering =
2609 use_AQM && ((t1.is_baryon() && t2.is_baryon() &&
2610 t1.antiparticle_sign() == t2.antiparticle_sign()) ||
2611 ((t1.is_baryon() && t2.is_meson()) ||
2612 (t2.is_baryon() && t1.is_meson())) ||
2613 (t1.is_meson() && t2.is_meson()));
2614 const double mass_sum =
2617 if (!is_NN_scattering && !is_BBbar_scattering && !is_Npi_scattering &&
2618 !is_AQM_scattering) {
2620 }
else if (is_BBbar_scattering) {
2626 const PdgCode pdg1 = t1.pdgcode(), pdg2 = t2.pdgcode();
2627 const bool is_KplusP =
2639 }
else if (pdg1.is_pion() && pdg2.is_pion()) {
2644 if (!use_transition_probability) {
2645 return static_cast<double>(
sqrt_s_ > mass_sum + aqm_offset);
2649 double region_lower, region_upper;
2650 if (is_Npi_scattering) {
2653 }
else if (is_NN_scattering) {
2659 region_lower = mass_sum + aqm_offset;
2665 }
else if (
sqrt_s_ < region_lower) {
◆ probability_transit_high()
double smash::CrossSections::probability_transit_high |
( |
const double |
region_lower, |
|
|
const double |
region_upper |
|
) |
| const |
- Parameters
-
[in] | region_lower | the lowest sqrts in the transition region [GeV] |
[in] | region_upper | the highest sqrts in the transition region [GeV] |
- Returns
- probability to have the high energy interaction (via string)
Definition at line 2674 of file crosssections.cc.
2684 double x = (
sqrt_s_ - 0.5 * (region_lower + region_upper)) /
2685 (region_upper - region_lower);
2686 assert(x >= -0.5 && x <= 0.5);
2687 double prob = 0.5 * (std::sin(M_PI * x) + 1.0);
2688 assert(prob >= 0. && prob <= 1.);
◆ elastic_parametrization()
double smash::CrossSections::elastic_parametrization |
( |
bool |
use_AQM | ) |
const |
|
private |
Choose the appropriate parametrizations for given incoming particles and return the (parametrized) elastic cross section.
- Parameters
-
[in] | use_AQM | whether AQM is activated |
- Returns
- Elastic cross section
Definition at line 221 of file crosssections.cc.
224 double elastic_xs = 0.0;
225 if ((pdg_a.is_nucleon() && pdg_b.is_pion()) ||
226 (pdg_b.is_nucleon() && pdg_a.is_pion())) {
229 }
else if ((pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
230 (pdg_b.is_nucleon() && pdg_a.is_kaon())) {
232 elastic_xs =
nk_el();
233 }
else if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
234 pdg_a.antiparticle_sign() == pdg_b.antiparticle_sign()) {
236 elastic_xs =
nn_el();
237 }
else if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
238 pdg_a.antiparticle_sign() == -pdg_b.antiparticle_sign()) {
241 }
else if (pdg_a.is_nucleus() || pdg_b.is_nucleus()) {
242 const PdgCode& pdg_nucleus = pdg_a.is_nucleus() ? pdg_a : pdg_b;
243 const PdgCode& pdg_other = pdg_a.is_nucleus() ? pdg_b : pdg_a;
244 const bool is_deuteron =
246 if (is_deuteron && pdg_other.is_pion()) {
249 }
else if (is_deuteron && pdg_other.is_nucleon()) {
253 }
else if (use_AQM) {
257 if (pdg_a.is_baryon() && pdg_b.is_baryon()) {
258 elastic_xs =
nn_el();
259 }
else if ((pdg_a.is_meson() && pdg_b.is_baryon()) ||
260 (pdg_b.is_meson() && pdg_a.is_baryon())) {
262 }
else if (pdg_a.is_meson() && pdg_b.is_meson()) {
277 (1. - 0.4 * pdg_a.frac_strange()) * (1. - 0.4 * pdg_b.frac_strange());
◆ nn_el()
double smash::CrossSections::nn_el |
( |
| ) |
const |
|
private |
Determine the (parametrized) elastic cross section for a nucleon-nucleon (NN) collision.
- Returns
- Elastic cross section for NN
- Exceptions
-
std::runtime_error | if positive cross section cannot be specified. |
Definition at line 282 of file crosssections.cc.
290 if (pdg_a.antiparticle_sign() == -pdg_b.antiparticle_sign()) {
292 }
else if (pdg_a.is_nucleon() && pdg_b.is_nucleon()) {
303 std::stringstream ss;
306 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
307 <<
" j_a=" << pdg_a.spin() <<
" j_b=" << pdg_b.spin()
308 <<
" sigma=" << sig_el <<
" s=" << s;
309 throw std::runtime_error(ss.str());
◆ npi_el()
double smash::CrossSections::npi_el |
( |
| ) |
const |
|
private |
Determine the elastic cross section for a nucleon-pion (Npi) collision.
It is given by a parametrization of experimental data.
- Returns
- Elastic cross section for Npi
- Exceptions
-
std::runtime_error | if incoming particles are not nucleon+pion. |
std::runtime_error | if positive cross section cannot be specified. |
Definition at line 313 of file crosssections.cc.
317 const PdgCode& nucleon = pdg_a.is_nucleon() ? pdg_a : pdg_b;
318 const PdgCode& pion = pdg_a.is_nucleon() ? pdg_b : pdg_a;
319 assert(pion != nucleon);
324 switch (nucleon.code()) {
326 switch (pion.code()) {
339 switch (pion.code()) {
352 switch (pion.code()) {
365 switch (pion.code()) {
378 throw std::runtime_error(
379 "only the elastic cross section for proton-pion "
386 std::stringstream ss;
389 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
390 <<
" j_a=" << pdg_a.spin() <<
" j_b=" << pdg_b.spin()
391 <<
" sigma=" << sig_el <<
" s=" << s;
392 throw std::runtime_error(ss.str());
◆ nk_el()
double smash::CrossSections::nk_el |
( |
| ) |
const |
|
private |
Determine the elastic cross section for a nucleon-kaon (NK) collision.
It is given by a parametrization of experimental data.
- Returns
- Elastic cross section for NK
- Exceptions
-
std::runtime_error | if incoming particles are not nucleon+kaon. |
std::runtime_error | if positive cross section cannot be specified. |
Definition at line 610 of file crosssections.cc.
614 const PdgCode& nucleon = pdg_a.is_nucleon() ? pdg_a : pdg_b;
615 const PdgCode& kaon = pdg_a.is_nucleon() ? pdg_b : pdg_a;
616 assert(kaon != nucleon);
621 switch (nucleon.code()) {
623 switch (kaon.code()) {
639 switch (kaon.code()) {
655 switch (kaon.code()) {
671 switch (kaon.code()) {
687 throw std::runtime_error(
688 "elastic cross section for antinucleon-kaon "
695 std::stringstream ss;
698 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
699 <<
" j_a=" << pdg_a.spin() <<
" j_b=" << pdg_b.spin()
700 <<
" sigma=" << sig_el <<
" s=" << s;
701 throw std::runtime_error(ss.str());
◆ npi_yk()
CollisionBranchList smash::CrossSections::npi_yk |
( |
| ) |
const |
|
private |
Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering.
These scatterings are suppressed at high energies when strings are turned on with probabilities, so they need to be added back manually.
- Returns
- List of all possible Npi -> YK reactions with their cross sections
Definition at line 396 of file crosssections.cc.
399 const ParticleType& type_nucleon = a.pdgcode().is_nucleon() ? a : b;
400 const ParticleType& type_pion = a.pdgcode().is_nucleon() ? b : a;
402 const auto pdg_nucleon = type_nucleon.pdgcode().code();
403 const auto pdg_pion = type_pion.pdgcode().code();
411 CollisionBranchList process_list;
412 switch (pdg_nucleon) {
420 type_K_p, type_Sigma_p);
431 type_K_p, type_Sigma_m);
433 sqrt_s_, type_K_z, type_Sigma_z);
435 sqrt_s_, type_K_z, type_Lambda);
450 sqrt_s_, type_K_p, type_Sigma_z);
452 sqrt_s_, type_K_z, type_Sigma_p);
455 type_K_p, type_Lambda);
471 type_K_z, type_Sigma_p);
473 sqrt_s_, type_K_p, type_Sigma_z);
475 sqrt_s_, type_K_p, type_Lambda);
483 type_K_z, type_Sigma_m);
498 sqrt_s_, type_K_z, type_Sigma_z);
500 sqrt_s_, type_K_p, type_Sigma_m);
503 type_K_z, type_Lambda);
519 type_K_m, type_Sigma_m_bar);
521 sqrt_s_, type_Kbar_z, type_Sigma_z_bar);
523 sqrt_s_, type_Kbar_z, type_Lambda_bar);
531 type_K_m, type_Sigma_p_bar);
546 sqrt_s_, type_K_m, type_Sigma_z_bar);
548 sqrt_s_, type_Kbar_z, type_Sigma_p_bar);
551 type_K_m, type_Lambda_bar);
564 type_Kbar_z, type_Sigma_m_bar);
575 type_Kbar_z, type_Sigma_p_bar);
577 sqrt_s_, type_K_m, type_Sigma_z_bar);
579 sqrt_s_, type_K_m, type_Lambda_bar);
594 sqrt_s_, type_Kbar_z, type_Sigma_z_bar);
596 sqrt_s_, type_K_m, type_Sigma_m_bar);
599 type_Kbar_z, type_Lambda_bar);
◆ bb_xx_except_nn()
CollisionBranchList smash::CrossSections::bb_xx_except_nn |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering except the more specific Nucleon-Nucleon Scattering.
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possible BB reactions with their cross sections
Definition at line 832 of file crosssections.cc.
834 CollisionBranchList process_list;
838 bool same_sign = type_a.antiparticle_sign() == type_b.antiparticle_sign();
839 bool any_nucleus = type_a.is_nucleus() || type_b.is_nucleus();
840 if (!same_sign && !any_nucleus) {
843 bool anti_particles = type_a.antiparticle_sign() == -1;
844 if (type_a.is_nucleon() || type_b.is_nucleon()) {
849 }
else if (type_a.is_Delta() || type_b.is_Delta()) {
◆ nn_xx()
CollisionBranchList smash::CrossSections::nn_xx |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering.
Calculate cross sections for resonance production from nucleon-nucleon collisions (i.e. N N -> N R, N N -> Delta R).
Checks are processed in the following order:
- Charge conservation
- Isospin factors (Clebsch-Gordan)
- Enough energy for all decay channels to be available for the resonance
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of resonance production processes possible in the collision of the two nucleons. Each element in the list contains the type(s) of the final state particle(s) and the cross section for that particular process.
Definition at line 859 of file crosssections.cc.
860 CollisionBranchList process_list, channel_list;
866 bool both_antinucleons =
869 const ParticleTypePtrList& nuc_or_anti_nuc =
871 : ParticleType::list_nucleons();
872 const ParticleTypePtrList& delta_or_anti_delta =
874 : ParticleType::list_Deltas();
879 [&sqrts](
const ParticleType& type_res_1,
const ParticleType&) {
880 return type_res_1.iso_multiplet()->get_integral_NR(sqrts);
882 process_list.reserve(process_list.size() + channel_list.size());
883 std::move(channel_list.begin(), channel_list.end(),
884 std::inserter(process_list, process_list.end()));
885 channel_list.clear();
892 [&sqrts](
const ParticleType& type_res_1,
893 const ParticleType& type_res_2) {
894 return type_res_1.iso_multiplet()->get_integral_RR(
895 type_res_2.iso_multiplet(), sqrts);
897 process_list.reserve(process_list.size() + channel_list.size());
898 std::move(channel_list.begin(), channel_list.end(),
899 std::inserter(process_list, process_list.end()));
900 channel_list.clear();
904 ParticleTypePtr deutron =
906 ParticleTypePtr antideutron =
912 if (deutron && antideutron && pim && pi0 && pip &&
914 const ParticleTypePtrList deutron_list = {deutron};
915 const ParticleTypePtrList antideutron_list = {antideutron};
916 const ParticleTypePtrList pion_list = {pim, pi0, pip};
918 (both_antinucleons ? antideutron_list : deutron_list), pion_list,
919 [&sqrts](
const ParticleType& type_res_1,
920 const ParticleType& type_res_2) {
921 return pCM(sqrts, type_res_1.mass(), type_res_2.mass());
923 process_list.reserve(process_list.size() + channel_list.size());
924 std::move(channel_list.begin(), channel_list.end(),
925 std::inserter(process_list, process_list.end()));
926 channel_list.clear();
◆ nk_xx()
CollisionBranchList smash::CrossSections::nk_xx |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 background processes for Nucleon-Kaon (NK) Scattering.
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possible NK reactions with their cross sections
Definition at line 932 of file crosssections.cc.
935 const ParticleType& type_nucleon = a.pdgcode().is_nucleon() ? a : b;
936 const ParticleType& type_kaon = a.pdgcode().is_nucleon() ? b : a;
938 const auto pdg_nucleon = type_nucleon.pdgcode().code();
939 const auto pdg_kaon = type_kaon.pdgcode().code();
956 bool incl_KN_to_KDelta =
959 bool incl_Strangeness_exchange =
962 CollisionBranchList process_list;
967 switch (pdg_nucleon) {
969 if (incl_Strangeness_exchange) {
979 sqrt_s_, type_pi_m, type_Sigma_p);
982 sqrt_s_, type_pi_p, type_Sigma_m);
985 type_pi_z, type_Sigma_z);
988 type_pi_z, type_Lambda);
999 if (incl_Strangeness_exchange) {
1007 type_pi_m, type_Sigma_z);
1010 type_pi_z, type_Sigma_m);
1013 type_pi_m, type_Lambda);
1018 if (incl_KN_to_KDelta) {
1026 type_nucleon, type_kaon,
1030 sqrt_s_, type_Kbar_z, type_Delta_pp_bar);
1034 type_nucleon, type_kaon,
1035 type_K_m, type_Delta_p_bar);
1037 sqrt_s_, type_K_m, type_Delta_p_bar);
1042 if (incl_KN_to_KDelta) {
1050 type_nucleon, type_kaon,
1054 sqrt_s_, type_Kbar_z, type_Delta_p_bar);
1058 type_nucleon, type_kaon,
1059 type_K_m, type_Delta_z_bar);
1061 sqrt_s_, type_K_m, type_Delta_z_bar);
1063 if (incl_KN_to_KN) {
1067 type_Kbar_z, type_p_bar);
1077 switch (pdg_nucleon) {
1079 if (incl_KN_to_KDelta) {
1087 type_nucleon, type_kaon,
1088 type_K_z, type_Delta_pp);
1090 sqrt_s_, type_K_z, type_Delta_pp);
1094 type_nucleon, type_kaon,
1095 type_K_p, type_Delta_p);
1097 sqrt_s_, type_K_p, type_Delta_p);
1102 if (incl_KN_to_KDelta) {
1110 type_nucleon, type_kaon,
1111 type_K_z, type_Delta_p);
1113 sqrt_s_, type_K_z, type_Delta_p);
1117 type_nucleon, type_kaon,
1118 type_K_p, type_Delta_z);
1120 sqrt_s_, type_K_p, type_Delta_z);
1122 if (incl_KN_to_KN) {
1131 if (incl_Strangeness_exchange) {
1141 sqrt_s_, type_pi_p, type_Sigma_p_bar);
1144 sqrt_s_, type_pi_m, type_Sigma_m_bar);
1147 type_pi_z, type_Sigma_z_bar);
1150 type_pi_z, type_Lambda_bar);
1152 if (incl_KN_to_KN) {
1156 sqrt_s_, type_K_z, type_n_bar);
1161 if (incl_Strangeness_exchange) {
1169 type_pi_p, type_Sigma_z_bar);
1172 type_pi_z, type_Sigma_m_bar);
1175 type_pi_p, type_Lambda_bar);
1188 switch (pdg_nucleon) {
1190 if (incl_KN_to_KDelta) {
1198 type_nucleon, type_kaon,
1199 type_K_z, type_Delta_p);
1201 sqrt_s_, type_K_z, type_Delta_p);
1205 type_nucleon, type_kaon,
1206 type_K_p, type_Delta_z);
1208 sqrt_s_, type_K_p, type_Delta_z);
1210 if (incl_KN_to_KN) {
1224 if (incl_KN_to_KDelta) {
1232 type_nucleon, type_kaon,
1233 type_K_z, type_Delta_z);
1235 sqrt_s_, type_K_z, type_Delta_z);
1239 type_nucleon, type_kaon,
1240 type_K_p, type_Delta_m);
1242 sqrt_s_, type_K_p, type_Delta_m);
1247 if (incl_Strangeness_exchange) {
1255 type_pi_m, type_Sigma_z_bar);
1258 type_pi_z, type_Sigma_p_bar);
1261 type_pi_m, type_Lambda_bar);
1266 if (incl_Strangeness_exchange) {
1276 sqrt_s_, type_pi_m, type_Sigma_m_bar);
1279 sqrt_s_, type_pi_p, type_Sigma_p_bar);
1282 type_pi_z, type_Sigma_z_bar);
1285 type_pi_z, type_Lambda_bar);
1287 if (incl_KN_to_KN) {
1291 sqrt_s_, type_K_p, type_p_bar);
1299 switch (pdg_nucleon) {
1301 if (incl_Strangeness_exchange) {
1309 type_pi_z, type_Sigma_p);
1312 type_pi_p, type_Sigma_z);
1315 type_pi_p, type_Lambda);
1320 if (incl_Strangeness_exchange) {
1330 sqrt_s_, type_pi_p, type_Sigma_m);
1333 sqrt_s_, type_pi_m, type_Sigma_p);
1336 type_pi_z, type_Sigma_z);
1339 type_pi_z, type_Lambda);
1341 if (incl_KN_to_KN) {
1350 if (incl_KN_to_KDelta) {
1352 const auto& type_Kbar_z = type_kaon;
1358 type_nucleon, type_kaon,
1362 sqrt_s_, type_Kbar_z, type_Delta_bar_m);
1366 type_nucleon, type_kaon,
1367 type_K_m, type_Delta_bar_z);
1369 sqrt_s_, type_K_m, type_Delta_bar_z);
1371 if (incl_KN_to_KN) {
1380 sqrt_s_, type_K_m, type_n_bar);
1385 if (incl_KN_to_KDelta) {
1393 type_nucleon, type_kaon,
1397 sqrt_s_, type_Kbar_z, type_Delta_z_bar);
1401 type_nucleon, type_kaon,
1402 type_K_m, type_Delta_m_bar);
1404 sqrt_s_, type_K_m, type_Delta_m_bar);
1412 return process_list;
◆ deltak_xx()
CollisionBranchList smash::CrossSections::deltak_xx |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering.
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possible DeltaK reactions with their cross sections
Definition at line 1415 of file crosssections.cc.
1417 CollisionBranchList process_list;
1419 return process_list;
1423 const ParticleType& type_delta = a.pdgcode().is_Delta() ? a : b;
1424 const ParticleType& type_kaon = a.pdgcode().is_Delta() ? b : a;
1426 const auto pdg_delta = type_delta.pdgcode().code();
1427 const auto pdg_kaon = type_kaon.pdgcode().code();
1434 switch (
pack(pdg_delta, pdg_kaon)) {
1445 type_p, type_K_p, type_kaon, type_delta) *
1458 type_kaon, type_p_bar,
1461 type_p_bar, type_K_m, type_kaon, type_delta) *
1464 sqrt_s_, type_p_bar, type_K_m);
1479 type_n, type_K_p, type_kaon, type_delta) *
1490 type_p, type_K_z, type_kaon, type_delta) *
1505 type_kaon, type_n_bar,
1508 type_n_bar, type_K_m, type_kaon, type_delta) *
1511 sqrt_s_, type_n_bar, type_K_m);
1516 type_kaon, type_p_bar,
1519 type_p_bar, type_Kbar_z, type_kaon, type_delta) *
1522 sqrt_s_, type_p_bar, type_Kbar_z);
1535 type_n, type_K_z, type_kaon, type_delta) *
1548 type_kaon, type_n_bar,
1551 type_n_bar, type_Kbar_z, type_kaon, type_delta) *
1554 sqrt_s_, type_n_bar, type_Kbar_z);
1561 return process_list;
◆ ypi_xx()
CollisionBranchList smash::CrossSections::ypi_xx |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering.
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possible Ypi reactions with their cross sections
Definition at line 1564 of file crosssections.cc.
1565 CollisionBranchList process_list;
1567 return process_list;
1571 const ParticleType& type_hyperon = a.pdgcode().is_hyperon() ? a : b;
1572 const ParticleType& type_pion = a.pdgcode().is_hyperon() ? b : a;
1574 const auto pdg_hyperon = type_hyperon.pdgcode().code();
1575 const auto pdg_pion = type_pion.pdgcode().code();
1579 switch (
pack(pdg_hyperon, pdg_pion)) {
1586 s, type_hyperon, type_pion, type_n, type_K_m) *
1602 sqrt_s_, type_p, type_Kbar_z);
1611 type_pion, type_n_bar,
1615 sqrt_s_, type_n_bar, type_K_p);
1624 type_pion, type_p_bar,
1628 sqrt_s_, type_p_bar, type_K_z);
1637 s, type_hyperon, type_pion, type_n, type_K_m) *
1653 sqrt_s_, type_p, type_Kbar_z);
1662 type_pion, type_n_bar,
1666 sqrt_s_, type_n_bar, type_K_p);
1675 type_pion, type_p_bar,
1679 sqrt_s_, type_p_bar, type_K_z);
1688 s, type_hyperon, type_pion, type_n, type_K_m) *
1704 sqrt_s_, type_p, type_Kbar_z);
1713 type_pion, type_n_bar,
1717 sqrt_s_, type_n_bar, type_K_p);
1726 type_pion, type_p_bar,
1730 sqrt_s_, type_p_bar, type_K_z);
1741 s, type_hyperon, type_pion, type_p, type_K_m) *
1752 sqrt_s_, type_n, type_Kbar_z);
1763 type_pion, type_p_bar,
1767 sqrt_s_, type_p_bar, type_K_p);
1771 type_pion, type_n_bar,
1775 sqrt_s_, type_n_bar, type_K_z);
1786 s, type_hyperon, type_pion, type_p, type_K_m) *
1797 sqrt_s_, type_n, type_Kbar_z);
1808 type_pion, type_p_bar,
1812 sqrt_s_, type_p_bar, type_K_p);
1816 type_pion, type_n_bar,
1820 sqrt_s_, type_n_bar, type_K_z);
1831 s, type_hyperon, type_pion, type_p, type_K_m) *
1842 sqrt_s_, type_n, type_Kbar_z);
1853 type_pion, type_p_bar,
1857 sqrt_s_, type_p_bar, type_K_p);
1861 type_pion, type_n_bar,
1865 sqrt_s_, type_n_bar, type_K_z);
1876 s, type_hyperon, type_pion, type_p, type_K_m) *
1887 sqrt_s_, type_n, type_Kbar_z);
1898 type_pion, type_p_bar,
1902 sqrt_s_, type_p_bar, type_K_p);
1906 type_pion, type_n_bar,
1910 sqrt_s_, type_n_bar, type_K_z);
1917 return process_list;
◆ dpi_xx()
CollisionBranchList smash::CrossSections::dpi_xx |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron (dpi), specifically dπ→ NN, d̅π→ N̅N̅; πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse.
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possible dpi reactions with their cross sections
Definition at line 1920 of file crosssections.cc.
1921 CollisionBranchList process_list;
1927 bool is_pid = (type_a.is_deuteron() && type_b.pdgcode().is_pion()) ||
1928 (type_b.is_deuteron() && type_a.pdgcode().is_pion());
1930 const int baryon_number = type_a.baryon_number() + type_b.baryon_number();
1931 ParticleTypePtrList nuc = (baryon_number > 0)
1935 for (ParticleTypePtr nuc_a : nuc) {
1936 for (ParticleTypePtr nuc_b : nuc) {
1937 if (type_a.charge() + type_b.charge() !=
1938 nuc_a->charge() + nuc_b->charge()) {
1942 for (
const int twoI : I_tot_range(*nuc_a, *nuc_b)) {
1944 type_a, type_b, *nuc_a, *nuc_b, twoI);
1951 const double matrix_element =
1953 if (matrix_element <= 0.) {
1957 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
1958 const int sym_fac_in =
1959 (type_a.iso_multiplet() == type_b.iso_multiplet()) ? 2 : 1;
1960 const int sym_fac_out =
1961 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
1962 double p_cm_final =
pCM_from_s(s, nuc_a->mass(), nuc_b->mass());
1963 const double xsection = isospin_factor * spin_factor * sym_fac_in /
1964 sym_fac_out * p_cm_final * matrix_element /
1968 process_list.push_back(make_unique<CollisionBranch>(
1971 nuc_a->name(), nuc_b->name(),
1972 " at sqrts [GeV] = ", sqrts,
1973 " with cs[mb] = ", xsection);
1981 bool is_pid_or_pidprime = ((type_a.is_deuteron() || type_a.is_dprime()) &&
1982 type_b.pdgcode().is_pion()) ||
1983 ((type_b.is_deuteron() || type_b.is_dprime()) &&
1984 type_a.pdgcode().is_pion());
1985 if (is_pid_or_pidprime &&
1987 const ParticleType& type_pi = type_a.pdgcode().is_pion() ? type_a : type_b;
1988 const ParticleType& type_nucleus = type_a.is_nucleus() ? type_a : type_b;
1991 for (ParticleTypePtr produced_nucleus : nuclei) {
1993 if (produced_nucleus == &type_nucleus ||
1994 produced_nucleus->charge() != type_nucleus.charge() ||
1995 produced_nucleus->baryon_number() != type_nucleus.baryon_number()) {
2002 const double matrix_element =
2003 295.5 + 2.862 / (0.00283735 +
pow_int(sqrts - 2.181, 2)) +
2004 0.0672 /
pow_int(tmp, 2) - 6.61753 / tmp;
2005 const double spin_factor =
2006 (produced_nucleus->spin() + 1) * (type_pi.spin() + 1);
2011 double xsection = matrix_element * spin_factor / (s *
cm_momentum());
2012 if (produced_nucleus->is_stable()) {
2013 assert(!type_nucleus.is_stable());
2014 xsection *=
pCM_from_s(s, type_pi.mass(), produced_nucleus->mass());
2016 assert(type_nucleus.is_stable());
2017 const double resonance_integral =
2018 produced_nucleus->iso_multiplet()->get_integral_piR(sqrts);
2019 xsection *= resonance_integral;
2021 ", matrix element: ", matrix_element,
2024 process_list.push_back(make_unique<CollisionBranch>(
2027 type_pi.name(), produced_nucleus->name(),
2028 " at ", sqrts,
" GeV, xs[mb] = ", xsection);
2031 return process_list;
◆ dn_xx()
CollisionBranchList smash::CrossSections::dn_xx |
( |
ReactionsBitSet |
included_2to2 | ) |
const |
|
private |
Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron (dN), specifically Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e.g.
Nd'→ Nd).
- Parameters
-
[in] | included_2to2 | Which 2->2 reactions are enabled? |
- Returns
- List of all possible dN reactions with their cross sections
Nd → Nd', N̅d̅→ N̅d̅' and reverse: Fit to match experimental cross-section Nd -> Nnp from [13].
N̅d → N̅d', Nd̅→ Nd̅' and reverse: Fit to roughly match experimental cross-section N̅d -> N̅ np from Bizzarri:1973sp [7].
Definition at line 2034 of file crosssections.cc.
2037 const ParticleType& type_N = type_a.is_nucleon() ? type_a : type_b;
2038 const ParticleType& type_nucleus = type_a.is_nucleus() ? type_a : type_b;
2039 CollisionBranchList process_list;
2041 return process_list;
2047 for (ParticleTypePtr produced_nucleus : nuclei) {
2049 if (produced_nucleus == &type_nucleus ||
2050 produced_nucleus->charge() != type_nucleus.charge() ||
2051 produced_nucleus->baryon_number() != type_nucleus.baryon_number()) {
2054 double matrix_element = 0.0;
2057 if (std::signbit(type_N.baryon_number()) ==
2058 std::signbit(type_nucleus.baryon_number())) {
2062 matrix_element = 79.0474 / std::pow(tmp, 0.7897) + 654.596 * tmp;
2067 matrix_element = 342.572 / std::pow(tmp, 0.6);
2069 const double spin_factor =
2070 (produced_nucleus->spin() + 1) * (type_N.spin() + 1);
2074 double xsection = matrix_element * spin_factor / (s *
cm_momentum());
2075 if (produced_nucleus->is_stable()) {
2076 assert(!type_nucleus.is_stable());
2077 xsection *=
pCM_from_s(s, type_N.mass(), produced_nucleus->mass());
2079 assert(type_nucleus.is_stable());
2080 const double resonance_integral =
2081 produced_nucleus->iso_multiplet()->get_integral_NR(sqrts);
2082 xsection *= resonance_integral;
2084 process_list.push_back(make_unique<CollisionBranch>(
2087 type_N.name(), produced_nucleus->name(),
" at ",
2088 sqrts,
" GeV, xs[mb] = ", xsection);
2090 return process_list;
◆ string_hard_cross_section()
double smash::CrossSections::string_hard_cross_section |
( |
| ) |
const |
|
private |
Determine the (parametrized) hard non-diffractive string cross section for this collision.
- Returns
- Parametrized cross section (without AQM scaling).
Definition at line 2291 of file crosssections.cc.
2292 double cross_sec = 0.;
2301 if (data_a.is_baryon() && data_b.is_baryon()) {
2304 }
else if (data_a.is_baryon() || data_b.is_baryon()) {
◆ bar_bar_to_nuc_nuc()
CollisionBranchList smash::CrossSections::bar_bar_to_nuc_nuc |
( |
const bool |
is_anti_particles | ) |
const |
|
private |
Calculate cross sections for resonance absorption (i.e.
NR->NN and ΔR->NN).
- Parameters
-
[in] | is_anti_particles | Whether the colliding particles are antiparticles |
- Returns
- List of possible resonance absorption processes. Each element of the list contains the types of the final-state particles and the cross section for that particular process.
Cross section for 2->2 resonance absorption, obtained via detailed balance from the inverse reaction. See eqs. (B.6), (B.9) and (181) in Buss:2011mx [10]. There are factors for spin, isospin and symmetry involved.
Definition at line 2356 of file crosssections.cc.
2360 CollisionBranchList process_list;
2366 ParticleTypePtrList nuc_or_anti_nuc;
2367 if (is_anti_particles) {
2374 for (ParticleTypePtr nuc_a : nuc_or_anti_nuc) {
2375 for (ParticleTypePtr nuc_b : nuc_or_anti_nuc) {
2377 if (type_a.charge() + type_b.charge() !=
2378 nuc_a->charge() + nuc_b->charge()) {
2382 for (
const int twoI : I_tot_range(*nuc_a, *nuc_b)) {
2384 type_a, type_b, *nuc_a, *nuc_b, twoI);
2391 const double matrix_element =
2393 if (matrix_element <= 0.) {
2401 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
2402 const int sym_fac_in =
2403 (type_a.iso_multiplet() == type_b.iso_multiplet()) ? 2 : 1;
2404 const int sym_fac_out =
2405 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
2406 const double xsection = isospin_factor * spin_factor * sym_fac_in /
2407 sym_fac_out * p_cm_final * matrix_element /
2411 process_list.push_back(make_unique<CollisionBranch>(
2414 "2->2 absorption with original particles: ", type_a, type_b);
2419 return process_list;
◆ nn_to_resonance_matrix_element()
double smash::CrossSections::nn_to_resonance_matrix_element |
( |
double |
sqrts, |
|
|
const ParticleType & |
type_a, |
|
|
const ParticleType & |
type_b, |
|
|
const int |
twoI |
|
) |
| |
|
staticprivate |
Scattering matrix amplitude squared (divided by 16π) for resonance production processes like NN → NR and NN → ΔR, where R is a baryon resonance (Δ, N*, Δ*).
Includes no spin or isospin factors.
- Parameters
-
[in] | sqrts | sqrt(Mandelstam-s), i.e. collision CMS energy. |
[in] | type_a | Type information for the first final-state particle. |
[in] | type_b | Type information for the second final-state particle. |
[in] | twoI | Twice the total isospin of the involved state. |
- Returns
- Matrix amplitude squared \( |\mathcal{M}(\sqrt{s})|^2/16\pi \).
NN → NΔ: fit sqrt(s)-dependence to OBE model [Dmitriev:1986st [16]]
All other processes use a constant matrix element, similar to Bass:1998ca [4], equ. (3.35).
pn → pnη cross section is known to be larger than the corresponding pp → ppη cross section by a factor of 6.5 [Calen:1998vh [11]]. Since the eta is mainly produced by an intermediate N*(1535) we introduce an explicit isospin asymmetry for the production of N*(1535) produced in pn vs. pp similar to [Teis:1996kx [43]], eq. 29.
Definition at line 2422 of file crosssections.cc.
2426 const double m_a = type_a.mass();
2427 const double m_b = type_b.mass();
2428 const double msqr = 2. * (m_a * m_a + m_b * m_b);
2436 const double w_a = type_a.width_at_pole();
2437 const double w_b = type_b.width_at_pole();
2438 const double uplmt = m_a + m_b + 3.0 * (w_a + w_b) + 3.0;
2439 if (sqrts > uplmt) {
2443 if (((type_a.is_Delta() && type_b.is_nucleon()) ||
2444 (type_b.is_Delta() && type_a.is_nucleon())) &&
2445 (type_a.antiparticle_sign() == type_b.antiparticle_sign())) {
2446 return 68. / std::pow(sqrts - 1.104, 1.951);
2449 }
else if (((type_a.is_Nstar() && type_b.is_nucleon()) ||
2450 (type_b.is_Nstar() && type_a.is_nucleon())) &&
2451 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2455 }
else if (twoI == 0) {
2456 const double parametrization = 14. / msqr;
2462 if (type_a.is_Nstar1535() || type_b.is_Nstar1535()) {
2463 return 6.5 * parametrization;
2465 return parametrization;
2468 }
else if (((type_a.is_Deltastar() && type_b.is_nucleon()) ||
2469 (type_b.is_Deltastar() && type_a.is_nucleon())) &&
2470 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2473 }
else if ((type_a.is_Delta() && type_b.is_Delta()) &&
2474 (type_a.antiparticle_sign() == type_b.antiparticle_sign())) {
2478 }
else if (twoI == 0) {
2481 }
else if (((type_a.is_Nstar() && type_b.is_Delta()) ||
2482 (type_b.is_Nstar() && type_a.is_Delta())) &&
2483 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2486 }
else if (((type_a.is_Deltastar() && type_b.is_Delta()) ||
2487 (type_b.is_Deltastar() && type_a.is_Delta())) &&
2488 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2492 }
else if (twoI == 0) {
2495 }
else if ((type_a.is_deuteron() && type_b.pdgcode().is_pion()) ||
2496 (type_b.is_deuteron() && type_a.pdgcode().is_pion())) {
2502 (1.0 - std::exp(-(sqrts - 2.0) * 20.0));
◆ find_nn_xsection_from_type()
template<class IntegrationMethod >
CollisionBranchList smash::CrossSections::find_nn_xsection_from_type |
( |
const ParticleTypePtrList & |
type_res_1, |
|
|
const ParticleTypePtrList & |
type_res_2, |
|
|
const IntegrationMethod |
integrator |
|
) |
| const |
|
private |
Utility function to avoid code replication in nn_xx().
- Parameters
-
[in] | type_res_1 | List of possible first final resonance types |
[in] | type_res_2 | List of possible second final resonance types |
[in] | integrator | Used to integrate over the kinematically allowed mass range of the Breit-Wigner distribution |
- Returns
- List of all possible NN reactions with their cross sections with different final states
Cross section for 2->2 process with 1/2 resonance(s) in final state. Based on Eq. (46) in Weil:2013mya [46] and Eq. (3.29) in Bass:1998ca [4]
Definition at line 2510 of file crosssections.cc.
2517 CollisionBranchList channel_list;
2521 for (ParticleTypePtr type_res_1 : list_res_1) {
2523 for (ParticleTypePtr type_res_2 : list_res_2) {
2525 if (type_res_1->charge() + type_res_2->charge() !=
2526 type_particle_a.charge() + type_particle_b.charge()) {
2531 for (
const int twoI : I_tot_range(type_particle_a, type_particle_b)) {
2533 type_particle_a, type_particle_b, *type_res_1, *type_res_2, twoI);
2540 const double lower_limit = type_res_1->min_mass_kinematic();
2541 const double upper_limit =
sqrt_s_ - type_res_2->mass();
2545 if (upper_limit - lower_limit < 1E-3) {
2551 sqrt_s_, *type_res_1, *type_res_2, twoI);
2552 if (matrix_element <= 0.) {
2559 const double resonance_integral = integrator(*type_res_1, *type_res_2);
2564 const double spin_factor =
2565 (type_res_1->spin() + 1) * (type_res_2->spin() + 1);
2566 const double xsection = isospin_factor * spin_factor * matrix_element *
2570 channel_list.push_back(make_unique<CollisionBranch>(
2573 "Found 2->2 creation process for resonance ", type_res_1,
", ",
2576 type_particle_a, type_particle_b);
2581 return channel_list;
◆ cm_momentum()
double smash::CrossSections::cm_momentum |
( |
| ) |
const |
|
inlineprivate |
Determine the momenta of the incoming particles in the center-of-mass system.
- Returns
- Center-of-mass momentum
Definition at line 458 of file crosssections.h.
◆ add_channel()
template<typename F >
void smash::CrossSections::add_channel |
( |
CollisionBranchList & |
process_list, |
|
|
F && |
get_xsection, |
|
|
double |
sqrts, |
|
|
const ParticleType & |
type_a, |
|
|
const ParticleType & |
type_b |
|
) |
| const |
|
inlineprivate |
Helper function: Add a 2-to-2 channel to a collision branch list given a cross section.
The cross section is only calculated if there is enough energy for the process. If the cross section is small, the branch is not added.
Definition at line 487 of file crosssections.h.
490 const double sqrt_s_min =
491 type_a.min_mass_spectral() + type_b.min_mass_spectral();
493 double scale_B = 0.0;
494 double scale_I3 = 0.0;
495 bool is_below_threshold;
496 FourVector incoming_momentum = FourVector();
499 incoming_momentum +=
p.momentum();
510 is_below_threshold = (incoming_momentum +
potentials_.first * scale_B +
512 .abs() <= sqrt_s_min;
514 is_below_threshold = (sqrts <= sqrt_s_min);
516 if (is_below_threshold) {
519 const auto xsection = get_xsection();
521 process_list.push_back(make_unique<CollisionBranch>(
◆ incoming_particles_
const ParticleList smash::CrossSections::incoming_particles_ |
|
private |
◆ sqrt_s_
const double smash::CrossSections::sqrt_s_ |
|
private |
◆ potentials_
Potentials at the interacting point.
They are used to calculate the corrections on the threshold energies.
Definition at line 474 of file crosssections.h.
◆ is_BBbar_pair_
const bool smash::CrossSections::is_BBbar_pair_ |
|
private |
Whether incoming particles are a baryon-antibaryon pair.
Definition at line 477 of file crosssections.h.
The documentation for this class was generated from the following files:
static ParticleTypePtrList & list_nucleons()
double ppbar_high_energy(double mandelstam_s)
ppbar total cross section at high energies
CollisionBranchList bar_bar_to_nuc_nuc(const bool is_anti_particles) const
Calculate cross sections for resonance absorption (i.e.
double k0p_elastic_background(double mandelstam_s)
K0 p elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
static ParticleTypePtrList & list_anti_nucleons()
hard string process involving 2->2 QCD process by PYTHIA.
double kplusn_inelastic_background(double mandelstam_s)
K+ n inelastic background cross section parametrization Source: Buss:2011mx , B.3....
double kplusn_k0p(double mandelstam_s)
K+ n charge exchange cross section parametrization.
double deuteron_nucleon_elastic(double mandelstam_s)
Deuteron nucleon elastic cross-section [mb] parametrized by Oh:2009gx .
const ParticleList incoming_particles_
List with data of scattering particles.
double ppbar_elastic(double mandelstam_s)
ppbar elastic cross section parametrization Source: Bass:1998ca
double kminusn_piminuslambda(double sqrts)
K- n <-> pi- Lambda cross section parametrization Follow from the parametrization with the same stran...
double kminusp_piplussigmaminus(double sqrts)
K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra ).
static std::pair< double, int > force_scale(const ParticleType &data)
Evaluates the scaling factor of the forces acting on the particles.
static ParticleTypePtrList & list_light_nuclei()
static PdgCode from_decimal(const int pdgcode_decimal)
Construct PDG code from decimal number.
double kbar0p_elastic_background(double mandelstam_s)
Kbar0 p elastic background cross section parametrization Source: Buss:2011mx , B.3....
double kminusp_pi0sigma0(double sqrts)
K- p <-> pi0 Sigma0 cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.
double diffractive. Two strings are formed, one from A and one from B.
Use string fragmentation.
double piplusp_high_energy(double mandelstam_s)
pi+p total cross section at high energies
double pipi_string_hard(double mandelstam_s)
pion-pion hard scattering cross section (with partonic scattering)
non-diffractive. Two strings are formed both have ends in A and B.
double pp_elastic(double mandelstam_s)
pp elastic cross section parametrization Source: Weil:2013mya , eq.
double k0n_elastic_background(double mandelstam_s)
K0 n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
const std::array< double, 2 > sqrts_range_Npi
transition range in N-pi collisions
double formation(const ParticleType &type_resonance, double cm_momentum_sqr) const
Return the 2-to-1 resonance production cross section for a given resonance.
double xs_ppbar_annihilation(double mandelstam_s)
parametrized cross-section for proton-antiproton annihilation used in the UrQMD model
double npi_el() const
Determine the elastic cross section for a nucleon-pion (Npi) collision.
constexpr double nucleon_mass
Nucleon mass in GeV.
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.
2->2 inelastic scattering
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.
constexpr double hbarc
GeV <-> fm conversion factor.
single diffractive AB->XB.
double ppbar_total(double mandelstam_s)
ppbar total 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.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
static ParticleTypePtrList & list_anti_Deltas()
double elastic_parametrization(bool use_AQM) const
Choose the appropriate parametrizations for given incoming particles and return the (parametrized) el...
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.
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
constexpr double really_small
Numerical error tolerance.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
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 ...
double NN_string_hard(double mandelstam_s)
nucleon-nucleon hard scattering cross section (with partonic scattering)
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 piminusp_sigmaminuskplus_pdg(double mandelstam_s)
pi- p -> Sigma- K+ cross section parametrization, PDG data.
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.
const double pipi_offset
Constant offset as to where to turn on the strings and elastic processes for pi pi reactions (this is...
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...
CollisionBranchPtr NNbar_annihilation(const double current_xs) const
Determine the cross section for NNbar annihilation, which is given by the difference between the para...
double kminusn_elastic_background(double mandelstam_s)
K- n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
double pp_high_energy(double mandelstam_s)
pp total cross section at high energies
CollisionBranchList nk_xx(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 background processes for Nucleon-Kaon (NK) Scattering.
CollisionBranchList npi_yk() const
Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering.
double np_high_energy(double mandelstam_s)
np total cross section at high energies
double string_probability(bool strings_switch, bool use_transition_probability, bool use_AQM, bool treat_nnbar_with_strings) const
const double sqrt_s_
Total energy in the center-of-mass frame.
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().
constexpr int decimal_antid
Anti-deuteron in decimal digits.
constexpr double minimum_sqrts_pythia_can_handle
Energy in GeV, below which hard reactions via pythia are impossible.
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 kminusp_pi0lambda(double sqrts)
K- p <-> pi0 Lambda cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.
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
double piplusp_elastic_high_energy(double mandelstam_s, double m1, double m2)
pi+p elactic cross section parametrization.
static constexpr int LScatterAction
constexpr int decimal_d
Deuteron in decimal digits.
static int pdg_map_for_pythia(PdgCode &pdg)
Take pdg code and map onto particle specie which can be handled by PYTHIA.
double deuteron_pion_elastic(double mandelstam_s)
Deuteron pion elastic cross-section [mb] parametrized to fit pi-d elastic scattering data (the data c...
CollisionBranchList bb_xx_except_nn(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering except the more specific Nucleon-...
double cm_momentum() const
Determine the momenta of the incoming particles in the center-of-mass system.
const double sqrts_range
constant for the range of transition region in the case of AQM this is added to the sum of masses + s...
double high_energy() const
Determine the parametrized total cross section at high energies for the given collision,...
CollisionBranchList deltak_xx(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering.
CollisionBranchList dn_xx(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron (dN), specifically Nd → Nd',...
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
const bool is_BBbar_pair_
Whether incoming particles are a baryon-antibaryon pair.
CollisionBranchList rare_two_to_two() const
Find all 2->2 processes which are suppressed at high energies when strings are turned on with probabi...
KaonNucleonRatios kaon_nucleon_ratios
double piminusp_sigma0k0_res(double mandelstam_s)
pi- p -> Sigma0 K0 cross section parametrization, resonance contribution.
double kbar0n_elastic_background(double mandelstam_s)
Kbar0 n elastic background cross section parametrization Source: Buss:2011mx , B.3....
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
double piminusp_high_energy(double mandelstam_s)
pi-p total cross section at high energies
double np_elastic(double mandelstam_s)
np elastic cross section parametrization Source: Weil:2013mya , eq.
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.
double piminusp_lambdak0_pdg(double mandelstam_s)
pi- p -> Lambda K0 cross section parametrization, PDG data.
CollisionBranchList two_to_two(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes for the given scattering.
constexpr int h1
h₁(1170).
double kminusn_piminussigma0(double sqrts)
K- n <-> pi- Sigma0 cross section parametrization Follow from the parametrization with the same stran...
Use intermediate Resonances.
(41-45) soft string excitations.
double kplusp_inelastic_background(double mandelstam_s)
K+ p inelastic background cross section parametrization Source: Buss:2011mx , B.3....
CollisionBranchList NNbar_creation() const
Determine the cross section for NNbar creation, which is given by detailed balance from the reverse r...
constexpr int Delta_pp
Δ⁺⁺.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
CollisionBranchList ypi_xx(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering.
const double KN_offset
Constant offset as to where to shift from 2to2 to string processes (in GeV) in the case of KN reactio...
double piplusp_elastic(double mandelstam_s)
pi+p elastic cross section parametrization, PDG data.
a special case of baryon-antibaryon annihilation.
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...
static constexpr int LCrossSections
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.
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
double piplusp_sigmapluskplus_pdg(double mandelstam_s)
pi+ p to Sigma+ K+ cross section parametrization, PDG data.
double piminusp_elastic(double mandelstam_s)
pi-p elastic cross section parametrization Source: GiBUU:parametrizationBarMes_HighEnergy....
double npbar_high_energy(double mandelstam_s)
npbar total cross section at high energies
static double sum_xs_of(CollisionBranchList &list)
Helper function: Sum all cross sections of the given process list.
elastic scattering: particles remain the same, only momenta change
double nk_el() const
Determine the elastic cross section for a nucleon-kaon (NK) collision.
double Npi_string_hard(double mandelstam_s)
nucleon-pion hard scattering cross section (with partonic scattering)
CollisionBranchList dpi_xx(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron (dpi), specifically dπ→ NN,...
double nn_el() const
Determine the (parametrized) elastic cross section for a nucleon-nucleon (NN) collision.
static ParticleTypePtrList & list_baryon_resonances()
CollisionBranchPtr elastic(double elast_par, bool use_AQM) const
Determine the elastic cross section for this collision.
CollisionBranchList string_excitation(double total_string_xs, StringProcess *string_process, bool use_AQM) const
Determine the cross section for string excitations, which is given by the difference between the para...
Potentials * pot_pointer
Pointer to a Potential class.
CollisionBranchList nn_xx(ReactionsBitSet included_2to2) const
Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering.
const std::array< double, 2 > sqrts_range_NN
transition range in N-N collisions: Tuned to reproduce experimental exclusive cross section data,...
double kminusp_piminussigmaplus(double sqrts)
K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra ).
constexpr double deuteron_mass
Deuteron mass in GeV.
double kminusp_kbar0n(double mandelstam_s)
K- p <-> Kbar0 n cross section parametrization.
const std::pair< FourVector, FourVector > potentials_
Potentials at the interacting point.
double string_hard_cross_section() const
Determine the (parametrized) hard non-diffractive string cross section for this collision.
resonance formation (2->1)
constexpr double pion_mass
Pion mass in GeV.
double probability_transit_high(const double region_lower, const double region_upper) const
static const ParticleTypeList & list_all()
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
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.
T pCM_sqr(const T sqrts, const T mass_a, const T mass_b) noexcept
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept