Version: SMASH-3.0
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 
65  static double sum_xs_of(const CollisionBranchList& list) {
66  double xs_sum = 0.0;
67  for (auto& proc : list) {
68  xs_sum += proc->weight();
69  }
70  return xs_sum;
71  }
72 
89  CollisionBranchPtr elastic(
90  const ScatterActionsFinderParameters& finder_parameters) const;
91 
104  CollisionBranchList two_to_one() const;
105 
117  double formation(const ParticleType& type_resonance,
118  double cm_momentum_sqr) const;
119 
131  CollisionBranchList rare_two_to_two() const;
132 
145  CollisionBranchList two_to_two(const ReactionsBitSet& included_2to2,
146  double KN_offset) const;
147 
156  CollisionBranchList two_to_three() const;
157 
166  CollisionBranchList two_to_four() const;
167 
188  CollisionBranchList string_excitation(double total_string_xs,
189  StringProcess* string_process,
190  bool use_AQM) const;
191 
206  CollisionBranchPtr NNbar_annihilation(double current_xs,
207  double scale_xs) const;
208 
216  CollisionBranchList NNbar_creation() const;
217 
227  CollisionBranchPtr NNbar_to_5pi(double scale_xs) const;
228 
236  static double d_pi_inelastic_xs(double pion_kinetic_energy);
237 
245  static double d_N_inelastic_xs(double N_kinetic_energy);
246 
254  static double d_aN_inelastic_xs(double aN_kinetic_energy);
255 
272  static double two_to_three_xs(const ParticleType& type_in1,
273  const ParticleType& type_in2, double sqrts);
274 
286  static double two_to_four_xs(const ParticleType& type_in1,
287  const ParticleType& type_in2, double sqrts);
288 
296  double high_energy(
297  const StringTransitionParameters& transition_high_energy) const;
298 
337  double string_probability(
338  const ScatterActionsFinderParameters& finder_parameters) const;
339 
345  double probability_transit_high(double region_lower,
346  double region_upper) const;
347 
348  private:
359  double elastic_parametrization(bool use_AQM, double pipi_offset) const;
360 
369  double nn_el() const;
370 
381  double npi_el() const;
382 
393  double nk_el() const;
394 
403  CollisionBranchList npi_yk() const;
404 
411  CollisionBranchList bb_xx_except_nn(
412  const ReactionsBitSet& included_2to2) const;
413 
430  CollisionBranchList nn_xx(const ReactionsBitSet& included_2to2) const;
431 
443  CollisionBranchList nk_xx(const ReactionsBitSet& included_2to2,
444  double KN_offset) const;
445 
451  CollisionBranchList deltak_xx(const ReactionsBitSet& included_2to2) const;
452 
458  CollisionBranchList ypi_xx(const ReactionsBitSet& included_2to2) const;
459 
467  CollisionBranchList dpi_xx(const ReactionsBitSet& included_2to2) const;
468 
476  CollisionBranchList dn_xx(const ReactionsBitSet& included_2to2) const;
477 
487  static double xs_dpi_dprimepi(double sqrts, double cm_mom,
488  ParticleTypePtr produced_nucleus,
489  const ParticleType& type_pi);
490 
501  static double xs_dn_dprimen(double sqrts, double cm_mom,
502  ParticleTypePtr produced_nucleus,
503  const ParticleType& type_nucleus,
504  const ParticleType& type_N);
505 
512  double string_hard_cross_section() const;
513 
525  CollisionBranchList bar_bar_to_nuc_nuc(const bool is_anti_particles) const;
526 
539  static double nn_to_resonance_matrix_element(double sqrts,
540  const ParticleType& type_a,
541  const ParticleType& type_b,
542  const int twoI);
543 
553  template <class IntegrationMethod>
554  CollisionBranchList find_nn_xsection_from_type(
555  const ParticleTypePtrList& type_res_1,
556  const ParticleTypePtrList& type_res_2,
557  const IntegrationMethod integrator) const;
558 
564  double cm_momentum() const {
565  const double m1 = incoming_particles_[0].effective_mass();
566  const double m2 = incoming_particles_[1].effective_mass();
567  return pCM(sqrt_s_, m1, m2);
568  }
569 
571  const ParticleList incoming_particles_;
572 
574  const double sqrt_s_;
575 
580  const std::pair<FourVector, FourVector> potentials_;
581 
586  const bool is_BBbar_pair_;
587 
589  const bool is_NNbar_pair_;
590 
598  template <typename F>
599  void add_channel(CollisionBranchList& process_list, F&& get_xsection,
600  double sqrts, const ParticleType& type_a,
601  const ParticleType& type_b) const {
602  const double sqrt_s_min =
603  type_a.min_mass_spectral() + type_b.min_mass_spectral();
604  /* Determine wether the process is below the threshold. */
605  double scale_B = 0.0;
606  double scale_I3 = 0.0;
607  bool is_below_threshold;
608  FourVector incoming_momentum = FourVector();
609  if (pot_pointer != nullptr) {
610  for (const auto& p : incoming_particles_) {
611  incoming_momentum += p.momentum();
612  scale_B += pot_pointer->force_scale(p.type()).first;
613  scale_I3 +=
614  pot_pointer->force_scale(p.type()).second * p.type().isospin3_rel();
615  }
616  scale_B -= pot_pointer->force_scale(type_a).first;
617  scale_I3 -=
618  pot_pointer->force_scale(type_a).second * type_a.isospin3_rel();
619  scale_B -= pot_pointer->force_scale(type_b).first;
620  scale_I3 -=
621  pot_pointer->force_scale(type_b).second * type_b.isospin3_rel();
622  is_below_threshold = (incoming_momentum + potentials_.first * scale_B +
623  potentials_.second * scale_I3)
624  .abs() <= sqrt_s_min;
625  } else {
626  is_below_threshold = (sqrts <= sqrt_s_min);
627  }
628  if (is_below_threshold) {
629  return;
630  }
631  const auto xsection = get_xsection();
632  if (xsection > really_small) {
633  process_list.push_back(std::make_unique<CollisionBranch>(
634  type_a, type_b, xsection, ProcessType::TwoToTwo));
635  }
636  }
637 };
638 
639 } // namespace smash
640 
641 #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.
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:65
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:672
Particle type contains the static properties of a particle species.
Definition: particletype.h:97
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:179
static std::pair< double, int > force_scale(const ParticleType &data)
Evaluates the scaling factor of the forces acting on the particles.
Definition: potentials.cc:145
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.