form_factor#

Implementations of the form factor, or barrier factor.

class FormFactor(s, m1, m2, angular_momentum, meson_radius, normalize, *args, evaluate: bool = False, **kwargs)[source]#

Bases: Expr

Formulate a Blatt–Weisskopf form factor.

Returns the sqrt of a BlattWeisskopfSquared with \(z = q^2 d^2\), where \(q^2\) is the BreakupMomentumSquared and \(d\) is the meson radius. With normalize=False, this is the production process factor \(n_a\) from PDG2026, Eq. (50.33), with \(d = 1/q_0\). The default normalized form factor \(\hat{\mathcal{F}}_L\) differs from \(n_a\) by the constant \(\left|h_L^{(1)}(1)\right|\). This constant cancels in ratios, such as in EnergyDependentWidth, but not when the form factor is used as a vertex factor.

(1)#\[\begin{split} \begin{aligned} \hat{\mathcal{F}}_{L}\left(s, m_{a}, m_{b}\right) \;&=\; \sqrt{\hat{B}_{L}^2\left(d^{2} q^2\left(s\right)\right)} \\ \end{aligned}\end{split}\]
normalize: bool[source]#
property func: type[source]#

Return a class-valued constructor preserving non-sympy arguments.

SymPy’s type queries require a class, while downstream dispatch compares it with the original class. Constructed instances retain their original type and pickle representation.

class BlattWeisskopfSquared(z, angular_momentum, normalize, *args, evaluate: bool = False, **kwargs)[source]#

Bases: Expr

Normalized Blatt–Weisskopf function \(\hat{B}_L^2(z)\).

Parameters:
  • z – Argument of the Blatt–Weisskopf function. A usual choice is \(z = (d q)^2\) with \(d\) the impact parameter and \(q\) the breakup-momentum (see BreakupMomentumSquared).

  • angular_momentum – Angular momentum \(L\) of the decaying particle.

  • normalize – Set to False to omit the normalization constant \(\left|h_L^{(1)}(1)\right|^2\). The resulting \(B_L^2(z)\) equals \(z^L F_L^2(\sqrt{z})\), where \(F_L\) is the non-normalized Blatt–Weisskopf function of PDG2026, Eq. (50.34). This is the square of the factor \(n_L\) of Equation (50.33).

The hat indicates the normalization \(\hat{B}_L^2(1)=1\). Both variants have equal powers of \(z\) in the numerator and the denominator, so they are unitless no matter what \(z\) is. The PDG function \(F_L\) instead has \(1\) in the numerator and carries the threshold factor \(z^L\) separately.

>>> z = sp.Symbol("z", nonnegative=True)
>>> BlattWeisskopfSquared(z, angular_momentum=2).doit()
13*z**2/(z**2 + 3*z + 9)
>>> BlattWeisskopfSquared(z, angular_momentum=2, normalize=False).doit()
z**2/(z**2 + 3*z + 9)

See also

Form factor, TR-029, and [Chung, 2015].

With this, the implementation becomes

(2)#\[\begin{split} \begin{aligned} \hat{B}_{L}^2\left(z\right) \;&=\; \frac{\left|{h_{L}^{(1)}\left(1\right)}\right|^{2}}{z \left|{h_{L}^{(1)}\left(\sqrt{z}\right)}\right|^{2}} \\ \end{aligned}\end{split}\]

where \(h_{L}^{(1)}\left(z\right)\) is defined by (3).

normalize: bool[source]#
property func: type[source]#

Return a class-valued constructor preserving non-sympy arguments.

SymPy’s type queries require a class, while downstream dispatch compares it with the original class. Constructed instances retain their original type and pickle representation.

class SphericalHankel1(l, z, *args, evaluate: bool = False, **kwargs)[source]#

Bases: Expr

Spherical Hankel function of the first kind for real-valued \(z\).

See [von Hippel and Quigg, 1972], Equation (A12), and TR-029 for more info. This page explains the difference with the general Hankel function of the first kind, \(H_\ell^{(1)}\).

This expression class assumes that \(z\) is real and evaluates to the following series:

(3)#\[\begin{split} \begin{aligned} h_{\ell}^{(1)}\left(z\right) \;&=\; \frac{\left(- i\right)^{\ell + 1} e^{i z} \sum_{k=0}^{\ell} \frac{\left(\frac{i}{2 z}\right)^{k} \left(k + \ell\right)!}{k! \left(- k + \ell\right)!}}{z} \\ \end{aligned}\end{split}\]