Version: SMASH-3.1
crosssections.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2013-2014,2018-2023
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #ifndef SRC_INCLUDE_SMASH_CROSSSECTIONS_H_
11 #define SRC_INCLUDE_SMASH_CROSSSECTIONS_H_
12 
13 #include <memory>
14 #include <utility>
15 
16 #include "forwarddeclarations.h"
17 #include "isoparticletype.h"
18 #include "particles.h"
19 #include "potential_globals.h"
21 #include "stringprocess.h"
22 
23 namespace smash {
24 
32  public:
41  CrossSections(const ParticleList& incoming_particles, double sqrt_s,
42  const std::pair<FourVector, FourVector> potentials);
43 
57  CollisionBranchList generate_collision_list(
58  const ScatterActionsFinderParameters& finder_parameters,
59  StringProcess* string_process) const;
60 
69  double parametrized_total(
70  const ScatterActionsFinderParameters& finder_parameters) const;
71 
76  static double sum_xs_of(const CollisionBranchList& list) {
77  double xs_sum = 0.0;
78  for (auto& proc : list) {
79  xs_sum += proc->weight();
80  }
81  return xs_sum;
82  }
83 
100  CollisionBranchPtr elastic(
101  const ScatterActionsFinderParameters& finder_parameters) const;
102 
115  CollisionBranchList two_to_one() const;
116 
128  double formation(const ParticleType& type_resonance,
129  double cm_momentum_sqr) const;
130 
142  CollisionBranchList rare_two_to_two() const;
143 
156  CollisionBranchList two_to_two(const ReactionsBitSet& included_2to2,
157  double KN_offset) const;
158 
167  CollisionBranchList two_to_three() const;
168 
177  CollisionBranchList two_to_four() const;
178 
199  CollisionBranchList string_excitation(double total_string_xs,
200  StringProcess* string_process,
201  bool use_AQM) const;
202 
217  CollisionBranchPtr NNbar_annihilation(double current_xs,
218  double scale_xs) const;
219 
227  CollisionBranchList NNbar_creation() const;
228 
238  CollisionBranchPtr NNbar_to_5pi(double scale_xs) const;
239 
247  static double d_pi_inelastic_xs(double pion_kinetic_energy);
248 
256  static double d_N_inelastic_xs(double N_kinetic_energy);
257 
265  static double d_aN_inelastic_xs(double aN_kinetic_energy);
266 
283  static double two_to_three_xs(const ParticleType& type_in1,
284  const ParticleType& type_in2, double sqrts);
285 
297  static double two_to_four_xs(const ParticleType& type_in1,
298  const ParticleType& type_in2, double sqrts);
299 
307  double high_energy(
308  const StringTransitionParameters& transition_high_energy) const;
309 
348  double string_probability(
349  const ScatterActionsFinderParameters& finder_parameters) const;
350 
356  double probability_transit_high(double region_lower,
357  double region_upper) const;
358 
359  private:
370  double elastic_parametrization(bool use_AQM, double pipi_offset) const;
371 
380  double nn_el() const;
381 
392  double npi_el() const;
393 
404  double nk_el() const;
405 
414  CollisionBranchList npi_yk() const;
415 
422  CollisionBranchList bb_xx_except_nn(
423  const ReactionsBitSet& included_2to2) const;
424 
441  CollisionBranchList nn_xx(const ReactionsBitSet& included_2to2) const;
442 
454  CollisionBranchList nk_xx(const ReactionsBitSet& included_2to2,
455  double KN_offset) const;
456 
462  CollisionBranchList deltak_xx(const ReactionsBitSet& included_2to2) const;
463 
469  CollisionBranchList ypi_xx(const ReactionsBitSet& included_2to2) const;
470 
478  CollisionBranchList dpi_xx(const ReactionsBitSet& included_2to2) const;
479 
487  CollisionBranchList dn_xx(const ReactionsBitSet& included_2to2) const;
488 
498  static double xs_dpi_dprimepi(double sqrts, double cm_mom,
499  ParticleTypePtr produced_nucleus,
500  const ParticleType& type_pi);
501 
512  static double xs_dn_dprimen(double sqrts, double cm_mom,
513  ParticleTypePtr produced_nucleus,
514  const ParticleType& type_nucleus,
515  const ParticleType& type_N);
516 
523  double string_hard_cross_section() const;
524 
536  CollisionBranchList bar_bar_to_nuc_nuc(const bool is_anti_particles) const;
537 
550  static double nn_to_resonance_matrix_element(double sqrts,
551  const ParticleType& type_a,
552  const ParticleType& type_b,
553  const int twoI);
554 
564  template <class IntegrationMethod>
565  CollisionBranchList find_nn_xsection_from_type(
566  const ParticleTypePtrList& type_res_1,
567  const ParticleTypePtrList& type_res_2,
568  const IntegrationMethod integrator) const;
569 
575  double cm_momentum() const {
576  const double m1 = incoming_particles_[0].effective_mass();
577  const double m2 = incoming_particles_[1].effective_mass();
578  return pCM(sqrt_s_, m1, m2);
579  }
580 
582  const ParticleList incoming_particles_;
583 
585  const double sqrt_s_;
586 
591  const std::pair<FourVector, FourVector> potentials_;
592 
597  const bool is_BBbar_pair_;
598 
600  const bool is_NNbar_pair_;
601 
609  template <typename F>
610  void add_channel(CollisionBranchList& process_list, F&& get_xsection,
611  double sqrts, const ParticleType& type_a,
612  const ParticleType& type_b) const {
613  const double sqrt_s_min =
614  type_a.min_mass_spectral() + type_b.min_mass_spectral();
615  /* Determine wether the process is below the threshold. */
616  double scale_B = 0.0;
617  double scale_I3 = 0.0;
618  bool is_below_threshold;
619  FourVector incoming_momentum = FourVector();
620  if (pot_pointer != nullptr) {
621  for (const auto& p : incoming_particles_) {
622  incoming_momentum += p.momentum();
623  scale_B += pot_pointer->force_scale(p.type()).first;
624  scale_I3 +=
625  pot_pointer->force_scale(p.type()).second * p.type().isospin3_rel();
626  }
627  scale_B -= pot_pointer->force_scale(type_a).first;
628  scale_I3 -=
629  pot_pointer->force_scale(type_a).second * type_a.isospin3_rel();
630  scale_B -= pot_pointer->force_scale(type_b).first;
631  scale_I3 -=
632  pot_pointer->force_scale(type_b).second * type_b.isospin3_rel();
633  is_below_threshold = (incoming_momentum + potentials_.first * scale_B +
634  potentials_.second * scale_I3)
635  .abs() <= sqrt_s_min;
636  } else {
637  is_below_threshold = (sqrts <= sqrt_s_min);
638  }
639  if (is_below_threshold) {
640  return;
641  }
642  const auto xsection = get_xsection();
643  if (xsection > really_small) {
644  process_list.push_back(std::make_unique<CollisionBranch>(
645  type_a, type_b, xsection, ProcessType::TwoToTwo));
646  }
647  }
648 };
649 
650 } // namespace smash
651 
652 #endif // SRC_INCLUDE_SMASH_CROSSSECTIONS_H_
The cross section class assembels everything that is needed to calculate the cross section and return...
Definition: crosssections.h:31
const double sqrt_s_
Total energy in the center-of-mass frame.
static double d_N_inelastic_xs(double N_kinetic_energy)
Parametrization of deuteron-nucleon inelastic cross section.
static double xs_dpi_dprimepi(double sqrts, double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_pi)
Parametrized cross section for πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse,...
CollisionBranchList two_to_two(const ReactionsBitSet &included_2to2, double KN_offset) const
Find all inelastic 2->2 processes for the given scattering.
CollisionBranchPtr NNbar_to_5pi(double scale_xs) const
Create collision branch for NNbar annihilation going directly into 5 pions.
double probability_transit_high(double region_lower, double region_upper) const
CollisionBranchList NNbar_creation() const
Determine the cross section for NNbar creation, which is given by detailed balance from the reverse r...
CollisionBranchList dpi_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron (dpi), specifically dπ→ NN,...
CollisionBranchList bb_xx_except_nn(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering except the more specific Nucleon-...
CollisionBranchList npi_yk() const
Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering.
CollisionBranchList find_nn_xsection_from_type(const ParticleTypePtrList &type_res_1, const ParticleTypePtrList &type_res_2, const IntegrationMethod integrator) const
Utility function to avoid code replication in nn_xx().
double cm_momentum() const
Determine the momenta of the incoming particles in the center-of-mass system.
CollisionBranchList bar_bar_to_nuc_nuc(const bool is_anti_particles) const
Calculate cross sections for resonance absorption (i.e.
double string_probability(const ScatterActionsFinderParameters &finder_parameters) const
CollisionBranchList deltak_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering.
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...
CrossSections(const ParticleList &incoming_particles, double sqrt_s, const std::pair< FourVector, FourVector > potentials)
Construct CrossSections instance.
static double xs_dn_dprimen(double sqrts, double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_nucleus, const ParticleType &type_N)
Parametrized cross section for Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e....
CollisionBranchList two_to_four() const
Find all 2->4 processes for the given scattering.
CollisionBranchPtr elastic(const ScatterActionsFinderParameters &finder_parameters) const
Determine the elastic cross section for this collision.
double formation(const ParticleType &type_resonance, double cm_momentum_sqr) const
Return the 2-to-1 resonance production cross section for a given resonance.
void add_channel(CollisionBranchList &process_list, F &&get_xsection, double sqrts, const ParticleType &type_a, const ParticleType &type_b) const
Helper function: Add a 2-to-2 channel to a collision branch list given a cross section.
double string_hard_cross_section() const
Determine the (parametrized) hard non-diffractive string cross section for this collision.
const std::pair< FourVector, FourVector > potentials_
Potentials at the interacting point.
static double two_to_three_xs(const ParticleType &type_in1, const ParticleType &type_in2, double sqrts)
Determine 2->3 cross section for the scattering of the given particle types.
double nk_el() const
Determine the elastic cross section for a nucleon-kaon (NK) collision.
CollisionBranchList nk_xx(const ReactionsBitSet &included_2to2, double KN_offset) const
Find all inelastic 2->2 background processes for Nucleon-Kaon (NK) Scattering.
CollisionBranchList two_to_one() const
Find all resonances that can be produced in a 2->1 collision of the two input particles and the produ...
const ParticleList incoming_particles_
List with data of scattering particles.
double npi_el() const
Determine the elastic cross section for a nucleon-pion (Npi) collision.
double nn_el() const
Determine the (parametrized) elastic cross section for a nucleon-nucleon (NN) collision.
const bool is_BBbar_pair_
Whether incoming particles are a pair of a baryon and an antibaryon (could be different baryon types)
CollisionBranchList dn_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron (dN), specifically Nd → Nd',...
double elastic_parametrization(bool use_AQM, double pipi_offset) const
Choose the appropriate parametrizations for given incoming particles and return the (parametrized) el...
static double two_to_four_xs(const ParticleType &type_in1, const ParticleType &type_in2, double sqrts)
Determine 2->4 cross section for the scattering of the given particle types.
CollisionBranchList ypi_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering.
double parametrized_total(const ScatterActionsFinderParameters &finder_parameters) const
Select the parametrization for the total cross section, given the types of incoming particles.
const bool is_NNbar_pair_
Whether incoming particles are a nulecon-antinucleon pair (same isospin)
static double nn_to_resonance_matrix_element(double sqrts, const ParticleType &type_a, const ParticleType &type_b, const int twoI)
Scattering matrix amplitude squared (divided by 16π) for resonance production processes like NN → NR ...
CollisionBranchList rare_two_to_two() const
Find all 2->2 processes which are suppressed at high energies when strings are turned on with probabi...
static double sum_xs_of(const CollisionBranchList &list)
Helper function: Sum all cross sections of the given process list.
Definition: crosssections.h:76
CollisionBranchList two_to_three() const
Find all 2->3 processes for the given scattering.
static double d_aN_inelastic_xs(double aN_kinetic_energy)
Parametrization of deuteron-antinucleon inelastic cross section.
CollisionBranchPtr NNbar_annihilation(double current_xs, double scale_xs) const
Determine the cross section for NNbar annihilation, which is given by the difference between the para...
CollisionBranchList generate_collision_list(const ScatterActionsFinderParameters &finder_parameters, StringProcess *string_process) const
Generate a list of all possible collisions between the incoming particles with the given c....
static double d_pi_inelastic_xs(double pion_kinetic_energy)
Parametrization of deuteron-pion inelastic cross section.
double high_energy(const StringTransitionParameters &transition_high_energy) const
Determine the parametrized total cross section at high energies for the given collision,...
CollisionBranchList nn_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:33
A pointer-like interface to global references to ParticleType objects.
Definition: particletype.h:676
Particle type contains the static properties of a particle species.
Definition: particletype.h:98
double min_mass_spectral() const
The minimum mass of the resonance, where the spectral function is non-zero.
double isospin3_rel() const
Definition: particletype.h:180
static std::pair< double, int > force_scale(const ParticleType &data)
Evaluates the scaling factor of the forces acting on the particles.
Definition: potentials.cc:156
String excitation processes used in SMASH.
Definition: stringprocess.h:45
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
constexpr int p
Proton.
Definition: action.h:24
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
@ TwoToTwo
See here for a short description.
Potentials * pot_pointer
Pointer to a Potential class.
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
Helper structure for ScatterActionsFinder.
Constants related to transition between low and high collision energies.