Version: SMASH-1.8
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 static constexpr int LScatterAction = LogArea::ScatterAction::id;
29 
31  const ParticleList &in, const double time, const int n_frac_photons,
32  const double hadronic_cross_section_input)
33  : ScatterAction(in[0], in[1], time),
34  reac_(photon_reaction_type(in)),
35  number_of_fractional_photons_(n_frac_photons),
36  hadron_out_t_(outgoing_hadron_type(in)),
37  hadron_out_mass_(sample_out_hadron_mass(hadron_out_t_)),
38  hadronic_cross_section_(hadronic_cross_section_input) {}
39 
41  const ParticleList &in) {
42  if (in.size() != 2) {
44  }
45 
46  PdgCode a = in[0].pdgcode();
47  PdgCode b = in[1].pdgcode();
48 
49  // swap so that pion is first and there are less cases to be listed
50  if (!a.is_pion()) {
51  std::swap(a, b);
52  }
53 
54  switch (pack(a.code(), b.code())) {
55  case (pack(pdg::pi_p, pdg::pi_z)):
56  case (pack(pdg::pi_z, pdg::pi_p)):
58 
59  case (pack(pdg::pi_m, pdg::pi_z)):
60  case (pack(pdg::pi_z, pdg::pi_m)):
62 
63  case (pack(pdg::pi_p, pdg::rho_z)):
65 
66  case (pack(pdg::pi_m, pdg::rho_z)):
68 
69  case (pack(pdg::pi_m, pdg::rho_p)):
71 
72  case (pack(pdg::pi_p, pdg::rho_m)):
74 
75  case (pack(pdg::pi_z, pdg::rho_p)):
77 
78  case (pack(pdg::pi_z, pdg::rho_m)):
80 
81  case (pack(pdg::pi_p, pdg::pi_m)):
82  case (pack(pdg::pi_m, pdg::pi_p)):
84 
85  case (pack(pdg::pi_z, pdg::rho_z)):
87 
88  default:
90  }
91 }
92 
93 void ScatterActionPhoton::perform_photons(const OutputsList &outputs) {
94  for (int i = 0; i < number_of_fractional_photons_; i++) {
96  for (const auto &output : outputs) {
97  if (output->is_photon_output()) {
98  // we do not care about the local density
99  output->at_interaction(*this, 0.0);
100  }
101  }
102  }
103 }
104 
106  const ReactionType reaction) {
107  static const ParticleTypePtr rho_z_particle_ptr =
109  static const ParticleTypePtr rho_p_particle_ptr =
111  static const ParticleTypePtr rho_m_particle_ptr =
113  static const ParticleTypePtr pi_z_particle_ptr =
115  static const ParticleTypePtr pi_p_particle_ptr =
117  static const ParticleTypePtr pi_m_particle_ptr =
119 
120  switch (reaction) {
122  return rho_p_particle_ptr;
123  break;
125  return rho_m_particle_ptr;
126  break;
128  return rho_z_particle_ptr;
129  break;
130 
133  return pi_p_particle_ptr;
134 
137  return pi_m_particle_ptr;
138 
142  return pi_z_particle_ptr;
143  break;
144  default:
145  // default constructor constructs p with invalid index
146  ParticleTypePtr p{};
147  return p;
148  }
149 }
150 
152  const ParticleList &in) {
153  auto reac = photon_reaction_type(in);
154  return outgoing_hadron_type(reac);
155 }
156 
158  const ParticleList &in) {
159  auto reac = photon_reaction_type(in);
160  auto hadron = outgoing_hadron_type(in);
161 
162  if (reac == ReactionType::no_reaction)
163  return false;
164 
167  return false;
168  }
169 
170  // C15 has only s-channel. Make sure that CM-energy is high
171  // enough to produce mediating omega meson
172  if ((reac == ReactionType::pi_m_rho_p_pi_z ||
175  if (s_sqrt < omega_mass) {
176  return false;
177  }
178  }
179 
180  // for all other processes: if cm-energy is not high enough to produce final
181  // state particle reject the collision.
182  if (hadron->is_stable() && s_sqrt < hadron->mass()) {
183  return false;
184  // Make sure energy is high enough to not only create final state particle,
185  // but to also assign momentum.
186  } else if (!hadron->is_stable() &&
187  s_sqrt < (hadron->min_mass_spectral() + really_small)) {
188  return false;
189  } else {
190  return true;
191  }
192 }
193 
195  // we have only one reaction per incoming particle pair
196  if (collision_processes_photons_.size() != 1) {
197  logg[LScatterAction].fatal()
198  << "Problem in ScatterActionPhoton::generate_final_state().\n";
199  throw std::runtime_error("");
200  }
201  auto *proc = collision_processes_photons_[0].get();
202 
203  outgoing_particles_ = proc->particle_list();
204  process_type_ = proc->get_type();
205 
206  FourVector middle_point = get_interaction_point();
207 
208  // t is defined to be the momentum exchanged between the rho meson and the
209  // photon in pi + rho -> pi + photon channel. Therefore,
210  // get_t_range needs to be called with m2 being the rho mass instead of the
211  // pion mass. So, particles 1 and 2 are swapped if necessary.
212 
213  if (!incoming_particles_[0].pdgcode().is_pion()) {
214  std::swap(incoming_particles_[0], incoming_particles_[1]);
215  }
216 
217  // 2->2 inelastic scattering
218  // Sample the particle momenta in CM system
219  const double m1 = incoming_particles_[0].effective_mass();
220  const double m2 = incoming_particles_[1].effective_mass();
221 
222  const double &m_out = hadron_out_mass_;
223 
224  const double s = mandelstam_s();
225  const double sqrts = sqrt_s();
226  std::array<double, 2> mandelstam_t = get_t_range(sqrts, m1, m2, m_out, 0.0);
227  const double t1 = mandelstam_t[1];
228  const double t2 = mandelstam_t[0];
229  const double pcm_in = cm_momentum();
230  const double pcm_out = pCM(sqrts, m_out, 0.0);
231 
232  const double t = random::uniform(t1, t2);
233 
234  double costheta = (t - pow_int(m2, 2) +
235  0.5 * (s + pow_int(m2, 2) - pow_int(m1, 2)) *
236  (s - pow_int(m_out, 2)) / s) /
237  (pcm_in * (s - pow_int(m_out, 2)) / sqrts);
238 
239  // on very rare occasions near the kinematic threshold numerical issues give
240  // unphysical angles.
241  if (costheta > 1 || costheta < -1) {
242  logg[LScatterAction].warn()
243  << "Cos(theta)of photon scattering out of physical bounds in "
244  "the following scattering: "
245  << incoming_particles_ << "Clamping to [-1,1].";
246  if (costheta > 1.0)
247  costheta = 1.0;
248  if (costheta < -1.0)
249  costheta = -1.0;
250  }
251  Angles phitheta(random::uniform(0.0, twopi), costheta);
252  outgoing_particles_[0].set_4momentum(hadron_out_mass_,
253  phitheta.threevec() * pcm_out);
254  outgoing_particles_[1].set_4momentum(0.0, -phitheta.threevec() * pcm_out);
255 
256  // Set positions & boost to computational frame.
257  for (ParticleData &new_particle : outgoing_particles_) {
258  new_particle.set_4position(middle_point);
259  new_particle.boost_momentum(-beta_cm());
260  }
261 
262  const double E_Photon = outgoing_particles_[1].momentum()[0];
263 
264  // if rho in final state take already sampled mass (same as m_out). If rho is
265  // incoming take the mass of the incoming particle
266  const double m_rho = rho_mass();
267 
268  // compute the differential cross section with form factor included
269  const double diff_xs = diff_cross_section_w_ff(t, m_rho, E_Photon);
270 
271  // Weighing of the fractional photons
273  weight_ = diff_xs * (t2 - t1) /
275  } else {
276  weight_ = proc->weight() / hadronic_cross_section();
277  }
278  // Photons are not really part of the normal processes, so we have to set a
279  // constant arbitrary number.
280  const auto id_process = ID_PROCESS_PHOTON;
281  Action::check_conservation(id_process);
282 }
283 
285  double reaction_cross_section) {
286  CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
287  incoming_particles_[0].type(), incoming_particles_[1].type(),
288  reaction_cross_section, ProcessType::TwoToTwo);
289  add_collision(std::move(dummy_process));
290 }
291 
293  const ParticleTypePtr out_t) {
294  double mass = out_t->mass();
295  const double cms_energy = sqrt_s();
296  if (cms_energy <= out_t->min_mass_kinematic()) {
298  "Problem in ScatterActionPhoton::sample_hadron_mass");
299  }
300 
301  if (!out_t->is_stable()) {
302  mass = out_t->sample_resonance_mass(0, cms_energy);
303  }
304 
305  return mass;
306 }
307 
309  assert(reac_ != ReactionType::no_reaction);
310  switch (reac_) {
311  // rho in final state. use already sampled mass
315  return hadron_out_mass_;
316  // rho in initial state, use its mass
324  return (incoming_particles_[0].is_rho())
325  ? incoming_particles_[0].effective_mass()
326  : incoming_particles_[1].effective_mass();
328  default:
329  throw std::runtime_error(
330  "Invalid ReactionType in ScatterActionPhoton::rho_mass()");
331  }
332 }
333 
335  MediatorType mediator) {
336  CollisionBranchList process_list;
338 
339  static ParticleTypePtr photon_particle = &ParticleType::find(pdg::photon);
340 
341  const double s = mandelstam_s();
342  // the mass of the mediating particle depends on the channel. For an incoming
343  // rho it is the mass of the incoming particle, for an outgoing rho it is the
344  // sampled mass
345  const double m_rho = rho_mass();
346  double xsection = 0.0;
347 
348  switch (reac_) {
350  xsection = xs_object.xs_pi_pi_rho0(s, m_rho);
351  break;
352 
355  xsection = xs_object.xs_pi_pi0_rho(s, m_rho);
356  break;
357 
360  xsection = xs_object.xs_pi_rho0_pi(s, m_rho);
361  break;
362 
365  if (mediator == MediatorType::SUM) {
366  xsection = xs_object.xs_pi_rho_pi0(s, m_rho);
367  break;
368  } else if (mediator == MediatorType::PION) {
369  xsection = xs_object.xs_pi_rho_pi0_rho_mediated(s, m_rho);
370  break;
371  } else if (mediator == MediatorType::OMEGA) {
372  xsection = xs_object.xs_pi_rho_pi0_omega_mediated(s, m_rho);
373  break;
374  } else {
375  throw std::runtime_error("");
376  }
379  if (mediator == MediatorType::SUM) {
380  xsection = xs_object.xs_pi0_rho_pi(s, m_rho);
381  break;
382  } else if (mediator == MediatorType::PION) {
383  xsection = xs_object.xs_pi0_rho_pi_rho_mediated(s, m_rho);
384  break;
385  } else if (mediator == MediatorType::OMEGA) {
386  xsection = xs_object.xs_pi0_rho_pi_omega_mediated(s, m_rho);
387  break;
388  } else {
389  throw std::runtime_error("");
390  }
391 
393  xsection = xs_object.xs_pi0_rho0_pi0(s, m_rho);
394  break;
395 
397  // never reached
398  break;
399  }
400 
401  // Due to numerical reasons it can happen that the calculated cross sections
402  // are negative (approximately -1e-15) if sqrt(s) is close to the threshold
403  // energy. In those cases the cross section is manually set to 0.1 mb, which
404  // is a reasonable value for the processes we are looking at (C14,C15,C16).
405 
406  if (xsection <= 0) {
407  xsection = 0.1;
408  logg[LScatterAction].warn(
409  "Calculated negative cross section.\nParticles ", incoming_particles_,
410  " mass rho particle: ", m_rho, ", 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
smash
Definition: action.h:24
smash::Action::incoming_particles_
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:304
smash::ScatterActionPhoton::reac_
const ReactionType reac_
Photonic process as determined from incoming particles.
Definition: scatteractionphoton.h:191
smash::ScatterActionPhoton::number_of_fractional_photons_
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
Definition: scatteractionphoton.h:198
smash::ScatterActionPhoton::is_kinematically_possible
static bool is_kinematically_possible(const double s_sqrt, const ParticleList &in)
Check if CM-energy is sufficient to produce hadron in final state.
Definition: scatteractionphoton.cc:157
pow.h
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi0_rho0_pi0
static double xs_pi0_rho0_pi0(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:4011
smash::pdg::Lambda
constexpr int Lambda
Λ.
Definition: pdgcode_constants.h:47
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi_rho_pi0
static double xs_pi_rho_pi0(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:4440
smash::ScatterActionPhoton::ReactionType::pi_p_rho_m_pi_z
smash::ParticleData
Definition: particledata.h:52
smash::ScatterActionPhoton::hadron_out_mass_
const double hadron_out_mass_
Mass of outgoing hadron.
Definition: scatteractionphoton.h:204
smash::CrosssectionsPhoton< ComputationMethod::Analytic >
Class to calculate the cross-section of a meson-meson to meson-photon process.
Definition: crosssectionsphoton.h:32
smash::omega_mass
constexpr double omega_mass
omega mass in GeV.
Definition: constants.h:76
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi_pi_rho0
static double xs_pi_pi_rho0(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:4451
cxx14compat.h
smash::PdgCode::is_pion
bool is_pion() const
Definition: pdgcode.h:369
smash::ScatterActionPhoton::ReactionType::pi_p_pi_m_rho_z
smash::ScatterAction
Definition: scatteraction.h:31
smash::Action::check_conservation
virtual void check_conservation(const uint32_t id_process) const
Check various conservation laws.
Definition: action.cc:246
smash::ScatterAction::cm_momentum
double cm_momentum() const
Get the momentum of the center of mass of the incoming particles in the calculation frame.
Definition: scatteraction.cc:156
smash::ScatterActionPhoton::ReactionType::pi_m_rho_z_pi_m
smash::ParticleType::mass
double mass() const
Definition: particletype.h:144
smash::pdg::rho_z
constexpr int rho_z
ρ⁰.
Definition: pdgcode_constants.h:85
smash::ScatterActionPhoton::perform_photons
void perform_photons(const OutputsList &outputs)
Create the photon final state and write to output.
Definition: scatteractionphoton.cc:93
smash::ScatterActionPhoton::photon_cross_sections
CollisionBranchList photon_cross_sections(MediatorType mediator=default_mediator_)
Computes the total cross section of the photon process.
Definition: scatteractionphoton.cc:334
smash::pdg::rho_p
constexpr int rho_p
ρ⁺.
Definition: pdgcode_constants.h:83
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi0_rho_pi_rho_mediated
static double xs_diff_pi0_rho_pi_rho_mediated(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:2472
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi_pi0_rho
static double xs_pi_pi0_rho(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:7050
smash::ScatterActionPhoton::ReactionType::pi_z_pi_p_rho_p
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi_rho0_pi
static double xs_pi_rho0_pi(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:81
smash::ProcessType::TwoToTwo
2->2 inelastic scattering
smash::ScatterActionPhoton::rho_mass
double rho_mass() const
Find the mass of the participating rho-particle.
Definition: scatteractionphoton.cc:308
smash::ScatterAction::beta_cm
ThreeVector beta_cm() const
Get the velocity of the center of mass of the scattering particles in the calculation frame.
Definition: scatteraction.cc:146
smash::ScatterActionPhoton::ReactionType
ReactionType
Enum for encoding the photon process.
Definition: scatteractionphoton.h:112
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::pdg::photon
constexpr int photon
Photon.
Definition: pdgcode_constants.h:25
smash::ScatterActionPhoton::MediatorType::OMEGA
smash::ScatterActionPhoton::ReactionType::pi_z_rho_m_pi_m
smash::pCM
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi0_rho_pi
static double xs_pi0_rho_pi(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:4433
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
smash::ParticleType::find
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:105
random.h
angles.h
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi_pi_rho0
static double xs_diff_pi_pi_rho0(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:6770
crosssectionsphoton.h
smash::ScatterActionPhoton::photon_reaction_type
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
Definition: scatteractionphoton.cc:40
forwarddeclarations.h
smash::ParticleTypePtr
Definition: particletype.h:663
outputinterface.h
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi_rho0_pi
static double xs_diff_pi_rho0_pi(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:1335
smash::get_t_range
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
smash::ScatterActionPhoton::hadron_out_t_
const ParticleTypePtr hadron_out_t_
ParticleTypePtr to the type of the outgoing hadron.
Definition: scatteractionphoton.h:201
smash::twopi
constexpr double twopi
.
Definition: constants.h:42
smash::ScatterActionPhoton::form_factor_single
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 (...
Definition: scatteractionphoton.cc:568
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi0_rho0_pi0
static double xs_diff_pi0_rho0_pi0(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:4192
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi_rho_pi0_omega_mediated
static double xs_diff_pi_rho_pi0_omega_mediated(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:4288
smash::ScatterActionPhoton::diff_cross_section_w_ff
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.
Definition: scatteractionphoton.cc:478
smash::ParticleType::is_stable
bool is_stable() const
Definition: particletype.h:236
smash::ParticleType::sample_resonance_mass
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 'this') and one ...
Definition: particletype.cc:622
smash::Action::process_type_
ProcessType process_type_
type of process
Definition: action.h:321
smash::ScatterActionPhoton::form_factor_pion
double form_factor_pion(const double E_photon) const
Compute the form factor for a process with a pion as the lightest exchange particle.
Definition: scatteractionphoton.cc:543
smash::ScatterActionPhoton::outgoing_hadron_type
static ParticleTypePtr outgoing_hadron_type(const ParticleList &in)
Return ParticleTypePtr of hadron in the out channel, given the incoming particles.
Definition: scatteractionphoton.cc:151
smash::ScatterActionPhoton::ReactionType::pi_m_rho_p_pi_z
smash::ScatterActionPhoton::generate_final_state
void generate_final_state() override
Generate the final-state for the photon scatter process.
Definition: scatteractionphoton.cc:194
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi0_rho_pi_rho_mediated
static double xs_pi0_rho_pi_rho_mediated(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:1607
smash::LScatterAction
static constexpr int LScatterAction
Definition: bremsstrahlungaction.cc:17
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi_rho_pi0_omega_mediated
static double xs_pi_rho_pi0_omega_mediated(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:4241
smash::ScatterActionPhoton::weight_
double weight_
Weight of the produced photon.
Definition: scatteractionphoton.h:220
particletype.h
smash::ScatterActionPhoton::hadronic_cross_section
double hadronic_cross_section() const
Return the total cross section of the underlying hadronic scattering.
Definition: scatteractionphoton.h:71
smash::PdgCode
Definition: pdgcode.h:108
smash::ScatterActionPhoton::diff_cross_section
double diff_cross_section(const double t, const double m_rho, MediatorType mediator=default_mediator_) const
Calculate the differential cross section of photon process.
Definition: scatteractionphoton.cc:417
smash::Action::outgoing_particles_
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:312
smash::Angles::threevec
ThreeVector threevec() const
Definition: angles.h:268
kinematics.h
smash::Action::sqrt_s
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:266
smash::ScatterActionPhoton::ReactionType::pi_z_rho_p_pi_p
smash::pow_int
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
scatteractionphoton.h
smash::ScatterActionPhoton::ReactionType::pi_z_pi_m_rho_m
constants.h
smash::ScatterActionPhoton::MediatorType
MediatorType
Compile-time switch for setting the handling of processes which can happen via different mediating pa...
Definition: scatteractionphoton.h:215
smash::ScatterAction::add_collision
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
Definition: scatteraction.cc:41
pdgcode.h
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi_pi0_rho
static double xs_diff_pi_pi0_rho(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:8630
smash::ScatterActionPhoton::ReactionType::pi_p_rho_z_pi_p
smash::ScatterActionPhoton::ReactionType::no_reaction
smash::FourVector
Definition: fourvector.h:33
smash::ScatterActionPhoton::ScatterActionPhoton
ScatterActionPhoton(const ParticleList &in, const double time, const int n_frac_photons, const double hadronic_cross_section_input)
Construct a ScatterActionPhoton object.
Definition: scatteractionphoton.cc:30
smash::Action::get_interaction_point
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:69
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::Angles
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
smash::ScatterActionPhoton::MediatorType::PION
smash::random::uniform
T uniform(T min, T max)
Definition: random.h:88
smash::ID_PROCESS_PHOTON
constexpr std::uint32_t ID_PROCESS_PHOTON
Process ID for any photon process.
Definition: constants.h:131
smash::ScatterActionPhoton::collision_processes_photons_
CollisionBranchList collision_processes_photons_
Holds the photon branch.
Definition: scatteractionphoton.h:188
smash::pdg::rho_m
constexpr int rho_m
ρ⁻.
Definition: pdgcode_constants.h:87
smash::pdg::pi_m
constexpr int pi_m
π⁻.
Definition: pdgcode_constants.h:66
smash::ScatterActionPhoton::form_factor_omega
double form_factor_omega(const double E_photon) const
Compute the form factor for a process with a omega as the lightest exchange particle.
Definition: scatteractionphoton.cc:555
smash::ScatterActionPhoton::MediatorType::SUM
smash::ScatterActionPhoton::sample_out_hadron_mass
double sample_out_hadron_mass(const ParticleTypePtr out_type)
Sample the mass of the outgoing hadron.
Definition: scatteractionphoton.cc:292
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi_rho_pi0_rho_mediated
static double xs_pi_rho_pi0_rho_mediated(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:2677
smash::PdgCode::code
std::int32_t code() const
Definition: pdgcode.h:247
smash::ScatterActionPhoton::diff_cross_section_single
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...
Definition: scatteractionphoton.cc:574
smash::Action::InvalidResonanceFormation
Definition: action.h:298
smash::ScatterActionPhoton::ReactionType::pi_z_rho_z_pi_z
smash::pdg::pi_p
constexpr int pi_p
π⁺.
Definition: pdgcode_constants.h:62
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_pi0_rho_pi_omega_mediated
static double xs_pi0_rho_pi_omega_mediated(const double s, const double m_rho)
Total cross sections for given photon process:
Definition: crosssectionsphoton.cc:4320
tabulation.h
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi_rho_pi0_rho_mediated
static double xs_diff_pi_rho_pi0_rho_mediated(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:3794
smash::CrosssectionsPhoton< ComputationMethod::Analytic >::xs_diff_pi0_rho_pi_omega_mediated
static double xs_diff_pi0_rho_pi_omega_mediated(const double s, const double t, const double m_rho)
Differential cross section for given photon process.
Definition: crosssectionsphoton.cc:4402
smash::ScatterAction::mandelstam_s
double mandelstam_s() const
Determine the Mandelstam s variable,.
Definition: scatteraction.cc:154
smash::pack
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
Definition: pdgcode_constants.h:107
smash::ScatterActionPhoton::add_dummy_hadronic_process
void add_dummy_hadronic_process(double reaction_cross_section)
Adds one hadronic process with a given cross-section.
Definition: scatteractionphoton.cc:284
smash::ScatterActionPhoton::default_mediator_
static constexpr MediatorType default_mediator_
Value used for default exchange particle. See MediatorType.
Definition: scatteractionphoton.h:217