 |
Version: SMASH-2.0
|
|
#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 65 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, MultiParticleReactionsBitSet included_multi, double low_snn_cut, bool strings_switch, bool use_AQM, bool strings_with_probability, NNbarTreatment nnbar_treatment, StringProcess *string_process, double scale_xs, double additional_el_xs) 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, double add_el_xs, double scale_xs) const |
| Determine the elastic cross section for this collision. More...
|
|
CollisionBranchList | two_to_one (const bool prevent_dprime_form) 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 | two_to_three () const |
| Find all 2->3 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 double scale_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 |
|
|
static double | sum_xs_of (const CollisionBranchList &list) |
| Helper function: Sum all cross sections of the given process list. More...
|
|
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. More...
|
|
|
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...
|
|
|
static double | xs_dpi_dprimepi (const double sqrts, const double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_pi) |
| Parametrized cross section for πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse, see Oliinychenko:2018ugs [37] for details. More...
|
|
static double | xs_dn_dprimen (const double sqrts, const 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.g. More...
|
|
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 and NN → ΔR, where R is a baryon resonance (Δ, N*, Δ*). 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 100 of file crosssections.cc.
◆ generate_collision_list()
CollisionBranchList smash::CrossSections::generate_collision_list |
( |
double |
elastic_parameter, |
|
|
bool |
two_to_one_switch, |
|
|
ReactionsBitSet |
included_2to2, |
|
|
MultiParticleReactionsBitSet |
included_multi, |
|
|
double |
low_snn_cut, |
|
|
bool |
strings_switch, |
|
|
bool |
use_AQM, |
|
|
bool |
strings_with_probability, |
|
|
NNbarTreatment |
nnbar_treatment, |
|
|
StringProcess * |
string_process, |
|
|
double |
scale_xs, |
|
|
double |
additional_el_xs |
|
) |
| 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] | included_multi | Which multi-particle reactions 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. |
[in] | scale_xs | Factor by which all (partial) cross sections are scaled |
[in] | additional_el_xs | Additional constant elastic cross section |
- Returns
- List of all possible collisions.
Definition at line 111 of file crosssections.cc.
118 CollisionBranchList process_list;
122 double p_pythia = 0.;
123 if (strings_with_probability) {
131 const bool reject_by_nucleon_elastic_cutoff =
132 t1.is_nucleon() && t2.is_nucleon() &&
133 t1.antiparticle_sign() == t2.antiparticle_sign() &&
sqrt_s_ < low_snn_cut;
135 if (incl_elastic && !reject_by_nucleon_elastic_cutoff) {
136 process_list.emplace_back(
137 elastic(elastic_parameter, use_AQM, additional_el_xs, scale_xs));
143 const double sig_current =
sum_xs_of(process_list);
144 const double sig_string =
145 std::max(0., scale_xs *
high_energy() - sig_current);
152 if (two_to_one_switch) {
154 const bool prevent_dprime_form =
157 (1. - p_pythia) * scale_xs);
159 if (included_2to2.any()) {
162 (1. - p_pythia) * scale_xs);
174 throw std::runtime_error(
175 "'NNbar' has to be in the list of allowed 2 to 2 processes "
176 "to enable annihilation to go through resonances");
178 if (t1.is_nucleon() && t2.pdgcode() == t1.get_antiparticle()->pdgcode()) {
181 process_list.emplace_back(
◆ sum_xs_of()
static double smash::CrossSections::sum_xs_of |
( |
const CollisionBranchList & |
list | ) |
|
|
inlinestatic |
Helper function: Sum all cross sections of the given process list.
Definition at line 116 of file crosssections.h.
118 for (
auto& proc : list) {
119 xs_sum += proc->weight();
◆ elastic()
CollisionBranchPtr smash::CrossSections::elastic |
( |
double |
elast_par, |
|
|
bool |
use_AQM, |
|
|
double |
add_el_xs, |
|
|
double |
scale_xs |
|
) |
| 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). Optional a constant additional elastic cross section is added
- Parameters
-
[in] | elast_par | Elastic cross section parameter from the input file. |
[in] | use_AQM | Whether to extend elastic cross-sections with AQM. |
[in] | add_el_xs | Additional constant elastic cross section |
[in] | scale_xs | Factor by which all (partial) cross sections are scaled |
- Note
- The additional constant elastic cross section contribution is added after the scaling of the cross section.
- Returns
- A ProcessBranch object containing the cross section and final-state IDs.
Definition at line 192 of file crosssections.cc.
195 double elastic_xs = 0.;
196 if (elast_par >= 0.) {
198 elastic_xs = elast_par;
206 return make_unique<CollisionBranch>(
◆ two_to_one()
CollisionBranchList smash::CrossSections::two_to_one |
( |
const bool |
prevent_dprime_form | ) |
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.
- Parameters
-
[in] | prevent_dprime_form | In the case of using direct 3-to-2 deuteron reactions, prevent the d' from forming via the decay back reaction. |
- 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 708 of file crosssections.cc.
710 CollisionBranchList resonance_process_list;
721 if (type_resonance.is_stable()) {
726 if (prevent_dprime_form && type_resonance.is_dprime()) {
731 if ((!type_particle_a.is_stable() &&
732 type_resonance.pdgcode() == type_particle_a.pdgcode()) ||
733 (!type_particle_b.is_stable() &&
734 type_resonance.pdgcode() == type_particle_b.pdgcode())) {
738 double resonance_xsection =
formation(type_resonance, p_cm_sqr);
742 resonance_process_list.push_back(make_unique<CollisionBranch>(
746 "->", type_resonance.name(),
747 " at sqrt(s)[GeV] = ",
sqrt_s_,
748 " with xs[mb] = ", resonance_xsection);
751 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 754 of file crosssections.cc.
759 if (type_resonance.charge() !=
760 type_particle_a.charge() + type_particle_b.charge()) {
765 if (type_resonance.baryon_number() !=
766 type_particle_a.baryon_number() + type_particle_b.baryon_number()) {
771 const double partial_width = type_resonance.get_partial_in_width(
773 if (partial_width <= 0.) {
778 const double spinfactor =
779 static_cast<double>(type_resonance.spin() + 1) /
780 ((type_particle_a.spin() + 1) * (type_particle_b.spin() + 1));
781 const int sym_factor =
782 (type_particle_a.pdgcode() == type_particle_b.pdgcode()) ? 2 : 1;
786 return spinfactor * sym_factor * 2. * M_PI * M_PI / cm_momentum_sqr *
787 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 211 of file crosssections.cc.
212 CollisionBranchList process_list;
215 const auto& pdg_a = data_a.pdgcode();
216 const auto& pdg_b = data_b.pdgcode();
217 if ((pdg_a.is_nucleon() && pdg_b.is_pion()) ||
218 (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 791 of file crosssections.cc.
793 CollisionBranchList process_list;
796 const ParticleType& type_a = data_a.type();
797 const ParticleType& type_b = data_b.type();
798 const auto& pdg_a = data_a.pdgcode();
799 const auto& pdg_b = data_b.pdgcode();
800 if (data_a.is_baryon() && data_b.is_baryon()) {
801 if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
802 pdg_a.antiparticle_sign() == pdg_b.antiparticle_sign()) {
804 process_list =
nn_xx(included_2to2);
809 }
else if ((type_a.is_baryon() && type_b.is_meson()) ||
810 (type_a.is_meson() && type_b.is_baryon())) {
812 if ((pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
813 (pdg_b.is_nucleon() && pdg_a.is_kaon())) {
815 process_list =
nk_xx(included_2to2);
816 }
else if ((pdg_a.is_hyperon() && pdg_b.is_pion()) ||
817 (pdg_b.is_hyperon() && pdg_a.is_pion())) {
819 process_list =
ypi_xx(included_2to2);
820 }
else if ((pdg_a.is_Delta() && pdg_b.is_kaon()) ||
821 (pdg_b.is_Delta() && pdg_a.is_kaon())) {
825 }
else if (type_a.is_nucleus() || type_b.is_nucleus()) {
826 if ((type_a.is_nucleon() && type_b.is_nucleus()) ||
827 (type_b.is_nucleon() && type_a.is_nucleus())) {
829 process_list =
dn_xx(included_2to2);
830 }
else if (((type_a.is_deuteron() || type_a.is_dprime()) &&
832 ((type_b.is_deuteron() || type_b.is_dprime()) &&
835 process_list =
dpi_xx(included_2to2);
◆ two_to_three()
CollisionBranchList smash::CrossSections::two_to_three |
( |
| ) |
const |
Find all 2->3 processes for the given scattering.
This function calls the different, more specific functions for the different scatterings.
- Returns
- List of all possibe 2->3 processes.
Definition at line 841 of file crosssections.cc.
842 CollisionBranchList process_list;
846 if ((type_a.is_deuteron() && type_b.pdgcode().is_pion()) ||
847 (type_b.is_deuteron() && type_a.pdgcode().is_pion())) {
848 const ParticleType& type_pi = type_a.pdgcode().is_pion() ? type_a : type_b;
849 const ParticleType& type_nucleus = type_a.is_nucleus() ? type_a : type_b;
851 if (type_nucleus.baryon_number() > 0) {
856 process_list.push_back(make_unique<CollisionBranch>(
864 process_list.push_back(make_unique<CollisionBranch>(
865 type_pi, type_anti_p, type_anti_n,
870 if ((type_a.is_nucleon() && type_b.is_deuteron()) ||
871 (type_b.is_nucleon() && type_a.is_deuteron())) {
872 const ParticleType& type_N = type_a.is_nucleon() ? type_a : type_b;
873 const ParticleType& type_nucleus = type_a.is_deuteron() ? type_a : type_b;
875 if (type_nucleus.baryon_number() > 0) {
880 process_list.push_back(make_unique<CollisionBranch>(
888 process_list.push_back(make_unique<CollisionBranch>(
889 type_N, type_anti_p, type_anti_n,
◆ 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 2211 of file crosssections.cc.
2213 if (!string_process) {
2214 throw std::runtime_error(
"string_process should be initialized.");
2217 CollisionBranchList channel_list;
2218 if (total_string_xs <= 0.) {
2219 return channel_list;
2228 std::array<int, 2> pdgid;
2229 double AQM_factor = 1.;
2230 for (
int i = 0; i < 2; i++) {
2233 AQM_factor *= (1. - 0.4 * pdg.frac_strange());
2238 bool can_annihilate =
false;
2241 for (
int iq = 1; iq <= n_q_types; iq++) {
2242 std::array<int, 2> nquark;
2243 for (
int i = 0; i < 2; i++) {
2247 if (nquark[0] != 0 && nquark[1] != 0) {
2248 can_annihilate =
true;
2264 std::array<double, 3> xs =
2265 string_process->cross_sections_diffractive(pdgid[0], pdgid[1],
sqrt_s_);
2267 for (
int ip = 0; ip < 3; ip++) {
2268 xs[ip] *= AQM_factor;
2271 double single_diffr_AX = xs[0], single_diffr_XB = xs[1], double_diffr = xs[2];
2272 double single_diffr = single_diffr_AX + single_diffr_XB;
2273 double diffractive = single_diffr + double_diffr;
2279 double sig_annihilation = 0.0;
2280 if (can_annihilate) {
2286 xs_param *= AQM_factor;
2288 sig_annihilation = std::min(total_string_xs, xs_param);
2291 const double nondiffractive_all =
2292 std::max(0., total_string_xs - sig_annihilation - diffractive);
2293 diffractive = total_string_xs - sig_annihilation - nondiffractive_all;
2294 double_diffr = std::max(0., diffractive - single_diffr);
2295 const double a = (diffractive - double_diffr) / single_diffr;
2296 single_diffr_AX *= a;
2297 single_diffr_XB *= a;
2298 assert(std::abs(single_diffr_AX + single_diffr_XB + double_diffr +
2299 sig_annihilation + nondiffractive_all - total_string_xs) <
2302 double nondiffractive_soft = 0.;
2303 double nondiffractive_hard = 0.;
2304 if (nondiffractive_all > 0.) {
2309 nondiffractive_soft =
2310 nondiffractive_all * std::exp(-hard_xsec / nondiffractive_all);
2311 nondiffractive_hard = nondiffractive_all - nondiffractive_soft;
2322 const double sig_string_soft = total_string_xs - nondiffractive_hard;
2325 if (sig_string_soft > 0.) {
2326 channel_list.push_back(make_unique<CollisionBranch>(
2328 channel_list.push_back(make_unique<CollisionBranch>(
2330 channel_list.push_back(make_unique<CollisionBranch>(
2332 channel_list.push_back(make_unique<CollisionBranch>(
2334 if (can_annihilate) {
2335 channel_list.push_back(make_unique<CollisionBranch>(
2339 if (nondiffractive_hard > 0.) {
2340 channel_list.push_back(make_unique<CollisionBranch>(
2343 return channel_list;
◆ NNbar_annihilation()
CollisionBranchPtr smash::CrossSections::NNbar_annihilation |
( |
const double |
current_xs, |
|
|
const double |
scale_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 |
[in] | scale_xs | Factor by which all (partial) cross sections are scaled |
- 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 2433 of file crosssections.cc.
2438 double nnbar_xsec = std::max(0.,
ppbar_total(s) * scale_xs - 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 2446 of file crosssections.cc.
2447 CollisionBranchList channel_list;
2457 if (
sqrt_s_ - 2 * type_N.mass() < 0) {
2458 return channel_list;
2466 channel_list.push_back(make_unique<CollisionBranch>(
2468 channel_list.push_back(make_unique<CollisionBranch>(
2471 return channel_list;
◆ two_to_three_xs()
double smash::CrossSections::two_to_three_xs |
( |
const ParticleType & |
type_in1, |
|
|
const ParticleType & |
type_in2, |
|
|
double |
sqrts |
|
) |
| |
|
static |
Determine 2->3 cross section for the scattering of the given particle types.
That the function only depends on the types of particles (plus sqrt(s)) and not on the specific particles, is an assumption needed in order to treat the 3->2 back-reaction with the stochastic criterion, where this function also needs to be called for 3-to-2 collision probability with only types and sqrt(s) known at this point. Therefore the function is also made static.
- Parameters
-
[in] | type_in1 | first scatterning particle type |
[in] | type_in2 | second scatterning particle type |
[in] | sqrts | center-of-mass energy of scattering |
- Returns
- cross section for 2->3 process
Definition at line 896 of file crosssections.cc.
899 double xsection = 0.0;
900 bool is_dpi = (type_a.is_deuteron() && type_b.pdgcode().is_pion()) ||
901 (type_b.is_deuteron() && type_a.pdgcode().is_pion());
902 bool is_dn = (type_a.is_nucleon() && type_b.is_nucleus()) ||
903 (type_b.is_nucleon() && type_a.is_nucleus());
905 if (is_dpi || is_dn) {
909 const ParticleTypePtr type_dprime =
912 throw std::invalid_argument(
913 "d' (pdg: 1000010021) resonance not found in particles.txt.\nThe "
914 "resonance is required for the cross section calculation of 2->3 "
915 "scatterings involing deuterons.");
919 const ParticleType& type_pi =
920 type_a.pdgcode().is_pion() ? type_a : type_b;
923 type_dprime, type_pi);
926 const ParticleType& type_N = type_a.is_nucleon() ? type_a : type_b;
927 const ParticleType& type_nucleus = type_a.is_nucleus() ? type_a : type_b;
929 type_dprime, type_nucleus, type_N);
◆ 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 2346 of file crosssections.cc.
2354 if (pdg_a.is_baryon() && pdg_b.is_baryon()) {
2355 if (pdg_a == pdg_b) {
2357 }
else if (pdg_a.antiparticle_sign() * pdg_b.antiparticle_sign() == 1) {
2359 }
else if (pdg_a.antiparticle_sign() * pdg_b.antiparticle_sign() == -1) {
2365 if (pdg_a.is_antiparticle_of(pdg_b)) {
2375 xs = xs_l * (1. - prob_high) + xs_h * prob_high;
2390 }
else if ((pdg_a.is_meson() && pdg_b.is_baryon()) ||
2391 (pdg_b.is_meson() && pdg_a.is_baryon())) {
2397 if (pdg_a.is_meson() && pdg_b.is_meson()) {
2404 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 2702 of file crosssections.cc.
2708 if (!strings_switch) {
2715 const bool is_NN_scattering =
2716 t1.is_nucleon() && t2.is_nucleon() &&
2717 t1.antiparticle_sign() == t2.antiparticle_sign();
2718 const bool is_BBbar_scattering =
2720 (t1.is_nucleon() && t2.is_nucleon() &&
2721 t1.antiparticle_sign() != t2.antiparticle_sign());
2722 const bool is_Npi_scattering = (t1.pdgcode().is_pion() && t2.is_nucleon()) ||
2723 (t1.is_nucleon() && t2.pdgcode().is_pion());
2726 const bool is_AQM_scattering =
2727 use_AQM && ((t1.is_baryon() && t2.is_baryon() &&
2728 t1.antiparticle_sign() == t2.antiparticle_sign()) ||
2729 ((t1.is_baryon() && t2.is_meson()) ||
2730 (t2.is_baryon() && t1.is_meson())) ||
2731 (t1.is_meson() && t2.is_meson()));
2732 const double mass_sum =
2735 if (!is_NN_scattering && !is_BBbar_scattering && !is_Npi_scattering &&
2736 !is_AQM_scattering) {
2738 }
else if (is_BBbar_scattering) {
2744 const PdgCode pdg1 = t1.pdgcode(), pdg2 = t2.pdgcode();
2745 const bool is_KplusP =
2757 }
else if (pdg1.is_pion() && pdg2.is_pion()) {
2762 if (!use_transition_probability) {
2763 return static_cast<double>(
sqrt_s_ > mass_sum + aqm_offset);
2767 double region_lower, region_upper;
2768 if (is_Npi_scattering) {
2771 }
else if (is_NN_scattering) {
2777 region_lower = mass_sum + aqm_offset;
2783 }
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 2792 of file crosssections.cc.
2802 double x = (
sqrt_s_ - 0.5 * (region_lower + region_upper)) /
2803 (region_upper - region_lower);
2804 assert(x >= -0.5 && x <= 0.5);
2805 double prob = 0.5 * (std::sin(M_PI * x) + 1.0);
2806 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 224 of file crosssections.cc.
227 double elastic_xs = 0.0;
228 if ((pdg_a.is_nucleon() && pdg_b.is_pion()) ||
229 (pdg_b.is_nucleon() && pdg_a.is_pion())) {
232 }
else if ((pdg_a.is_nucleon() && pdg_b.is_kaon()) ||
233 (pdg_b.is_nucleon() && pdg_a.is_kaon())) {
235 elastic_xs =
nk_el();
236 }
else if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
237 pdg_a.antiparticle_sign() == pdg_b.antiparticle_sign()) {
239 elastic_xs =
nn_el();
240 }
else if (pdg_a.is_nucleon() && pdg_b.is_nucleon() &&
241 pdg_a.antiparticle_sign() == -pdg_b.antiparticle_sign()) {
244 }
else if (pdg_a.is_nucleus() || pdg_b.is_nucleus()) {
245 const PdgCode& pdg_nucleus = pdg_a.is_nucleus() ? pdg_a : pdg_b;
246 const PdgCode& pdg_other = pdg_a.is_nucleus() ? pdg_b : pdg_a;
247 const bool is_deuteron =
249 if (is_deuteron && pdg_other.is_pion()) {
252 }
else if (is_deuteron && pdg_other.is_nucleon()) {
256 }
else if (use_AQM) {
260 if (pdg_a.is_baryon() && pdg_b.is_baryon()) {
261 elastic_xs =
nn_el();
262 }
else if ((pdg_a.is_meson() && pdg_b.is_baryon()) ||
263 (pdg_b.is_meson() && pdg_a.is_baryon())) {
265 }
else if (pdg_a.is_meson() && pdg_b.is_meson()) {
280 (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 285 of file crosssections.cc.
293 if (pdg_a.antiparticle_sign() == -pdg_b.antiparticle_sign()) {
295 }
else if (pdg_a.is_nucleon() && pdg_b.is_nucleon()) {
306 std::stringstream ss;
309 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
310 <<
" j_a=" << pdg_a.spin() <<
" j_b=" << pdg_b.spin()
311 <<
" sigma=" << sig_el <<
" s=" << s;
312 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 316 of file crosssections.cc.
320 const PdgCode& nucleon = pdg_a.is_nucleon() ? pdg_a : pdg_b;
321 const PdgCode& pion = pdg_a.is_nucleon() ? pdg_b : pdg_a;
322 assert(pion != nucleon);
327 switch (nucleon.code()) {
329 switch (pion.code()) {
342 switch (pion.code()) {
355 switch (pion.code()) {
368 switch (pion.code()) {
381 throw std::runtime_error(
382 "only the elastic cross section for proton-pion "
389 std::stringstream ss;
392 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
393 <<
" j_a=" << pdg_a.spin() <<
" j_b=" << pdg_b.spin()
394 <<
" sigma=" << sig_el <<
" s=" << s;
395 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 613 of file crosssections.cc.
617 const PdgCode& nucleon = pdg_a.is_nucleon() ? pdg_a : pdg_b;
618 const PdgCode& kaon = pdg_a.is_nucleon() ? pdg_b : pdg_a;
619 assert(kaon != nucleon);
624 switch (nucleon.code()) {
626 switch (kaon.code()) {
642 switch (kaon.code()) {
658 switch (kaon.code()) {
674 switch (kaon.code()) {
690 throw std::runtime_error(
691 "elastic cross section for antinucleon-kaon "
698 std::stringstream ss;
701 ss <<
"problem in CrossSections::elastic: a=" << name_a <<
" b=" << name_b
702 <<
" j_a=" << pdg_a.spin() <<
" j_b=" << pdg_b.spin()
703 <<
" sigma=" << sig_el <<
" s=" << s;
704 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 399 of file crosssections.cc.
402 const ParticleType& type_nucleon = a.pdgcode().is_nucleon() ? a : b;
403 const ParticleType& type_pion = a.pdgcode().is_nucleon() ? b : a;
405 const auto pdg_nucleon = type_nucleon.pdgcode().code();
406 const auto pdg_pion = type_pion.pdgcode().code();
414 CollisionBranchList process_list;
415 switch (pdg_nucleon) {
423 type_K_p, type_Sigma_p);
434 type_K_p, type_Sigma_m);
436 sqrt_s_, type_K_z, type_Sigma_z);
438 sqrt_s_, type_K_z, type_Lambda);
453 sqrt_s_, type_K_p, type_Sigma_z);
455 sqrt_s_, type_K_z, type_Sigma_p);
458 type_K_p, type_Lambda);
474 type_K_z, type_Sigma_p);
476 sqrt_s_, type_K_p, type_Sigma_z);
478 sqrt_s_, type_K_p, type_Lambda);
486 type_K_z, type_Sigma_m);
501 sqrt_s_, type_K_z, type_Sigma_z);
503 sqrt_s_, type_K_p, type_Sigma_m);
506 type_K_z, type_Lambda);
522 type_K_m, type_Sigma_m_bar);
524 sqrt_s_, type_Kbar_z, type_Sigma_z_bar);
526 sqrt_s_, type_Kbar_z, type_Lambda_bar);
534 type_K_m, type_Sigma_p_bar);
549 sqrt_s_, type_K_m, type_Sigma_z_bar);
551 sqrt_s_, type_Kbar_z, type_Sigma_p_bar);
554 type_K_m, type_Lambda_bar);
567 type_Kbar_z, type_Sigma_m_bar);
578 type_Kbar_z, type_Sigma_p_bar);
580 sqrt_s_, type_K_m, type_Sigma_z_bar);
582 sqrt_s_, type_K_m, type_Lambda_bar);
597 sqrt_s_, type_Kbar_z, type_Sigma_z_bar);
599 sqrt_s_, type_K_m, type_Sigma_m_bar);
602 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 935 of file crosssections.cc.
937 CollisionBranchList process_list;
941 bool same_sign = type_a.antiparticle_sign() == type_b.antiparticle_sign();
942 bool any_nucleus = type_a.is_nucleus() || type_b.is_nucleus();
943 if (!same_sign && !any_nucleus) {
946 bool anti_particles = type_a.antiparticle_sign() == -1;
947 if (type_a.is_nucleon() || type_b.is_nucleon()) {
952 }
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 962 of file crosssections.cc.
963 CollisionBranchList process_list, channel_list;
969 bool both_antinucleons =
972 const ParticleTypePtrList& nuc_or_anti_nuc =
974 : ParticleType::list_nucleons();
975 const ParticleTypePtrList& delta_or_anti_delta =
977 : ParticleType::list_Deltas();
982 [&sqrts](
const ParticleType& type_res_1,
const ParticleType&) {
983 return type_res_1.iso_multiplet()->get_integral_NR(sqrts);
985 process_list.reserve(process_list.size() + channel_list.size());
986 std::move(channel_list.begin(), channel_list.end(),
987 std::inserter(process_list, process_list.end()));
988 channel_list.clear();
995 [&sqrts](
const ParticleType& type_res_1,
996 const ParticleType& type_res_2) {
997 return type_res_1.iso_multiplet()->get_integral_RR(
998 type_res_2.iso_multiplet(), sqrts);
1000 process_list.reserve(process_list.size() + channel_list.size());
1001 std::move(channel_list.begin(), channel_list.end(),
1002 std::inserter(process_list, process_list.end()));
1003 channel_list.clear();
1007 ParticleTypePtr deutron =
1009 ParticleTypePtr antideutron =
1015 if (deutron && antideutron && pim && pi0 && pip &&
1017 const ParticleTypePtrList deutron_list = {deutron};
1018 const ParticleTypePtrList antideutron_list = {antideutron};
1019 const ParticleTypePtrList pion_list = {pim, pi0, pip};
1021 (both_antinucleons ? antideutron_list : deutron_list), pion_list,
1022 [&sqrts](
const ParticleType& type_res_1,
1023 const ParticleType& type_res_2) {
1024 return pCM(sqrts, type_res_1.mass(), type_res_2.mass());
1026 process_list.reserve(process_list.size() + channel_list.size());
1027 std::move(channel_list.begin(), channel_list.end(),
1028 std::inserter(process_list, process_list.end()));
1029 channel_list.clear();
1032 return process_list;
◆ 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 1035 of file crosssections.cc.
1038 const ParticleType& type_nucleon = a.pdgcode().is_nucleon() ? a : b;
1039 const ParticleType& type_kaon = a.pdgcode().is_nucleon() ? b : a;
1041 const auto pdg_nucleon = type_nucleon.pdgcode().code();
1042 const auto pdg_kaon = type_kaon.pdgcode().code();
1059 bool incl_KN_to_KDelta =
1061 sqrt_s_ < KN_to_KDelta_cutoff;
1062 bool incl_Strangeness_exchange =
1065 CollisionBranchList process_list;
1070 switch (pdg_nucleon) {
1072 if (incl_Strangeness_exchange) {
1082 sqrt_s_, type_pi_m, type_Sigma_p);
1085 sqrt_s_, type_pi_p, type_Sigma_m);
1088 type_pi_z, type_Sigma_z);
1091 type_pi_z, type_Lambda);
1093 if (incl_KN_to_KN) {
1097 sqrt_s_, type_Kbar_z, type_n);
1102 if (incl_Strangeness_exchange) {
1110 type_pi_m, type_Sigma_z);
1113 type_pi_z, type_Sigma_m);
1116 type_pi_m, type_Lambda);
1121 if (incl_KN_to_KDelta) {
1129 type_nucleon, type_kaon,
1133 sqrt_s_, type_Kbar_z, type_Delta_pp_bar);
1137 type_nucleon, type_kaon,
1138 type_K_m, type_Delta_p_bar);
1140 sqrt_s_, type_K_m, type_Delta_p_bar);
1145 if (incl_KN_to_KDelta) {
1153 type_nucleon, type_kaon,
1157 sqrt_s_, type_Kbar_z, type_Delta_p_bar);
1161 type_nucleon, type_kaon,
1162 type_K_m, type_Delta_z_bar);
1164 sqrt_s_, type_K_m, type_Delta_z_bar);
1166 if (incl_KN_to_KN) {
1170 type_Kbar_z, type_p_bar);
1180 switch (pdg_nucleon) {
1182 if (incl_KN_to_KDelta) {
1190 type_nucleon, type_kaon,
1191 type_K_z, type_Delta_pp);
1193 sqrt_s_, type_K_z, type_Delta_pp);
1197 type_nucleon, type_kaon,
1198 type_K_p, type_Delta_p);
1200 sqrt_s_, type_K_p, type_Delta_p);
1205 if (incl_KN_to_KDelta) {
1213 type_nucleon, type_kaon,
1214 type_K_z, type_Delta_p);
1216 sqrt_s_, type_K_z, type_Delta_p);
1220 type_nucleon, type_kaon,
1221 type_K_p, type_Delta_z);
1223 sqrt_s_, type_K_p, type_Delta_z);
1225 if (incl_KN_to_KN) {
1234 if (incl_Strangeness_exchange) {
1244 sqrt_s_, type_pi_p, type_Sigma_p_bar);
1247 sqrt_s_, type_pi_m, type_Sigma_m_bar);
1250 type_pi_z, type_Sigma_z_bar);
1253 type_pi_z, type_Lambda_bar);
1255 if (incl_KN_to_KN) {
1259 sqrt_s_, type_K_z, type_n_bar);
1264 if (incl_Strangeness_exchange) {
1272 type_pi_p, type_Sigma_z_bar);
1275 type_pi_z, type_Sigma_m_bar);
1278 type_pi_p, type_Lambda_bar);
1291 switch (pdg_nucleon) {
1293 if (incl_KN_to_KDelta) {
1301 type_nucleon, type_kaon,
1302 type_K_z, type_Delta_p);
1304 sqrt_s_, type_K_z, type_Delta_p);
1308 type_nucleon, type_kaon,
1309 type_K_p, type_Delta_z);
1311 sqrt_s_, type_K_p, type_Delta_z);
1313 if (incl_KN_to_KN) {
1327 if (incl_KN_to_KDelta) {
1335 type_nucleon, type_kaon,
1336 type_K_z, type_Delta_z);
1338 sqrt_s_, type_K_z, type_Delta_z);
1342 type_nucleon, type_kaon,
1343 type_K_p, type_Delta_m);
1345 sqrt_s_, type_K_p, type_Delta_m);
1350 if (incl_Strangeness_exchange) {
1358 type_pi_m, type_Sigma_z_bar);
1361 type_pi_z, type_Sigma_p_bar);
1364 type_pi_m, type_Lambda_bar);
1369 if (incl_Strangeness_exchange) {
1379 sqrt_s_, type_pi_m, type_Sigma_m_bar);
1382 sqrt_s_, type_pi_p, type_Sigma_p_bar);
1385 type_pi_z, type_Sigma_z_bar);
1388 type_pi_z, type_Lambda_bar);
1390 if (incl_KN_to_KN) {
1394 sqrt_s_, type_K_p, type_p_bar);
1402 switch (pdg_nucleon) {
1404 if (incl_Strangeness_exchange) {
1412 type_pi_z, type_Sigma_p);
1415 type_pi_p, type_Sigma_z);
1418 type_pi_p, type_Lambda);
1423 if (incl_Strangeness_exchange) {
1433 sqrt_s_, type_pi_p, type_Sigma_m);
1436 sqrt_s_, type_pi_m, type_Sigma_p);
1439 type_pi_z, type_Sigma_z);
1442 type_pi_z, type_Lambda);
1444 if (incl_KN_to_KN) {
1453 if (incl_KN_to_KDelta) {
1455 const auto& type_Kbar_z = type_kaon;
1461 type_nucleon, type_kaon,
1465 sqrt_s_, type_Kbar_z, type_Delta_bar_m);
1469 type_nucleon, type_kaon,
1470 type_K_m, type_Delta_bar_z);
1472 sqrt_s_, type_K_m, type_Delta_bar_z);
1474 if (incl_KN_to_KN) {
1483 sqrt_s_, type_K_m, type_n_bar);
1488 if (incl_KN_to_KDelta) {
1496 type_nucleon, type_kaon,
1500 sqrt_s_, type_Kbar_z, type_Delta_z_bar);
1504 type_nucleon, type_kaon,
1505 type_K_m, type_Delta_m_bar);
1507 sqrt_s_, type_K_m, type_Delta_m_bar);
1515 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 1518 of file crosssections.cc.
1520 CollisionBranchList process_list;
1522 return process_list;
1526 const ParticleType& type_delta = a.pdgcode().is_Delta() ? a : b;
1527 const ParticleType& type_kaon = a.pdgcode().is_Delta() ? b : a;
1529 const auto pdg_delta = type_delta.pdgcode().code();
1530 const auto pdg_kaon = type_kaon.pdgcode().code();
1537 switch (
pack(pdg_delta, pdg_kaon)) {
1548 type_p, type_K_p, type_kaon, type_delta) *
1561 type_kaon, type_p_bar,
1564 type_p_bar, type_K_m, type_kaon, type_delta) *
1567 sqrt_s_, type_p_bar, type_K_m);
1582 type_n, type_K_p, type_kaon, type_delta) *
1593 type_p, type_K_z, type_kaon, type_delta) *
1608 type_kaon, type_n_bar,
1611 type_n_bar, type_K_m, type_kaon, type_delta) *
1614 sqrt_s_, type_n_bar, type_K_m);
1619 type_kaon, type_p_bar,
1622 type_p_bar, type_Kbar_z, type_kaon, type_delta) *
1625 sqrt_s_, type_p_bar, type_Kbar_z);
1638 type_n, type_K_z, type_kaon, type_delta) *
1651 type_kaon, type_n_bar,
1654 type_n_bar, type_Kbar_z, type_kaon, type_delta) *
1657 sqrt_s_, type_n_bar, type_Kbar_z);
1664 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 1667 of file crosssections.cc.
1668 CollisionBranchList process_list;
1670 return process_list;
1674 const ParticleType& type_hyperon = a.pdgcode().is_hyperon() ? a : b;
1675 const ParticleType& type_pion = a.pdgcode().is_hyperon() ? b : a;
1677 const auto pdg_hyperon = type_hyperon.pdgcode().code();
1678 const auto pdg_pion = type_pion.pdgcode().code();
1682 switch (
pack(pdg_hyperon, pdg_pion)) {
1689 s, type_hyperon, type_pion, type_n, type_K_m) *
1705 sqrt_s_, type_p, type_Kbar_z);
1714 type_pion, type_n_bar,
1718 sqrt_s_, type_n_bar, type_K_p);
1727 type_pion, type_p_bar,
1731 sqrt_s_, type_p_bar, type_K_z);
1740 s, type_hyperon, type_pion, type_n, type_K_m) *
1756 sqrt_s_, type_p, type_Kbar_z);
1765 type_pion, type_n_bar,
1769 sqrt_s_, type_n_bar, type_K_p);
1778 type_pion, type_p_bar,
1782 sqrt_s_, type_p_bar, type_K_z);
1791 s, type_hyperon, type_pion, type_n, type_K_m) *
1807 sqrt_s_, type_p, type_Kbar_z);
1816 type_pion, type_n_bar,
1820 sqrt_s_, type_n_bar, type_K_p);
1829 type_pion, type_p_bar,
1833 sqrt_s_, type_p_bar, type_K_z);
1844 s, type_hyperon, type_pion, type_p, type_K_m) *
1855 sqrt_s_, type_n, type_Kbar_z);
1866 type_pion, type_p_bar,
1870 sqrt_s_, type_p_bar, type_K_p);
1874 type_pion, type_n_bar,
1878 sqrt_s_, type_n_bar, type_K_z);
1889 s, type_hyperon, type_pion, type_p, type_K_m) *
1900 sqrt_s_, type_n, type_Kbar_z);
1911 type_pion, type_p_bar,
1915 sqrt_s_, type_p_bar, type_K_p);
1919 type_pion, type_n_bar,
1923 sqrt_s_, type_n_bar, type_K_z);
1934 s, type_hyperon, type_pion, type_p, type_K_m) *
1945 sqrt_s_, type_n, type_Kbar_z);
1956 type_pion, type_p_bar,
1960 sqrt_s_, type_p_bar, type_K_p);
1964 type_pion, type_n_bar,
1968 sqrt_s_, type_n_bar, type_K_z);
1979 s, type_hyperon, type_pion, type_p, type_K_m) *
1990 sqrt_s_, type_n, type_Kbar_z);
2001 type_pion, type_p_bar,
2005 sqrt_s_, type_p_bar, type_K_p);
2009 type_pion, type_n_bar,
2013 sqrt_s_, type_n_bar, type_K_z);
2020 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 2055 of file crosssections.cc.
2056 CollisionBranchList process_list;
2062 bool is_pid = (type_a.is_deuteron() && type_b.pdgcode().is_pion()) ||
2063 (type_b.is_deuteron() && type_a.pdgcode().is_pion());
2065 const int baryon_number = type_a.baryon_number() + type_b.baryon_number();
2066 ParticleTypePtrList nuc = (baryon_number > 0)
2070 for (ParticleTypePtr nuc_a : nuc) {
2071 for (ParticleTypePtr nuc_b : nuc) {
2072 if (type_a.charge() + type_b.charge() !=
2073 nuc_a->charge() + nuc_b->charge()) {
2077 for (
const int twoI : I_tot_range(*nuc_a, *nuc_b)) {
2079 type_a, type_b, *nuc_a, *nuc_b, twoI);
2086 const double matrix_element =
2088 if (matrix_element <= 0.) {
2092 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
2093 const int sym_fac_in =
2094 (type_a.iso_multiplet() == type_b.iso_multiplet()) ? 2 : 1;
2095 const int sym_fac_out =
2096 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
2097 double p_cm_final =
pCM_from_s(s, nuc_a->mass(), nuc_b->mass());
2098 const double xsection = isospin_factor * spin_factor * sym_fac_in /
2099 sym_fac_out * p_cm_final * matrix_element /
2103 process_list.push_back(make_unique<CollisionBranch>(
2106 nuc_a->name(), nuc_b->name(),
2107 " at sqrts [GeV] = ", sqrts,
2108 " with cs[mb] = ", xsection);
2116 bool is_pid_or_pidprime = ((type_a.is_deuteron() || type_a.is_dprime()) &&
2117 type_b.pdgcode().is_pion()) ||
2118 ((type_b.is_deuteron() || type_b.is_dprime()) &&
2119 type_a.pdgcode().is_pion());
2120 if (is_pid_or_pidprime &&
2122 const ParticleType& type_pi = type_a.pdgcode().is_pion() ? type_a : type_b;
2123 const ParticleType& type_nucleus = type_a.is_nucleus() ? type_a : type_b;
2125 for (ParticleTypePtr produced_nucleus : nuclei) {
2127 if (produced_nucleus == &type_nucleus ||
2128 produced_nucleus->charge() != type_nucleus.charge() ||
2129 produced_nucleus->baryon_number() != type_nucleus.baryon_number()) {
2132 const double xsection =
2134 process_list.push_back(make_unique<CollisionBranch>(
2137 type_pi.name(), produced_nucleus->name(),
2138 " at ", sqrts,
" GeV, xs[mb] = ", xsection);
2141 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
Definition at line 2182 of file crosssections.cc.
2185 const ParticleType& type_N = type_a.is_nucleon() ? type_a : type_b;
2186 const ParticleType& type_nucleus = type_a.is_nucleus() ? type_a : type_b;
2187 CollisionBranchList process_list;
2189 return process_list;
2193 for (ParticleTypePtr produced_nucleus : nuclei) {
2195 if (produced_nucleus == &type_nucleus ||
2196 produced_nucleus->charge() != type_nucleus.charge() ||
2197 produced_nucleus->baryon_number() != type_nucleus.baryon_number()) {
2202 process_list.push_back(make_unique<CollisionBranch>(
2205 type_N.name(), produced_nucleus->name(),
" at ",
2206 sqrt_s_,
" GeV, xs[mb] = ", xsection);
2208 return process_list;
◆ xs_dpi_dprimepi()
double smash::CrossSections::xs_dpi_dprimepi |
( |
const double |
sqrts, |
|
|
const double |
cm_mom, |
|
|
ParticleTypePtr |
produced_nucleus, |
|
|
const ParticleType & |
type_pi |
|
) |
| |
|
staticprivate |
Parametrized cross section for πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse, see Oliinychenko:2018ugs [37] for details.
- Parameters
-
[in] | sqrts | square-root of mandelstam s |
[in] | cm_mom | center of mass momentum of incoming particles |
[in] | produced_nucleus | type of outgoing deuteron or d-prime |
[in] | type_pi | type of scattering pion |
- Returns
- cross section for given scattering
Definition at line 2023 of file crosssections.cc.
2026 const double s = sqrts * sqrts;
2031 const double matrix_element =
2032 295.5 + 2.862 / (0.00283735 +
pow_int(sqrts - 2.181, 2)) +
2033 0.0672 /
pow_int(tmp, 2) - 6.61753 / tmp;
2035 const double spin_factor =
2036 (produced_nucleus->spin() + 1) * (type_pi.spin() + 1);
2041 double xsection = matrix_element * spin_factor / (s * cm_mom);
2042 if (produced_nucleus->is_stable()) {
2043 xsection *=
pCM_from_s(s, type_pi.mass(), produced_nucleus->mass());
2045 const double resonance_integral =
2046 produced_nucleus->iso_multiplet()->get_integral_piR(sqrts);
2047 xsection *= resonance_integral;
2049 ", matrix element: ", matrix_element,
2050 ", cm_momentum: ", cm_mom);
◆ xs_dn_dprimen()
Parametrized cross section for Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e.g.
Nd'→ Nd), see Oliinychenko:2018ugs [37] for details.
- Parameters
-
[in] | sqrts | square-root of mandelstam s |
[in] | cm_mom | center of mass momentum of incoming particles |
[in] | produced_nucleus | type of outgoing deuteron or d-prime |
[in] | type_nucleus | type of scattering (incoming) deuteron or d-prime |
[in] | type_N | type of scattering nucleon |
- Returns
- cross section for given scattering
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 2144 of file crosssections.cc.
2148 const double s = sqrts * sqrts;
2149 double matrix_element = 0.0;
2152 if (std::signbit(type_N.baryon_number()) ==
2153 std::signbit(type_nucleus.baryon_number())) {
2157 matrix_element = 79.0474 / std::pow(tmp, 0.7897) + 654.596 * tmp;
2162 matrix_element = 342.572 / std::pow(tmp, 0.6);
2164 const double spin_factor =
2165 (produced_nucleus->spin() + 1) * (type_N.spin() + 1);
2169 double xsection = matrix_element * spin_factor / (s * cm_mom);
2170 if (produced_nucleus->is_stable()) {
2171 assert(!type_nucleus.is_stable());
2172 xsection *=
pCM_from_s(s, type_N.mass(), produced_nucleus->mass());
2174 assert(type_nucleus.is_stable());
2175 const double resonance_integral =
2176 produced_nucleus->iso_multiplet()->get_integral_NR(sqrts);
2177 xsection *= resonance_integral;
◆ 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 2409 of file crosssections.cc.
2410 double cross_sec = 0.;
2419 if (data_a.is_baryon() && data_b.is_baryon()) {
2422 }
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 2474 of file crosssections.cc.
2478 CollisionBranchList process_list;
2484 ParticleTypePtrList nuc_or_anti_nuc;
2485 if (is_anti_particles) {
2492 for (ParticleTypePtr nuc_a : nuc_or_anti_nuc) {
2493 for (ParticleTypePtr nuc_b : nuc_or_anti_nuc) {
2495 if (type_a.charge() + type_b.charge() !=
2496 nuc_a->charge() + nuc_b->charge()) {
2500 for (
const int twoI : I_tot_range(*nuc_a, *nuc_b)) {
2502 type_a, type_b, *nuc_a, *nuc_b, twoI);
2509 const double matrix_element =
2511 if (matrix_element <= 0.) {
2519 const double spin_factor = (nuc_a->spin() + 1) * (nuc_b->spin() + 1);
2520 const int sym_fac_in =
2521 (type_a.iso_multiplet() == type_b.iso_multiplet()) ? 2 : 1;
2522 const int sym_fac_out =
2523 (nuc_a->iso_multiplet() == nuc_b->iso_multiplet()) ? 2 : 1;
2524 const double xsection = isospin_factor * spin_factor * sym_fac_in /
2525 sym_fac_out * p_cm_final * matrix_element /
2529 process_list.push_back(make_unique<CollisionBranch>(
2532 "2->2 absorption with original particles: ", type_a, type_b);
2537 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 [17]]
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 [48]], eq. 29.
Definition at line 2540 of file crosssections.cc.
2544 const double m_a = type_a.mass();
2545 const double m_b = type_b.mass();
2546 const double msqr = 2. * (m_a * m_a + m_b * m_b);
2554 const double w_a = type_a.width_at_pole();
2555 const double w_b = type_b.width_at_pole();
2556 const double uplmt = m_a + m_b + 3.0 * (w_a + w_b) + 3.0;
2557 if (sqrts > uplmt) {
2561 if (((type_a.is_Delta() && type_b.is_nucleon()) ||
2562 (type_b.is_Delta() && type_a.is_nucleon())) &&
2563 (type_a.antiparticle_sign() == type_b.antiparticle_sign())) {
2564 return 68. / std::pow(sqrts - 1.104, 1.951);
2567 }
else if (((type_a.is_Nstar() && type_b.is_nucleon()) ||
2568 (type_b.is_Nstar() && type_a.is_nucleon())) &&
2569 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2573 }
else if (twoI == 0) {
2574 const double parametrization = 14. / msqr;
2580 if (type_a.is_Nstar1535() || type_b.is_Nstar1535()) {
2581 return 6.5 * parametrization;
2583 return parametrization;
2586 }
else if (((type_a.is_Deltastar() && type_b.is_nucleon()) ||
2587 (type_b.is_Deltastar() && type_a.is_nucleon())) &&
2588 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2591 }
else if ((type_a.is_Delta() && type_b.is_Delta()) &&
2592 (type_a.antiparticle_sign() == type_b.antiparticle_sign())) {
2596 }
else if (twoI == 0) {
2599 }
else if (((type_a.is_Nstar() && type_b.is_Delta()) ||
2600 (type_b.is_Nstar() && type_a.is_Delta())) &&
2601 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2604 }
else if (((type_a.is_Deltastar() && type_b.is_Delta()) ||
2605 (type_b.is_Deltastar() && type_a.is_Delta())) &&
2606 type_a.antiparticle_sign() == type_b.antiparticle_sign()) {
2610 }
else if (twoI == 0) {
2613 }
else if ((type_a.is_deuteron() && type_b.pdgcode().is_pion()) ||
2614 (type_b.is_deuteron() && type_a.pdgcode().is_pion())) {
2620 (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 [51] and Eq. (3.29) in Bass:1998ca [4]
Definition at line 2628 of file crosssections.cc.
2635 CollisionBranchList channel_list;
2639 for (ParticleTypePtr type_res_1 : list_res_1) {
2641 for (ParticleTypePtr type_res_2 : list_res_2) {
2643 if (type_res_1->charge() + type_res_2->charge() !=
2644 type_particle_a.charge() + type_particle_b.charge()) {
2649 for (
const int twoI : I_tot_range(type_particle_a, type_particle_b)) {
2651 type_particle_a, type_particle_b, *type_res_1, *type_res_2, twoI);
2658 const double lower_limit = type_res_1->min_mass_kinematic();
2659 const double upper_limit =
sqrt_s_ - type_res_2->mass();
2663 if (upper_limit - lower_limit < 1E-3) {
2669 sqrt_s_, *type_res_1, *type_res_2, twoI);
2670 if (matrix_element <= 0.) {
2677 const double resonance_integral = integrator(*type_res_1, *type_res_2);
2682 const double spin_factor =
2683 (type_res_1->spin() + 1) * (type_res_2->spin() + 1);
2684 const double xsection = isospin_factor * spin_factor * matrix_element *
2688 channel_list.push_back(make_unique<CollisionBranch>(
2691 "Found 2->2 creation process for resonance ", type_res_1,
", ",
2694 type_particle_a, type_particle_b);
2699 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 547 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 576 of file crosssections.h.
579 const double sqrt_s_min =
580 type_a.min_mass_spectral() + type_b.min_mass_spectral();
582 double scale_B = 0.0;
583 double scale_I3 = 0.0;
584 bool is_below_threshold;
585 FourVector incoming_momentum = FourVector();
588 incoming_momentum +=
p.momentum();
599 is_below_threshold = (incoming_momentum +
potentials_.first * scale_B +
601 .abs() <= sqrt_s_min;
603 is_below_threshold = (sqrts <= sqrt_s_min);
605 if (is_below_threshold) {
608 const auto xsection = get_xsection();
610 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 563 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 566 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.
static double xs_dpi_dprimepi(const double sqrts, const 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 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....
CollisionBranchList two_to_three() const
Find all 2->3 processes for the given scattering.
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.
static double sum_xs_of(const CollisionBranchList &list)
Helper function: Sum all cross sections of the given process list.
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...
double kminusn_elastic_background(double mandelstam_s)
K- n elastic background cross section parametrization Source: Buss:2011mx , B.3.9.
CollisionBranchList two_to_one(const bool prevent_dprime_form) const
Find all resonances that can be produced in a 2->1 collision of the two input particles and the produ...
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.
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.
CollisionBranchPtr NNbar_annihilation(const double current_xs, const double scale_xs) const
Determine the cross section for NNbar annihilation, which is given by the difference between the para...
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
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()
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 ).
static double xs_dn_dprimen(const double sqrts, const 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....
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)
CollisionBranchPtr elastic(double elast_par, bool use_AQM, double add_el_xs, double scale_xs) const
Determine the elastic cross section for this collision.
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
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.
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept