Version: SMASH-3.4
crosssections.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2013-2014,2018-2024,2026
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 <optional>
15 #include <utility>
16 
18 #include "smash/isoparticletype.h"
19 #include "smash/particles.h"
22 #include "smash/stringprocess.h"
23 
24 namespace smash {
25 
26 /**
27  * The CrossSections class assembles everything that is needed to calculate
28  * cross sections and gathers a list of all possible reactions for the incoming
29  * particles at the given energy with the calculated cross sections.
30  */
32  public:
33  /**
34  * Construct CrossSections instance.
35  *
36  * \param[in] incoming_particles Particles that are interacting.
37  * \param[in] sqrt_s Center-of-mass energy of the reaction.
38  * \param[in] potentials Potentials at the interacting point. They are
39  * used to calculate the corrections on the thresholds.
40  */
41  CrossSections(const ParticleList& incoming_particles, double sqrt_s,
42  const std::pair<FourVector, FourVector> potentials);
43 
44  /**
45  * Generate a list of all possible collisions between the incoming particles
46  * with the given c.m. energy and the calculated cross sections.
47  * The string processes are not added at this step if it is not triggerd
48  * according to the probability. It will then be added in
49  * add_all_scatterings in scatteraction.cc
50  *
51  * \param[in] finder_parameters parameters for collision finding.
52  * \param[in] string_process a pointer to the StringProcess object,
53  * which is used for string excitation and fragmentation.
54  *
55  * \return List of all possible collisions.
56  */
57  CollisionBranchList generate_collision_list(
58  const ScatterActionsFinderParameters& finder_parameters,
59  StringProcess* string_process) const;
60 
61  /**
62  * Select the parametrization for the total cross section, given the types of
63  * incoming particles.
64  *
65  * \param[in] finder_parameters Parameters for collision finding, containing
66  * cut for low energy NN interactions.
67  *
68  * \return The appropriate total cross section value.
69  */
70  double parametrized_total(
71  const ScatterActionsFinderParameters& finder_parameters) const;
72 
73  /**
74  * Helper function:
75  * Sum all cross sections of the given process list.
76  */
77  static double sum_xs_of(const CollisionBranchList& list) {
78  double xs_sum = 0.0;
79  for (auto& proc : list) {
80  xs_sum += proc->weight();
81  }
82  return xs_sum;
83  }
84 
85  /**
86  * Determine the elastic cross section for this collision. If elastic_par is
87  * given (and positive), we just use a constant cross section of that size,
88  * otherwise a parametrization of the elastic cross section is used
89  * (if available). Optional a constant additional elastic cross section is
90  * added
91  *
92  * \param[in] finder_parameters parameters for collision finding, including
93  * cross section modifications from config file.
94  *
95  * \note The additional constant elastic cross section contribution is added
96  * after the scaling of the cross section.
97  *
98  * \return A ProcessBranch object containing the cross section and
99  * final-state IDs.
100  */
101  CollisionBranchPtr elastic(
102  const ScatterActionsFinderParameters& finder_parameters) const;
103 
104  /**
105  * Find all resonances that can be produced in a 2->1 collision of the two
106  * input particles and the production cross sections of these resonances.
107  *
108  * Given the data and type information of two colliding particles,
109  * create a list of possible resonance production processes
110  * and their cross sections.
111  *
112  * If <tt>\ref key_CT_charm_rescattering_ "Charm_Rescattering_Method"</tt> is
113  * not set to `"Resonances"` then interactions of charmed hadrons will not be
114  * considered in two to one processes.
115  *
116  * \param[in] charm_rescattering Type of charm rescattering
117  *
118  * \return A list of processes with resonance in the final state.
119  * Each element in the list contains the type of the final-state particle
120  * and the cross section for that particular process.
121  */
122  CollisionBranchList two_to_one(CharmRescattering charm_rescattering) const;
123 
124  /**
125  * Calculates the 2-to-1 resonance production cross section for a given
126  * resonance using the Breit-Wigner distribution as probability amplitude.
127  * See eq. (176) in \iref{Buss:2011mx}.
128  *
129  * \param[in] type_resonance Type information for the resonance to be
130  * produced.
131  * \param[in] cm_momentum_sqr Square of the center-of-mass momentum of the
132  * two initial particles.
133  *
134  * \return The cross section for the process
135  * [initial particle a] + [initial particle b] -> resonance.
136  */
137  double formation(const ParticleType& type_resonance,
138  double cm_momentum_sqr) const;
139 
140  /**
141  * Find all 2->2 processes which are suppressed at high energies when
142  * strings are turned on with probabilites, but important for the
143  * production of rare species such as strange particles.
144  *
145  * This function should call the different, more specific functions for
146  * the different scatterings. But so far, only Nucleon-Pion to Hyperon-
147  * Kaon scattering is implemented.
148  *
149  * \return List of all possible rare 2->2 processes.
150  */
151  CollisionBranchList rare_two_to_two() const;
152 
153  /**
154  * Find all inelastic 2->2 processes for the given scattering.
155  *
156  * This function calls the different, more specific functions for
157  * the different scatterings.
158  *
159  * \param[in] included_2to2 Which 2->2 reactions are enabled?
160  * \param[in] KN_offset Offset to the minimum energy for string production in
161  * KN scatterings
162  * \param[in] charm_rescattering Type of charm rescattering
163  *
164  * \return List of all possible inelastic 2->2 processes.
165  */
166  CollisionBranchList two_to_two(const ReactionsBitSet& included_2to2,
167  double KN_offset,
168  CharmRescattering charm_rescattering) const;
169 
170  /**
171  * Find all 2->3 processes for the given scattering.
172  *
173  * This function calls the different, more specific functions for
174  * the different scatterings.
175  *
176  * \return List of all possible 2->3 processes.
177  */
178  CollisionBranchList two_to_three() const;
179 
180  /**
181  * Find all 2->4 processes for the given scattering.
182  *
183  * This function calls the different, more specific functions for
184  * the different scatterings.
185  *
186  * \return List of all possible 2->4 processes.
187  */
188  CollisionBranchList two_to_four() const;
189 
190  /**
191  * Determine the cross section for string excitations, which is given by the
192  * difference between the parametrized total cross section and all the
193  * explicitly implemented channels at low energy (elastic, resonance
194  * excitation, etc).
195  *
196  * \param[in] total_string_xs Total cross section for the string process [mb]
197  * \param[in] string_process a pointer to the StringProcess object,
198  * which is used for string excitation and fragmentation
199  * \param[in] finder_parameters parameters for collision finding and cross
200  * sections
201  * \return List of subprocesses (single-diffractive, double-diffractive and
202  * non-diffractive) with their cross sections
203  *
204  * \throw std::runtime_error if string_process is a null pointer
205  *
206  * This method has to be called after all other processes
207  * have been determined.
208  * \todo Same assumption made by NNbar_annihilation. Resolve.
209  */
210  CollisionBranchList string_excitation(
211  double total_string_xs, StringProcess* string_process,
212  const ScatterActionsFinderParameters& finder_parameters) const;
213 
214  /**
215  * Determine the cross section for NNbar annihilation, which is given by the
216  * difference between the parametrized total cross section and all the
217  * explicitly implemented channels at low energy (in this case only elastic).
218  * \param[in] current_xs Sum of all cross sections of already determined
219  * processes
220  * \param[in] scale_xs Factor by which all (partial) cross sections are scaled
221  * \return Collision Branch with NNbar annihilation process and its cross
222  * section
223  *
224  * This method has to be called after all other processes
225  * have been determined.
226  * \todo Same assumption made by string_excitation. Resolve.
227  */
228  CollisionBranchPtr NNbar_annihilation(double current_xs,
229  double scale_xs) const;
230 
231  /**
232  * Determine the cross section for NNbar creation, which is given by
233  * detailed balance from the reverse reaction. See
234  * NNbar_annihilation.
235  * \return Collision Branch with NNbar creation process and its cross
236  * section
237  */
238  CollisionBranchList NNbar_creation() const;
239 
240  /**
241  * Create collision branch for NNbar annihilation going directly into 5 pions.
242  * The cross section is given by the parametrized ppbar cross section, which
243  * is also used for the reverse 5-to-2 process.
244  *
245  * \param[in] scale_xs Factor by which all (partial) cross sections are scaled
246  * \return Collision Branch with NNbar annihilation process
247  *
248  */
249  CollisionBranchPtr NNbar_to_5pi(double scale_xs) const;
250 
251  /**
252  * Determine 2->3 cross section for the scattering of the given particle
253  * types.
254  *
255  * That the function only depends on the types of particles (plus sqrt(s)) and
256  * not on the specific particles, is an assumption needed in order to treat
257  * the 3->2 back-reaction with the stochastic criterion, where this function
258  * also needs to be called for 3-to-2 collision probability with only types
259  * and sqrt(s) known at this point. Therefore the function is also made
260  * static.
261  *
262  * \param[in] type_in1 first scatterning particle type
263  * \param[in] type_in2 second scatterning particle type
264  * \param[in] sqrts center-of-mass energy of scattering
265  * \return cross section for 2->3 process
266  */
267  static double two_to_three_xs(const ParticleType& type_in1,
268  const ParticleType& type_in2, double sqrts);
269 
270  /**
271  * Determine 2->4 cross section for the scattering of the given particle
272  * types.
273  *
274  * Same assumptions as for 2->3 cross section, see respective documentation.
275  *
276  * \param[in] type_in1 first scatterning particle type
277  * \param[in] type_in2 second scatterning particle type
278  * \param[in] sqrts center-of-mass energy of scattering
279  * \return cross section for 2->4 process
280  */
281  static double two_to_four_xs(const ParticleType& type_in1,
282  const ParticleType& type_in2, double sqrts);
283 
284  /**
285  * Determine the parametrized total cross section at high energies
286  * for the given collision, which is non-zero for Baryon-Baryon and
287  * Nucleon-Pion scatterings currently.
288  *
289  * This is rescaled by AQM factors.
290  *
291  * \param[in] finder_parameters parameters for collision finding and cross
292  * sections.
293  */
294  double high_energy(
295  const ScatterActionsFinderParameters& finder_parameters) const;
296 
297  /**
298  * \return the probability whether the scattering between the incoming
299  * particles is via string fragmentation or not.
300  *
301  * If use_transition_probability is true:
302  * The string fragmentation is implemented in the same way in GiBUU (Physics
303  * Reports 512(2012), 1-124, pg. 33). If the center of mass energy is low, two
304  * particles scatter through the resonance channels. If high, the outgoing
305  * particles are generated by string fragmentation. If in between, the out-
306  * going particles are generated either through the resonance channels or
307  * string fragmentation by chance. In detail, the low energy region is from
308  * the threshold to (mix_scatter_type_energy - mix_scatter_type_window_width),
309  * while the high energy region is from (mix_scatter_type_energy +
310  * mix_scatter_type_window_width) to infinity. In between, the probability for
311  * string fragmentation increases smoothly from 0 to 1 as the c.m. energy.
312  *
313  * If use_transition_probability is false:
314  * The string fragmentation is implemented similarly to what is in UrQMD
315  * (\iref{Bass:1998ca}). If sqrts is lower than some cutoff value, there are
316  * no strings. If higher, strings are allowed, with the cross-section being
317  * the difference between some parametrized total cross-section and the sum
318  * of all other channels, if this parametrization is larger than the sum of
319  * the channels. If not, strings are not allowed (this cross-section check
320  * is performed directly after the function is called, for technical reasons).
321  *
322  * Both of these methods are initially implemented for NN and Npi cross-
323  * sections, and extended using the AQM to all BB, BM and MM interactions.
324  *
325  * Baryon-antibaryon annihilation also uses this function to decide whether to
326  * produce strings or not.
327  * Since there are no other contributions for this process, there are no
328  * cutoffs or gradual increase in the probability of this process happening or
329  * not, it just requires the proper combination of incoming particles and
330  * config parameters.
331  *
332  * \param[in] finder_parameters parameters for collision finding and cross
333  * sections.
334  */
335  double string_probability(
336  const ScatterActionsFinderParameters& finder_parameters) const;
337  /**
338  * Computes a smooth transition probability as a function of sqrt(s).
339  *
340  * The probability is:
341  * - 0 for sqrt(s) < region_lower
342  * - 1 for sqrt(s) > region_upper
343  * - smoothly varying between 0 and 1 inside the transition region
344  * according to a sinusoidal profile
345  *
346  * This probability can be used to determine the relative contribution of
347  * two processes or regimes (e.g. soft ↔ hard string excitation).
348  *
349  * \param[in] region_lower Lower bound of the transition region in sqrt(s)
350  * [GeV]
351  * \param[in] region_upper Upper bound of the transition region in sqrt(s)
352  * [GeV]
353  *
354  * \return Transition probability in the interval [0,1]
355  */
356  double transition_probability_at_sqrts(double region_lower,
357  double region_upper) const;
358 
359  private:
360  /**
361  * Choose the appropriate parametrizations for given incoming particles and
362  * return the (parametrized) elastic cross section.
363  *
364  * \param[in] finder_parameters parameters for collision finding and cross
365  * sections, containing whether to extend string cross-sections with AQM and
366  * the offset to the minimum energy for string production in \f$\pi\pi \f$
367  * scatterings
368  *
369  * \return Elastic cross section
370  *
371  * \throw std::runtime_error if elastic cross section is negative.
372  */
374  const ScatterActionsFinderParameters& finder_parameters) const;
375 
376  /**
377  * Determine the (parametrized) elastic cross section for a
378  * nucleon-nucleon (NN) collision.
379  * \return Elastic cross section for NN
380  *
381  * \throw std::runtime_error if positive cross section cannot be specified.
382  */
383  double nn_el() const;
384 
385  /**
386  * Determine the elastic cross section for a nucleon-pion (Npi) collision.
387  * It is given by a parametrization of experimental data.
388  * \return Elastic cross section for Npi
389  *
390  * \throw std::runtime_error if incoming particles are not nucleon+pion.
391  * \throw std::runtime_error if positive cross section cannot be specified.
392  */
393  double npi_el() const;
394 
395  /**
396  * Determine the elastic cross section for a nucleon-kaon (NK) collision.
397  * It is given by a parametrization of experimental data.
398  * \return Elastic cross section for NK
399  *
400  * \throw std::runtime_error if incoming particles are not nucleon+kaon.
401  * \throw std::runtime_error if positive cross section cannot be specified.
402  */
403  double nk_el() const;
404 
405  /**
406  * Determine the elastic cross section for a D meson-pion (Dpi) or a D*-pion
407  * (D*pi) collision. If the center-of-mass energy for the collision is below
408  * the lower bound of the energy range of the underlying cross section data,
409  * the return value is zero. If it is above the upper bound, the return value
410  * will be `std::nullopt`.
411  *
412  * \return Elastic cross section for Dpi or D*pi.
413  *
414  * \throw std::runtime_error if incoming particles are not Dpi or D*pi.
415  * \throw std::runtime_error if cross section is negative.
416  */
417  std::optional<double> Dpi_and_Dstarpi_elastic() const;
418 
419  /**
420  * Determine the inelastic cross section for a D meson-pion (Dpi) or a D*-pion
421  * (D*pi) collision.
422  *
423  * \return Inlastic cross section for Dpi or D*pi.
424  *
425  * \throw std::runtime_error if incoming particles are not Dpi or D*pi.
426  * \throw std::runtime_error if cross section is negative.
427  */
428  double Dpi_and_Dstarpi_inelastic() const;
429 
430  /**
431  * Determine the elastic cross section for a D meson-eta (Deta) or a D*-eta
432  * (D*eta) collision. If the center-of-mass energy for the collision is below
433  * the lower bound of the energy range of the underlying cross section data,
434  * the return value is zero. If it is above the upper bound, the return value
435  * will be `std::nullopt`.
436  *
437  * \return Elastic cross section for Deta or D*eta.
438  *
439  * \throw std::runtime_error if incoming particles are not Deta or D*eta.
440  * \throw std::runtime_error if cross section is negative.
441  */
442  std::optional<double> Deta_and_Dstareta_elastic() const;
443 
444  /**
445  * Determine the elastic cross section for a D meson-kaon (DK) or a D*-kaon
446  * (D*K) collision. If the center-of-mass energy for the collision is below
447  * the lower bound of the energy range of the underlying cross section data,
448  * the return value is zero. If it is above the upper bound, the return value
449  * will be `std::nullopt`.
450  *
451  * \return Elastic cross section for DK or D*K.
452  *
453  * \throw std::runtime_error if incoming particles are not DK or D*K.
454  * \throw std::runtime_error if cross section is negative.
455  */
456  std::optional<double> DK_and_DstarK_elastic() const;
457 
458  /**
459  * Determine the inelastic cross section for a D meson-kaon (DK) or a D*-kaon
460  * (D*K) collision.
461  *
462  * \return Inlastic cross section for DK or D*K.
463  *
464  * \throw std::runtime_error if incoming particles are not DK or D*K.
465  * \throw std::runtime_error if cross section is negative.
466  */
467  double DK_and_DstarK_inelastic() const;
468 
469  /**
470  * Determine the elastic cross section for a D meson-nucleon (DN) collision,
471  * If the center-of-mass energy for the collision is below the lower bound of
472  * the energy range of the underlying cross section data, the return value is
473  * zero. If it is above the upper bound, the return value will be
474  * `std::nullopt`.
475  *
476  * \return Elastic cross section for DN.
477  *
478  * \throw std::runtime_error if incoming particles are not DN.
479  * \throw std::runtime_error if cross section is negative.
480  */
481  std::optional<double> DN_elastic() const;
482 
483  /**
484  * Determine the inelastic cross section for a D meson-nucleon (DN) collision.
485  *
486  * \return Inlastic cross section for DN.
487  *
488  * \throw std::runtime_error if incoming particles are not DN.
489  * \throw std::runtime_error if cross section is negative.
490  */
491  double DN_inelastic() const;
492 
493  /**
494  * Determine the elastic cross section for a D meson-Delta (DΔ) collision,
495  * If the center-of-mass energy for the collision is below the lower bound of
496  * the energy range of the underlying cross section data, the return value is
497  * zero. If it is above the upper bound, the return value will be
498  * `std::nullopt`.
499  *
500  * \return Elastic cross section for DΔ.
501  *
502  * \throw std::runtime_error if incoming particles are not DΔ.
503  * \throw std::runtime_error if cross section is negative.
504  */
505  std::optional<double> DDelta_elastic() const;
506 
507  /**
508  * Determine the inelastic cross section for a D meson-Delta (DΔ) collision.
509  *
510  * \return Inlastic cross section for DΔ.
511  *
512  * \throw std::runtime_error if incoming particles are not DΔ.
513  * \throw std::runtime_error if cross section is negative.
514  */
515  double DDelta_inelastic() const;
516 
517  /**
518  * Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering.
519  * These scatterings are suppressed at high energies when strings are
520  * turned on with probabilities, so they need to be added back manually.
521  *
522  * \return List of all possible Npi -> YK reactions with their cross sections
523  */
524  CollisionBranchList npi_yk() const;
525 
526  /**
527  * Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering
528  * except the more specific Nucleon-Nucleon Scattering.
529  * \param[in] included_2to2 Which 2->2 reactions are enabled?
530  * \return List of all possible BB reactions with their cross sections
531  */
532  CollisionBranchList bb_xx_except_nn(
533  const ReactionsBitSet& included_2to2) const;
534 
535  /**
536  * Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering.
537  * Calculate cross sections for resonance production from
538  * nucleon-nucleon collisions (i.e. N N -> N R, N N -> Delta R).
539  *
540  * Checks are processed in the following order:
541  * 1. Charge conservation
542  * 2. Isospin factors (Clebsch-Gordan)
543  * 3. Enough energy for all decay channels to be available for the resonance
544  *
545  * \param[in] included_2to2 Which 2->2 reactions are enabled?
546  *
547  * \return List of resonance production processes possible in the collision
548  * of the two nucleons. Each element in the list contains the type(s) of the
549  * final state particle(s) and the cross section for that particular process.
550  */
551  CollisionBranchList nn_xx(const ReactionsBitSet& included_2to2) const;
552 
553  /**
554  * Find all inelastic 2->2 background processes for Nucleon-Kaon (NK)
555  * Scattering.
556  *
557  * \param[in] included_2to2 Which 2->2 reactions are enabled?
558  * \param[in] KN_offset Offset to the minimum energy for string production in
559  * KN scatterings
560  *
561  * \return List of all possible NK reactions with their cross sections
562  */
563  CollisionBranchList nk_xx(const ReactionsBitSet& included_2to2,
564  double KN_offset) const;
565 
566  /**
567  * Find all inelastic 2->2 processes for D meson-pion (Dpi) and D*-pion (D*pi)
568  * scattering.
569  *
570  * \param[in] included_2to2 Which 2->2 reactions are enabled?
571  * \param[in] charm_rescattering Type of charm rescattering
572  *
573  * \return List of all possible Dpi or D*pi reactions with their cross
574  * sections
575  */
576  CollisionBranchList Dpi_and_Dstarpi_xx(
577  const ReactionsBitSet& included_2to2,
578  CharmRescattering charm_rescattering) const;
579 
580  /**
581  * Find all inelastic 2->2 processes for D meson-kaon (DK) and D*-kaon (D*K)
582  * scattering.
583  *
584  * \param[in] included_2to2 Which 2->2 reactions are enabled?
585  * \param[in] charm_rescattering Type of charm rescattering
586  *
587  * \return List of all possible DK or D*K reactions with their cross sections
588  */
589  CollisionBranchList DK_and_DstarK_xx(
590  const ReactionsBitSet& included_2to2,
591  CharmRescattering charm_rescattering) const;
592 
593  /**
594  * Find all inelastic 2->2 processes for D meson-nucleon (DN) scatterings.
595  *
596  * \param[in] included_2to2 Which 2->2 reactions are enabled?
597  * \param[in] charm_rescattering Type of charm rescattering
598  *
599  * \return List of all possible DN reactions with their cross sections
600  */
601  CollisionBranchList DN_xx(const ReactionsBitSet& included_2to2,
602  CharmRescattering charm_rescattering) const;
603 
604  /**
605  * Find all inelastic 2->2 processes for D meson-Delta (DΔ) scatterings.
606  *
607  * \param[in] included_2to2 Which 2->2 reactions are enabled?
608  * \param[in] charm_rescattering Type of charm rescattering
609  *
610  * \return List of all possible DΔ reactions with their cross sections
611  */
612  CollisionBranchList DDelta_xx(const ReactionsBitSet& included_2to2,
613  CharmRescattering charm_rescattering) const;
614 
615  /**
616  * Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering.
617  * \param[in] included_2to2 Which 2->2 reactions are enabled?
618  * \return List of all possible DeltaK reactions with their cross sections
619  */
620  CollisionBranchList deltak_xx(const ReactionsBitSet& included_2to2) const;
621 
622  /**
623  * Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering.
624  * \param[in] included_2to2 Which 2->2 reactions are enabled?
625  * \return List of all possible Ypi reactions with their cross sections
626  */
627  CollisionBranchList ypi_xx(const ReactionsBitSet& included_2to2) const;
628 
629  /**
630  * Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron
631  * (dpi), specifically dπ→ NN, d̅π→ N̅N̅; πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅'
632  * and reverse.
633  * \param[in] included_2to2 Which 2->2 reactions are enabled?
634  * \return List of all possible dpi reactions with their cross sections
635  */
636  CollisionBranchList dpi_xx(const ReactionsBitSet& included_2to2) const;
637 
638  /**
639  * Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron
640  * (dN), specifically Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e.g.
641  * Nd'→ Nd).
642  * \param[in] included_2to2 Which 2->2 reactions are enabled?
643  * \return List of all possible dN reactions with their cross sections
644  */
645  CollisionBranchList dn_xx(const ReactionsBitSet& included_2to2) const;
646 
647  /**
648  * Parametrized cross section for πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and
649  * reverse, see \iref{Oliinychenko:2018ugs} for details.
650  * \param[in] sqrts square-root of mandelstam s
651  * \param[in] cm_mom center of mass momentum of incoming particles
652  * \param[in] produced_nucleus type of outgoing deuteron or d-prime
653  * \param[in] type_pi type of scattering pion
654  * \return cross section for given scattering
655  */
656  static double xs_dpi_dprimepi(double sqrts, double cm_mom,
657  ParticleTypePtr produced_nucleus,
658  const ParticleType& type_pi);
659 
660  /**
661  * Parametrized cross section for Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and
662  * reverse (e.g. Nd'→ Nd), see \iref{Oliinychenko:2018ugs} for details.
663  * \param[in] sqrts square-root of mandelstam s
664  * \param[in] cm_mom center of mass momentum of incoming particles
665  * \param[in] produced_nucleus type of outgoing deuteron or d-prime
666  * \param[in] type_nucleus type of scattering (incoming) deuteron or d-prime
667  * \param[in] type_N type of scattering nucleon
668  * \return cross section for given scattering
669  */
670  static double xs_dn_dprimen(double sqrts, double cm_mom,
671  ParticleTypePtr produced_nucleus,
672  const ParticleType& type_nucleus,
673  const ParticleType& type_N);
674 
675  /**
676  * Determine the (parametrized) hard non-diffractive string cross section
677  * for this collision.
678  *
679  * \return Parametrized cross section (without AQM scaling).
680  */
681  double string_hard_cross_section() const;
682 
683  /**
684  * Calculate cross sections for 2 → 2 resonance absorption (i.e. NR → NN and
685  * ΔR → NN). See eqs. (B.6), (B.9) and (181) in \iref{Buss:2011mx}.
686  *
687  * \param[in] is_anti_particles Whether the colliding particles are
688  * antiparticles
689  *
690  * \return List of possible resonance absorption processes. Each element of
691  * the list contains the types of the final-state particles and the cross
692  * section for that particular process.
693  */
694  CollisionBranchList bar_bar_to_nuc_nuc(bool is_anti_particles) const;
695 
696  /**
697  * Scattering matrix amplitude squared (divided by 16π) for resonance
698  * production processes like NN → NR and NN → ΔR, where R is a baryon
699  * resonance (Δ, N*, Δ*). Includes no spin or isospin factors.
700  *
701  * \param[in] sqrts sqrt(Mandelstam-s), i.e. collision CMS energy.
702  * \param[in] type_a Type information for the first final-state particle.
703  * \param[in] type_b Type information for the second final-state particle.
704  * \param[in] twoI Twice the total isospin of the involved state.
705  *
706  * \return Matrix amplitude squared \f$ |\mathcal{M}(\sqrt{s})|^2/16\pi \f$.
707  */
708  static double nn_to_resonance_matrix_element(double sqrts,
709  const ParticleType& type_a,
710  const ParticleType& type_b,
711  int twoI);
712 
713  /**
714  * Utility function to avoid code replication in nn_xx().
715  *
716  * \param[in] type_res_1 List of possible first final resonance types
717  * \param[in] type_res_2 List of possible second final resonance types
718  * \param[in] integrator Used to integrate over the kinematically allowed
719  * mass range of the Breit-Wigner distribution
720  *
721  * \return List of all possible NN reactions with their cross sections
722  * with different final states
723  */
724  template <class IntegrationMethod>
725  CollisionBranchList find_nn_xsection_from_type(
726  const ParticleTypePtrList& type_res_1,
727  const ParticleTypePtrList& type_res_2,
728  const IntegrationMethod integrator) const;
729 
730  /**
731  * Determine the momenta of the incoming particles in the
732  * center-of-mass system.
733  * \return Center-of-mass momentum
734  */
735  double cm_momentum() const {
736  const double m1 = incoming_particles_[0].effective_mass();
737  const double m2 = incoming_particles_[1].effective_mass();
738  return pCM(sqrt_s_, m1, m2);
739  }
740 
741  /// List with data of scattering particles.
742  const ParticleList incoming_particles_;
743 
744  /// Total energy in the center-of-mass frame.
745  const double sqrt_s_;
746 
747  /**
748  * Potentials at the interacting point.
749  * They are used to calculate the corrections on the threshold energies.
750  */
751  const std::pair<FourVector, FourVector> potentials_;
752 
753  /**
754  * Whether incoming particles are a pair of a baryon and an antibaryon
755  * (could be different baryon types)
756  */
757  const bool is_BBbar_pair_;
758 
759  /// Whether incoming particles are a nulecon-antinucleon pair (same isospin)
760  const bool is_NNbar_pair_;
761 
762  /**
763  * Helper function:
764  * Add a 2-to-2 channel to a collision branch list given a cross section.
765  *
766  * The cross section is only calculated if there is enough energy
767  * for the process. If the cross section is small, the branch is not added.
768  */
769  template <typename F>
770  void add_channel(CollisionBranchList& process_list, F&& get_xsection,
771  double sqrts, const ParticleType& type_a,
772  const ParticleType& type_b) const {
773  const double sqrt_s_min =
774  type_a.min_mass_spectral() + type_b.min_mass_spectral();
775  /* Determine wether the process is below the threshold. */
776  double scale_B = 0.0;
777  double scale_I3 = 0.0;
778  bool is_below_threshold;
779  FourVector incoming_momentum = FourVector();
780  if (pot_pointer != nullptr) {
781  for (const auto& p : incoming_particles_) {
782  incoming_momentum += p.momentum();
783  scale_B += pot_pointer->force_scale(p.type()).first;
784  scale_I3 +=
785  pot_pointer->force_scale(p.type()).second * p.type().isospin3_rel();
786  }
787  scale_B -= pot_pointer->force_scale(type_a).first;
788  scale_I3 -=
789  pot_pointer->force_scale(type_a).second * type_a.isospin3_rel();
790  scale_B -= pot_pointer->force_scale(type_b).first;
791  scale_I3 -=
792  pot_pointer->force_scale(type_b).second * type_b.isospin3_rel();
793  is_below_threshold = (incoming_momentum + potentials_.first * scale_B +
794  potentials_.second * scale_I3)
795  .abs() <= sqrt_s_min;
796  } else {
797  is_below_threshold = (sqrts <= sqrt_s_min);
798  }
799  if (is_below_threshold) {
800  return;
801  }
802  const auto xsection = get_xsection();
803  if (xsection > really_small) {
804  process_list.push_back(std::make_unique<CollisionBranch>(
805  type_a, type_b, xsection, ProcessType::TwoToTwo));
806  }
807  }
808 };
809 
810 } // namespace smash
811 
812 #endif // SRC_INCLUDE_SMASH_CROSSSECTIONS_H_
The CrossSections class assembles everything that is needed to calculate cross sections and gathers a...
Definition: crosssections.h:31
const double sqrt_s_
Total energy in the center-of-mass frame.
CollisionBranchList two_to_two(const ReactionsBitSet &included_2to2, double KN_offset, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for the given scattering.
double transition_probability_at_sqrts(double region_lower, double region_upper) const
Computes a smooth transition probability as a function of sqrt(s).
CollisionBranchList DK_and_DstarK_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-kaon (DK) and D*-kaon (D*K) scattering.
static double xs_dpi_dprimepi(double sqrts, double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_pi)
Parametrized cross section for πd→ πd' (mockup for πd→ πnp), πd̅→ πd̅' and reverse,...
double DK_and_DstarK_inelastic() const
Determine the inelastic cross section for a D meson-kaon (DK) or a D*-kaon (D*K) collision.
CollisionBranchPtr NNbar_to_5pi(double scale_xs) const
Create collision branch for NNbar annihilation going directly into 5 pions.
std::optional< double > DDelta_elastic() const
Determine the elastic cross section for a D meson-Delta (DΔ) collision, If the center-of-mass energy ...
CollisionBranchList NNbar_creation() const
Determine the cross section for NNbar creation, which is given by detailed balance from the reverse r...
CollisionBranchList dpi_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes involving Pion and (anti-) Deuteron (dpi), specifically dπ→ NN,...
std::optional< double > Dpi_and_Dstarpi_elastic() const
Determine the elastic cross section for a D meson-pion (Dpi) or a D*-pion (D*pi) collision.
double high_energy(const ScatterActionsFinderParameters &finder_parameters) const
Determine the parametrized total cross section at high energies for the given collision,...
CollisionBranchList bb_xx_except_nn(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Baryon-Baryon (BB) Scattering except the more specific Nucleon-...
CollisionBranchList npi_yk() const
Find all processes for Nucleon-Pion to Hyperon-Kaon Scattering.
CollisionBranchList find_nn_xsection_from_type(const ParticleTypePtrList &type_res_1, const ParticleTypePtrList &type_res_2, const IntegrationMethod integrator) const
Utility function to avoid code replication in nn_xx().
double DDelta_inelastic() const
Determine the inelastic cross section for a D meson-Delta (DΔ) collision.
double cm_momentum() const
Determine the momenta of the incoming particles in the center-of-mass system.
double string_probability(const ScatterActionsFinderParameters &finder_parameters) const
CollisionBranchList deltak_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Delta-Kaon (DeltaK) Scattering.
static double nn_to_resonance_matrix_element(double sqrts, const ParticleType &type_a, const ParticleType &type_b, int twoI)
Scattering matrix amplitude squared (divided by 16π) for resonance production processes like NN → NR ...
double DN_inelastic() const
Determine the inelastic cross section for a D meson-nucleon (DN) collision.
std::optional< double > DK_and_DstarK_elastic() const
Determine the elastic cross section for a D meson-kaon (DK) or a D*-kaon (D*K) collision.
double Dpi_and_Dstarpi_inelastic() const
Determine the inelastic cross section for a D meson-pion (Dpi) or a D*-pion (D*pi) collision.
CrossSections(const ParticleList &incoming_particles, double sqrt_s, const std::pair< FourVector, FourVector > potentials)
Construct CrossSections instance.
CollisionBranchList Dpi_and_Dstarpi_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-pion (Dpi) and D*-pion (D*pi) scattering.
static double xs_dn_dprimen(double sqrts, double cm_mom, ParticleTypePtr produced_nucleus, const ParticleType &type_nucleus, const ParticleType &type_N)
Parametrized cross section for Nd → Nd', N̅d → N̅d', N̅d̅→ N̅d̅', Nd̅→ Nd̅' and reverse (e....
double elastic_parametrization(const ScatterActionsFinderParameters &finder_parameters) const
Choose the appropriate parametrizations for given incoming particles and return the (parametrized) el...
CollisionBranchList DN_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-nucleon (DN) scatterings.
CollisionBranchList two_to_four() const
Find all 2->4 processes for the given scattering.
CollisionBranchPtr elastic(const ScatterActionsFinderParameters &finder_parameters) const
Determine the elastic cross section for this collision.
double formation(const ParticleType &type_resonance, double cm_momentum_sqr) const
Calculates the 2-to-1 resonance production cross section for a given resonance using the Breit-Wigner...
void add_channel(CollisionBranchList &process_list, F &&get_xsection, double sqrts, const ParticleType &type_a, const ParticleType &type_b) const
Helper function: Add a 2-to-2 channel to a collision branch list given a cross section.
double string_hard_cross_section() const
Determine the (parametrized) hard non-diffractive string cross section for this collision.
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.
const ParticleList incoming_particles_
List with data of scattering particles.
double npi_el() const
Determine the elastic cross section for a nucleon-pion (Npi) collision.
double nn_el() const
Determine the (parametrized) elastic cross section for a nucleon-nucleon (NN) collision.
const bool is_BBbar_pair_
Whether incoming particles are a pair of a baryon and an antibaryon (could be different baryon types)
CollisionBranchList dn_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes involving Nucleon and (anti-) Deuteron (dN), specifically Nd → Nd',...
static double two_to_four_xs(const ParticleType &type_in1, const ParticleType &type_in2, double sqrts)
Determine 2->4 cross section for the scattering of the given particle types.
CollisionBranchList ypi_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Hyperon-Pion (Ypi) Scattering.
CollisionBranchList DDelta_xx(const ReactionsBitSet &included_2to2, CharmRescattering charm_rescattering) const
Find all inelastic 2->2 processes for D meson-Delta (DΔ) scatterings.
CollisionBranchList string_excitation(double total_string_xs, StringProcess *string_process, const ScatterActionsFinderParameters &finder_parameters) const
Determine the cross section for string excitations, which is given by the difference between the para...
CollisionBranchList two_to_one(CharmRescattering charm_rescattering) const
Find all resonances that can be produced in a 2->1 collision of the two input particles and the produ...
double parametrized_total(const ScatterActionsFinderParameters &finder_parameters) const
Select the parametrization for the total cross section, given the types of incoming particles.
const bool is_NNbar_pair_
Whether incoming particles are a nulecon-antinucleon pair (same isospin)
CollisionBranchList rare_two_to_two() const
Find all 2->2 processes which are suppressed at high energies when strings are turned on with probabi...
static double sum_xs_of(const CollisionBranchList &list)
Helper function: Sum all cross sections of the given process list.
Definition: crosssections.h:77
CollisionBranchList two_to_three() const
Find all 2->3 processes for the given scattering.
CollisionBranchList bar_bar_to_nuc_nuc(bool is_anti_particles) const
Calculate cross sections for 2 → 2 resonance absorption (i.e.
CollisionBranchPtr NNbar_annihilation(double current_xs, double scale_xs) const
Determine the cross section for NNbar annihilation, which is given by the difference between the para...
CollisionBranchList generate_collision_list(const ScatterActionsFinderParameters &finder_parameters, StringProcess *string_process) const
Generate a list of all possible collisions between the incoming particles with the given c....
std::optional< double > DN_elastic() const
Determine the elastic cross section for a D meson-nucleon (DN) collision, If the center-of-mass energ...
std::optional< double > Deta_and_Dstareta_elastic() const
Determine the elastic cross section for a D meson-eta (Deta) or a D*-eta (D*eta) collision.
CollisionBranchList nn_xx(const ReactionsBitSet &included_2to2) const
Find all inelastic 2->2 processes for Nucelon-Nucelon Scattering.
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:731
Particle type contains the static properties of a particle species.
Definition: particletype.h:100
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:182
static std::pair< double, int > force_scale(const ParticleType &data)
Evaluates the scaling factor of the forces acting on the particles.
Definition: potentials.cc:152
Helper class for ScatterActionsFinder.
String excitation processes used in SMASH.
Definition: stringprocess.h:46
CharmRescattering
Possible charm scattering options.
std::bitset< 11 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
constexpr Section potentials
Section for the potentials information.
Definition: input_keys.h:228
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:41