Version: SMASH-3.4
bremsstrahlungactionphoton.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2019-2020,2022,2024-2026
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
11 
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  const SpinInteractionType spin_interaction_type)
23  : ScatterAction(in[0], in[1], time),
24  reac_(bremsstrahlung_reaction_type(in)),
25  number_of_fractional_photons_(n_frac_photons),
26  hadronic_cross_section_(hadronic_cross_section_input),
27  spin_interaction_type_(spin_interaction_type) {}
28 
31  const ParticleList &in) {
32  if (in.size() != 2) {
34  }
35 
36  PdgCode a = in[0].pdgcode();
37  PdgCode b = in[1].pdgcode();
38 
39  switch (pack(a.code(), b.code())) {
40  case (pack(pdg::pi_z, pdg::pi_m)):
41  case (pack(pdg::pi_m, pdg::pi_z)):
43 
44  case (pack(pdg::pi_z, pdg::pi_p)):
45  case (pack(pdg::pi_p, pdg::pi_z)):
47 
48  case (pack(pdg::pi_m, pdg::pi_p)):
49  case (pack(pdg::pi_p, pdg::pi_m)):
51 
52  case (pack(pdg::pi_m, pdg::pi_m)):
54 
55  case (pack(pdg::pi_p, pdg::pi_p)):
57 
58  case (pack(pdg::pi_z, pdg::pi_z)):
60 
61  default:
63  }
64 }
65 
67  const OutputsList &outputs) {
68  for (int i = 0; i < number_of_fractional_photons_; i++) {
70  for (const auto &output : outputs) {
71  if (output->is_photon_output()) {
72  // we do not care about the local density
73  output->at_interaction(*this, 0.0);
74  }
75  }
76  }
77 }
78 
80  // we have only one reaction per incoming particle pair
81  if (collision_processes_bremsstrahlung_.size() != 1) {
82  logg[LScatterAction].fatal()
83  << "Problem in "
84  "BremsstrahlungActionPhoton::generate_final_state().\nThe "
85  "process branch has "
87  << " entries. It should however have 1.";
88  throw std::runtime_error("");
89  }
90 
91  auto *proc = collision_processes_bremsstrahlung_[0].get();
92 
93  outgoing_particles_ = proc->particle_list();
94  process_type_ = proc->get_type();
95  FourVector interaction_point = get_interaction_point();
96 
97  // Sample k and theta:
98  // minimum cutoff for k to be in accordance with cross section calculations
99  double delta_k; // k-range
100  double k_min = 0.001;
101  double k_max =
102  (sqrt_s() * sqrt_s() - 2 * outgoing_particles_[0].type().mass() * 2 *
103  outgoing_particles_[1].type().mass()) /
104  (2 * sqrt_s());
105 
106  if ((k_max - k_min) < 0.0) {
107  // Make sure it is kinematically even possible to create a photon that is
108  // in accordance with the cross section cutoff
109  k_ = 0.0;
110  delta_k = 0.0;
111  } else {
112  k_ = random::uniform(k_min, k_max);
113  delta_k = (k_max - k_min);
114  }
115  theta_ = random::uniform(0.0, M_PI);
116 
117  // Sample the phase space anisotropically in the local rest frame
119 
120  // Get differential cross sections
121  std::pair<double, double> diff_xs_pair = brems_diff_cross_sections();
122  double diff_xs_k = diff_xs_pair.first;
123  double diff_xs_theta = diff_xs_pair.second;
124 
125  // Assign weighting factor
126  const double W_theta = diff_xs_theta * (M_PI - 0.0);
127  const double W_k = diff_xs_k * delta_k;
128  weight_ = std::sqrt(W_theta * W_k) /
130 
131  // Scale weight by cross section scaling factor of incoming particles
132  weight_ *= incoming_particles_[0].xsec_scaling_factor() *
133  incoming_particles_[1].xsec_scaling_factor();
134 
135  // Set position and formation time and boost back to computational frame
136  for (auto &new_particle : outgoing_particles_) {
137  // assuming decaying particles are always fully formed
138  new_particle.set_formation_time(time_of_execution_);
139  new_particle.set_4position(interaction_point);
140  new_particle.boost_momentum(
142  }
143 
144  // Set unpolarized spin vectors
147  }
148 
149  // Photons are not really part of the normal processes, so we have to set a
150  // constant arbitrary number.
151  const auto id_process = ID_PROCESS_PHOTON;
152  Action::check_conservation(id_process);
153 }
154 
156  assert(outgoing_particles_.size() == 3);
157  const double m_a = outgoing_particles_[0].type().mass(),
158  m_b = outgoing_particles_[1].type().mass(),
159  m_c = outgoing_particles_[2].type().mass();
160  const double sqrts = sqrt_s();
161  const double E_ab = sqrts - m_c - k_; // Ekin of the pion pair in cm frame
162  const double pcm = pCM(sqrts, E_ab, m_c); // cm momentum of (π pair - photon)
163  const double pcm_pions = pCM(E_ab, m_a, m_b); // cm momentum within pion pair
164 
165  // Photon angle: Phi random, theta from theta_ sampled above
166  const Angles phitheta_photon(random::uniform(0.0, twopi), std::cos(theta_));
167  outgoing_particles_[2].set_4momentum(m_c, pcm * phitheta_photon.threevec());
168  // Boost velocity to cm frame of the two pions
169  const ThreeVector beta_cm_pion_pair_photon =
170  pcm * phitheta_photon.threevec() / std::sqrt(pcm * pcm + E_ab * E_ab);
171 
172  // Sample pion pair isotropically
173  Angles phitheta;
174  phitheta.distribute_isotropically();
175  outgoing_particles_[0].set_4momentum(m_a, pcm_pions * phitheta.threevec());
176  outgoing_particles_[1].set_4momentum(m_b, -pcm_pions * phitheta.threevec());
177  outgoing_particles_[0].boost_momentum(beta_cm_pion_pair_photon);
178  outgoing_particles_[1].boost_momentum(beta_cm_pion_pair_photon);
179 }
180 
182  double reaction_cross_section) {
183  CollisionBranchPtr dummy_process = std::make_unique<CollisionBranch>(
184  incoming_particles_[0].type(), incoming_particles_[1].type(),
185  reaction_cross_section, ProcessType::BremsstrahlungPhoton);
186  add_collision(std::move(dummy_process));
187 }
188 
190  CollisionBranchList process_list;
191  // ParticleList final_state_particles;
192  static const ParticleTypePtr photon_particle =
194  static const ParticleTypePtr pi_z_particle = &ParticleType::find(pdg::pi_z);
195  static const ParticleTypePtr pi_p_particle = &ParticleType::find(pdg::pi_p);
196  static const ParticleTypePtr pi_m_particle = &ParticleType::find(pdg::pi_m);
197 
198  // Create interpolation objects, if not yet existent; only trigger for one
199  // of them as either all or none is created
202  }
203 
204  // Find cross section corresponding to given sqrt(s)
205  double sqrts = sqrt_s();
206  double xsection;
207 
209  // Here the final state is determined by the the final state provided by the
210  // sampled process using Monte Carlo techniqus
211 
212  // In the case of two oppositely charged pions as incoming particles,
213  // there are two potential final states: pi+ + pi- and pi0 + pi0
214  double xsection_pipi = (*pipi_pipi_opp_interpolation)(sqrts);
215  double xsection_pi0pi0 = (*pipi_pi0pi0_interpolation)(sqrts);
216 
217  // Prevent negative cross sections due to numerics in interpolation
218  xsection_pipi = (xsection_pipi <= 0.0) ? really_small : xsection_pipi;
219  xsection_pi0pi0 = (xsection_pi0pi0 <= 0.0) ? really_small : xsection_pi0pi0;
220 
221  // Necessary only to decide for a final state with pi+ and pi- as incoming
222  // particles.
223  CollisionBranchList process_list_pipi;
224 
225  // Add both processes to the process_list
226  process_list_pipi.push_back(std::make_unique<CollisionBranch>(
227  incoming_particles_[0].type(), incoming_particles_[1].type(),
228  *photon_particle, xsection_pipi, ProcessType::BremsstrahlungPhoton));
229  process_list_pipi.push_back(std::make_unique<CollisionBranch>(
230  *pi_z_particle, *pi_z_particle, *photon_particle, xsection_pi0pi0,
232 
233  // Decide for one of the possible final states
234  double total_cross_section = xsection_pipi + xsection_pi0pi0;
235  const CollisionBranch *proc =
236  choose_channel<CollisionBranch>(process_list_pipi, total_cross_section);
237 
238  xsection = proc->weight();
239 
240  process_list.push_back(std::make_unique<CollisionBranch>(
241  proc->particle_list()[0].type(), proc->particle_list()[1].type(),
242  *photon_particle, xsection, ProcessType::BremsstrahlungPhoton));
243 
244  } else if (reac_ == ReactionType::pi_m_pi_m ||
248  // Here the final state hadrons are identical to the initial state hadrons
250  xsection = (*pipi_pipi_same_interpolation)(sqrts);
251  } else {
252  // One pi0 in initial and final state
253  xsection = (*pipi0_pipi0_interpolation)(sqrts);
254  }
255 
256  // Prevent negative cross sections due to numerics in interpolation
257  xsection = (xsection <= 0.0) ? really_small : xsection;
258 
259  process_list.push_back(std::make_unique<CollisionBranch>(
260  incoming_particles_[0].type(), incoming_particles_[1].type(),
261  *photon_particle, xsection, ProcessType::BremsstrahlungPhoton));
262 
263  } else if (reac_ == ReactionType::pi_z_pi_z) {
264  // Here we have a hard-coded final state that differs from the initial
265  // state, namely: pi0 + pi0 -> pi+- + pi-+ + gamma
266  xsection = (*pi0pi0_pipi_interpolation)(sqrts);
267 
268  // Prevent negative cross sections due to numerics in interpolation
269  xsection = (xsection <= 0.0) ? really_small : xsection;
270 
271  process_list.push_back(std::make_unique<CollisionBranch>(
272  *pi_p_particle, *pi_m_particle, *photon_particle, xsection,
274  } else {
275  throw std::runtime_error(
276  "Unknown ReactionType in BremsstrahlungActionPhoton.");
277  }
278 
279  return process_list;
280 }
281 
282 std::pair<double, double>
284  static const ParticleTypePtr pi_z_particle = &ParticleType::find(pdg::pi_z);
285  const double collision_energy = sqrt_s();
286  double dsigma_dk;
287  double dsigma_dtheta;
288 
290  if (outgoing_particles_[0].type() != *pi_z_particle) {
291  // pi+- + pi+-- -> pi+- + pi+- + gamma
292  dsigma_dk =
293  (*pipi_pipi_opp_dsigma_dk_interpolation)(k_, collision_energy);
294  dsigma_dtheta = (*pipi_pipi_opp_dsigma_dtheta_interpolation)(
295  theta_, collision_energy);
296  } else {
297  // pi+- + pi+-- -> pi0 + pi0 + gamma
298  dsigma_dk = (*pipi_pi0pi0_dsigma_dk_interpolation)(k_, collision_energy);
299  dsigma_dtheta =
300  (*pipi_pi0pi0_dsigma_dtheta_interpolation)(theta_, collision_energy);
301  }
302  } else if (reac_ == ReactionType::pi_p_pi_p ||
304  dsigma_dk = (*pipi_pipi_same_dsigma_dk_interpolation)(k_, collision_energy);
305  dsigma_dtheta =
306  (*pipi_pipi_same_dsigma_dtheta_interpolation)(theta_, collision_energy);
307  } else if (reac_ == ReactionType::pi_z_pi_p ||
309  dsigma_dk = (*pipi0_pipi0_dsigma_dk_interpolation)(k_, collision_energy);
310  dsigma_dtheta =
311  (*pipi0_pipi0_dsigma_dtheta_interpolation)(theta_, collision_energy);
312  } else if (reac_ == ReactionType::pi_z_pi_z) {
313  dsigma_dk = (*pi0pi0_pipi_dsigma_dk_interpolation)(k_, collision_energy);
314  dsigma_dtheta =
315  (*pi0pi0_pipi_dsigma_dtheta_interpolation)(theta_, collision_energy);
316  } else {
317  throw std::runtime_error(
318  "Unkown channel when computing differential cross sections for "
319  "photon bremsstrahlung processes.");
320  }
321 
322  // Prevent negative cross sections due to numerics in interpolation
323  dsigma_dk = (dsigma_dk < 0.0) ? really_small : dsigma_dk;
324  dsigma_dtheta = (dsigma_dtheta < 0.0) ? really_small : dsigma_dtheta;
325 
326  // Combine differential cross sections to a pair
327  std::pair<double, double> diff_x_sections = {dsigma_dk, dsigma_dtheta};
328 
329  return diff_x_sections;
330 }
331 
333  // Read in tabularized values for sqrt(s), k and theta
334  std::vector<double> sqrts = BREMS_SQRTS;
335  std::vector<double> photon_momentum = BREMS_K;
336  std::vector<double> photon_angle = BREMS_THETA;
337 
338  // Read in tabularized total cross sections
339  std::vector<double> sigma_pipi_pipi_opp = BREMS_PIPI_PIPI_OPP_SIG;
340  std::vector<double> sigma_pipi_pipi_same = BREMS_PIPI_PIPI_SAME_SIG;
341  std::vector<double> sigma_pipi0_pipi0 = BREMS_PIPI0_PIPI0_SIG;
342  std::vector<double> sigma_pipi_pi0pi0 = BREMS_PIPI_PI0PI0_SIG;
343  std::vector<double> sigma_pi0pi0_pipi = BREMS_PI0PI0_PIPI_SIG;
344 
345  // Read in tabularized differential cross sections dSigma/dk
346  std::vector<double> dsigma_dk_pipi_pipi_opp = BREMS_PIPI_PIPI_OPP_DIFF_SIG_K;
347  std::vector<double> dsigma_dk_pipi_pipi_same =
349  std::vector<double> dsigma_dk_pipi0_pipi0 = BREMS_PIPI0_PIPI0_DIFF_SIG_K;
350  std::vector<double> dsigma_dk_pipi_pi0pi0 = BREMS_PIPI_PI0PI0_DIFF_SIG_K;
351  std::vector<double> dsigma_dk_pi0pi0_pipi = BREMS_PI0PI0_PIPI_DIFF_SIG_K;
352 
353  // Read in tabularized differential cross sections dSigma/dtheta
354  std::vector<double> dsigma_dtheta_pipi_pipi_opp =
356  std::vector<double> dsigma_dtheta_pipi_pipi_same =
358  std::vector<double> dsigma_dtheta_pipi0_pipi0 =
360  std::vector<double> dsigma_dtheta_pipi_pi0pi0 =
362  std::vector<double> dsigma_dtheta_pi0pi0_pipi =
364 
365  // Create interpolation objects containing linear interpolations for
366  // total cross sections
367  pipi_pipi_opp_interpolation = std::make_unique<InterpolateDataLinear<double>>(
368  sqrts, sigma_pipi_pipi_opp, ExtrapolationType::Constant);
370  std::make_unique<InterpolateDataLinear<double>>(
371  sqrts, sigma_pipi_pipi_same, ExtrapolationType::Constant);
372  pipi0_pipi0_interpolation = std::make_unique<InterpolateDataLinear<double>>(
373  sqrts, sigma_pipi0_pipi0, ExtrapolationType::Constant);
374  pipi_pi0pi0_interpolation = std::make_unique<InterpolateDataLinear<double>>(
375  sqrts, sigma_pipi_pi0pi0, ExtrapolationType::Constant);
376  pi0pi0_pipi_interpolation = std::make_unique<InterpolateDataLinear<double>>(
377  sqrts, sigma_pi0pi0_pipi, ExtrapolationType::Constant);
378 
379  // Create interpolation objects containing bicubic interpolations for
380  // differential dSigma/dk
382  std::make_unique<InterpolateData2DSpline>(photon_momentum, sqrts,
383  dsigma_dk_pipi_pipi_opp,
386  std::make_unique<InterpolateData2DSpline>(photon_momentum, sqrts,
387  dsigma_dk_pipi_pipi_same,
390  std::make_unique<InterpolateData2DSpline>(photon_momentum, sqrts,
391  dsigma_dk_pipi0_pipi0,
394  std::make_unique<InterpolateData2DSpline>(photon_momentum, sqrts,
395  dsigma_dk_pipi_pi0pi0,
398  std::make_unique<InterpolateData2DSpline>(photon_momentum, sqrts,
399  dsigma_dk_pi0pi0_pipi,
401 
402  // Create interpolation objects containing bicubic interpolations for
403  // differential dSigma/dtheta
405  std::make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
406  dsigma_dtheta_pipi_pipi_opp,
409  std::make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
410  dsigma_dtheta_pipi_pipi_same,
413  std::make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
414  dsigma_dtheta_pipi0_pipi0,
417  std::make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
418  dsigma_dtheta_pipi_pi0pi0,
421  std::make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
422  dsigma_dtheta_pi0pi0_pipi,
424 }
425 
426 } // namespace smash
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
Definition: action.cc:163
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:363
const double time_of_execution_
Time at which the action is supposed to be performed (absolute time in the lab frame in fm).
Definition: action.h:369
void assign_unpolarized_spin_vector_to_outgoing_particles()
Assign an unpolarized spin vector to all outgoing particles.
Definition: action.cc:339
virtual double check_conservation(const uint32_t id_process) const
Check various conservation laws.
Definition: action.cc:345
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:271
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:355
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:71
ProcessType process_type_
type of process
Definition: action.h:372
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
ThreeVector threevec() const
Definition: angles.h:288
void distribute_isotropically()
Populate the object with a new direction.
Definition: angles.h:199
void add_dummy_hadronic_process(double reaction_cross_section)
Adds one hadronic process with a given cross-section.
ReactionType
Enum for encoding the photon process.
void perform_bremsstrahlung(const OutputsList &outputs)
Create the final state and write to output.
std::pair< double, double > brems_diff_cross_sections()
Computes the differential cross sections dSigma/dk and dSigma/dtheta of the bremsstrahlung process.
void create_interpolations()
Create interpolation objects for tabularized cross sections: total cross section, differential dSigma...
const SpinInteractionType spin_interaction_type_
Type of spin interaction to use.
static ReactionType bremsstrahlung_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
void sample_3body_phasespace()
Sample the final state anisotropically, considering the differential cross sections with respect to t...
double k_
Sampled value of k (photon momentum)
CollisionBranchList brems_cross_sections()
Computes the total cross section of the bremsstrahlung process.
double hadronic_cross_section() const
Return the total cross section of the underlying hadronic scattering It is necessary for the weightin...
void generate_final_state() override
Generate the final-state for the Bremsstrahlung process.
const ReactionType reac_
Reaction process as determined from incoming particles.
double theta_
Sampled value of theta (angle of the photon)
double weight_
Weight of the produced photon.
CollisionBranchList collision_processes_bremsstrahlung_
Holds the bremsstrahlung branch.
BremsstrahlungActionPhoton(const ParticleList &in, const double time, const int n_frac_photons, const double hadronic_cross_section_input, const SpinInteractionType spin_interaction_type=SpinInteractionType::Off)
Construct a ScatterActionBrems object.
CollisionBranch is a derivative of ProcessBranch, which is used to represent particular final-state c...
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:33
ThreeVector velocity() const
Get the velocity (3-vector divided by zero component).
Definition: fourvector.h:333
A pointer-like interface to global references to ParticleType objects.
Definition: particletype.h:731
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
Definition: pdgcode.h:108
std::int32_t code() const
Definition: pdgcode.h:319
ParticleList particle_list() const
double weight() const
ScatterAction is a special action which takes two incoming particles and performs a scattering,...
Definition: scatteraction.h:30
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:31
@ Constant
Extrapolate using a constant value.
SpinInteractionType
Possible spin interaction types.
@ Off
No spin interactions.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > & logg
An array that stores all pre-configured Logger objects.
Definition: logging.h:245
constexpr Section output
Section for the output information.
Definition: input_keys.h:205
constexpr int pi_p
π⁺.
constexpr int pi_z
π⁰.
constexpr int photon
Photon.
constexpr int pi_m
π⁻.
T uniform(T min, T max)
Definition: random.h:91
Definition: action.h:24
static std::unique_ptr< InterpolateData2DSpline > pipi_pi0pi0_dsigma_dk_interpolation
const std::initializer_list< double > BREMS_PIPI_PIPI_SAME_DIFF_SIG_K
dSigma/dk for π+ + π+ -> π+ + π+ + γ or π- + π- -> π- + π- + γ
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
const std::initializer_list< double > BREMS_PIPI_PI0PI0_SIG
Total π+- + π-+ -> π0 + π0 + γ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > pipi_pipi_opp_interpolation
const std::initializer_list< double > BREMS_PIPI_PIPI_OPP_SIG
Total π+- + π-+ -> π+- + π-+ + γ cross section.
const std::initializer_list< double > BREMS_PIPI_PI0PI0_DIFF_SIG_THETA
dSigma/dtheta for π+- + π-+ -> π0 + π0 + γ
const std::initializer_list< double > BREMS_PIPI0_PIPI0_DIFF_SIG_K
dSigma/dk for π0 + π -> π0 + π + γ
const std::initializer_list< double > BREMS_PIPI_PIPI_SAME_SIG
Total π+ + π+ -> π+ + π+ + γ or π- + π- -> π- + π- + γ cross section.
static std::unique_ptr< InterpolateDataLinear< double > > pipi_pipi_same_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi0_pipi0_dsigma_dtheta_interpolation
constexpr std::uint32_t ID_PROCESS_PHOTON
Process ID for any photon process.
Definition: constants.h:129
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_opp_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pi0pi0_pipi_dsigma_dk_interpolation
static std::unique_ptr< InterpolateDataLinear< double > > pipi0_pipi0_interpolation
@ BremsstrahlungPhoton
See here for a short description.
const std::initializer_list< double > BREMS_PIPI_PIPI_OPP_DIFF_SIG_THETA
dSigma/dtheta for π+- + π-+ -> π+- + π-+ + γ
static std::unique_ptr< InterpolateData2DSpline > pipi0_pipi0_dsigma_dk_interpolation
const std::initializer_list< double > BREMS_PI0PI0_PIPI_SIG
Total π0 + π0 -> π+- + π-+ + γ cross section.
const std::initializer_list< double > BREMS_K
photon momentum
constexpr double twopi
.
Definition: constants.h:49
const std::initializer_list< double > BREMS_SQRTS
Center-of-mass energy.
const std::initializer_list< double > BREMS_THETA
theta angle with respect to collision axis of incoming pions
const std::initializer_list< double > BREMS_PI0PI0_PIPI_DIFF_SIG_THETA
dSigma/dtheta for π0 + π0 -> π+- + π-+ + γ
static std::unique_ptr< InterpolateDataLinear< double > > pipi_pi0pi0_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_same_dsigma_dtheta_interpolation
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
const std::initializer_list< double > BREMS_PIPI0_PIPI0_SIG
Total π0 + π -> π0 + π + γ cross section.
const std::initializer_list< double > BREMS_PI0PI0_PIPI_DIFF_SIG_K
dSigma/dk for π0 + π0 -> π+- + π-+ + γ
const std::initializer_list< double > BREMS_PIPI_PI0PI0_DIFF_SIG_K
dSigma/dk for π+- + π-+ -> π0 + π0 + γ
static std::unique_ptr< InterpolateDataLinear< double > > pi0pi0_pipi_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_same_dsigma_dk_interpolation
static std::unique_ptr< InterpolateData2DSpline > pipi_pi0pi0_dsigma_dtheta_interpolation
static std::unique_ptr< InterpolateData2DSpline > pi0pi0_pipi_dsigma_dtheta_interpolation
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:41
static constexpr int LScatterAction
const std::initializer_list< double > BREMS_PIPI_PIPI_OPP_DIFF_SIG_K
dSigma/dk for π+- + π-+ -> π+- + π-+ + γ
static std::unique_ptr< InterpolateData2DSpline > pipi_pipi_opp_dsigma_dtheta_interpolation
const std::initializer_list< double > BREMS_PIPI0_PIPI0_DIFF_SIG_THETA
dSigma/dtheta for π0 + π -> π0 + π + γ
const std::initializer_list< double > BREMS_PIPI_PIPI_SAME_DIFF_SIG_THETA
dSigma/dtheta for π+ + π+ -> π+ + π+ + γ or π- + π- -> π- + π- + γ