Version: SMASH-3.1
formfactors.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2018,2020,2022-2023
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 
8 #ifndef SRC_INCLUDE_SMASH_FORMFACTORS_H_
9 #define SRC_INCLUDE_SMASH_FORMFACTORS_H_
10 
11 #include <complex>
12 #include <string>
13 
14 #include "constants.h"
15 #include "macros.h"
16 #include "pdgcode.h"
17 #include "pdgcode_constants.h"
18 
19 namespace smash {
20 
35 inline double blatt_weisskopf_sqr(const double p_ab, const int L) {
36  if (L == 0) {
37  return 1.;
38  }
39  constexpr double R = 1. / hbarc; /* interaction radius = 1 fm */
40  const double x = p_ab * R;
41  const double x2 = x * x;
42  if (L == 1) {
43  return x2 / (1. + x2);
44  }
45  std::complex<double> g_prevprev(1, 0);
46  std::complex<double> g_prev(1, -x);
47  double numer = x2;
48  for (int l = 1; l < L; l++) {
49  numer *= x2;
50  const auto new_g =
51  static_cast<double>(2 * l + 1) * g_prev - x2 * g_prevprev;
52  g_prevprev = g_prev;
53  g_prev = new_g;
54  }
55  const double denom = std::norm(g_prev);
56  return numer / denom;
57 }
58 
77 inline double post_ff_sqr(double m, double M0, double srts0, double L) {
78  const auto L4 = L * L * L * L;
79  const auto M2 = M0 * M0;
80  const auto s0 = srts0 * srts0;
81  const auto sminus = (s0 - M2) * 0.5;
82  const auto splus = m * m - (s0 + M2) * 0.5;
83  const auto FF = (L4 + sminus * sminus) / (L4 + splus * splus);
84  return FF * FF;
85 }
86 
87 // electromagnetic transition form factors for the dilepton dalitz decays
88 
99 inline double em_form_factor_ps(PdgCode pdg, double mass) {
100  switch (pdg.code()) {
101  case pdg::pi_z:
102  return 1. + 5.5 * mass * mass;
103  case pdg::eta: {
104  const double lambda_eta = 0.716;
105  const double m_over_eta = mass / lambda_eta;
106  return 1. / (1. - m_over_eta * m_over_eta);
107  }
108  default: /* η' etc */
109  return 1.; // use QED approximation
110  }
111 }
112 
122 inline double em_form_factor_sqr_vec(PdgCode pdg, double mass) {
123  switch (pdg.code()) {
124  case pdg::omega: {
125  constexpr double lambda = 0.65;
126  constexpr double gamma = 0.075;
127  constexpr double lambda_sqr = lambda * lambda;
128  constexpr double gamma_sqr = gamma * gamma;
129  const double tmp = lambda_sqr - mass * mass;
130  const double denom = tmp * tmp + lambda_sqr * gamma_sqr;
131  return lambda_sqr * lambda_sqr / denom;
132  }
133  default: /* φ etc */
134  return 1.; // use QED approximation
135  }
136 }
137 
146 inline double form_factor_delta([[maybe_unused]] double m) { return 3.12; }
147 
148 } // namespace smash
149 
150 #endif // SRC_INCLUDE_SMASH_FORMFACTORS_H_
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
Definition: pdgcode.h:111
std::int32_t code() const
Definition: pdgcode.h:322
Collection of useful constants that are known at compile time.
constexpr int omega
ω.
constexpr int eta
η.
constexpr int pi_z
π⁰.
Definition: action.h:24
double em_form_factor_sqr_vec(PdgCode pdg, double mass)
Definition: formfactors.h:122
double form_factor_delta([[maybe_unused]] double m)
Definition: formfactors.h:146
double blatt_weisskopf_sqr(const double p_ab, const int L)
Definition: formfactors.h:35
constexpr double hbarc
GeV <-> fm conversion factor.
Definition: constants.h:25
double post_ff_sqr(double m, double M0, double srts0, double L)
An additional form factor for unstable final states as used in GiBUU, according to M.
Definition: formfactors.h:77
double em_form_factor_ps(PdgCode pdg, double mass)
Definition: formfactors.h:99
#define R(x, n)
Definition: sha256.cc:55