19     const ParticleList &in, 
const double time, 
const int n_frac_photons,
 
   20     const double hadronic_cross_section_input)
 
   22       reac_(bremsstrahlung_reaction_type(in)),
 
   23       number_of_fractional_photons_(n_frac_photons),
 
   24       hadronic_cross_section_(hadronic_cross_section_input) {}
 
   65     for (
const auto &output : outputs) {
 
   66       if (output->is_photon_output()) {
 
   68         output->at_interaction(*
this, 0.0);
 
   78         << 
"Problem in BremsstrahlungAction::generate_final_state().\nThe " 
   81         << 
" entries. It should however have 1.";
 
   82     throw std::runtime_error(
"");
 
  100   if ((k_max - k_min) < 0.0) {
 
  107     delta_k = (k_max - k_min);
 
  116   double diff_xs_k = diff_xs_pair.first;
 
  117   double diff_xs_theta = diff_xs_pair.second;
 
  120   const double W_theta = diff_xs_theta * (M_PI - 0.0);
 
  121   const double W_k = diff_xs_k * delta_k;
 
  122   weight_ = std::sqrt(W_theta * W_k) /
 
  133     new_particle.set_4position(interaction_point);
 
  134     new_particle.boost_momentum(
 
  149   const double sqrts = 
sqrt_s();
 
  150   const double E_ab = sqrts - m_c - 
k_;  
 
  151   const double pcm = 
pCM(sqrts, E_ab, m_c);  
 
  152   const double pcm_pions = 
pCM(E_ab, m_a, m_b);  
 
  159       pcm * phitheta_photon.
threevec() / std::sqrt(pcm * pcm + E_ab * E_ab);
 
  171     double reaction_cross_section) {
 
  172   CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
 
  179   CollisionBranchList process_list;
 
  203     double xsection_pipi = (*pipi_pipi_opp_interpolation)(sqrts);
 
  204     double xsection_pi0pi0 = (*pipi_pi0pi0_interpolation)(sqrts);
 
  207     xsection_pipi = (xsection_pipi <= 0.0) ? 
really_small : xsection_pipi;
 
  208     xsection_pi0pi0 = (xsection_pi0pi0 <= 0.0) ? 
really_small : xsection_pi0pi0;
 
  212     CollisionBranchList process_list_pipi;
 
  215     process_list_pipi.push_back(make_unique<CollisionBranch>(
 
  218     process_list_pipi.push_back(make_unique<CollisionBranch>(
 
  219         *pi_z_particle, *pi_z_particle, *photon_particle, xsection_pi0pi0,
 
  223     double total_cross_section = xsection_pipi + xsection_pi0pi0;
 
  225         choose_channel<CollisionBranch>(process_list_pipi, total_cross_section);
 
  227     xsection = proc->
weight();
 
  229     process_list.push_back(make_unique<CollisionBranch>(
 
  239       xsection = (*pipi_pipi_same_interpolation)(sqrts);
 
  242       xsection = (*pipi0_pipi0_interpolation)(sqrts);
 
  248     process_list.push_back(make_unique<CollisionBranch>(
 
  255     xsection = (*pi0pi0_pipi_interpolation)(sqrts);
 
  260     process_list.push_back(make_unique<CollisionBranch>(
 
  261         *pi_p_particle, *pi_m_particle, *photon_particle, xsection,
 
  264     throw std::runtime_error(
"Unknown ReactionType in BremsstrahlungAction.");
 
  272   const double collision_energy = 
sqrt_s();
 
  274   double dsigma_dtheta;
 
  280           (*pipi_pipi_opp_dsigma_dk_interpolation)(
k_, collision_energy);
 
  281       dsigma_dtheta = (*pipi_pipi_opp_dsigma_dtheta_interpolation)(
 
  282           theta_, collision_energy);
 
  285       dsigma_dk = (*pipi_pi0pi0_dsigma_dk_interpolation)(
k_, collision_energy);
 
  287           (*pipi_pi0pi0_dsigma_dtheta_interpolation)(
theta_, collision_energy);
 
  291     dsigma_dk = (*pipi_pipi_same_dsigma_dk_interpolation)(
k_, collision_energy);
 
  293         (*pipi_pipi_same_dsigma_dtheta_interpolation)(
theta_, collision_energy);
 
  296     dsigma_dk = (*pipi0_pipi0_dsigma_dk_interpolation)(
k_, collision_energy);
 
  298         (*pipi0_pipi0_dsigma_dtheta_interpolation)(
theta_, collision_energy);
 
  300     dsigma_dk = (*pi0pi0_pipi_dsigma_dk_interpolation)(
k_, collision_energy);
 
  302         (*pi0pi0_pipi_dsigma_dtheta_interpolation)(
theta_, collision_energy);
 
  304     throw std::runtime_error(
 
  305         "Unkown channel when computing differential cross sections for " 
  306         "bremsstrahlung processes.");
 
  310   dsigma_dk = (dsigma_dk < 0.0) ? 
really_small : dsigma_dk;
 
  311   dsigma_dtheta = (dsigma_dtheta < 0.0) ? 
really_small : dsigma_dtheta;
 
  314   std::pair<double, double> diff_x_sections = {dsigma_dk, dsigma_dtheta};
 
  316   return diff_x_sections;
 
  322   std::vector<double> photon_momentum = 
BREMS_K;
 
  334   std::vector<double> dsigma_dk_pipi_pipi_same =
 
  341   std::vector<double> dsigma_dtheta_pipi_pipi_opp =
 
  343   std::vector<double> dsigma_dtheta_pipi_pipi_same =
 
  345   std::vector<double> dsigma_dtheta_pipi0_pipi0 =
 
  347   std::vector<double> dsigma_dtheta_pipi_pi0pi0 =
 
  349   std::vector<double> dsigma_dtheta_pi0pi0_pipi =
 
  355       make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi_pipi_opp);
 
  357       make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi_pipi_same);
 
  359       make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi0_pipi0);
 
  361       make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pipi_pi0pi0);
 
  363       make_unique<InterpolateDataLinear<double>>(sqrts, sigma_pi0pi0_pipi);
 
  368       photon_momentum, sqrts, dsigma_dk_pipi_pipi_opp);
 
  370       photon_momentum, sqrts, dsigma_dk_pipi_pipi_same);
 
  372       photon_momentum, sqrts, dsigma_dk_pipi0_pipi0);
 
  374       photon_momentum, sqrts, dsigma_dk_pipi_pi0pi0);
 
  376       photon_momentum, sqrts, dsigma_dk_pi0pi0_pipi);
 
  381       make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
 
  382                                            dsigma_dtheta_pipi_pipi_opp);
 
  384       make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
 
  385                                            dsigma_dtheta_pipi_pipi_same);
 
  387       make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
 
  388                                            dsigma_dtheta_pipi0_pipi0);
 
  390       make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
 
  391                                            dsigma_dtheta_pipi_pi0pi0);
 
  393       make_unique<InterpolateData2DSpline>(photon_angle, sqrts,
 
  394                                            dsigma_dtheta_pi0pi0_pipi);
 
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
 
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
 
const double time_of_execution_
Time at which the action is supposed to be performed (absolute time in the lab frame in fm/c).
 
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
 
ParticleList incoming_particles_
List with data of incoming particles.
 
FourVector get_interaction_point() const
Get the interaction point.
 
ProcessType process_type_
type of process
 
virtual void check_conservation(const uint32_t id_process) const
Check various conservation laws.
 
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
 
ThreeVector threevec() const
 
void distribute_isotropically()
Populate the object with a new direction.
 
void sample_3body_phasespace()
Sample the final state anisotropically, considering the differential cross sections with respect to t...
 
ReactionType
Enum for encoding the photon process.
 
const ReactionType reac_
Reaction process as determined from incoming particles.
 
double k_
Sampled value of k (photon momentum)
 
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
 
void add_dummy_hadronic_process(double reaction_cross_section)
Adds one hadronic process with a given cross-section.
 
void generate_final_state() override
Generate the final-state for the Bremsstrahlung process.
 
static ReactionType bremsstrahlung_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
 
BremsstrahlungAction(const ParticleList &in, const double time, const int n_frac_photons, const double hadronic_cross_section_input)
Construct a ScatterActionBrems object.
 
void perform_bremsstrahlung(const OutputsList &outputs)
Create the final state and write to output.
 
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...
 
CollisionBranchList collision_processes_bremsstrahlung_
Holds the bremsstrahlung branch.
 
double weight_
Weight of the produced photon.
 
void create_interpolations()
Create interpolation objects for tabularized cross sections: total cross section, differential dSigma...
 
double theta_
Sampled value of theta (angle of the photon)
 
std::pair< double, double > brems_diff_cross_sections()
Computes the differential cross sections dSigma/dk and dSigma/dtheta of the bremsstrahlung process.
 
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.
 
ThreeVector velocity() const
Get the velocity (3-vector divided by zero component).
 
A pointer-like interface to global references to ParticleType objects.
 
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
 
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
 
std::int32_t code() const
 
ParticleList particle_list() const
 
ScatterAction is a special action which takes two incoming particles and performs a scattering,...
 
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
 
The ThreeVector class represents a physical three-vector  with the components .
 
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
 
constexpr int photon
Photon.
 
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
 
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.
 
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
 
@ Bremsstrahlung
bremsstrahlung process: a + b -> a + b + photon
 
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
 
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.
 
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 π- + π- -> π- + π- + γ