Version: SMASH-1.5
scatteractionphoton.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2016-2018
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  } else {
184  return true;
185  }
186 }
187 
189  // we have only one reaction per incoming particle pair
190  if (collision_processes_photons_.size() != 1) {
191  const auto &log = logger<LogArea::ScatterAction>();
192  log.fatal() << "Problem in ScatterActionPhoton::generate_final_state().\n";
193  throw std::runtime_error("");
194  }
195  auto *proc = collision_processes_photons_[0].get();
196 
197  outgoing_particles_ = proc->particle_list();
198  process_type_ = proc->get_type();
199 
200  FourVector middle_point = get_interaction_point();
201 
202  // t is defined to be the momentum exchanged between the rho meson and the
203  // photon in pi + rho -> pi + photon channel. Therefore,
204  // get_t_range needs to be called with m2 being the rho mass instead of the
205  // pion mass. So, particles 1 and 2 are swapped if necessary.
206 
207  if (!incoming_particles_[0].pdgcode().is_pion()) {
208  std::swap(incoming_particles_[0], incoming_particles_[1]);
209  }
210 
211  // 2->2 inelastic scattering
212  // Sample the particle momenta in CM system
213  const double m1 = incoming_particles_[0].effective_mass();
214  const double m2 = incoming_particles_[1].effective_mass();
215 
216  const double &m_out = hadron_out_mass_;
217 
218  const double s = mandelstam_s();
219  const double sqrts = sqrt_s();
220  std::array<double, 2> mandelstam_t = get_t_range(sqrts, m1, m2, m_out, 0.0);
221  const double t1 = mandelstam_t[1];
222  const double t2 = mandelstam_t[0];
223  const double pcm_in = cm_momentum();
224  const double pcm_out = pCM(sqrts, m_out, 0.0);
225 
226  const double t = random::uniform(t1, t2);
227 
228  double costheta = (t - pow_int(m2, 2) +
229  0.5 * (s + pow_int(m2, 2) - pow_int(m1, 2)) *
230  (s - pow_int(m_out, 2)) / s) /
231  (pcm_in * (s - pow_int(m_out, 2)) / sqrts);
232 
233  // on very rare occasions near the kinematic threshold numerical issues give
234  // unphysical angles.
235  if (costheta > 1 || costheta < -1) {
236  const auto &log = logger<LogArea::ScatterAction>();
237  log.warn() << "Cos(theta)of photon scattering out of physical bounds in "
238  "the following scattering: "
239  << incoming_particles_ << "Clamping to [-1,1].";
240  if (costheta > 1.0)
241  costheta = 1.0;
242  if (costheta < -1.0)
243  costheta = -1.0;
244  }
245  Angles phitheta(random::uniform(0.0, twopi), costheta);
246  outgoing_particles_[0].set_4momentum(hadron_out_mass_,
247  phitheta.threevec() * pcm_out);
248  outgoing_particles_[1].set_4momentum(0.0, -phitheta.threevec() * pcm_out);
249 
250  // Set positions & boost to computational frame.
251  for (ParticleData &new_particle : outgoing_particles_) {
252  new_particle.set_4position(middle_point);
253  new_particle.boost_momentum(-beta_cm());
254  }
255 
256  const double E_Photon = outgoing_particles_[1].momentum()[0];
257 
258  // if rho in final state take already sampled mass (same as m_out). If rho is
259  // incoming take the mass of the incoming particle
260  const double m_rho = rho_mass();
261 
262  // compute the differential cross section with form factor included
263  const double diff_xs = diff_cross_section_w_ff(t, m_rho, E_Photon);
264 
265  // Weighing of the fractional photons
267  weight_ = diff_xs * (t2 - t1) /
269  } else {
270  weight_ = proc->weight() / hadronic_cross_section();
271  }
272  // Photons are not really part of the normal processes, so we have to set a
273  // constant arbitrary number.
274  const auto id_process = ID_PROCESS_PHOTON;
275  Action::check_conservation(id_process);
276 }
277 
279  double reaction_cross_section) {
280  CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
281  incoming_particles_[0].type(), incoming_particles_[1].type(),
282  reaction_cross_section, ProcessType::TwoToTwo);
283  add_collision(std::move(dummy_process));
284 }
285 
287  const ParticleTypePtr out_t) {
288  double mass = out_t->mass();
289  const double cms_energy = sqrt_s();
290  if (cms_energy <= out_t->min_mass_kinematic()) {
292  "Problem in ScatterActionPhoton::sample_hadron_mass");
293  }
294 
295  if (!out_t->is_stable()) {
296  mass = out_t->sample_resonance_mass(0, cms_energy);
297  }
298 
299  return mass;
300 }
301 
303  assert(reac_ != ReactionType::no_reaction);
304  switch (reac_) {
305  // rho in final state. use already sampled mass
309  return hadron_out_mass_;
310  // rho in initial state, use its mass
318  return (incoming_particles_[0].is_rho())
319  ? incoming_particles_[0].effective_mass()
320  : incoming_particles_[1].effective_mass();
322  default:
323  throw std::runtime_error(
324  "Invalid ReactionType in ScatterActionPhoton::rho_mass()");
325  }
326 }
327 
329  MediatorType mediator) {
330  CollisionBranchList process_list;
332 
333  static ParticleTypePtr photon_particle = &ParticleType::find(pdg::photon);
334 
335  const double s = mandelstam_s();
336  // the mass of the mediating particle depends on the channel. For an incoming
337  // rho it is the mass of the incoming particle, for an outgoing rho it is the
338  // sampled mass
339  const double m_rho = rho_mass();
340  double xsection = 0.0;
341 
342  switch (reac_) {
344  xsection = xs_object.xs_pi_pi_rho0(s, m_rho);
345  break;
346 
349  xsection = xs_object.xs_pi_pi0_rho(s, m_rho);
350  break;
351 
354  xsection = xs_object.xs_pi_rho0_pi(s, m_rho);
355  break;
356 
359  if (mediator == MediatorType::SUM) {
360  xsection = xs_object.xs_pi_rho_pi0(s, m_rho);
361  break;
362  } else if (mediator == MediatorType::PION) {
363  xsection = xs_object.xs_pi_rho_pi0_rho_mediated(s, m_rho);
364  break;
365  } else if (mediator == MediatorType::OMEGA) {
366  xsection = xs_object.xs_pi_rho_pi0_omega_mediated(s, m_rho);
367  break;
368  } else {
369  throw std::runtime_error("");
370  }
373  if (mediator == MediatorType::SUM) {
374  xsection = xs_object.xs_pi0_rho_pi(s, m_rho);
375  break;
376  } else if (mediator == MediatorType::PION) {
377  xsection = xs_object.xs_pi0_rho_pi_rho_mediated(s, m_rho);
378  break;
379  } else if (mediator == MediatorType::OMEGA) {
380  xsection = xs_object.xs_pi0_rho_pi_omega_mediated(s, m_rho);
381  break;
382  } else {
383  throw std::runtime_error("");
384  }
385 
387  xsection = xs_object.xs_pi0_rho0_pi0(s, m_rho);
388  break;
389 
391  // never reached
392  break;
393  }
394 
395  // Due to numerical reasons it can happen that the calculated cross sections
396  // are negative (approximately -1e-15) if sqrt(s) is close to the threshold
397  // energy. In those cases the cross section is manually set to 0.1 mb, which
398  // is a reasonable value for the processes we are looking at (C14,C15,C16).
399 
400  if (xsection <= 0) {
401  xsection = 0.1;
402  const auto &log = logger<LogArea::ScatterAction>();
403  log.warn("Calculated negative cross section.\nParticles ",
404  incoming_particles_, " mass rho particle: ", m_rho,
405  ", sqrt_s: ", std::sqrt(s));
406  }
407  process_list.push_back(make_unique<CollisionBranch>(
408  *hadron_out_t_, *photon_particle, xsection, ProcessType::TwoToTwo));
409  return process_list;
410 }
411 
413  const double m_rho,
414  MediatorType mediator) const {
415  const double s = mandelstam_s();
416  double diff_xsection = 0.0;
417 
419 
420  switch (reac_) {
422  diff_xsection = xs_object.xs_diff_pi_pi_rho0(s, t, m_rho);
423  break;
424 
427  diff_xsection = xs_object.xs_diff_pi_pi0_rho(s, t, m_rho);
428  break;
429 
432  diff_xsection = xs_object.xs_diff_pi_rho0_pi(s, t, m_rho);
433  break;
434 
437  if (mediator == MediatorType::SUM) {
438  diff_xsection =
439  xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho) +
440  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
441  } else if (mediator == MediatorType::OMEGA) {
442  diff_xsection =
443  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
444  } else if (mediator == MediatorType::PION) {
445  diff_xsection = xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho);
446  }
447  break;
448 
451  if (mediator == MediatorType::SUM) {
452  diff_xsection =
453  xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho) +
454  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
455  } else if (mediator == MediatorType::OMEGA) {
456  diff_xsection =
457  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
458  } else if (mediator == MediatorType::PION) {
459  diff_xsection = xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho);
460  }
461  break;
462 
464  diff_xsection = xs_object.xs_diff_pi0_rho0_pi0(s, t, m_rho);
465  break;
467  // never reached
468  break;
469  }
470  return diff_xsection;
471 }
472 
474  const double m_rho,
475  const double E_photon) {
485  /* C12, C13, C15, C16 need special treatment. These processes have identical
486  incoming and outgoing particles, but diffrent mediating particles and
487  hence different form factors. If both channels are added up
488  (MediatorType::SUM), each contribution is corrected by the corresponding
489  form factor.
490  */
491  switch (reac_) {
497  std::pair<double, double> FF = form_factor_single(E_photon);
498  std::pair<double, double> diff_xs = diff_cross_section_single(t, m_rho);
499  const double xs_ff = pow_int(FF.first, 4) * diff_xs.first +
500  pow_int(FF.second, 4) * diff_xs.second;
501  return xs_ff;
502  } else if (default_mediator_ == MediatorType::PION) {
503  const double FF = form_factor_pion(E_photon);
504  const double diff_xs = diff_cross_section(t, m_rho);
505  return pow_int(FF, 4) * diff_xs;
506  } else if (default_mediator_ == MediatorType::OMEGA) {
507  const double FF = form_factor_omega(E_photon);
508  const double diff_xs = diff_cross_section(t, m_rho);
509  return pow_int(FF, 4) * diff_xs;
510  }
511  break;
512  }
518  const double FF = form_factor_pion(E_photon);
519  const double xs = diff_cross_section(t, m_rho);
520  const double xs_ff = pow_int(FF, 4) * xs;
521  return xs_ff;
522  }
523 
525  const double FF = form_factor_omega(E_photon);
526  const double xs = diff_cross_section(t, m_rho);
527  const double xs_ff = pow_int(FF, 4) * xs;
528  return xs_ff;
529  }
530 
532  default:
533  throw std::runtime_error("");
534  return 0;
535  }
536 }
537 
538 double ScatterActionPhoton::form_factor_pion(const double E_photon) const {
539  const double Lambda = 1.0;
540  const double Lambda2 = Lambda * Lambda;
541 
542  const double t_ff = 34.5096 * pow(E_photon, 0.737) -
543  67.557 * pow(E_photon, 0.7584) +
544  32.858 * pow(E_photon, 0.7806);
545  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
546 
547  return ff * ff;
548 }
549 
550 double ScatterActionPhoton::form_factor_omega(const double E_photon) const {
551  const double Lambda = 1.0;
552  const double Lambda2 = Lambda * Lambda;
553 
554  const double t_ff =
555  -61.595 * pow(E_photon, 0.9979) + 28.592 * pow(E_photon, 1.1579) +
556  37.738 * pow(E_photon, 0.9317) - 5.282 * pow(E_photon, 1.3686);
557  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
558 
559  return ff * ff;
560 }
561 
562 std::pair<double, double> ScatterActionPhoton::form_factor_single(
563  const double E_photon) {
564  return std::pair<double, double>(form_factor_pion(E_photon),
565  form_factor_omega(E_photon));
566 }
567 
569  const double t, const double m_rho) {
570  const double diff_xs_rho = diff_cross_section(t, m_rho, MediatorType::PION);
571  const double diff_xs_omega =
573 
574  return std::pair<double, double>(diff_xs_rho, diff_xs_omega);
575 }
576 
577 } // 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 mass() const
Definition: particletype.h:134
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:68
static ParticleTypePtr outgoing_hadron_type(const ParticleList &in)
Return ParticleTypePtr of hadron in the out channel, given the incoming particles.
double diff_cross_section(const double t, const double m_rho, MediatorType mediator=default_mediator_) const
Calculate the differential cross section of photon process.
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 ...
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.
double cm_momentum() const
Get the momentum of the center of mass of the incoming particles in the calculation frame...
double hadronic_cross_section() const
Return the total cross section of the underlying hadronic scattering.
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)
ThreeVector beta_cm() const
Get the velocity of the center of mass of the scattering particles in the calculation frame...
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...
ThreeVector threevec() const
Definition: angles.h:268
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.
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.
2->2 inelastic scattering
bool is_pion() const
Definition: pdgcode.h:372
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.
double mandelstam_s() const
Determine the Mandelstam s variable,.
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.
constexpr double twopi
.
Definition: constants.h:39
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.
bool is_stable() const
Definition: particletype.h:226
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:311
constexpr int rho_p
ρ⁺.
double form_factor_omega(const double E_photon) const
Compute the form factor for a process with a omega as the lightest exchange particle.
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:85
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
ρ⁻.
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)
static double xs_pi0_rho0_pi0(const double s, const double m_rho)
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.
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
π⁻.
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:660
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)
double rho_mass() const
Find the mass of the participating rho-particle.
static double xs_pi_rho0_pi(const double s, const double m_rho)
double form_factor_pion(const double E_photon) const
Compute the form factor for a process with a pion as the lightest exchange particle.
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
void check_conservation(const uint32_t id_process) const
Check various conservation laws.
Definition: action.cc:219
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
std::int32_t code() const
Definition: pdgcode.h:249
Definition: action.h:24
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:265
static double xs_pi_rho_pi0_omega_mediated(const double s, const double m_rho)