Version: SMASH-1.8
bremsstrahlungaction.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2020 -
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
12 #include "smash/interpolation2D.h"
13 #include "smash/outputinterface.h"
14 #include "smash/random.h"
15 
16 namespace smash {
17 static constexpr int LScatterAction = LogArea::ScatterAction::id;
18 
20  const ParticleList &in, const double time, const int n_frac_photons,
21  const double hadronic_cross_section_input)
22  : ScatterAction(in[0], in[1], time),
23  reac_(bremsstrahlung_reaction_type(in)),
24  number_of_fractional_photons_(n_frac_photons),
25  hadronic_cross_section_(hadronic_cross_section_input) {}
26 
29  if (in.size() != 2) {
31  }
32 
33  PdgCode a = in[0].pdgcode();
34  PdgCode b = in[1].pdgcode();
35 
36  switch (pack(a.code(), b.code())) {
37  case (pack(pdg::pi_z, pdg::pi_m)):
38  case (pack(pdg::pi_m, pdg::pi_z)):
40 
41  case (pack(pdg::pi_z, pdg::pi_p)):
42  case (pack(pdg::pi_p, pdg::pi_z)):
44 
45  case (pack(pdg::pi_m, pdg::pi_p)):
46  case (pack(pdg::pi_p, pdg::pi_m)):
48 
49  case (pack(pdg::pi_m, pdg::pi_m)):
51 
52  case (pack(pdg::pi_p, pdg::pi_p)):
54 
55  case (pack(pdg::pi_z, pdg::pi_z)):
57 
58  default:
60  }
61 }
62 
63 void BremsstrahlungAction::perform_bremsstrahlung(const OutputsList &outputs) {
64  for (int i = 0; i < number_of_fractional_photons_; i++) {
66  for (const auto &output : outputs) {
67  if (output->is_photon_output()) {
68  // we do not care about the local density
69  output->at_interaction(*this, 0.0);
70  }
71  }
72  }
73 }
74 
76  // we have only one reaction per incoming particle pair
77  if (collision_processes_bremsstrahlung_.size() != 1) {
78  logg[LScatterAction].fatal()
79  << "Problem in BremsstrahlungAction::generate_final_state().\nThe "
80  "brocess branch has "
82  << " entries. It should however have 1.";
83  throw std::runtime_error("");
84  }
85 
86  auto *proc = collision_processes_bremsstrahlung_[0].get();
87 
88  outgoing_particles_ = proc->particle_list();
89  process_type_ = proc->get_type();
90  FourVector interaction_point = get_interaction_point();
91 
92  // Sample k and theta:
93  // minimum cutoff for k to be in accordance with cross section calculations
94  double delta_k; // k-range
95  double k_min = 0.001;
96  double k_max =
97  (sqrt_s() * sqrt_s() - 2 * outgoing_particles_[0].type().mass() * 2 *
98  outgoing_particles_[1].type().mass()) /
99  (2 * sqrt_s());
100 
101  if ((k_max - k_min) < 0.0) {
102  // Make sure it is kinematically even possible to create a photon that is
103  // in accordance with the cross section cutoff
104  k_ = 0.0;
105  delta_k = 0.0;
106  } else {
107  k_ = random::uniform(k_min, k_max);
108  delta_k = (k_max - k_min);
109  }
110  theta_ = random::uniform(0.0, M_PI);
111 
112  // Sample the phase space anisotropically in the local rest frame
114 
115  // Get differential cross sections
116  std::pair<double, double> diff_xs_pair = brems_diff_cross_sections();
117  double diff_xs_k = diff_xs_pair.first;
118  double diff_xs_theta = diff_xs_pair.second;
119 
120  // Assign weighting factor
121  const double W_theta = diff_xs_theta * (M_PI - 0.0);
122  const double W_k = diff_xs_k * delta_k;
123  weight_ = sqrt(W_theta * W_k) /
125 
126  // Set position and formation time and boost back to computational frame
127  for (auto &new_particle : outgoing_particles_) {
128  // assuming decaying particles are always fully formed
129  new_particle.set_formation_time(time_of_execution_);
130  new_particle.set_4position(interaction_point);
131  new_particle.boost_momentum(-beta_cm());
132  }
133 
134  // Photons are not really part of the normal processes, so we have to set a
135  // constant arbitrary number.
136  const auto id_process = ID_PROCESS_PHOTON;
137  Action::check_conservation(id_process);
138 }
139 
141  assert(outgoing_particles_.size() == 3);
142  const double m_a = outgoing_particles_[0].type().mass(),
143  m_b = outgoing_particles_[1].type().mass(),
144  m_c = outgoing_particles_[2].type().mass();
145  const double sqrts = sqrt_s();
146  const double E_ab = sqrts - m_c - k_; // Ekin of the pion pair in cm frame
147  const double pcm = pCM(sqrts, E_ab, m_c); // cm momentum of (π pair - photon)
148  const double pcm_pions = pCM(E_ab, m_a, m_b); // cm momentum within pion pair
149 
150  // Photon angle: Phi random, theta from theta_ sampled above
151  const Angles phitheta_photon(random::uniform(0.0, twopi), std::cos(theta_));
152  outgoing_particles_[2].set_4momentum(m_c, pcm * phitheta_photon.threevec());
153  // Boost velocity to cm frame of the two pions
154  const ThreeVector beta_cm_pion_pair_photon =
155  pcm * phitheta_photon.threevec() / std::sqrt(pcm * pcm + E_ab * E_ab);
156 
157  // Sample pion pair isotropically
158  Angles phitheta;
159  phitheta.distribute_isotropically();
160  outgoing_particles_[0].set_4momentum(m_a, pcm_pions * phitheta.threevec());
161  outgoing_particles_[1].set_4momentum(m_b, -pcm_pions * phitheta.threevec());
162  outgoing_particles_[0].boost_momentum(beta_cm_pion_pair_photon);
163  outgoing_particles_[1].boost_momentum(beta_cm_pion_pair_photon);
164 }
165 
167  double reaction_cross_section) {
168  CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
169  incoming_particles_[0].type(), incoming_particles_[1].type(),
170  reaction_cross_section, ProcessType::Bremsstrahlung);
171  add_collision(std::move(dummy_process));
172 }
173 
175  CollisionBranchList process_list;
176  // ParticleList final_state_particles;
177  static const ParticleTypePtr photon_particle =
179  static const ParticleTypePtr pi_z_particle = &ParticleType::find(pdg::pi_z);
180  static const ParticleTypePtr pi_p_particle = &ParticleType::find(pdg::pi_p);
181  static const ParticleTypePtr pi_m_particle = &ParticleType::find(pdg::pi_m);
182 
183  // Create interpolation objects, if not yet existent; only trigger for one
184  // of them as either all or none is created
187  }
188 
189  // Find cross section corresponding to given sqrt(s)
190  double sqrts = sqrt_s();
191  double xsection;
192 
194  // Here the final state is determined by the the final state provided by the
195  // sampled process using Monte Carlo techniqus
196 
197  // In the case of two oppositely charged pions as incoming particles,
198  // there are two potential final states: pi+ + pi- and pi0 + pi0
199  double xsection_pipi = (*pipi_pipi_opp_interpolation)(sqrts);
200  double xsection_pi0pi0 = (*pipi_pi0pi0_interpolation)(sqrts);
201 
202  // Prevent negative cross sections due to numerics in interpolation
203  xsection_pipi = (xsection_pipi <= 0.0) ? really_small : xsection_pipi;
204  xsection_pi0pi0 = (xsection_pi0pi0 <= 0.0) ? really_small : xsection_pi0pi0;
205 
206  // Necessary only to decide for a final state with pi+ and pi- as incoming
207  // particles.
208  CollisionBranchList process_list_pipi;
209 
210  // Add both processes to the process_list
211  process_list_pipi.push_back(make_unique<CollisionBranch>(
212  incoming_particles_[0].type(), incoming_particles_[1].type(),
213  *photon_particle, xsection_pipi, ProcessType::Bremsstrahlung));
214  process_list_pipi.push_back(make_unique<CollisionBranch>(
215  *pi_z_particle, *pi_z_particle, *photon_particle, xsection_pi0pi0,
217 
218  // Decide for one of the possible final states
219  double total_cross_section = xsection_pipi + xsection_pi0pi0;
220  const CollisionBranch *proc =
221  choose_channel<CollisionBranch>(process_list_pipi, total_cross_section);
222 
223  xsection = proc->weight();
224 
225  process_list.push_back(make_unique<CollisionBranch>(
226  proc->particle_list()[0].type(), proc->particle_list()[1].type(),
227  *photon_particle, xsection, ProcessType::Bremsstrahlung));
228 
229  } else if (reac_ == ReactionType::pi_m_pi_m ||
233  // Here the final state hadrons are identical to the initial state hadrons
235  xsection = (*pipi_pipi_same_interpolation)(sqrts);
236  } else {
237  // One pi0 in initial and final state
238  xsection = (*pipi0_pipi0_interpolation)(sqrts);
239  }
240 
241  // Prevent negative cross sections due to numerics in interpolation
242  xsection = (xsection <= 0.0) ? really_small : xsection;
243 
244  process_list.push_back(make_unique<CollisionBranch>(
245  incoming_particles_[0].type(), incoming_particles_[1].type(),
246  *photon_particle, xsection, ProcessType::Bremsstrahlung));
247 
248  } else if (reac_ == ReactionType::pi_z_pi_z) {
249  // Here we have a hard-coded final state that differs from the initial
250  // state, namely: pi0 + pi0 -> pi+- + pi-+ + gamma
251  xsection = (*pi0pi0_pipi_interpolation)(sqrts);
252 
253  // Prevent negative cross sections due to numerics in interpolation
254  xsection = (xsection <= 0.0) ? really_small : xsection;
255 
256  process_list.push_back(make_unique<CollisionBranch>(
257  *pi_p_particle, *pi_m_particle, *photon_particle, xsection,
259  } else {
260  throw std::runtime_error("Unknown ReactionType in BremsstrahlungAction.");
261  }
262 
263  return process_list;
264 }
265 
267  static const ParticleTypePtr pi_z_particle = &ParticleType::find(pdg::pi_z);
268  const double collision_energy = sqrt_s();
269  double dsigma_dk;
270  double dsigma_dtheta;
271 
273  if (outgoing_particles_[0].type() != *pi_z_particle) {
274  // pi+- + pi+-- -> pi+- + pi+- + gamma
275  dsigma_dk =
276  (*pipi_pipi_opp_dsigma_dk_interpolation)(k_, collision_energy);
277  dsigma_dtheta = (*pipi_pipi_opp_dsigma_dtheta_interpolation)(
278  theta_, collision_energy);
279  } else {
280  // pi+- + pi+-- -> pi0 + pi0 + gamma
281  dsigma_dk = (*pipi_pi0pi0_dsigma_dk_interpolation)(k_, collision_energy);
282  dsigma_dtheta =
283  (*pipi_pi0pi0_dsigma_dtheta_interpolation)(theta_, collision_energy);
284  }
285  } else if (reac_ == ReactionType::pi_p_pi_p ||
287  dsigma_dk = (*pipi_pipi_same_dsigma_dk_interpolation)(k_, collision_energy);
288  dsigma_dtheta =
289  (*pipi_pipi_same_dsigma_dtheta_interpolation)(theta_, collision_energy);
290  } else if (reac_ == ReactionType::pi_z_pi_p ||
292  dsigma_dk = (*pipi0_pipi0_dsigma_dk_interpolation)(k_, collision_energy);
293  dsigma_dtheta =
294  (*pipi0_pipi0_dsigma_dtheta_interpolation)(theta_, collision_energy);
295  } else if (reac_ == ReactionType::pi_z_pi_z) {
296  dsigma_dk = (*pi0pi0_pipi_dsigma_dk_interpolation)(k_, collision_energy);
297  dsigma_dtheta =
298  (*pi0pi0_pipi_dsigma_dtheta_interpolation)(theta_, collision_energy);
299  } else {
300  throw std::runtime_error(
301  "Unkown channel when computing differential cross sections for "
302  "bremsstrahlung processes.");
303  }
304 
305  // Prevent negative cross sections due to numerics in interpolation
306  dsigma_dk = (dsigma_dk < 0.0) ? really_small : dsigma_dk;
307  dsigma_dtheta = (dsigma_dtheta < 0.0) ? really_small : dsigma_dtheta;
308 
309  // Combine differential cross sections to a pair
310  std::pair<double, double> diff_x_sections = {dsigma_dk, dsigma_dtheta};
311 
312  return diff_x_sections;
313 }
314 
316  // Read in tabularized values for sqrt(s), k and theta
317  std::vector<double> sqrts = BREMS_SQRTS;
318  std::vector<double> photon_momentum = BREMS_K;
319  std::vector<double> photon_angle = BREMS_THETA;
320 
321  // Read in tabularized total cross sections
322  std::vector<double> sigma_pipi_pipi_opp = BREMS_PIPI_PIPI_OPP_SIG;
323  std::vector<double> sigma_pipi_pipi_same = BREMS_PIPI_PIPI_SAME_SIG;
324  std::vector<double> sigma_pipi0_pipi0 = BREMS_PIPI0_PIPI0_SIG;
325  std::vector<double> sigma_pipi_pi0pi0 = BREMS_PIPI_PI0PI0_SIG;
326  std::vector<double> sigma_pi0pi0_pipi = BREMS_PI0PI0_PIPI_SIG;
327 
328  // Read in tabularized differential cross sections dSigma/dk
329  std::vector<double> dsigma_dk_pipi_pipi_opp = BREMS_PIPI_PIPI_OPP_DIFF_SIG_K;
330  std::vector<double> dsigma_dk_pipi_pipi_same =
332  std::vector<double> dsigma_dk_pipi0_pipi0 = BREMS_PIPI0_PIPI0_DIFF_SIG_K;
333  std::vector<double> dsigma_dk_pipi_pi0pi0 = BREMS_PIPI_PI0PI0_DIFF_SIG_K;
334  std::vector<double> dsigma_dk_pi0pi0_pipi = BREMS_PI0PI0_PIPI_DIFF_SIG_K;
335 
336  // Read in tabularized differential cross sections dSigma/dtheta
337  std::vector<double> dsigma_dtheta_pipi_pipi_opp =
339  std::vector<double> dsigma_dtheta_pipi_pipi_same =
341  std::vector<double> dsigma_dtheta_pipi0_pipi0 =
343  std::vector<double> dsigma_dtheta_pipi_pi0pi0 =
345  std::vector<double> dsigma_dtheta_pi0pi0_pipi =
347 
348  // Create interpolation objects containing linear interpolations for
349  // total cross sections
351  make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi_pipi_opp);
353  make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi_pipi_same);
355  make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi0_pipi0);
357  make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi_pi0pi0);
359  make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pi0pi0_pipi);
360 
361  // Create interpolation objects containing bicubic interpolations for
362  // differential dSigma/dk
363  pipi_pipi_opp_dsigma_dk_interpolation = make_unique<InterpolateData2DSpline>(
364  photon_momentum, sqrts, dsigma_dk_pipi_pipi_opp);
365  pipi_pipi_same_dsigma_dk_interpolation = make_unique<InterpolateData2DSpline>(
366  photon_momentum, sqrts, dsigma_dk_pipi_pipi_same);
367  pipi0_pipi0_dsigma_dk_interpolation = make_unique<InterpolateData2DSpline>(
368  photon_momentum, sqrts, dsigma_dk_pipi0_pipi0);
369  pipi_pi0pi0_dsigma_dk_interpolation = make_unique<InterpolateData2DSpline>(
370  photon_momentum, sqrts, dsigma_dk_pipi_pi0pi0);
371  pi0pi0_pipi_dsigma_dk_interpolation = make_unique<InterpolateData2DSpline>(
372  photon_momentum, sqrts, dsigma_dk_pi0pi0_pipi);
373 
374  // Create interpolation objects containing bicubic interpolations for
375  // differential dSigma/dtheta
377  make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
378  dsigma_dtheta_pipi_pipi_opp);
380  make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
381  dsigma_dtheta_pipi_pipi_same);
383  make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
384  dsigma_dtheta_pipi0_pipi0);
386  make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
387  dsigma_dtheta_pipi_pi0pi0);
389  make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
390  dsigma_dtheta_pi0pi0_pipi);
391 }
392 } // namespace smash
smash::pipi_pipi_same_interpolation
static std::unique_ptr< InterpolateDataLinear< double > > pipi_pipi_same_interpolation
Definition: crosssectionsbrems.h:4826
smash
Definition: action.h:24
smash::ProcessBranch::particle_list
ParticleList particle_list() const
Definition: processbranch.cc:26
smash::Action::incoming_particles_
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:304
smash::BremsstrahlungAction::create_interpolations
void create_interpolations()
Create interpolation objects for tabularized cross sections: total cross section, differential dSigma...
Definition: bremsstrahlungaction.cc:315
smash::BREMS_PIPI_PIPI_SAME_DIFF_SIG_K
const std::initializer_list< double > BREMS_PIPI_PIPI_SAME_DIFF_SIG_K
dSigma/dk for π+ + π+ -> π+ + π+ + γ or π- + π- -> π- + π- + γ
Definition: crosssectionsbrems.h:4866
smash::BremsstrahlungAction::brems_cross_sections
CollisionBranchList brems_cross_sections()
Computes the total cross section of the bremsstrahlung process.
Definition: bremsstrahlungaction.cc:174
smash::BREMS_PIPI_PI0PI0_SIG
const std::initializer_list< double > BREMS_PIPI_PI0PI0_SIG
Total π+- + π-+ -> π0 + π0 + γ cross section.
Definition: crosssectionsbrems.h:16040
smash::BREMS_PI0PI0_PIPI_DIFF_SIG_THETA
const std::initializer_list< double > BREMS_PI0PI0_PIPI_DIFF_SIG_THETA
dSigma/dtheta for π0 + π0 -> π+- + π-+ + γ
Definition: crosssectionsbrems.h:23694
smash::Action::time_of_execution_
const double time_of_execution_
Time at which the action is supposed to be performed (absolute time in the lab frame in fm/c).
Definition: action.h:318
smash::BREMS_K
const std::initializer_list< double > BREMS_K
photon momentum
Definition: crosssectionsbrems.h:41
smash::BREMS_PIPI_PI0PI0_DIFF_SIG_K
const std::initializer_list< double > BREMS_PIPI_PI0PI0_DIFF_SIG_K
dSigma/dk for π+- + π-+ -> π0 + π0 + γ
Definition: crosssectionsbrems.h:16068
smash::BREMS_PIPI_PIPI_OPP_SIG
const std::initializer_list< double > BREMS_PIPI_PIPI_OPP_SIG
Total π+- + π-+ -> π+- + π-+ + γ cross section.
Definition: crosssectionsbrems.h:88
smash::BremsstrahlungAction::number_of_fractional_photons_
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
Definition: bremsstrahlungaction.h:151
smash::BremsstrahlungAction::ReactionType::pi_z_pi_z
smash::BremsstrahlungAction::k_
double k_
Sampled value of k (photon momentum)
Definition: bremsstrahlungaction.h:163
smash::pipi_pipi_opp_dsigma_dtheta_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_opp_dsigma_dtheta_interpolation
Definition: crosssectionsbrems.h:84
smash::pipi0_pipi0_interpolation
static std::unique_ptr< InterpolateDataLinear< double > > pipi0_pipi0_interpolation
Definition: crosssectionsbrems.h:10429
smash::BREMS_SQRTS
const std::initializer_list< double > BREMS_SQRTS
Center-of-mass energy.
Definition: crosssectionsbrems.h:23
smash::BremsstrahlungAction::brems_diff_cross_sections
std::pair< double, double > brems_diff_cross_sections()
Computes the differential cross sections dSigma/dk and dSigma/dtheta of the bremsstrahlung process.
Definition: bremsstrahlungaction.cc:266
smash::BREMS_PI0PI0_PIPI_DIFF_SIG_K
const std::initializer_list< double > BREMS_PI0PI0_PIPI_DIFF_SIG_K
dSigma/dk for π0 + π0 -> π+- + π-+ + γ
Definition: crosssectionsbrems.h:21262
smash::BremsstrahlungAction::bremsstrahlung_reaction_type
static ReactionType bremsstrahlung_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
Definition: bremsstrahlungaction.cc:28
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::BremsstrahlungAction::sample_3body_phasespace
void sample_3body_phasespace() override
Sample the final state anisotropically, considering the differential cross sections with respect to t...
Definition: bremsstrahlungaction.cc:140
smash::BremsstrahlungAction::ReactionType::pi_z_pi_m
smash::Angles::distribute_isotropically
void distribute_isotropically()
Populate the object with a new direction.
Definition: angles.h:188
smash::BremsstrahlungAction::hadronic_cross_section
double hadronic_cross_section() const
Return the total cross section of the underlying hadronic scattering It is necessary for the weightin...
Definition: bremsstrahlungaction.h:74
smash::BREMS_PIPI_PI0PI0_DIFF_SIG_THETA
const std::initializer_list< double > BREMS_PIPI_PI0PI0_DIFF_SIG_THETA
dSigma/dtheta for π+- + π-+ -> π0 + π0 + γ
Definition: crosssectionsbrems.h:18500
smash::pi0pi0_pipi_interpolation
static std::unique_ptr< InterpolateDataLinear< double > > pi0pi0_pipi_interpolation
Definition: crosssectionsbrems.h:21226
smash::pipi_pipi_opp_interpolation
static std::unique_ptr< InterpolateDataLinear< double > > pipi_pipi_opp_interpolation
Definition: crosssectionsbrems.h:80
smash::BremsstrahlungAction::ReactionType::pi_m_pi_m
smash::BREMS_THETA
const std::initializer_list< double > BREMS_THETA
theta angle with respect to collision axis of incoming pions
Definition: crosssectionsbrems.h:61
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::BremsstrahlungAction::add_dummy_hadronic_process
void add_dummy_hadronic_process(double reaction_cross_section)
Adds one hadronic process with a given cross-section.
Definition: bremsstrahlungaction.cc:166
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::BremsstrahlungAction::weight_
double weight_
Weight of the produced photon.
Definition: bremsstrahlungaction.h:154
smash::pCM
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
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
smash::pipi_pi0pi0_interpolation
static std::unique_ptr< InterpolateDataLinear< double > > pipi_pi0pi0_interpolation
Definition: crosssectionsbrems.h:16032
smash::BremsstrahlungAction::theta_
double theta_
Sampled value of theta (angle of the photon)
Definition: bremsstrahlungaction.h:166
smash::ParticleTypePtr
Definition: particletype.h:663
smash::ThreeVector
Definition: threevector.h:31
outputinterface.h
smash::BREMS_PIPI0_PIPI0_DIFF_SIG_THETA
const std::initializer_list< double > BREMS_PIPI0_PIPI0_DIFF_SIG_THETA
dSigma/dtheta for π0 + π -> π0 + π + γ
Definition: crosssectionsbrems.h:13306
smash::BREMS_PIPI_PIPI_OPP_DIFF_SIG_THETA
const std::initializer_list< double > BREMS_PIPI_PIPI_OPP_DIFF_SIG_THETA
dSigma/dtheta for π+- + π-+ -> π+- + π-+ + γ
Definition: crosssectionsbrems.h:2552
smash::twopi
constexpr double twopi
.
Definition: constants.h:42
smash::BremsstrahlungAction::collision_processes_bremsstrahlung_
CollisionBranchList collision_processes_bremsstrahlung_
Holds the bremsstrahlung branch.
Definition: bremsstrahlungaction.h:141
smash::pipi0_pipi0_dsigma_dtheta_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi0_pipi0_dsigma_dtheta_interpolation
Definition: crosssectionsbrems.h:10433
smash::Action::process_type_
ProcessType process_type_
type of process
Definition: action.h:321
bremsstrahlungaction.h
smash::BREMS_PIPI0_PIPI0_DIFF_SIG_K
const std::initializer_list< double > BREMS_PIPI0_PIPI0_DIFF_SIG_K
dSigma/dk for π0 + π -> π0 + π + γ
Definition: crosssectionsbrems.h:10469
smash::LScatterAction
static constexpr int LScatterAction
Definition: bremsstrahlungaction.cc:17
smash::BremsstrahlungAction::BremsstrahlungAction
BremsstrahlungAction(const ParticleList &in, const double time, const int n_frac_photons, const double hadronic_cross_section_input)
Construct a ScatterActionBrems object.
Definition: bremsstrahlungaction.cc:19
smash::PdgCode
Definition: pdgcode.h:108
smash::ProcessType::Bremsstrahlung
bremsstrahlung process: a + b -> a + b + photon
smash::pipi_pipi_same_dsigma_dtheta_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_same_dsigma_dtheta_interpolation
Definition: crosssectionsbrems.h:4830
smash::BremsstrahlungAction::ReactionType::pi_p_pi_m
smash::BREMS_PIPI_PIPI_SAME_DIFF_SIG_THETA
const std::initializer_list< double > BREMS_PIPI_PIPI_SAME_DIFF_SIG_THETA
dSigma/dtheta for π+ + π+ -> π+ + π+ + γ or π- + π- -> π- + π- + γ
Definition: crosssectionsbrems.h:7703
smash::Action::outgoing_particles_
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:312
smash::BremsstrahlungAction::ReactionType
ReactionType
Enum for encoding the photon process.
Definition: bremsstrahlungaction.h:103
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::BremsstrahlungAction::ReactionType::pi_p_pi_p
smash::pipi_pipi_same_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_same_dsigma_dk_interpolation
Definition: crosssectionsbrems.h:4828
smash::BREMS_PI0PI0_PIPI_SIG
const std::initializer_list< double > BREMS_PI0PI0_PIPI_SIG
Total π0 + π0 -> π+- + π-+ + γ cross section.
Definition: crosssectionsbrems.h:21234
interpolation2D.h
smash::pi0pi0_pipi_dsigma_dtheta_interpolation
static std::unique_ptr< InterpolateData2DSpline > pi0pi0_pipi_dsigma_dtheta_interpolation
Definition: crosssectionsbrems.h:21230
smash::BremsstrahlungAction::reac_
const ReactionType reac_
Reaction process as determined from incoming particles.
Definition: bremsstrahlungaction.h:144
smash::ScatterAction::add_collision
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
Definition: scatteraction.cc:41
smash::BremsstrahlungAction::ReactionType::pi_z_pi_p
smash::pipi0_pipi0_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi0_pipi0_dsigma_dk_interpolation
Definition: crosssectionsbrems.h:10431
smash::FourVector
Definition: fourvector.h:33
smash::Action::get_interaction_point
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:69
smash::Angles
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
smash::BREMS_PIPI0_PIPI0_SIG
const std::initializer_list< double > BREMS_PIPI0_PIPI0_SIG
Total π0 + π -> π0 + π + γ cross section.
Definition: crosssectionsbrems.h:10437
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::pi0pi0_pipi_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pi0pi0_pipi_dsigma_dk_interpolation
Definition: crosssectionsbrems.h:21228
smash::pipi_pi0pi0_dsigma_dtheta_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pi0pi0_dsigma_dtheta_interpolation
Definition: crosssectionsbrems.h:16036
smash::BREMS_PIPI_PIPI_OPP_DIFF_SIG_K
const std::initializer_list< double > BREMS_PIPI_PIPI_OPP_DIFF_SIG_K
dSigma/dk for π+- + π-+ -> π+- + π-+ + γ
Definition: crosssectionsbrems.h:120
smash::pdg::pi_m
constexpr int pi_m
π⁻.
Definition: pdgcode_constants.h:66
crosssectionsbrems.h
smash::PdgCode::code
std::int32_t code() const
Definition: pdgcode.h:247
smash::BREMS_PIPI_PIPI_SAME_SIG
const std::initializer_list< double > BREMS_PIPI_PIPI_SAME_SIG
Total π+ + π+ -> π+ + π+ + γ or π- + π- -> π- + π- + γ cross section.
Definition: crosssectionsbrems.h:4834
smash::BremsstrahlungAction::ReactionType::no_reaction
smash::pdg::pi_p
constexpr int pi_p
π⁺.
Definition: pdgcode_constants.h:62
smash::BremsstrahlungAction::perform_bremsstrahlung
void perform_bremsstrahlung(const OutputsList &outputs)
Create the final state and write to output.
Definition: bremsstrahlungaction.cc:63
smash::BremsstrahlungAction::generate_final_state
void generate_final_state() override
Generate the final-state for the Bremsstrahlung process.
Definition: bremsstrahlungaction.cc:75
smash::ProcessBranch::weight
double weight() const
Definition: processbranch.h:186
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::pipi_pi0pi0_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pi0pi0_dsigma_dk_interpolation
Definition: crosssectionsbrems.h:16034
smash::CollisionBranch
Definition: processbranch.h:209
smash::pipi_pipi_opp_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_opp_dsigma_dk_interpolation
Definition: crosssectionsbrems.h:82