Version: SMASH-3.4
bremsstrahlungactiondilepton.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2026
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #ifndef SRC_INCLUDE_SMASH_BREMSSTRAHLUNGACTIONDILEPTON_H_
11 #define SRC_INCLUDE_SMASH_BREMSSTRAHLUNGACTIONDILEPTON_H_
12 
13 #include <utility>
14 
15 #include "forwarddeclarations.h"
16 #include "scatteraction.h"
17 
18 namespace smash {
19 /**
20  * \ingroup action
21  * Similar to the photon treatment, BremsstrahlungActionDilepton is a special
22  * action which takes two incoming particles and performs a perturbative
23  * scattering where a Bremsstrahlung photon is produced.
24  * The final state particles are not further propagated, only written
25  * to the dilepton output.
26  *
27  * Implements dilepton production via the process pn -> pn e⁺e⁻ using
28  * the phase-space corrected soft-photon approximation (SPA) as e.g. outlined
29  * in \iref{Weil:2013mya} (see eq. (40)–(43) in the reference document).
30  *
31  * The pion electromagnetic form factor (PEFF) from \iref{Shyam:2010vr} is
32  * optionally applied, modifying the differential cross section by
33  * \f$|F_\pi(M^2)|^2\f$. The form factor accounts for the internal charged
34  * pion propagator.
35  *
36  * Kinematic variables sampled for the dilepton pair are:
37  * - m_inv: invariant mass of the dilepton pair
38  * [\f$2m_e,\sqrt{s}-2m_N\f$]
39  * - q: 3-momentum of dilepton in pn-CM frame
40  * - \f$\cos\theta\f$: Cosine of polar angle of dilepton in pn-CM frame
41  * \f$[-1, 1]\f$
42  * - \f$\phi\f$: azimuthal angle of dilepton in pn-CM frame \f$[0, 2\pi]\f$
43  *
44  * The dilepton 4-momentum is constructed directly from
45  * (m_inv, q, \f$\cos\theta\f$, \f$\phi\f$) to enable event-by-event acceptance
46  * cuts. The e⁺e⁻ pair is subsequently produced isotropically in the virtual
47  * photon's rest frame.
48  *
49  */
51  public:
52  /**
53  * Enum for encoding bremsstrahlung process for n+p only.
54  * It is uniquely determined by the incoming particles.
55  */
56  enum class ReactionType { no_reaction, np };
57 
58  /**
59  * Construct a BremsstrahlungActionDilepton object.
60  *
61  * \param[in] in ParticleList of incoming particles (n+p only).
62  * \param[in] time Time relative to underlying hadronic action.
63  * \param[in] hadronic_cross_section_input Total np hadronic cross section.
64  * \param[in] ff_type Which form factor parametrization to use.
65  *
66  * \return The constructed object.
67  */
68  BremsstrahlungActionDilepton(const ParticleList &in, double time,
69  double hadronic_cross_section_input,
71 
72  /**
73  * Check if particles can undergo an implemented dilepton
74  * bremsstrahlung process.
75  *
76  * This function does not check the involved kinematics.
77  *
78  * \param[in] in ParticleList of incoming particles.
79  *
80  * \return bool if dilepton bremsstrahlung reaction implemented.
81  */
82  static bool is_dilepton_brems_reaction(const ParticleList &in) {
84  }
85 
86  /**
87  * Adds the hadronic process with a given cross section.
88  *
89  * The intended use is to add the hadronic cross section from the already
90  * performed hadronic action without recomputing it.
91  *
92  * \param[in] reaction_cross_section Total cross section of underlying
93  * hadronic process [mb]
94  */
95  void add_dummy_hadronic_process(double reaction_cross_section);
96 
97  /**
98  * Create the final state and write to output.
99  *
100  * \param[in] outputs List of all outputs. Does not have to be a specific
101  * dilepton output, the function will take care of this.
102  */
103  void perform_dilepton_bremsstrahlung(const OutputsList &outputs);
104 
105  /**
106  * Main function: sample kinematics and compute weight for one
107  * dilepton event.
108  */
109  void generate_final_state() override;
110 
111  /**
112  * Return the weight of the dilepton pair.
113  *
114  * \return The total weight.
115  */
116  double get_total_weight() const override { return weight_; }
117 
118  /**
119  * Return the partial weight of zero as otherwise garbage is written to
120  * output.
121  *
122  * \return 0.0 as partial weight.
123  */
124  double get_partial_weight() const override { return 0.0; }
125 
126  private:
127  /**
128  * Determine dilepton bremsstrahlung process from incoming particle list.
129  *
130  * If incoming particles are not part of any implemented dilepton
131  * bremsstrahlung process, i.e. currently only p+n (in any order),
132  * the function will return no_reaction.
133  *
134  * \param[in] in ParticleList of incoming particles.
135  *
136  * \return ReactionType enum-member
137  */
138  static ReactionType dilepton_brems_reaction_type_(const ParticleList &in);
139 
140  /**
141  * Generates momenta of outgoing particles (for 2-body isotropic decays only).
142  *
143  * \param[in] p_parent FourVector of incoming particle momentum.
144  * \param[in] child_1 First child particle.
145  * \param[in] child_2 Second child particle.
146  *
147  * \return bool if sampling is successful, i.e. if there is enough energy
148  * to create the outgoing particles. If sampling fails, the
149  * function returns false and the weight of the dilepton pair
150  * is set to 0 when generating the final state.
151  */
152  bool sample_2body_isotropic_(const FourVector &p_parent,
153  ParticleData &child_1, ParticleData &child_2);
154 
155  /**
156  * Fully differential cross section \f$\frac{d\sigma}{dM dq d\Omega}\f$
157  * for \f$ pn \rightarrow pne^+ e^- \f$.
158  *
159  * \param[in] m_inv Invariant mass of dilepton pair
160  * \param[in] q 3-momentum of dilepton in pn-CM frame
161  * \param[in] sqrts CM energy \f$\sqrt(s)\f$
162  *
163  * \return \f$\frac{d\sigma}{dM dq d\Omega}\f$
164  */
165  double diff_xs_pn_dilepton_(double m_inv, double q, double sqrts) const;
166 
167  /**
168  * Returns \f$|F_\pi(m_{inv}^2)|^2\f$, the squared pion electromagnetic form
169  * factor.
170  *
171  * \param[in] m_inv Invariant mass of dilepton pair [GeV]
172  *
173  * \return \f$|F_\pi(m_{inv}^2)|^2\f$ (dimensionless)
174  */
175  double pion_em_form_factor_sq_(double m_inv) const;
176 
177  /**
178  * Holds the bremsstrahlung branch. As of now, this will hold only one branch.
179  */
181 
182  /// Reaction process as determined from incoming particles.
184 
185  /// Weight of the dilepton event.
186  double weight_ = 0.0;
187 
188  /// Total cross section of dilepton bremsstrahlung process [mb].
190 
191  /// Total hadronic cross section
193 
194  /// Form factor type: Off, FF1, FF2.
196 
197  /// Sampled 3-momentum of dilepton pair in pn-CM frame
198  double q_;
199 
200  /// Sampled invariant mass of the dilepton pair
201  double m_inv_;
202 };
203 
204 } // namespace smash
205 
206 #endif // SRC_INCLUDE_SMASH_BREMSSTRAHLUNGACTIONDILEPTON_H_
Similar to the photon treatment, BremsstrahlungActionDilepton is a special action which takes two inc...
const ReactionType reaction_type_
Reaction process as determined from incoming particles.
static bool is_dilepton_brems_reaction(const ParticleList &in)
Check if particles can undergo an implemented dilepton bremsstrahlung process.
double pion_em_form_factor_sq_(double m_inv) const
Returns , the squared pion electromagnetic form factor.
ReactionType
Enum for encoding bremsstrahlung process for n+p only.
const double hadronic_cross_section_
Total hadronic cross section.
void perform_dilepton_bremsstrahlung(const OutputsList &outputs)
Create the final state and write to output.
CollisionBranchList collision_processes_dilepton_bremsstrahlung_
Holds the bremsstrahlung branch.
double diff_xs_pn_dilepton_(double m_inv, double q, double sqrts) const
Fully differential cross section for .
bool sample_2body_isotropic_(const FourVector &p_parent, ParticleData &child_1, ParticleData &child_2)
Generates momenta of outgoing particles (for 2-body isotropic decays only).
static ReactionType dilepton_brems_reaction_type_(const ParticleList &in)
Determine dilepton bremsstrahlung process from incoming particle list.
double m_inv_
Sampled invariant mass of the dilepton pair.
double cross_section_dilepton_bremsstrahlung_
Total cross section of dilepton bremsstrahlung process [mb].
double get_partial_weight() const override
Return the partial weight of zero as otherwise garbage is written to output.
double weight_
Weight of the dilepton event.
double q_
Sampled 3-momentum of dilepton pair in pn-CM frame.
void generate_final_state() override
Main function: sample kinematics and compute weight for one dilepton event.
const DileptonBremsPionFormFactor form_factor_type_
Form factor type: Off, FF1, FF2.
BremsstrahlungActionDilepton(const ParticleList &in, double time, double hadronic_cross_section_input, DileptonBremsPionFormFactor ff_type)
Construct a BremsstrahlungActionDilepton object.
void add_dummy_hadronic_process(double reaction_cross_section)
Adds the hadronic process with a given cross section.
double get_total_weight() const override
Return the weight of the dilepton pair.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:33
ParticleData contains the dynamic information of a certain particle.
Definition: particledata.h:59
ScatterAction is a special action which takes two incoming particles and performs a scattering,...
Definition: scatteraction.h:30
DileptonBremsPionFormFactor
Option to use form factors in dilepton bremsstrahlung as described in Shyam:2010vr .
Definition: action.h:24