Version: SMASH-3.4
decaytype.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2020,2022-2023
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 
8 #ifndef SRC_INCLUDE_SMASH_DECAYTYPE_H_
9 #define SRC_INCLUDE_SMASH_DECAYTYPE_H_
10 
11 #include <memory>
12 #include <vector>
13 
14 #include "forwarddeclarations.h"
15 #include "particletype.h"
16 #include "tabulation.h"
17 
18 namespace smash {
19 
20 /**
21  * DecayType is the abstract base class for all decay types.
22  */
23 class DecayType {
24  public:
25  /**
26  * Construct a \ref DecayType.
27  *
28  * \param[in] part_types Final-state particles of the decay.
29  * \param[in] l Angular momentum of the decay.
30  * \return The constructed object.
31  */
32  DecayType(ParticleTypePtrList part_types, int l)
33  : particle_types_(part_types), L_(l) {}
34  /**
35  * Virtual Destructor.
36  *
37  * The declaration of the destructor is necessary to make it virtual.
38  */
39  virtual ~DecayType() = default;
40  /// \return the number of particles in the final state
41  virtual unsigned int particle_number() const = 0;
42  /**
43  * \return if the final state consists of the given particle list.
44  *
45  * \param[in] list Final state particle types to be checked.
46  */
47  virtual bool has_particles(ParticleTypePtrList list) const = 0;
48  /**
49  * \return if this decay type has the right mother
50  * (most decays do not depend on the mother type).
51  *
52  * \param[in] mother Particle type to be checked.
53  */
54  virtual bool has_mother([[maybe_unused]] ParticleTypePtr mother) const {
55  return true;
56  }
57  /// \return the particle types associated with this branch.
58  const ParticleTypePtrList &particle_types() const { return particle_types_; }
59  /// \return the angular momentum of this branch.
60  inline int angular_momentum() const { return L_; }
61  /**
62  * \return the mass-dependent width of the decay.
63  *
64  * \param[in] m0 Pole mass of the decaying particle [GeV].
65  * \param[in] G0 Partial width at the pole mass [GeV].
66  * \param[in] m Actual mass of the decaying particle [GeV].
67  */
68  virtual double width(double m0, double G0, double m) const = 0;
69  /**
70  * \return The mass-dependent in-width for a resonance formation process.
71  *
72  * \param[in] m0 Pole mass of the produced resonance [GeV].
73  * \param[in] G0 Partial width at the pole mass [GeV].
74  * \param[in] m Actual mass of the produced resonance [GeV].
75  * \param[in] m1 Actual mass of the first incoming particle [GeV].
76  * \param[in] m2 Actual mass of the second incoming particle [GeV].
77  */
78  virtual double in_width(double m0, double G0, double m, double m1,
79  double m2) const = 0;
80 
81  /// \return whether the decay is a dilepton decay (most decays are hadronic)
82  virtual bool is_dilepton_decay() const { return false; }
83 
84  protected:
85  /// final-state particles of the decay
86  ParticleTypePtrList particle_types_;
87  /// angular momentum of the decay
88  int L_;
89 };
90 
91 /**
92  * TwoBodyDecay represents a decay type with two final-state particles.
93  */
94 class TwoBodyDecay : public DecayType {
95  public:
96  /**
97  * Construct a \ref TwoBodyDecay.
98  *
99  * \param[in] part_types Final-state particles of the decay.
100  * \param[in] l Angular momentum of the decay.
101  * \return The constructed object.
102  */
103  TwoBodyDecay(ParticleTypePtrList part_types, int l);
104  unsigned int particle_number() const override;
105  bool has_particles(ParticleTypePtrList list) const override;
106  /// \return The kinematic energy threshold of the decay in GeV.
107  double threshold() const {
108  return particle_types_[0]->min_mass_spectral() +
109  particle_types_[1]->min_mass_spectral();
110  }
111 
112  protected:
113  /**
114  * This is a virtual helper method which is used to write the width as
115  * Gamma(m) = Gamma_0 * rho(m) / rho(m_0). This ensures that the width is
116  * properly normalized at the pole mass to Gamma(m_0) = Gamma_0.
117  * By default rho simply equals one, which corresponds to a constant width.
118  *
119  * \param[in] mass Resonance mass of the decay.
120  * \return Width of the decay at the given \p mass.
121  * */
122  virtual double rho([[maybe_unused]] double mass) const { return 1.; }
123 };
124 
125 /**
126  * TwoBodyDecayStable represents a decay type with two stable final-state
127  * particles.
128  */
130  public:
131  /**
132  * Construct a \ref TwoBodyDecayStable.
133  *
134  * \param[in] part_types Final-state particles of the decay.
135  * \param[in] l Angular momentum of the decay.
136  * \return The constructed object.
137  */
138  TwoBodyDecayStable(ParticleTypePtrList part_types, int l);
139 
140  /**
141  * Get the mass-dependent width of a two-body decay into stable particles
142  * according to \iref{Manley:1992yb}.
143  *
144  * \param m0 Pole mass of the decaying particle [GeV].
145  * \param G0 Partial width at the pole mass [GeV].
146  * \param m Actual mass of the decaying particle [GeV].
147  */
148  double width(double m0, double G0, double m) const override;
149 
150  /**
151  * Get the mass-dependent in-width for a resonance formation process from two
152  * stable particles according to \iref{Manley:1992yb},
153  * see also \iref{Effenberger:1999wlg}, eq. (2.77).
154  *
155  * \param m0 Pole mass of the produced resonance [GeV].
156  * \param G0 Partial width at the pole mass [GeV].
157  * \param m Actual mass of the produced resonance [GeV].
158  * \param m1 Actual mass of the first incoming particle [GeV].
159  * \param m2 Actual mass of the second incoming particle [GeV].
160  */
161  double in_width(double m0, double G0, double m, double m1,
162  double m2) const override;
163 
164  protected:
165  /**
166  * See TwoBodyDecay::rho.
167  */
168  double rho(double m) const override;
169 };
170 
171 /**
172  * TwoBodyDecaySemistable represents a decay type with two final-state
173  * particles, one of which is stable and the other is unstable.
174  */
176  public:
177  /**
178  * Construct a \ref TwoBodyDecaySemistable.
179  *
180  * \param[in] part_types Final-state particles of the decay.
181  * \param[in] l Angular momentum of the decay.
182  * \return The constructed object.
183  */
184  TwoBodyDecaySemistable(ParticleTypePtrList part_types, int l);
185 
186  /**
187  * Get the mass-dependent width of a two-body decay into one stable and one
188  * unstable particle according to \iref{Manley:1992yb}.
189  *
190  * \param m0 Pole mass of the decaying particle [GeV].
191  * \param G0 Partial width at the pole mass [GeV].
192  * \param m Actual mass of the decaying particle [GeV].
193  */
194  double width(double m0, double G0, double m) const override;
195 
196  /**
197  * Get the mass-dependent in-width for a resonance formation process from one
198  * stable and one unstable particle according to \iref{Manley:1992yb},
199  * see also \iref{Effenberger:1999wlg}, eq. (2.77).
200  *
201  * \param m0 Pole mass of the produced resonance [GeV].
202  * \param G0 Partial width at the pole mass [GeV].
203  * \param m Actual mass of the produced resonance [GeV].
204  * \param m1 Actual mass of the first incoming particle [GeV].
205  * \param m2 Actual mass of the second incoming particle [GeV].
206  */
207  double in_width(double m0, double G0, double m, double m1,
208  double m2) const override;
209 
210  protected:
211  /**
212  * See TwoBodyDecay::rho.
213  */
214  double rho(double m) const override;
215 
216  /**
217  * \return the cutoff parameter Λ for semi-stable decays,
218  * given the types of the daughter particles.
219  *
220  * For the values used in GiBUU, see \iref{Buss:2011mx}, eq. (175).
221  * For the original values used by M. Post, see table 1 in \iref{Post:2003hu}.
222  *
223  * We mostly stick to the GiBUU values, but use a different value for the ρπ
224  * decay, in order to avoid secondary bumps in the ω spectral function and
225  * achieve a better normalization. In contrast to smash, GiBUU does not have
226  * an ω → ρ π decay.
227  */
228  double get_Lambda();
229 
230  /// Cut-off parameter Λ for semi-stable decays.
231  double Lambda_;
232 
233  /// Tabulation of the resonance integrals.
234  mutable std::unique_ptr<Tabulation> tabulation_;
235 };
236 
237 /**
238  * TwoBodyDecayUnstable represents a decay type with two unstable final-state
239  * particles.
240  */
242  public:
243  /**
244  * Construct a \ref TwoBodyDecayUnstable.
245  *
246  * \param[in] part_types Final-state particles of the decay.
247  * \param[in] l Angular momentum of the decay.
248  * \return The constructed object.
249  */
250  TwoBodyDecayUnstable(ParticleTypePtrList part_types, int l);
251  double width(double m0, double G0, double m) const override;
252  double in_width(double m0, double G0, double m, double m1,
253  double m2) const override;
254 
255  protected:
256  /**
257  * See TwoBodyDecay::rho.
258  */
259  double rho(double m) const override;
260  /**
261  * \return the cut-off parameter Λ for unstable decays,
262  * given the types of the daughter particles.
263  */
264  double get_Lambda();
265 
266  /// Cut-off parameter Λ for unstable decays.
267  double Lambda_;
268 
269  /// Tabulation of the resonance integrals.
270  mutable std::unique_ptr<Tabulation> tabulation_;
271 };
272 
273 /**
274  * TwoBodyDecayDilepton represents a decay with a lepton and its antilepton
275  * as the final-state particles.
276  */
278  public:
279  /**
280  * Construct a \ref TwoBodyDecayDilepton.
281  *
282  * \param[in] part_types Final-state particles of the decay.
283  * \param[in] l Angular momentum of the decay.
284  * \return The constructed object.
285  */
286  TwoBodyDecayDilepton(ParticleTypePtrList part_types, int l);
287 
288  double width(double m0, double G0, double m) const override;
289  bool is_dilepton_decay() const override { return true; }
290 };
291 
292 /**
293  * ThreeBodyDecay represents a decay type with three final-state particles.
294  */
295 class ThreeBodyDecay : public DecayType {
296  public:
297  /**
298  * Construct a \ref ThreeBodyDecay.
299  *
300  * \param[in] part_types Final-state particles of the decay.
301  * \param[in] l Angular momentum of the decay.
302  * \return The constructed object.
303  */
304  ThreeBodyDecay(ParticleTypePtrList part_types, int l);
305 
306  unsigned int particle_number() const override;
307  bool has_particles(ParticleTypePtrList list) const override;
308  double width(double m0, double G0, double m) const override;
309  double in_width(double m0, double G0, double m, double m1,
310  double m2) const override;
311 };
312 
313 /**
314  * ThreeBodyDecayDilepton represents a decay type with three final-state
315  * particles, two of which are leptons.
316  */
318  public:
319  /**
320  * Construct a \ref ThreeBodyDecayDilepton.
321  *
322  * \param[in] mother Type of the mother particle.
323  * \param[in] part_types Final-state particles of the decay.
324  * \param[in] l Angular momentum of the decay.
325  * \return The constructed object.
326  */
327  ThreeBodyDecayDilepton(ParticleTypePtr mother, ParticleTypePtrList part_types,
328  int l);
329 
330  /**
331  * See DecayType::has_mother.
332  */
333  bool has_mother(ParticleTypePtr mother) const override;
334 
335  /**
336  * Get the mass-differential width \f$ d\Gamma / dm \f$ for a dilepton Dalitz
337  * decay, where \f$ m \f$ is the invariant mass of the lepton pair.
338  *
339  * This differential width is used directly for the dilepton shining weights.
340  * It is calculated according to \iref{Weil:2013mya}, eq. (30)-(36).
341  *
342  * Also see \iref{Staudenmaier:2017vtq} for a description of dilepton
343  * production in SMASH.
344  *
345  * \param[in] m_par Mass of the parent.
346  * \param[in] m_l Mass of the lepton species.
347  * \param[in] m_dil Invariant mass of the dilepton pair [GeV].
348  * \param[in] m_other Mass of the third, non-leptonic, particle.
349  * \param[in] other Type of the third particle.
350  * \param[in] t Type of the parent particle.
351  * \return Mass differential width.
352  */
353  static double diff_width(double m_par, double m_l, double m_dil,
354  double m_other, ParticleTypePtr other,
355  ParticleTypePtr t);
356  double width(double m0, double G0, double m) const override;
357 
358  bool is_dilepton_decay() const override { return true; }
359 
360  protected:
361  /// Tabulation of the resonance integrals.
362  mutable std::unique_ptr<Tabulation> tabulation_;
363 
364  /// Type of the mother particle.
366 };
367 
368 } // namespace smash
369 
370 #endif // SRC_INCLUDE_SMASH_DECAYTYPE_H_
DecayType is the abstract base class for all decay types.
Definition: decaytype.h:23
virtual unsigned int particle_number() const =0
DecayType(ParticleTypePtrList part_types, int l)
Construct a DecayType.
Definition: decaytype.h:32
int L_
angular momentum of the decay
Definition: decaytype.h:88
virtual double in_width(double m0, double G0, double m, double m1, double m2) const =0
virtual ~DecayType()=default
Virtual Destructor.
virtual bool has_particles(ParticleTypePtrList list) const =0
virtual bool is_dilepton_decay() const
Definition: decaytype.h:82
ParticleTypePtrList particle_types_
final-state particles of the decay
Definition: decaytype.h:86
const ParticleTypePtrList & particle_types() const
Definition: decaytype.h:58
int angular_momentum() const
Definition: decaytype.h:60
virtual double width(double m0, double G0, double m) const =0
virtual bool has_mother([[maybe_unused]] ParticleTypePtr mother) const
Definition: decaytype.h:54
A pointer-like interface to global references to ParticleType objects.
Definition: particletype.h:731
ThreeBodyDecayDilepton represents a decay type with three final-state particles, two of which are lep...
Definition: decaytype.h:317
ParticleTypePtr mother_
Type of the mother particle.
Definition: decaytype.h:365
static double diff_width(double m_par, double m_l, double m_dil, double m_other, ParticleTypePtr other, ParticleTypePtr t)
Get the mass-differential width for a dilepton Dalitz decay, where is the invariant mass of the lep...
Definition: decaytype.cc:337
bool has_mother(ParticleTypePtr mother) const override
See DecayType::has_mother.
Definition: decaytype.cc:333
double width(double m0, double G0, double m) const override
Definition: decaytype.cc:449
ThreeBodyDecayDilepton(ParticleTypePtr mother, ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecayDilepton.
Definition: decaytype.cc:306
bool is_dilepton_decay() const override
Definition: decaytype.h:358
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:362
ThreeBodyDecay represents a decay type with three final-state particles.
Definition: decaytype.h:295
double width(double m0, double G0, double m) const override
Definition: decaytype.cc:295
bool has_particles(ParticleTypePtrList list) const override
Definition: decaytype.cc:285
unsigned int particle_number() const override
Definition: decaytype.cc:283
ThreeBodyDecay(ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecay.
Definition: decaytype.cc:274
double in_width(double m0, double G0, double m, double m1, double m2) const override
Definition: decaytype.cc:299
TwoBodyDecayDilepton represents a decay with a lepton and its antilepton as the final-state particles...
Definition: decaytype.h:277
double width(double m0, double G0, double m) const override
Get the mass-dependent width of a two-body decay into stable particles according to Manley:1992yb .
Definition: decaytype.cc:253
TwoBodyDecayDilepton(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayDilepton.
Definition: decaytype.cc:241
bool is_dilepton_decay() const override
Definition: decaytype.h:289
TwoBodyDecaySemistable represents a decay type with two final-state particles, one of which is stable...
Definition: decaytype.h:175
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:234
double rho(double m) const override
See TwoBodyDecay::rho.
Definition: decaytype.cc:145
TwoBodyDecaySemistable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecaySemistable.
Definition: decaytype.cc:123
double Lambda_
Cut-off parameter Λ for semi-stable decays.
Definition: decaytype.h:231
double in_width(double m0, double G0, double m, double m1, double m2) const override
Get the mass-dependent in-width for a resonance formation process from one stable and one unstable pa...
Definition: decaytype.cc:170
double width(double m0, double G0, double m) const override
Get the mass-dependent width of a two-body decay into one stable and one unstable particle according ...
Definition: decaytype.cc:165
TwoBodyDecayStable represents a decay type with two stable final-state particles.
Definition: decaytype.h:129
double width(double m0, double G0, double m) const override
Get the mass-dependent width of a two-body decay into stable particles according to Manley:1992yb .
Definition: decaytype.cc:90
double in_width(double m0, double G0, double m, double m1, double m2) const override
Get the mass-dependent in-width for a resonance formation process from two stable particles according...
Definition: decaytype.cc:95
double rho(double m) const override
See TwoBodyDecay::rho.
Definition: decaytype.cc:82
TwoBodyDecayStable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayStable.
Definition: decaytype.cc:72
TwoBodyDecayUnstable represents a decay type with two unstable final-state particles.
Definition: decaytype.h:241
double in_width(double m0, double G0, double m, double m1, double m2) const override
Definition: decaytype.cc:231
double width(double m0, double G0, double m) const override
Definition: decaytype.cc:227
double rho(double m) const override
See TwoBodyDecay::rho.
Definition: decaytype.cc:199
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:270
TwoBodyDecayUnstable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayUnstable.
Definition: decaytype.cc:181
double Lambda_
Cut-off parameter Λ for unstable decays.
Definition: decaytype.h:267
TwoBodyDecay represents a decay type with two final-state particles.
Definition: decaytype.h:94
unsigned int particle_number() const override
Definition: decaytype.cc:60
double threshold() const
Definition: decaytype.h:107
virtual double rho([[maybe_unused]] double mass) const
This is a virtual helper method which is used to write the width as Gamma(m) = Gamma_0 * rho(m) / rho...
Definition: decaytype.h:122
TwoBodyDecay(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecay.
Definition: decaytype.cc:51
bool has_particles(ParticleTypePtrList list) const override
Definition: decaytype.cc:62
Definition: action.h:24