from collections.abc import Callablefrom typing import Anyimport matplotlib.pyplot as pltimport numpy as npimport sympy as spfrom ampform.io import aslatexfrom ampform.kinematics.phasespace import Kallenfrom ampform.sympy import unevaluatedfrom iminuit import Minuitfrom IPython.display import Mathfrom matplotlib import colors
Tip
See the Finding poles notebook for more explanation on the phase space factors and the procedure for finding a pole and computing a residue in the unphysical sheet.
Definition of phase space factors
@unevaluated(real=False)class PhaseSpaceFactor(sp.Expr): s: Any m1: Any m2: Any _latex_repr_ =R"\rho_{{{m1},{m2}}}\left({s}\right)"def evaluate(self) -> sp.Expr: s, m1, m2 =self.argsreturn sp.sqrt(s - (m1 + m2) **2) * sp.sqrt(s - (m1 - m2) **2) / s@unevaluated(real=False)class PhaseSpaceFactorCM(sp.Expr): s: Any m1: Any m2: Any _latex_repr_ =R"\rho_{{{m1},{m2}}}^\mathrm{{CM}}\left({s}\right)"def evaluate(self) -> sp.Expr: s, m1, m2 =self.argsreturn-16* sp.pi * sp.I * ChewMandelstam(s, m1, m2)@unevaluated(real=False)class ChewMandelstam(sp.Expr): s: Any m1: Any m2: Any _latex_repr_ =R"\Sigma\left({s}\right)"def evaluate(self) -> sp.Expr: s, m1, m2 =self.args q = BreakupMomentum(s, m1, m2)return (1/ (16* sp.pi**2)* ( (2* q / sp.sqrt(s))* sp.log((m1**2+ m2**2- s +2* sp.sqrt(s) * q) / (2* m1 * m2))- (m1**2- m2**2) * (1/ s -1/ (m1 + m2) **2) * sp.log(m1 / m2) ) )@unevaluated(real=False)class BreakupMomentum(sp.Expr): s: Any m1: Any m2: Any _latex_repr_ =R"q\left({s}\right)"def evaluate(self) -> sp.Expr: s, m1, m2 =self.argsreturn sp.sqrt(Kallen(s, m1**2, m2**2)) / (2* sp.sqrt(s))class DiagonalMatrix(sp.DiagonalMatrix):def _latex(self, printer, *args): # noqa: ARG002return printer._print(self.args[0])args = sp.symbols("s m_a m_b")exprs = [ PhaseSpaceFactor(*args), PhaseSpaceFactorCM(*args), ChewMandelstam(*args), BreakupMomentum(*args),]Math(aslatex({expr: expr.doit(deep=False) for expr in exprs}))
n =2K = sp.MatrixSymbol("K", n, n)CM = DiagonalMatrix(sp.MatrixSymbol(R"\rho^\mathrm{CM}", n, n))rho = DiagonalMatrix(sp.MatrixSymbol("rho", n, n))I = sp.Identity(n)
T1 = (I - sp.I * K * CM).inv() * KT1
\(\displaystyle \left(\mathbb{I} + - i K \rho^\mathrm{CM}\right)^{-1} K\)
Depending on the centre-of-mass energy, different Riemann sheets connect smoothly to the physical one. In our case the resonance mass will be above the threshold for the first and the second channel. Therefore the resonance is expected to be located on the third sheet.
Ti = (T1.inv() -2* sp.I * rho).inv()Ti
\(\displaystyle \left(- 2 i \rho + K^{-1} \left(\mathbb{I} + - i K \rho^\mathrm{CM}\right)\right)^{-1}\)
Z = np.abs(T3_denom_func[0, 0](S.conj()))plt.title(R"Absolute value of denominator of $T_\mathrm{III}^{1, 1}$")plt.pcolormesh(X, -Y, Z, rasterized=True, norm=colors.LogNorm(vmin=0.1, vmax=4))plt.colorbar()plt.xlabel("Re(s)")plt.ylabel("Im(s)")plt.show()