Version: SMASH-2.0
scatteractionmulti.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2020
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
11 
12 #include "smash/crosssections.h"
13 #include "smash/integrate.h"
14 #include "smash/logging.h"
15 
16 namespace smash {
17 static constexpr int LScatterActionMulti = LogArea::ScatterActionMulti::id;
18 
19 ScatterActionMulti::ScatterActionMulti(const ParticleList& in_plist,
20  double time)
21  : Action(in_plist, time), total_probability_(0.) {}
22 
23 void ScatterActionMulti::add_reaction(CollisionBranchPtr p) {
24  add_process<CollisionBranch>(p, reaction_channels_, total_probability_);
25 }
26 
27 void ScatterActionMulti::add_reactions(CollisionBranchList pv) {
28  add_processes<CollisionBranch>(std::move(pv), reaction_channels_,
30 }
31 
33  double xsec_scaling = 1.0;
34  for (const ParticleData& in_part : incoming_particles_) {
35  xsec_scaling *= in_part.xsec_scaling_factor();
36  }
37  return total_probability_ * xsec_scaling;
38 }
39 
41  double xsec_scaling = 1.0;
42  for (const ParticleData& in_part : incoming_particles_) {
43  xsec_scaling *= in_part.xsec_scaling_factor();
44  }
45  return partial_probability_ * xsec_scaling;
46 }
47 
49  double dt, const double gcell_vol,
50  const MultiParticleReactionsBitSet incl_multi) {
51  // 3 -> m
52  if (incoming_particles_.size() == 3) {
53  // 3 -> 1
54  if (incl_multi[IncludedMultiParticleReactions::Meson_3to1] == 1) {
56  incoming_particles_[2])) {
57  // 3pi -> omega
58  const ParticleTypePtr type_omega = ParticleType::try_find(0x223);
59  if (type_omega) {
60  add_reaction(make_unique<CollisionBranch>(
61  *type_omega,
62  probability_three_to_one(*type_omega, dt, gcell_vol,
63  type_omega->spin_degeneracy()),
65  }
66  // 3pi -> phi
67  const ParticleTypePtr type_phi = ParticleType::try_find(0x333);
68  if (type_phi) {
69  add_reaction(make_unique<CollisionBranch>(
70  *type_phi,
71  probability_three_to_one(*type_phi, dt, gcell_vol,
72  type_phi->spin_degeneracy()),
74  }
76  incoming_particles_[2])) {
77  // eta2pi -> eta-prime
78  const ParticleTypePtr type_eta_prime = ParticleType::try_find(0x331);
79 
80  int sym_factor_in = 1;
81  if (incoming_particles_[0].type() == incoming_particles_[1].type() ||
82  incoming_particles_[1].type() == incoming_particles_[2].type() ||
83  incoming_particles_[2].type() == incoming_particles_[0].type()) {
84  sym_factor_in = 2; // 2 factorial
85  }
86 
87  if (type_eta_prime) {
88  add_reaction(make_unique<CollisionBranch>(
89  *type_eta_prime,
91  *type_eta_prime, dt, gcell_vol,
92  sym_factor_in * type_eta_prime->spin_degeneracy()),
94  }
95  }
96  }
97  // 3 -> 2
98  if (incl_multi[IncludedMultiParticleReactions::Deuteron_3to2] == 1) {
99  const PdgCode pdg_a = incoming_particles_[0].pdgcode();
100  const PdgCode pdg_b = incoming_particles_[1].pdgcode();
101  const PdgCode pdg_c = incoming_particles_[2].pdgcode();
102  const ParticleTypePtr type_deuteron =
104  const ParticleTypePtr type_anti_deuteron =
106 
107  const int spin_factor_inc = pdg_a.spin_degeneracy() *
108  pdg_b.spin_degeneracy() *
109  pdg_c.spin_degeneracy();
110 
111  if (type_deuteron && type_anti_deuteron) {
112  // πpn → πd
113  if ((pdg_a.is_pion() && pdg_b == pdg::p && pdg_c == pdg::n) ||
114  (pdg_a.is_pion() && pdg_b == pdg::n && pdg_c == pdg::p) ||
115  (pdg_a == pdg::p && pdg_b.is_pion() && pdg_c == pdg::n) ||
116  (pdg_a == pdg::n && pdg_b.is_pion() && pdg_c == pdg::p) ||
117  (pdg_a == pdg::p && pdg_b == pdg::n && pdg_c.is_pion()) ||
118  (pdg_a == pdg::n && pdg_b == pdg::p && pdg_c.is_pion())) {
119  // Get type of incoming π
120  ParticleList::iterator it = std::find_if(
122  [](ParticleData x) { return x.is_pion(); });
123  const ParticleType& type_pi = it->type();
124 
125  const double spin_degn =
126  react_degen_factor(spin_factor_inc, type_pi.spin_degeneracy(),
127  type_deuteron->spin_degeneracy());
128 
129  add_reaction(make_unique<CollisionBranch>(
130  type_pi, *type_deuteron,
131  probability_three_to_two(type_pi, *type_deuteron, dt, gcell_vol,
132  spin_degn),
134  }
135 
136  // πp̅n̅ → πd̅
137  if ((pdg_a.is_pion() && pdg_b == -pdg::p && pdg_c == -pdg::n) ||
138  (pdg_a.is_pion() && pdg_b == -pdg::n && pdg_c == -pdg::p) ||
139  (pdg_a == -pdg::p && pdg_b.is_pion() && pdg_c == -pdg::n) ||
140  (pdg_a == -pdg::n && pdg_b.is_pion() && pdg_c == -pdg::p) ||
141  (pdg_a == -pdg::p && pdg_b == -pdg::n && pdg_c.is_pion()) ||
142  (pdg_a == -pdg::n && pdg_b == -pdg::p && pdg_c.is_pion())) {
143  // Get type of incoming π
144  ParticleList::iterator it = std::find_if(
146  [](ParticleData x) { return x.is_pion(); });
147  const ParticleType& type_pi = it->type();
148 
149  const double spin_degn =
150  react_degen_factor(spin_factor_inc, type_pi.spin_degeneracy(),
151  type_anti_deuteron->spin_degeneracy());
152 
153  add_reaction(make_unique<CollisionBranch>(
154  type_pi, *type_anti_deuteron,
155  probability_three_to_two(type_pi, *type_anti_deuteron, dt,
156  gcell_vol, spin_degn),
158  }
159 
160  // Nnp → Nd, N̅np → N̅d
161  if ((pdg_a.is_nucleon() && pdg_b == pdg::p && pdg_c == pdg::n) ||
162  (pdg_a.is_nucleon() && pdg_b == pdg::n && pdg_c == pdg::p) ||
163  (pdg_a == pdg::p && pdg_b.is_nucleon() && pdg_c == pdg::n) ||
164  (pdg_a == pdg::n && pdg_b.is_nucleon() && pdg_c == pdg::p) ||
165  (pdg_a == pdg::p && pdg_b == pdg::n && pdg_c.is_nucleon()) ||
166  (pdg_a == pdg::n && pdg_b == pdg::p && pdg_c.is_nucleon())) {
167  int symmetry_factor = 1; // already true for N̅np → N̅d case
168 
169  ParticleList::iterator it =
170  std::find_if(incoming_particles_.begin(),
171  incoming_particles_.end(), [](ParticleData x) {
172  return x.pdgcode().antiparticle_sign() == -1;
173  });
174  if (it == incoming_particles_.end()) {
175  /* Meaning no anti-N found by find_if,
176  * therefore not N̅np → N̅d, but Nnp → Nd. */
177  symmetry_factor = 2; // for Nnp → Nd (2 factorial)
178  // It is already clear here that we have a double of two N
179  if (pdg_a == pdg_b) {
180  it = incoming_particles_.begin();
181  } else {
182  // If a and b are not the double, then c has to be part of it
183  it = incoming_particles_.begin() + 2;
184  }
185  }
186  const ParticleType& type_N = it->type();
187 
188  const double spin_degn =
189  react_degen_factor(spin_factor_inc, type_N.spin_degeneracy(),
190  type_deuteron->spin_degeneracy());
191 
192  add_reaction(make_unique<CollisionBranch>(
193  type_N, *type_deuteron,
194  probability_three_to_two(type_N, *type_deuteron, dt, gcell_vol,
195  symmetry_factor * spin_degn),
197  }
198 
199  // Np̅n̅ → Nd̅, N̅p̅n̅ → N̅d̅
200  if ((pdg_a.is_nucleon() && pdg_b == -pdg::p && pdg_c == -pdg::n) ||
201  (pdg_a.is_nucleon() && pdg_b == -pdg::n && pdg_c == -pdg::p) ||
202  (pdg_a == -pdg::p && pdg_b.is_nucleon() && pdg_c == -pdg::n) ||
203  (pdg_a == -pdg::n && pdg_b.is_nucleon() && pdg_c == -pdg::p) ||
204  (pdg_a == -pdg::p && pdg_b == -pdg::n && pdg_c.is_nucleon()) ||
205  (pdg_a == -pdg::n && pdg_b == -pdg::p && pdg_c.is_nucleon())) {
206  int symmetry_factor = 1; // already true for Np̅n̅ → Nd̅ case
207 
208  ParticleList::iterator it =
209  std::find_if(incoming_particles_.begin(),
210  incoming_particles_.end(), [](ParticleData x) {
211  return x.pdgcode().antiparticle_sign() == 1;
212  });
213  if (it == incoming_particles_.end()) {
214  /* Meaning no N found by find_if,
215  * therefore not Np̅n̅ → Nd̅, but N̅p̅n̅ → N̅d̅. */
216  symmetry_factor = 2; // for N̅p̅n̅ → N̅d̅ (2 factorial)
217  // It is already clear here that we have a double of two N̅
218  if (pdg_a == pdg_b) {
219  it = incoming_particles_.begin();
220  } else {
221  // If a and b are not the double, then c has to be part of it
222  it = incoming_particles_.begin() + 2;
223  }
224  }
225  const ParticleType& type_N = it->type();
226 
227  const double spin_degn =
228  react_degen_factor(spin_factor_inc, type_N.spin_degeneracy(),
229  type_anti_deuteron->spin_degeneracy());
230 
231  add_reaction(make_unique<CollisionBranch>(
232  type_N, *type_anti_deuteron,
233  probability_three_to_two(type_N, *type_anti_deuteron, dt,
234  gcell_vol, symmetry_factor * spin_degn),
236  }
237  }
238  }
239  }
240 }
241 
243  logg[LScatterActionMulti].debug("Incoming particles: ", incoming_particles_);
244 
245  /* Decide for a particular final state. */
246  const CollisionBranch* proc =
247  choose_channel<CollisionBranch>(reaction_channels_, total_probability_);
248  process_type_ = proc->get_type();
250  partial_probability_ = proc->weight();
251 
252  logg[LScatterActionMulti].debug("Chosen channel: ", process_type_,
254 
255  switch (process_type_) {
257  /* n->1 annihilation */
258  annihilation();
259  break;
261  /* 3->2 scattering */
262  three_to_two();
263  break;
264  default:
266  "ScatterActionMulti::generate_final_state: Invalid process type " +
267  std::to_string(static_cast<int>(process_type_)) + " was requested.");
268  }
269 
270  /* The production point of the new particles. */
271  FourVector middle_point = get_interaction_point();
272 
273  for (ParticleData& new_particle : outgoing_particles_) {
274  // Boost to the computational frame
275  new_particle.boost_momentum(
277  /* Set positions of the outgoing particles */
278  new_particle.set_4position(middle_point);
279  }
280 }
281 
282 double ScatterActionMulti::calculate_I3(const double sqrts) const {
283  static Integrator integrate;
284  const double m1 = incoming_particles_[0].effective_mass();
285  const double m2 = incoming_particles_[1].effective_mass();
286  const double m3 = incoming_particles_[2].effective_mass();
287  const double lower_bound = (m1 + m2) * (m1 + m2);
288  const double upper_bound = (sqrts - m3) * (sqrts - m3);
289  const auto result = integrate(lower_bound, upper_bound, [&](double m12_sqr) {
290  const double m12 = std::sqrt(m12_sqr);
291  const double e2_star = (m12_sqr - m1 * m1 + m2 * m2) / (2 * m12);
292  const double e3_star = (sqrts * sqrts - m12_sqr - m3 * m3) / (2 * m12);
293  const double m23_sqr_min =
294  (e2_star + e3_star) * (e2_star + e3_star) -
295  std::pow(std::sqrt(e2_star * e2_star - m2 * m2) +
296  std::sqrt(e3_star * e3_star - m3 * m3),
297  2.0);
298  const double m23_sqr_max =
299  (e2_star + e3_star) * (e2_star + e3_star) -
300  std::pow(std::sqrt(e2_star * e2_star - m2 * m2) -
301  std::sqrt(e3_star * e3_star - m3 * m3),
302  2.0);
303  return m23_sqr_max - m23_sqr_min;
304  });
305 
306  return result;
307 }
308 
310  const ParticleType& type_out, double dt, const double gcell_vol,
311  const int degen_factor) const {
312  const double e1 = incoming_particles_[0].momentum().x0();
313  const double e2 = incoming_particles_[1].momentum().x0();
314  const double e3 = incoming_particles_[2].momentum().x0();
315  const double sqrts = sqrt_s();
316 
317  const double gamma_decay = type_out.get_partial_width(
318  sqrts, {&incoming_particles_[0].type(), &incoming_particles_[1].type(),
319  &incoming_particles_[2].type()});
320 
321  const double I_3 = calculate_I3(sqrts);
322  const double ph_sp_3 =
323  1. / (8 * M_PI * M_PI * M_PI) * 1. / (16 * sqrts * sqrts) * I_3;
324 
325  const double spec_f_val = type_out.spectral_function(sqrts);
326 
327  return dt / (gcell_vol * gcell_vol) * M_PI / (4. * e1 * e2 * e3) *
328  gamma_decay / ph_sp_3 * spec_f_val * std::pow(hbarc, 5.0) *
329  degen_factor;
330 }
331 
333  const ParticleType& type_out1, const ParticleType& type_out2, double dt,
334  const double gcell_vol, const double degen_factor) const {
335  const double e1 = incoming_particles_[0].momentum().x0();
336  const double e2 = incoming_particles_[1].momentum().x0();
337  const double e3 = incoming_particles_[2].momentum().x0();
338  const double m4 = type_out1.mass();
339  const double m5 = type_out2.mass();
340 
341  const double sqrts = sqrt_s();
342  const double xs =
343  CrossSections::two_to_three_xs(type_out1, type_out2, sqrts) / gev2_mb;
344  const double lamb = lambda_tilde(sqrts * sqrts, m4 * m4, m5 * m5);
345 
346  const double I_3 = calculate_I3(sqrts);
347  const double ph_sp_3 =
348  1. / (8 * M_PI * M_PI * M_PI) * 1. / (16 * sqrts * sqrts) * I_3;
349 
350  return dt / (gcell_vol * gcell_vol) * 1. / (4. * e1 * e2 * e3) * lamb /
351  (ph_sp_3 * 8 * M_PI * sqrts * sqrts) * xs * std::pow(hbarc, 5.0) *
352  degen_factor;
353 }
354 
356  if (outgoing_particles_.size() != 1) {
357  std::string s =
358  "Annihilation: "
359  "Incorrect number of particles in final state: ";
360  s += std::to_string(outgoing_particles_.size()) + ".";
361  throw InvalidScatterActionMulti(s);
362  }
363  // Set the momentum of the formed particle in its rest frame.
364  outgoing_particles_[0].set_4momentum(
365  total_momentum_of_outgoing_particles().abs(), 0., 0., 0.);
366  // Make sure to assign formation times before boost to the computational frame
368 
369  logg[LScatterActionMulti].debug("Momentum of the new particle: ",
370  outgoing_particles_[0].momentum());
371 }
372 
375  // Make sure to assign formation times before boost to the computational frame
377  logg[LScatterActionMulti].debug("3->2 scattering:", incoming_particles_,
378  " -> ", outgoing_particles_);
379 }
380 
382  const ParticleData& data_a, const ParticleData& data_b,
383  const ParticleData& data_c) const {
384  // We want a combination of pi+, pi- and pi0
385  const PdgCode pdg_a = data_a.pdgcode();
386  const PdgCode pdg_b = data_b.pdgcode();
387  const PdgCode pdg_c = data_c.pdgcode();
388 
389  return (pdg_a.is_pion() && pdg_b.is_pion() && pdg_c.is_pion()) &&
390  (pdg_a != pdg_b && pdg_b != pdg_c && pdg_c != pdg_a);
391 }
392 
394  const ParticleData& data_b,
395  const ParticleData& data_c) const {
396  // We want a combination of pi0, pi0 and eta or pi+, pi- and eta
397  const PdgCode pdg_a = data_a.pdgcode();
398  const PdgCode pdg_b = data_b.pdgcode();
399  const PdgCode pdg_c = data_c.pdgcode();
400 
401  return (pdg_a == pdg::pi_z && pdg_b == pdg::pi_z && pdg_c == pdg::eta) ||
402  (pdg_a == pdg::pi_z && pdg_b == pdg::eta && pdg_c == pdg::pi_z) ||
403  (pdg_a == pdg::eta && pdg_b == pdg::pi_z && pdg_c == pdg::pi_z) ||
404 
405  (pdg_a == pdg::eta && pdg_b == pdg::pi_m && pdg_c == pdg::pi_p) ||
406  (pdg_a == pdg::eta && pdg_b == pdg::pi_p && pdg_c == pdg::pi_m) ||
407  (pdg_a == pdg::pi_m && pdg_b == pdg::pi_p && pdg_c == pdg::eta) ||
408  (pdg_a == pdg::pi_m && pdg_b == pdg::eta && pdg_c == pdg::pi_p) ||
409  (pdg_a == pdg::pi_p && pdg_b == pdg::pi_m && pdg_c == pdg::eta) ||
410  (pdg_a == pdg::pi_p && pdg_b == pdg::eta && pdg_c == pdg::pi_m);
411 }
412 
413 void ScatterActionMulti::format_debug_output(std::ostream& out) const {
414  out << "MultiParticleScatter of " << incoming_particles_;
415  if (outgoing_particles_.empty()) {
416  out << " (not performed)";
417  } else {
418  out << " to " << outgoing_particles_;
419  }
420 }
421 
422 } // namespace smash
smash
Definition: action.h:24
smash::ProcessBranch::particle_list
ParticleList particle_list() const
Definition: processbranch.cc:26
smash::Action::lambda_tilde
static double lambda_tilde(double a, double b, double c)
Little helper function that calculates the lambda function (sometimes written with a tilde to better ...
Definition: action.h:310
smash::Action::incoming_particles_
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:326
smash::Action::assign_formation_time_to_outgoing_particles
void assign_formation_time_to_outgoing_particles()
Assign the formation time to the outgoing particles.
Definition: action.cc:183
smash::ParticleData
Definition: particledata.h:52
smash::PdgCode::is_nucleon
bool is_nucleon() const
Definition: pdgcode.h:321
smash::Action::sample_2body_phasespace
void sample_2body_phasespace()
Sample the full 2-body phase-space (masses, momenta, angles) in the center-of-mass frame for the fina...
Definition: action.cc:297
smash::ScatterActionMulti::add_reactions
void add_reactions(CollisionBranchList pv)
Add several new reaction channels at once.
Definition: scatteractionmulti.cc:27
smash::PdgCode::from_decimal
static PdgCode from_decimal(const int pdgcode_decimal)
Construct PDG code from decimal number.
Definition: pdgcode.h:267
smash::ProcessType::MultiParticleThreeToTwo
smash::PdgCode::spin_degeneracy
unsigned int spin_degeneracy() const
Definition: pdgcode.h:539
smash::PdgCode::is_pion
bool is_pion() const
Definition: pdgcode.h:381
smash::ScatterActionMulti::generate_final_state
void generate_final_state() override
Generate the final-state of the multi-particle scattering process.
Definition: scatteractionmulti.cc:242
smash::Integrator
A C++ interface for numerical integration in one dimension with the GSL CQUAD integration functions.
Definition: integrate.h:106
smash::pdg::eta
constexpr int eta
η.
Definition: pdgcode_constants.h:78
smash::ParticleType::mass
double mass() const
Definition: particletype.h:144
smash::ParticleData::pdgcode
PdgCode pdgcode() const
Get the pdgcode of the particle.
Definition: particledata.h:81
smash::ParticleType::spectral_function
double spectral_function(double m) const
Full spectral function of the resonance (relativistic Breit-Wigner distribution with mass-dependent ...
Definition: particletype.cc:570
smash::ScatterActionMulti::format_debug_output
void format_debug_output(std::ostream &out) const override
Definition: scatteractionmulti.cc:413
smash::hbarc
constexpr double hbarc
GeV <-> fm conversion factor.
Definition: constants.h:25
smash::gev2_mb
constexpr double gev2_mb
GeV^-2 <-> mb conversion factor.
Definition: constants.h:31
smash::pdg::pi_z
constexpr int pi_z
π⁰.
Definition: pdgcode_constants.h:64
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::ScatterActionMulti::add_possible_reactions
void add_possible_reactions(double dt, const double gcell_vol, const MultiParticleReactionsBitSet incl_multi)
Add all possible multi-particle reactions for the given incoming particles.
Definition: scatteractionmulti.cc:48
smash::ScatterActionMulti::probability_three_to_one
double probability_three_to_one(const ParticleType &type_out, double dt, const double gcell_vol, const int degen_factor=1) const
Calculate the probability for a 3m-to-1 reaction according to the stochastic collision criterion (e....
Definition: scatteractionmulti.cc:309
MultiParticleReactionsBitSet
std::bitset< 2 > MultiParticleReactionsBitSet
Container for the 2 to 2 reactions in the code.
Definition: forwarddeclarations.h:240
smash::ParticleType::spin_degeneracy
unsigned int spin_degeneracy() const
Definition: particletype.h:194
crosssections.h
Deuteron_3to2
Definition: forwarddeclarations.h:236
smash::ParticleTypePtr
Definition: particletype.h:665
smash::ScatterActionMulti::calculate_I3
double calculate_I3(const double sqrts) const
Calculate the integration necessary for the three-body phase space.
Definition: scatteractionmulti.cc:282
smash::ProcessType::MultiParticleThreeMesonsToOne
multi particle scattering
smash::integrate
static Integrator integrate
Definition: decaytype.cc:144
smash::ScatterActionMulti::add_reaction
void add_reaction(CollisionBranchPtr p)
Add a new reaction channel.
Definition: scatteractionmulti.cc:23
smash::ScatterActionMulti::partial_probability_
double partial_probability_
Partial probability of the chosen outgoing channel.
Definition: scatteractionmulti.h:236
smash::pdg::decimal_antid
constexpr int decimal_antid
Anti-deuteron in decimal digits.
Definition: pdgcode_constants.h:95
smash::Action::process_type_
ProcessType process_type_
type of process
Definition: action.h:343
smash::CollisionBranch::get_type
ProcessType get_type() const override
Definition: processbranch.h:298
smash::ParticleType
Definition: particletype.h:97
smash::ScatterActionMulti::react_degen_factor
double react_degen_factor(const int spin_factor_inc, const int spin_degen_out1, const int spin_degen_out2) const
Determine the spin degeneracy factor ( ) for the 3->2 reaction.
Definition: scatteractionmulti.h:200
smash::pdg::decimal_d
constexpr int decimal_d
Deuteron in decimal digits.
Definition: pdgcode_constants.h:93
smash::PdgCode
Definition: pdgcode.h:108
smash::Action::total_momentum_of_outgoing_particles
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
Definition: action.cc:152
smash::LScatterActionMulti
static constexpr int LScatterActionMulti
Definition: scatteractionmulti.cc:17
smash::ParticleType::try_find
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
Definition: particletype.cc:89
smash::Action::outgoing_particles_
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:334
smash::ScatterActionMulti::ScatterActionMulti
ScatterActionMulti(const ParticleList &in_plist, double time)
Construct a ScatterActionMulti object.
Definition: scatteractionmulti.cc:19
smash::Action::sqrt_s
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:266
smash::ParticleType::get_partial_width
double get_partial_width(const double m, const ParticleTypePtrList dlist) const
Get the mass-dependent partial width of a resonance with mass m, decaying into two given daughter par...
Definition: particletype.cc:535
integrate.h
smash::ScatterActionMulti::two_pions_eta
bool two_pions_eta(const ParticleData &data_a, const ParticleData &data_b, const ParticleData &data_c) const
Check wether the three incoming particles are π⁺,π⁻,η or π⁰,π⁰,η in any order.
Definition: scatteractionmulti.cc:393
logging.h
smash::Action
Definition: action.h:35
smash::FourVector
Definition: fourvector.h:33
smash::ScatterActionMulti::InvalidScatterActionMulti
Definition: scatteractionmulti.h:80
smash::Action::get_interaction_point
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:67
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::pdg::n
constexpr int n
Neutron.
Definition: pdgcode_constants.h:30
smash::ScatterActionMulti::total_probability_
double total_probability_
Total probability of reaction.
Definition: scatteractionmulti.h:233
smash::ScatterActionMulti::three_to_two
void three_to_two()
Perform a 3->2 process.
Definition: scatteractionmulti.cc:373
smash::ScatterActionMulti::probability_three_to_two
double probability_three_to_two(const ParticleType &type_out1, const ParticleType &type_out2, double dt, const double gcell_vol, const double degen_factor=1.0) const
Calculate the probability for a 3-to-2 reaction according to the stochastic collision criterion (simi...
Definition: scatteractionmulti.cc:332
smash::pdg::pi_m
constexpr int pi_m
π⁻.
Definition: pdgcode_constants.h:66
smash::ScatterActionMulti::three_different_pions
bool three_different_pions(const ParticleData &data_a, const ParticleData &data_b, const ParticleData &data_c) const
Check wether the three incoming particles are π⁺,π⁻,π⁰ in any order.
Definition: scatteractionmulti.cc:381
smash::ScatterActionMulti::get_total_weight
double get_total_weight() const override
Get the total probability for the reaction (scaled with the cross section scaling factors of the inco...
Definition: scatteractionmulti.cc:32
smash::pdg::pi_p
constexpr int pi_p
π⁺.
Definition: pdgcode_constants.h:62
scatteractionmulti.h
Meson_3to1
Definition: forwarddeclarations.h:235
smash::ScatterActionMulti::get_partial_weight
double get_partial_weight() const override
Get the partial probability for the chosen channel (scaled with the cross section scaling factors of ...
Definition: scatteractionmulti.cc:40
smash::ScatterActionMulti::reaction_channels_
CollisionBranchList reaction_channels_
List of possible collisions.
Definition: scatteractionmulti.h:239
smash::ProcessBranch::weight
double weight() const
Definition: processbranch.h:198
smash::CollisionBranch
Definition: processbranch.h:221
smash::ScatterActionMulti::annihilation
void annihilation()
Perform a n->1 annihilation process.
Definition: scatteractionmulti.cc:355
smash::CrossSections::two_to_three_xs
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.
Definition: crosssections.cc:896