Version: SMASH-2.0
scatteractionphoton.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2016-2020
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/outputinterface.h"
20 #include "smash/particletype.h"
21 #include "smash/pow.h"
22 #include "smash/random.h"
23 
24 namespace smash {
25 static constexpr int LScatterAction = LogArea::ScatterAction::id;
26 
28  const ParticleList &in, const double time, const int n_frac_photons,
29  const double hadronic_cross_section_input)
30  : ScatterAction(in[0], in[1], time),
31  reac_(photon_reaction_type(in)),
32  number_of_fractional_photons_(n_frac_photons),
33  hadron_out_t_(outgoing_hadron_type(in)),
34  hadron_out_mass_(sample_out_hadron_mass(hadron_out_t_)),
35  hadronic_cross_section_(hadronic_cross_section_input) {}
36 
38  const ParticleList &in) {
39  if (in.size() != 2) {
41  }
42 
43  PdgCode a = in[0].pdgcode();
44  PdgCode b = in[1].pdgcode();
45 
46  // swap so that pion is first and there are less cases to be listed
47  if (!a.is_pion()) {
48  std::swap(a, b);
49  }
50 
51  switch (pack(a.code(), b.code())) {
52  case (pack(pdg::pi_p, pdg::pi_z)):
53  case (pack(pdg::pi_z, pdg::pi_p)):
55 
56  case (pack(pdg::pi_m, pdg::pi_z)):
57  case (pack(pdg::pi_z, pdg::pi_m)):
59 
60  case (pack(pdg::pi_p, pdg::rho_z)):
62 
63  case (pack(pdg::pi_m, pdg::rho_z)):
65 
66  case (pack(pdg::pi_m, pdg::rho_p)):
68 
69  case (pack(pdg::pi_p, pdg::rho_m)):
71 
72  case (pack(pdg::pi_z, pdg::rho_p)):
74 
75  case (pack(pdg::pi_z, pdg::rho_m)):
77 
78  case (pack(pdg::pi_p, pdg::pi_m)):
79  case (pack(pdg::pi_m, pdg::pi_p)):
81 
82  case (pack(pdg::pi_z, pdg::rho_z)):
84 
85  default:
87  }
88 }
89 
90 void ScatterActionPhoton::perform_photons(const OutputsList &outputs) {
91  for (int i = 0; i < number_of_fractional_photons_; i++) {
93  for (const auto &output : outputs) {
94  if (output->is_photon_output()) {
95  // we do not care about the local density
96  output->at_interaction(*this, 0.0);
97  }
98  }
99  }
100 }
101 
103  const ReactionType reaction) {
104  static const ParticleTypePtr rho_z_particle_ptr =
106  static const ParticleTypePtr rho_p_particle_ptr =
108  static const ParticleTypePtr rho_m_particle_ptr =
110  static const ParticleTypePtr pi_z_particle_ptr =
112  static const ParticleTypePtr pi_p_particle_ptr =
114  static const ParticleTypePtr pi_m_particle_ptr =
116 
117  switch (reaction) {
119  return rho_p_particle_ptr;
120  break;
122  return rho_m_particle_ptr;
123  break;
125  return rho_z_particle_ptr;
126  break;
127 
130  return pi_p_particle_ptr;
131 
134  return pi_m_particle_ptr;
135 
139  return pi_z_particle_ptr;
140  break;
141  default:
142  // default constructor constructs p with invalid index
143  ParticleTypePtr p{};
144  return p;
145  }
146 }
147 
149  const ParticleList &in) {
150  auto reac = photon_reaction_type(in);
151  return outgoing_hadron_type(reac);
152 }
153 
155  const ParticleList &in) {
156  auto reac = photon_reaction_type(in);
157  auto hadron = outgoing_hadron_type(in);
158 
159  if (reac == ReactionType::no_reaction)
160  return false;
161 
164  return false;
165  }
166 
167  // C15 has only s-channel. Make sure that CM-energy is high
168  // enough to produce mediating omega meson
169  if ((reac == ReactionType::pi_m_rho_p_pi_z ||
172  if (s_sqrt < omega_mass) {
173  return false;
174  }
175  }
176 
177  // for all other processes: if cm-energy is not high enough to produce final
178  // state particle reject the collision.
179  if (hadron->is_stable() && s_sqrt < hadron->mass()) {
180  return false;
181  // Make sure energy is high enough to not only create final state particle,
182  // but to also assign momentum.
183  } else if (!hadron->is_stable() &&
184  s_sqrt < (hadron->min_mass_spectral() + really_small)) {
185  return false;
186  } else {
187  return true;
188  }
189 }
190 
192  // we have only one reaction per incoming particle pair
193  if (collision_processes_photons_.size() != 1) {
194  logg[LScatterAction].fatal()
195  << "Problem in ScatterActionPhoton::generate_final_state().\n";
196  throw std::runtime_error("");
197  }
198  auto *proc = collision_processes_photons_[0].get();
199 
200  outgoing_particles_ = proc->particle_list();
201  process_type_ = proc->get_type();
202 
203  FourVector middle_point = get_interaction_point();
204 
205  // t is defined to be the momentum exchanged between the rho meson and the
206  // photon in pi + rho -> pi + photon channel. Therefore,
207  // get_t_range needs to be called with m2 being the rho mass instead of the
208  // pion mass. So, particles 1 and 2 are swapped if necessary.
209 
210  if (!incoming_particles_[0].pdgcode().is_pion()) {
211  std::swap(incoming_particles_[0], incoming_particles_[1]);
212  }
213 
214  // 2->2 inelastic scattering
215  // Sample the particle momenta in CM system
216  const double m1 = incoming_particles_[0].effective_mass();
217  const double m2 = incoming_particles_[1].effective_mass();
218 
219  const double &m_out = hadron_out_mass_;
220 
221  const double s = mandelstam_s();
222  const double sqrts = sqrt_s();
223  std::array<double, 2> mandelstam_t = get_t_range(sqrts, m1, m2, m_out, 0.0);
224  const double t1 = mandelstam_t[1];
225  const double t2 = mandelstam_t[0];
226  const double pcm_in = cm_momentum();
227  const double pcm_out = pCM(sqrts, m_out, 0.0);
228 
229  const double t = random::uniform(t1, t2);
230 
231  double costheta = (t - pow_int(m2, 2) +
232  0.5 * (s + pow_int(m2, 2) - pow_int(m1, 2)) *
233  (s - pow_int(m_out, 2)) / s) /
234  (pcm_in * (s - pow_int(m_out, 2)) / sqrts);
235 
236  // on very rare occasions near the kinematic threshold numerical issues give
237  // unphysical angles.
238  if (costheta > 1 || costheta < -1) {
239  logg[LScatterAction].warn()
240  << "Cos(theta)of photon scattering out of physical bounds in "
241  "the following scattering: "
242  << incoming_particles_ << "Clamping to [-1,1].";
243  if (costheta > 1.0)
244  costheta = 1.0;
245  if (costheta < -1.0)
246  costheta = -1.0;
247  }
248  Angles phitheta(random::uniform(0.0, twopi), costheta);
249  outgoing_particles_[0].set_4momentum(hadron_out_mass_,
250  phitheta.threevec() * pcm_out);
251  outgoing_particles_[1].set_4momentum(0.0, -phitheta.threevec() * pcm_out);
252 
253  // Set positions & boost to computational frame.
254  for (ParticleData &new_particle : outgoing_particles_) {
255  new_particle.set_4position(middle_point);
256  new_particle.boost_momentum(
258  }
259 
260  const double E_Photon = outgoing_particles_[1].momentum()[0];
261 
262  // Weighing of the fractional photons
264  // if rho in final state take already sampled mass (same as m_out). If rho
265  // is 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  weight_ = diff_xs * (t2 - t1) /
273  } else {
274  // compute the total cross section with form factor included
275  const double total_xs = total_cross_section_w_ff(E_Photon);
276 
277  weight_ = total_xs / hadronic_cross_section();
278  }
279  // Scale weight by cross section scaling factor of incoming particles
280  weight_ *= incoming_particles_[0].xsec_scaling_factor() *
281  incoming_particles_[1].xsec_scaling_factor();
282 
283  // Photons are not really part of the normal processes, so we have to set a
284  // constant arbitrary number.
285  const auto id_process = ID_PROCESS_PHOTON;
286  Action::check_conservation(id_process);
287 }
288 
290  double reaction_cross_section) {
291  CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
292  incoming_particles_[0].type(), incoming_particles_[1].type(),
293  reaction_cross_section, ProcessType::TwoToTwo);
294  add_collision(std::move(dummy_process));
295 }
296 
298  const ParticleTypePtr out_t) {
299  double mass = out_t->mass();
300  const double cms_energy = sqrt_s();
301  if (cms_energy <= out_t->min_mass_kinematic()) {
303  "Problem in ScatterActionPhoton::sample_hadron_mass");
304  }
305 
306  if (!out_t->is_stable()) {
307  mass = out_t->sample_resonance_mass(0, cms_energy);
308  }
309 
310  return mass;
311 }
312 
314  assert(reac_ != ReactionType::no_reaction);
315  switch (reac_) {
316  // rho in final state. use already sampled mass
320  return hadron_out_mass_;
321  // rho in initial state, use its mass
329  return (incoming_particles_[0].is_rho())
330  ? incoming_particles_[0].effective_mass()
331  : incoming_particles_[1].effective_mass();
333  default:
334  throw std::runtime_error(
335  "Invalid ReactionType in ScatterActionPhoton::rho_mass()");
336  }
337 }
338 
340  CollisionBranchList process_list;
341 
342  static ParticleTypePtr photon_particle = &ParticleType::find(pdg::photon);
343  double xsection = total_cross_section();
344 
345  process_list.push_back(make_unique<CollisionBranch>(
346  *hadron_out_t_, *photon_particle, xsection, ProcessType::TwoToTwo));
348  return process_list;
349 }
350 
352  CollisionBranchList process_list;
354 
355  const double s = mandelstam_s();
356  // the mass of the mediating particle depends on the channel. For an incoming
357  // rho it is the mass of the incoming particle, for an outgoing rho it is the
358  // sampled mass
359  const double m_rho = rho_mass();
360  double xsection = 0.0;
361 
362  switch (reac_) {
364  xsection = xs_object.xs_pi_pi_rho0(s, m_rho);
365  break;
366 
369  xsection = xs_object.xs_pi_pi0_rho(s, m_rho);
370  break;
371 
374  xsection = xs_object.xs_pi_rho0_pi(s, m_rho);
375  break;
376 
379  if (mediator == MediatorType::SUM) {
380  xsection = xs_object.xs_pi_rho_pi0(s, m_rho);
381  break;
382  } else if (mediator == MediatorType::PION) {
383  xsection = xs_object.xs_pi_rho_pi0_rho_mediated(s, m_rho);
384  break;
385  } else if (mediator == MediatorType::OMEGA) {
386  xsection = xs_object.xs_pi_rho_pi0_omega_mediated(s, m_rho);
387  break;
388  } else {
389  throw std::runtime_error("");
390  }
393  if (mediator == MediatorType::SUM) {
394  xsection = xs_object.xs_pi0_rho_pi(s, m_rho);
395  break;
396  } else if (mediator == MediatorType::PION) {
397  xsection = xs_object.xs_pi0_rho_pi_rho_mediated(s, m_rho);
398  break;
399  } else if (mediator == MediatorType::OMEGA) {
400  xsection = xs_object.xs_pi0_rho_pi_omega_mediated(s, m_rho);
401  break;
402  } else {
403  throw std::runtime_error("");
404  }
405 
407  xsection = xs_object.xs_pi0_rho0_pi0(s, m_rho);
408  break;
409 
411  // never reached
412  break;
413  }
414 
415  if (xsection == 0.0) {
416  // Vanishing cross sections are problematic for the creation of a
417  // CollisionBranch. For infrastructure reasons it is however necessary to
418  // create such a collision branch whenever the underlying hadronic
419  // scattering is a candidate for a photon interaction. In these cases we
420  // need to manually set a dummy value for the cross section and produce the
421  // photon. This photon will however automatically be assigned a 0 weight
422  // because of the vanishing cross section and therefore not be of relevance
423  // for any analysis.
424  // In other cases, where the collision branch was already created, we
425  // do not want to overwrite the cross section, of course.
426  xsection = collision_branch_created_ ? 0.0 : 0.01;
427  } else if (xsection < 0) {
428  // Due to numerical reasons it can happen that the calculated cross sections
429  // are negative (approximately -1e-15) if sqrt(s) is close to the threshold
430  // energy. In those cases the cross section is manually set to 0.1 mb, which
431  // is a reasonable value for the processes we are looking at (C14,C15,C16).
432  xsection = 0.1;
433  logg[LScatterAction].warn(
434  "Calculated negative cross section.\nParticles ", incoming_particles_,
435  " mass rho particle: ", m_rho, ", sqrt_s: ", std::sqrt(s));
436  }
437  return xsection;
438 }
439 
440 double ScatterActionPhoton::total_cross_section_w_ff(const double E_photon) {
450  /* C12, C13, C15, C16 need special treatment. These processes have identical
451  incoming and outgoing particles, but diffrent mediating particles and
452  hence different form factors. If both channels are added up
453  (MediatorType::SUM), each contribution is corrected by the corresponding
454  form factor.
455  */
456  switch (reac_) {
462  std::pair<double, double> FF = form_factor_pair(E_photon);
463  std::pair<double, double> xs = total_cross_section_pair();
464  const double xs_ff =
465  pow_int(FF.first, 4) * xs.first + pow_int(FF.second, 4) * xs.second;
466  return xs_ff;
467  } else if (default_mediator_ == MediatorType::PION) {
468  const double FF = form_factor_pion(E_photon);
469  const double xs = total_cross_section();
470  return pow_int(FF, 4) * xs;
471  } else if (default_mediator_ == MediatorType::OMEGA) {
472  const double FF = form_factor_omega(E_photon);
473  const double xs = total_cross_section();
474  return pow_int(FF, 4) * xs;
475  }
476  break;
477  }
483  const double FF = form_factor_pion(E_photon);
484  const double xs = total_cross_section();
485  const double xs_ff = pow_int(FF, 4) * xs;
486  return xs_ff;
487  }
488 
490  const double FF = form_factor_omega(E_photon);
491  const double xs = total_cross_section();
492  const double xs_ff = pow_int(FF, 4) * xs;
493  return xs_ff;
494  }
495 
497  default:
498  throw std::runtime_error("");
499  return 0;
500  }
501 }
502 
504  const double m_rho,
505  MediatorType mediator) const {
506  const double s = mandelstam_s();
507  double diff_xsection = 0.0;
508 
510 
511  switch (reac_) {
513  diff_xsection = xs_object.xs_diff_pi_pi_rho0(s, t, m_rho);
514  break;
515 
518  diff_xsection = xs_object.xs_diff_pi_pi0_rho(s, t, m_rho);
519  break;
520 
523  diff_xsection = xs_object.xs_diff_pi_rho0_pi(s, t, m_rho);
524  break;
525 
528  if (mediator == MediatorType::SUM) {
529  diff_xsection =
530  xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho) +
531  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
532  } else if (mediator == MediatorType::OMEGA) {
533  diff_xsection =
534  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
535  } else if (mediator == MediatorType::PION) {
536  diff_xsection = xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho);
537  }
538  break;
539 
542  if (mediator == MediatorType::SUM) {
543  diff_xsection =
544  xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho) +
545  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
546  } else if (mediator == MediatorType::OMEGA) {
547  diff_xsection =
548  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
549  } else if (mediator == MediatorType::PION) {
550  diff_xsection = xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho);
551  }
552  break;
553 
555  diff_xsection = xs_object.xs_diff_pi0_rho0_pi0(s, t, m_rho);
556  break;
558  // never reached
559  break;
560  }
561  return diff_xsection;
562 }
563 
565  const double m_rho,
566  const double E_photon) {
576  /* C12, C13, C15, C16 need special treatment. These processes have identical
577  incoming and outgoing particles, but diffrent mediating particles and
578  hence different form factors. If both channels are added up
579  (MediatorType::SUM), each contribution is corrected by the corresponding
580  form factor.
581  */
582  switch (reac_) {
588  std::pair<double, double> FF = form_factor_pair(E_photon);
589  std::pair<double, double> diff_xs = diff_cross_section_pair(t, m_rho);
590  const double xs_ff = pow_int(FF.first, 4) * diff_xs.first +
591  pow_int(FF.second, 4) * diff_xs.second;
592  return xs_ff;
593  } else if (default_mediator_ == MediatorType::PION) {
594  const double FF = form_factor_pion(E_photon);
595  const double diff_xs = diff_cross_section(t, m_rho);
596  return pow_int(FF, 4) * diff_xs;
597  } else if (default_mediator_ == MediatorType::OMEGA) {
598  const double FF = form_factor_omega(E_photon);
599  const double diff_xs = diff_cross_section(t, m_rho);
600  return pow_int(FF, 4) * diff_xs;
601  }
602  break;
603  }
609  const double FF = form_factor_pion(E_photon);
610  const double xs = diff_cross_section(t, m_rho);
611  const double xs_ff = pow_int(FF, 4) * xs;
612  return xs_ff;
613  }
614 
616  const double FF = form_factor_omega(E_photon);
617  const double xs = diff_cross_section(t, m_rho);
618  const double xs_ff = pow_int(FF, 4) * xs;
619  return xs_ff;
620  }
621 
623  default:
624  throw std::runtime_error("");
625  return 0;
626  }
627 }
628 
629 double ScatterActionPhoton::form_factor_pion(const double E_photon) const {
630  const double Lambda = 1.0;
631  const double Lambda2 = Lambda * Lambda;
632 
633  const double t_ff = 34.5096 * std::pow(E_photon, 0.737) -
634  67.557 * std::pow(E_photon, 0.7584) +
635  32.858 * std::pow(E_photon, 0.7806);
636  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
637 
638  return ff * ff;
639 }
640 
641 double ScatterActionPhoton::form_factor_omega(const double E_photon) const {
642  const double Lambda = 1.0;
643  const double Lambda2 = Lambda * Lambda;
644 
645  const double t_ff = -61.595 * std::pow(E_photon, 0.9979) +
646  28.592 * std::pow(E_photon, 1.1579) +
647  37.738 * std::pow(E_photon, 0.9317) -
648  5.282 * std::pow(E_photon, 1.3686);
649  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
650 
651  return ff * ff;
652 }
653 
654 std::pair<double, double> ScatterActionPhoton::form_factor_pair(
655  const double E_photon) {
656  return std::pair<double, double>(form_factor_pion(E_photon),
657  form_factor_omega(E_photon));
658 }
659 
661  const double xs_pion = total_cross_section(MediatorType::PION);
662  const double xs_omega = total_cross_section(MediatorType::OMEGA);
663 
664  return std::pair<double, double>(xs_pion, xs_omega);
665 }
666 
668  const double t, const double m_rho) {
669  const double diff_xs_pion = diff_cross_section(t, m_rho, MediatorType::PION);
670  const double diff_xs_omega =
672 
673  return std::pair<double, double>(diff_xs_pion, diff_xs_omega);
674 }
675 
676 } // namespace smash
smash
Definition: action.h:24
smash::Action::incoming_particles_
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:326
smash::ScatterActionPhoton::total_cross_section_pair
std::pair< double, double > total_cross_section_pair()
For processes which can happen via (pi, a1, rho) and omega exchange, return the total cross section f...
Definition: scatteractionphoton.cc:660
smash::ScatterActionPhoton::reac_
const ReactionType reac_
Photonic process as determined from incoming particles.
Definition: scatteractionphoton.h:194
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:201
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:154
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:4014
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:4443
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:207
smash::ScatterActionPhoton::total_cross_section_w_ff
double total_cross_section_w_ff(const double E_photon)
Compute the total cross corrected for form factors.
Definition: scatteractionphoton.cc:440
smash::CrosssectionsPhoton< ComputationMethod::Analytic >
Class to calculate the cross-section of a meson-meson to meson-photon process.
Definition: crosssectionsphoton.h:32
smash::ScatterActionPhoton::create_collision_branch
CollisionBranchList create_collision_branch()
Creates a CollisionBranchList containing the photon processes.
Definition: scatteractionphoton.cc:339
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:4454
cxx14compat.h
smash::PdgCode::is_pion
bool is_pion() const
Definition: pdgcode.h:381
smash::ScatterActionPhoton::ReactionType::pi_p_pi_m_rho_z
smash::ScatterAction
Definition: scatteraction.h:30
smash::Action::check_conservation
virtual void check_conservation(const uint32_t id_process) const
Check various conservation laws.
Definition: action.cc:345
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:161
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:90
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:2475
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:7053
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:84
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:313
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:4436
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:99
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:6773
crosssectionsphoton.h
smash::ScatterActionPhoton::photon_reaction_type
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
Definition: scatteractionphoton.cc:37
forwarddeclarations.h
smash::ParticleTypePtr
Definition: particletype.h:665
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:1338
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:204
smash::twopi
constexpr double twopi
.
Definition: constants.h:42
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:4195
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:4291
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 corrected for form factors.
Definition: scatteractionphoton.cc:564
smash::ParticleType::is_stable
bool is_stable() const
Definition: particletype.h:239
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:615
smash::Action::process_type_
ProcessType process_type_
type of process
Definition: action.h:343
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:629
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:148
smash::ScatterActionPhoton::ReactionType::pi_m_rho_p_pi_z
smash::ScatterActionPhoton::form_factor_pair
std::pair< double, double > form_factor_pair(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:654
smash::ScatterActionPhoton::generate_final_state
void generate_final_state() override
Generate the final-state for the photon scatter process.
Definition: scatteractionphoton.cc:191
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:1610
smash::LScatterAction
static constexpr int LScatterAction
Definition: bremsstrahlungaction.cc:16
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:4244
smash::ScatterActionPhoton::weight_
double weight_
Weight of the produced photon.
Definition: scatteractionphoton.h:223
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::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::ScatterActionPhoton::total_cross_section
double total_cross_section(MediatorType mediator=default_mediator_) const
Calculate the total cross section of the photon process.
Definition: scatteractionphoton.cc:351
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 the photon process.
Definition: scatteractionphoton.cc:503
smash::Action::outgoing_particles_
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:334
smash::Angles::threevec
ThreeVector threevec() const
Definition: angles.h:268
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:218
smash::ScatterAction::add_collision
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
Definition: scatteraction.cc:40
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:8633
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:27
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::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:118
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:641
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:297
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:2680
smash::PdgCode::code
std::int32_t code() const
Definition: pdgcode.h:247
smash::Action::InvalidResonanceFormation
Definition: action.h:320
smash::ScatterActionPhoton::ReactionType::pi_z_rho_z_pi_z
smash::ScatterActionPhoton::diff_cross_section_pair
std::pair< double, double > diff_cross_section_pair(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:667
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:4323
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:3797
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:4405
smash::ScatterAction::mandelstam_s
double mandelstam_s() const
Determine the Mandelstam s variable,.
Definition: scatteraction.cc:159
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::collision_branch_created_
bool collision_branch_created_
Was the collision branch already created?
Definition: scatteractionphoton.h:191
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:289
smash::ScatterActionPhoton::default_mediator_
static constexpr MediatorType default_mediator_
Value used for default exchange particle. See MediatorType.
Definition: scatteractionphoton.h:220