Version: SMASH-1.6
scatteractionphoton.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2016-2019
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
11 
12 #include <algorithm>
13 
14 #include "smash/angles.h"
15 #include "smash/constants.h"
17 #include "smash/cxx14compat.h"
19 #include "smash/kinematics.h"
20 #include "smash/outputinterface.h"
21 #include "smash/particletype.h"
22 #include "smash/pdgcode.h"
23 #include "smash/pow.h"
24 #include "smash/random.h"
25 #include "smash/tabulation.h"
26 
27 namespace smash {
28 
30  const ParticleList &in, const double time, const int n_frac_photons,
31  const double hadronic_cross_section_input)
32  : ScatterAction(in[0], in[1], time),
33  reac_(photon_reaction_type(in)),
34  number_of_fractional_photons_(n_frac_photons),
35  hadron_out_t_(outgoing_hadron_type(in)),
36  hadron_out_mass_(sample_out_hadron_mass(hadron_out_t_)),
37  hadronic_cross_section_(hadronic_cross_section_input) {}
38 
40  const ParticleList &in) {
41  if (in.size() != 2) {
43  }
44 
45  PdgCode a = in[0].pdgcode();
46  PdgCode b = in[1].pdgcode();
47 
48  // swap so that pion is first and there are less cases to be listed
49  if (!a.is_pion()) {
50  std::swap(a, b);
51  }
52 
53  switch (pack(a.code(), b.code())) {
54  case (pack(pdg::pi_p, pdg::pi_z)):
55  case (pack(pdg::pi_z, pdg::pi_p)):
57 
58  case (pack(pdg::pi_m, pdg::pi_z)):
59  case (pack(pdg::pi_z, pdg::pi_m)):
61 
62  case (pack(pdg::pi_p, pdg::rho_z)):
64 
65  case (pack(pdg::pi_m, pdg::rho_z)):
67 
68  case (pack(pdg::pi_m, pdg::rho_p)):
70 
71  case (pack(pdg::pi_p, pdg::rho_m)):
73 
74  case (pack(pdg::pi_z, pdg::rho_p)):
76 
77  case (pack(pdg::pi_z, pdg::rho_m)):
79 
80  case (pack(pdg::pi_p, pdg::pi_m)):
81  case (pack(pdg::pi_m, pdg::pi_p)):
83 
84  case (pack(pdg::pi_z, pdg::rho_z)):
86 
87  default:
89  }
90 }
91 
92 void ScatterActionPhoton::perform_photons(const OutputsList &outputs) {
93  for (int i = 0; i < number_of_fractional_photons_; i++) {
95  for (const auto &output : outputs) {
96  if (output->is_photon_output()) {
97  // we do not care about the local density
98  output->at_interaction(*this, 0.0);
99  }
100  }
101  }
102 }
103 
105  const ReactionType reaction) {
106  static const ParticleTypePtr rho_z_particle_ptr =
108  static const ParticleTypePtr rho_p_particle_ptr =
110  static const ParticleTypePtr rho_m_particle_ptr =
112  static const ParticleTypePtr pi_z_particle_ptr =
114  static const ParticleTypePtr pi_p_particle_ptr =
116  static const ParticleTypePtr pi_m_particle_ptr =
118 
119  switch (reaction) {
121  return rho_p_particle_ptr;
122  break;
124  return rho_m_particle_ptr;
125  break;
127  return rho_z_particle_ptr;
128  break;
129 
132  return pi_p_particle_ptr;
133 
136  return pi_m_particle_ptr;
137 
141  return pi_z_particle_ptr;
142  break;
143  default:
144  // default constructor constructs p with invalid index
145  ParticleTypePtr p{};
146  return p;
147  }
148 }
149 
151  const ParticleList &in) {
152  auto reac = photon_reaction_type(in);
153  return outgoing_hadron_type(reac);
154 }
155 
157  const ParticleList &in) {
158  auto reac = photon_reaction_type(in);
159  auto hadron = outgoing_hadron_type(in);
160 
161  if (reac == ReactionType::no_reaction)
162  return false;
163 
166  return false;
167  }
168 
169  // C15 has only s-channel. Make sure that CM-energy is high
170  // enough to produce mediating omega meson
171  if ((reac == ReactionType::pi_m_rho_p_pi_z ||
174  if (s_sqrt < omega_mass) {
175  return false;
176  }
177  }
178 
179  // for all other processes: if cm-energy is not high enough to produce final
180  // state particle reject the collision.
181  if (hadron->is_stable() && s_sqrt < hadron->mass()) {
182  return false;
183  // Make sure energy is high enough to not only create final state particle,
184  // but to also assign momentum.
185  } else if (!hadron->is_stable() &&
186  s_sqrt < (hadron->min_mass_spectral() + really_small)) {
187  return false;
188  } else {
189  return true;
190  }
191 }
192 
194  // we have only one reaction per incoming particle pair
195  if (collision_processes_photons_.size() != 1) {
196  const auto &log = logger<LogArea::ScatterAction>();
197  log.fatal() << "Problem in ScatterActionPhoton::generate_final_state().\n";
198  throw std::runtime_error("");
199  }
200  auto *proc = collision_processes_photons_[0].get();
201 
202  outgoing_particles_ = proc->particle_list();
203  process_type_ = proc->get_type();
204 
205  FourVector middle_point = get_interaction_point();
206 
207  // t is defined to be the momentum exchanged between the rho meson and the
208  // photon in pi + rho -> pi + photon channel. Therefore,
209  // get_t_range needs to be called with m2 being the rho mass instead of the
210  // pion mass. So, particles 1 and 2 are swapped if necessary.
211 
212  if (!incoming_particles_[0].pdgcode().is_pion()) {
213  std::swap(incoming_particles_[0], incoming_particles_[1]);
214  }
215 
216  // 2->2 inelastic scattering
217  // Sample the particle momenta in CM system
218  const double m1 = incoming_particles_[0].effective_mass();
219  const double m2 = incoming_particles_[1].effective_mass();
220 
221  const double &m_out = hadron_out_mass_;
222 
223  const double s = mandelstam_s();
224  const double sqrts = sqrt_s();
225  std::array<double, 2> mandelstam_t = get_t_range(sqrts, m1, m2, m_out, 0.0);
226  const double t1 = mandelstam_t[1];
227  const double t2 = mandelstam_t[0];
228  const double pcm_in = cm_momentum();
229  const double pcm_out = pCM(sqrts, m_out, 0.0);
230 
231  const double t = random::uniform(t1, t2);
232 
233  double costheta = (t - pow_int(m2, 2) +
234  0.5 * (s + pow_int(m2, 2) - pow_int(m1, 2)) *
235  (s - pow_int(m_out, 2)) / s) /
236  (pcm_in * (s - pow_int(m_out, 2)) / sqrts);
237 
238  // on very rare occasions near the kinematic threshold numerical issues give
239  // unphysical angles.
240  if (costheta > 1 || costheta < -1) {
241  const auto &log = logger<LogArea::ScatterAction>();
242  log.warn() << "Cos(theta)of photon scattering out of physical bounds in "
243  "the following scattering: "
244  << incoming_particles_ << "Clamping to [-1,1].";
245  if (costheta > 1.0)
246  costheta = 1.0;
247  if (costheta < -1.0)
248  costheta = -1.0;
249  }
250  Angles phitheta(random::uniform(0.0, twopi), costheta);
251  outgoing_particles_[0].set_4momentum(hadron_out_mass_,
252  phitheta.threevec() * pcm_out);
253  outgoing_particles_[1].set_4momentum(0.0, -phitheta.threevec() * pcm_out);
254 
255  // Set positions & boost to computational frame.
256  for (ParticleData &new_particle : outgoing_particles_) {
257  new_particle.set_4position(middle_point);
258  new_particle.boost_momentum(-beta_cm());
259  }
260 
261  const double E_Photon = outgoing_particles_[1].momentum()[0];
262 
263  // if rho in final state take already sampled mass (same as m_out). If rho is
264  // incoming take the mass of the incoming particle
265  const double m_rho = rho_mass();
266 
267  // compute the differential cross section with form factor included
268  const double diff_xs = diff_cross_section_w_ff(t, m_rho, E_Photon);
269 
270  // Weighing of the fractional photons
272  weight_ = diff_xs * (t2 - t1) /
274  } else {
275  weight_ = proc->weight() / hadronic_cross_section();
276  }
277  // Photons are not really part of the normal processes, so we have to set a
278  // constant arbitrary number.
279  const auto id_process = ID_PROCESS_PHOTON;
280  Action::check_conservation(id_process);
281 }
282 
284  double reaction_cross_section) {
285  CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
286  incoming_particles_[0].type(), incoming_particles_[1].type(),
287  reaction_cross_section, ProcessType::TwoToTwo);
288  add_collision(std::move(dummy_process));
289 }
290 
292  const ParticleTypePtr out_t) {
293  double mass = out_t->mass();
294  const double cms_energy = sqrt_s();
295  if (cms_energy <= out_t->min_mass_kinematic()) {
297  "Problem in ScatterActionPhoton::sample_hadron_mass");
298  }
299 
300  if (!out_t->is_stable()) {
301  mass = out_t->sample_resonance_mass(0, cms_energy);
302  }
303 
304  return mass;
305 }
306 
308  assert(reac_ != ReactionType::no_reaction);
309  switch (reac_) {
310  // rho in final state. use already sampled mass
314  return hadron_out_mass_;
315  // rho in initial state, use its mass
323  return (incoming_particles_[0].is_rho())
324  ? incoming_particles_[0].effective_mass()
325  : incoming_particles_[1].effective_mass();
327  default:
328  throw std::runtime_error(
329  "Invalid ReactionType in ScatterActionPhoton::rho_mass()");
330  }
331 }
332 
334  MediatorType mediator) {
335  CollisionBranchList process_list;
337 
338  static ParticleTypePtr photon_particle = &ParticleType::find(pdg::photon);
339 
340  const double s = mandelstam_s();
341  // the mass of the mediating particle depends on the channel. For an incoming
342  // rho it is the mass of the incoming particle, for an outgoing rho it is the
343  // sampled mass
344  const double m_rho = rho_mass();
345  double xsection = 0.0;
346 
347  switch (reac_) {
349  xsection = xs_object.xs_pi_pi_rho0(s, m_rho);
350  break;
351 
354  xsection = xs_object.xs_pi_pi0_rho(s, m_rho);
355  break;
356 
359  xsection = xs_object.xs_pi_rho0_pi(s, m_rho);
360  break;
361 
364  if (mediator == MediatorType::SUM) {
365  xsection = xs_object.xs_pi_rho_pi0(s, m_rho);
366  break;
367  } else if (mediator == MediatorType::PION) {
368  xsection = xs_object.xs_pi_rho_pi0_rho_mediated(s, m_rho);
369  break;
370  } else if (mediator == MediatorType::OMEGA) {
371  xsection = xs_object.xs_pi_rho_pi0_omega_mediated(s, m_rho);
372  break;
373  } else {
374  throw std::runtime_error("");
375  }
378  if (mediator == MediatorType::SUM) {
379  xsection = xs_object.xs_pi0_rho_pi(s, m_rho);
380  break;
381  } else if (mediator == MediatorType::PION) {
382  xsection = xs_object.xs_pi0_rho_pi_rho_mediated(s, m_rho);
383  break;
384  } else if (mediator == MediatorType::OMEGA) {
385  xsection = xs_object.xs_pi0_rho_pi_omega_mediated(s, m_rho);
386  break;
387  } else {
388  throw std::runtime_error("");
389  }
390 
392  xsection = xs_object.xs_pi0_rho0_pi0(s, m_rho);
393  break;
394 
396  // never reached
397  break;
398  }
399 
400  // Due to numerical reasons it can happen that the calculated cross sections
401  // are negative (approximately -1e-15) if sqrt(s) is close to the threshold
402  // energy. In those cases the cross section is manually set to 0.1 mb, which
403  // is a reasonable value for the processes we are looking at (C14,C15,C16).
404 
405  if (xsection <= 0) {
406  xsection = 0.1;
407  const auto &log = logger<LogArea::ScatterAction>();
408  log.warn("Calculated negative cross section.\nParticles ",
409  incoming_particles_, " mass rho particle: ", m_rho,
410  ", sqrt_s: ", std::sqrt(s));
411  }
412  process_list.push_back(make_unique<CollisionBranch>(
413  *hadron_out_t_, *photon_particle, xsection, ProcessType::TwoToTwo));
414  return process_list;
415 }
416 
418  const double m_rho,
419  MediatorType mediator) const {
420  const double s = mandelstam_s();
421  double diff_xsection = 0.0;
422 
424 
425  switch (reac_) {
427  diff_xsection = xs_object.xs_diff_pi_pi_rho0(s, t, m_rho);
428  break;
429 
432  diff_xsection = xs_object.xs_diff_pi_pi0_rho(s, t, m_rho);
433  break;
434 
437  diff_xsection = xs_object.xs_diff_pi_rho0_pi(s, t, m_rho);
438  break;
439 
442  if (mediator == MediatorType::SUM) {
443  diff_xsection =
444  xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho) +
445  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
446  } else if (mediator == MediatorType::OMEGA) {
447  diff_xsection =
448  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
449  } else if (mediator == MediatorType::PION) {
450  diff_xsection = xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho);
451  }
452  break;
453 
456  if (mediator == MediatorType::SUM) {
457  diff_xsection =
458  xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho) +
459  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
460  } else if (mediator == MediatorType::OMEGA) {
461  diff_xsection =
462  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
463  } else if (mediator == MediatorType::PION) {
464  diff_xsection = xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho);
465  }
466  break;
467 
469  diff_xsection = xs_object.xs_diff_pi0_rho0_pi0(s, t, m_rho);
470  break;
472  // never reached
473  break;
474  }
475  return diff_xsection;
476 }
477 
479  const double m_rho,
480  const double E_photon) {
490  /* C12, C13, C15, C16 need special treatment. These processes have identical
491  incoming and outgoing particles, but diffrent mediating particles and
492  hence different form factors. If both channels are added up
493  (MediatorType::SUM), each contribution is corrected by the corresponding
494  form factor.
495  */
496  switch (reac_) {
502  std::pair<double, double> FF = form_factor_single(E_photon);
503  std::pair<double, double> diff_xs = diff_cross_section_single(t, m_rho);
504  const double xs_ff = pow_int(FF.first, 4) * diff_xs.first +
505  pow_int(FF.second, 4) * diff_xs.second;
506  return xs_ff;
507  } else if (default_mediator_ == MediatorType::PION) {
508  const double FF = form_factor_pion(E_photon);
509  const double diff_xs = diff_cross_section(t, m_rho);
510  return pow_int(FF, 4) * diff_xs;
511  } else if (default_mediator_ == MediatorType::OMEGA) {
512  const double FF = form_factor_omega(E_photon);
513  const double diff_xs = diff_cross_section(t, m_rho);
514  return pow_int(FF, 4) * diff_xs;
515  }
516  break;
517  }
523  const double FF = form_factor_pion(E_photon);
524  const double xs = diff_cross_section(t, m_rho);
525  const double xs_ff = pow_int(FF, 4) * xs;
526  return xs_ff;
527  }
528 
530  const double FF = form_factor_omega(E_photon);
531  const double xs = diff_cross_section(t, m_rho);
532  const double xs_ff = pow_int(FF, 4) * xs;
533  return xs_ff;
534  }
535 
537  default:
538  throw std::runtime_error("");
539  return 0;
540  }
541 }
542 
543 double ScatterActionPhoton::form_factor_pion(const double E_photon) const {
544  const double Lambda = 1.0;
545  const double Lambda2 = Lambda * Lambda;
546 
547  const double t_ff = 34.5096 * std::pow(E_photon, 0.737) -
548  67.557 * std::pow(E_photon, 0.7584) +
549  32.858 * std::pow(E_photon, 0.7806);
550  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
551 
552  return ff * ff;
553 }
554 
555 double ScatterActionPhoton::form_factor_omega(const double E_photon) const {
556  const double Lambda = 1.0;
557  const double Lambda2 = Lambda * Lambda;
558 
559  const double t_ff = -61.595 * std::pow(E_photon, 0.9979) +
560  28.592 * std::pow(E_photon, 1.1579) +
561  37.738 * std::pow(E_photon, 0.9317) -
562  5.282 * std::pow(E_photon, 1.3686);
563  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
564 
565  return ff * ff;
566 }
567 
568 std::pair<double, double> ScatterActionPhoton::form_factor_single(
569  const double E_photon) {
570  return std::pair<double, double>(form_factor_pion(E_photon),
571  form_factor_omega(E_photon));
572 }
573 
575  const double t, const double m_rho) {
576  const double diff_xs_rho = diff_cross_section(t, m_rho, MediatorType::PION);
577  const double diff_xs_omega =
579 
580  return std::pair<double, double>(diff_xs_rho, diff_xs_omega);
581 }
582 
583 } // namespace smash
constexpr int Lambda
Λ.
void generate_final_state() override
Generate the final-state for the photon scatter process.
static double xs_diff_pi_pi_rho0(const double s, const double t, const double m_rho)
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
double form_factor_pion(const double E_photon) const
Compute the form factor for a process with a pion as the lightest exchange particle.
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:265
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
static ParticleTypePtr outgoing_hadron_type(const ParticleList &in)
Return ParticleTypePtr of hadron in the out channel, given the incoming particles.
double hadronic_cross_section() const
Return the total cross section of the underlying hadronic scattering.
constexpr std::uint32_t ID_PROCESS_PHOTON
Process ID for any photon process.
Definition: constants.h:128
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
bool is_stable() const
Definition: particletype.h:236
ProcessType process_type_
type of process
Definition: action.h:320
static double xs_diff_pi_pi0_rho(const double s, const double t, const double m_rho)
Collection of useful constants that are known at compile time.
constexpr int photon
Photon.
MediatorType
Compile-time switch for setting the handling of processes which can happen via different mediating pa...
double weight_
Weight of the produced photon.
constexpr int rho_z
ρ⁰.
Class to calculate the cross-section of a meson-meson to meson-photon process.
bool is_pion() const
Definition: pdgcode.h:372
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
static double xs_diff_pi_rho_pi0_omega_mediated(const double s, const double t, const double m_rho)
ScatterActionPhoton(const ParticleList &in, const double time, const int n_frac_photons, const double hadronic_cross_section_input)
Construct a ScatterActionPhoton object.
double rho_mass() const
Find the mass of the participating rho-particle.
double sample_resonance_mass(const double mass_stable, const double cms_energy, int L=0) const
Resonance mass sampling for 2-particle final state with one resonance (type given by &#39;this&#39;) and one ...
2->2 inelastic scattering
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
constexpr int pi_z
π⁰.
CollisionBranchList collision_processes_photons_
Holds the photon branch.
static bool is_kinematically_possible(const double s_sqrt, const ParticleList &in)
Check if CM-energy is sufficient to produce hadron in final state.
static double xs_diff_pi_rho0_pi(const double s, const double t, const double m_rho)
static constexpr MediatorType default_mediator_
Value used for default exchange particle. See MediatorType.
ThreeVector threevec() const
Definition: angles.h:268
constexpr double twopi
.
Definition: constants.h:39
double mass() const
Definition: particletype.h:144
Thrown for example when ScatterAction is called to perform with a wrong number of final-state particl...
Definition: action.h:297
std::array< T, 2 > get_t_range(const T sqrts, const T m1, const T m2, const T m3, const T m4)
Get the range of Mandelstam-t values allowed in a particular 2->2 process, see PDG 2014 booklet...
Definition: kinematics.h:109
const ReactionType reac_
Photonic process as determined from incoming particles.
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:311
constexpr int rho_p
ρ⁺.
double sample_out_hadron_mass(const ParticleTypePtr out_type)
Sample the mass of the outgoing hadron.
std::pair< double, double > diff_cross_section_single(const double t, const double m_rho)
For processes which can happen via (pi, a1, rho) and omega exchange, return the differential cross se...
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:303
static double xs_diff_pi0_rho_pi_rho_mediated(const double s, const double t, const double m_rho)
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
Definition: pdgcode.h:108
T uniform(T min, T max)
Definition: random.h:88
void perform_photons(const OutputsList &outputs)
Create the photon final state and write to output.
void add_dummy_hadronic_process(double reaction_cross_section)
Adds one hadronic process with a given cross-section.
static double xs_diff_pi0_rho_pi_omega_mediated(const double s, const double t, const double m_rho)
constexpr int pi_p
π⁺.
static double xs_pi_rho_pi0_rho_mediated(const double s, const double m_rho)
ReactionType
Enum for encoding the photon process.
constexpr int rho_m
ρ⁻.
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:68
CollisionBranchList photon_cross_sections(MediatorType mediator=default_mediator_)
Computes the total cross section of the photon process.
static double xs_pi0_rho_pi_rho_mediated(const double s, const double m_rho)
static double xs_pi_pi0_rho(const double s, const double m_rho)
void check_conservation(const uint32_t id_process) const
Check various conservation laws.
Definition: action.cc:247
static double xs_pi0_rho0_pi0(const double s, const double m_rho)
ThreeVector beta_cm() const
Get the velocity of the center of mass of the scattering particles in the calculation frame...
constexpr int p
Proton.
static double xs_pi0_rho_pi(const double s, const double m_rho)
const double hadron_out_mass_
Mass of outgoing hadron.
std::int32_t code() const
Definition: pdgcode.h:249
double diff_cross_section(const double t, const double m_rho, MediatorType mediator=default_mediator_) const
Calculate the differential cross section of photon process.
static double xs_pi0_rho_pi_omega_mediated(const double s, const double m_rho)
std::pair< double, double > form_factor_single(const double E_photon)
For processes which can happen via (pi, a1, rho) and omega exchange, return the form factor for the (...
static double xs_diff_pi_rho_pi0_rho_mediated(const double s, const double t, const double m_rho)
double diff_cross_section_w_ff(const double t, const double m_rho, const double E_photon)
Compute the differential cross section with form factors included.
constexpr int pi_m
π⁻.
double form_factor_omega(const double E_photon) const
Compute the form factor for a process with a omega as the lightest exchange particle.
static double xs_pi_pi_rho0(const double s, const double m_rho)
A pointer-like interface to global references to ParticleType objects.
Definition: particletype.h:654
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
static double xs_pi_rho_pi0(const double s, const double m_rho)
static double xs_pi_rho0_pi(const double s, const double m_rho)
static double xs_diff_pi0_rho0_pi0(const double s, const double t, const double m_rho)
ScatterAction is a special action which takes two incoming particles and performs a scattering...
Definition: scatteraction.h:31
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:32
constexpr double omega_mass
omega mass in GeV.
Definition: constants.h:73
const ParticleTypePtr hadron_out_t_
ParticleTypePtr to the type of the outgoing hadron.
ParticleData contains the dynamic information of a certain particle.
Definition: particledata.h:52
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
double cm_momentum() const
Get the momentum of the center of mass of the incoming particles in the calculation frame...
Definition: action.h:24
double mandelstam_s() const
Determine the Mandelstam s variable,.
static double xs_pi_rho_pi0_omega_mediated(const double s, const double m_rho)