20 const ParticleList &in,
const double time,
const int n_frac_photons,
21 const double hadronic_cross_section_input)
23 reac_(bremsstrahlung_reaction_type(in)),
24 number_of_fractional_photons_(n_frac_photons),
25 hadronic_cross_section_(hadronic_cross_section_input) {}
66 for (
const auto &output : outputs) {
67 if (output->is_photon_output()) {
69 output->at_interaction(*
this, 0.0);
79 <<
"Problem in BremsstrahlungAction::generate_final_state().\nThe "
82 <<
" entries. It should however have 1.";
83 throw std::runtime_error(
"");
101 if ((k_max - k_min) < 0.0) {
108 delta_k = (k_max - k_min);
117 double diff_xs_k = diff_xs_pair.first;
118 double diff_xs_theta = diff_xs_pair.second;
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) /
130 new_particle.set_4position(interaction_point);
131 new_particle.boost_momentum(-
beta_cm());
145 const double sqrts =
sqrt_s();
146 const double E_ab = sqrts - m_c -
k_;
147 const double pcm =
pCM(sqrts, E_ab, m_c);
148 const double pcm_pions =
pCM(E_ab, m_a, m_b);
155 pcm * phitheta_photon.
threevec() / std::sqrt(pcm * pcm + E_ab * E_ab);
167 double reaction_cross_section) {
168 CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
175 CollisionBranchList process_list;
199 double xsection_pipi = (*pipi_pipi_opp_interpolation)(sqrts);
200 double xsection_pi0pi0 = (*pipi_pi0pi0_interpolation)(sqrts);
203 xsection_pipi = (xsection_pipi <= 0.0) ?
really_small : xsection_pipi;
204 xsection_pi0pi0 = (xsection_pi0pi0 <= 0.0) ?
really_small : xsection_pi0pi0;
208 CollisionBranchList process_list_pipi;
211 process_list_pipi.push_back(make_unique<CollisionBranch>(
214 process_list_pipi.push_back(make_unique<CollisionBranch>(
215 *pi_z_particle, *pi_z_particle, *photon_particle, xsection_pi0pi0,
219 double total_cross_section = xsection_pipi + xsection_pi0pi0;
221 choose_channel<CollisionBranch>(process_list_pipi, total_cross_section);
223 xsection = proc->
weight();
225 process_list.push_back(make_unique<CollisionBranch>(
235 xsection = (*pipi_pipi_same_interpolation)(sqrts);
238 xsection = (*pipi0_pipi0_interpolation)(sqrts);
244 process_list.push_back(make_unique<CollisionBranch>(
251 xsection = (*pi0pi0_pipi_interpolation)(sqrts);
256 process_list.push_back(make_unique<CollisionBranch>(
257 *pi_p_particle, *pi_m_particle, *photon_particle, xsection,
260 throw std::runtime_error(
"Unknown ReactionType in BremsstrahlungAction.");
268 const double collision_energy =
sqrt_s();
270 double dsigma_dtheta;
276 (*pipi_pipi_opp_dsigma_dk_interpolation)(
k_, collision_energy);
277 dsigma_dtheta = (*pipi_pipi_opp_dsigma_dtheta_interpolation)(
278 theta_, collision_energy);
281 dsigma_dk = (*pipi_pi0pi0_dsigma_dk_interpolation)(
k_, collision_energy);
283 (*pipi_pi0pi0_dsigma_dtheta_interpolation)(
theta_, collision_energy);
287 dsigma_dk = (*pipi_pipi_same_dsigma_dk_interpolation)(
k_, collision_energy);
289 (*pipi_pipi_same_dsigma_dtheta_interpolation)(
theta_, collision_energy);
292 dsigma_dk = (*pipi0_pipi0_dsigma_dk_interpolation)(
k_, collision_energy);
294 (*pipi0_pipi0_dsigma_dtheta_interpolation)(
theta_, collision_energy);
296 dsigma_dk = (*pi0pi0_pipi_dsigma_dk_interpolation)(
k_, collision_energy);
298 (*pi0pi0_pipi_dsigma_dtheta_interpolation)(
theta_, collision_energy);
300 throw std::runtime_error(
301 "Unkown channel when computing differential cross sections for "
302 "bremsstrahlung processes.");
306 dsigma_dk = (dsigma_dk < 0.0) ?
really_small : dsigma_dk;
307 dsigma_dtheta = (dsigma_dtheta < 0.0) ?
really_small : dsigma_dtheta;
310 std::pair<double, double> diff_x_sections = {dsigma_dk, dsigma_dtheta};
312 return diff_x_sections;
318 std::vector<double> photon_momentum =
BREMS_K;
330 std::vector<double> dsigma_dk_pipi_pipi_same =
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 =
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);
364 photon_momentum, sqrts, dsigma_dk_pipi_pipi_opp);
366 photon_momentum, sqrts, dsigma_dk_pipi_pipi_same);
368 photon_momentum, sqrts, dsigma_dk_pipi0_pipi0);
370 photon_momentum, sqrts, dsigma_dk_pipi_pi0pi0);
372 photon_momentum, sqrts, dsigma_dk_pi0pi0_pipi);
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);