Analytic continuation

Definitions

import sympy as sp
from IPython.display import Math

breakup_momentum_squared():

from ampform.dynamics import breakup_momentum_squared

s, m_a, m_b = sp.symbols("s, m_a, m_b")
q_squared = breakup_momentum_squared(s, m_a, m_b)
Math(f"q^2(s) = {sp.latex(q_squared)}")
\[\displaystyle q^2(s) = \frac{\left(s - \left(m_{a} - m_{b}\right)^{2}\right) \left(s - \left(m_{a} + m_{b}\right)^{2}\right)}{4 s}\]

phase_space_factor():

from ampform.dynamics import phase_space_factor

rho = phase_space_factor(s, m_a, m_b)
rho_subs = rho.subs(4 * q_squared, 4 * sp.Symbol("q^{2}(s)"))
Math(fR"\hat{{\rho}}(s) = {sp.latex(rho_subs)}")
\[\displaystyle \hat{\rho}(s) = \frac{\sqrt{q^{2}(s)}}{8 \pi \sqrt{s}}\]

phase_space_factor_ac() (analytic continuation):

from ampform.dynamics import phase_space_factor_ac

rho_analytic = phase_space_factor_ac(s, m_a, m_b)
from ampform.dynamics import _analytic_continuation

_analytic_continuation(
    sp.Symbol(R"\hat{\rho}"), s, s_threshold=(m_a + m_b) ** 2
)
\[\begin{split}\displaystyle \begin{cases} \frac{i \hat{\rho} \log{\left(\left|{\frac{\hat{\rho} + 1}{\hat{\rho} - 1}}\right| \right)}}{\pi} & \text{for}\: s < 0 \\\frac{i \hat{\rho} \log{\left(\left|{\frac{\hat{\rho} + 1}{\hat{\rho} - 1}}\right| \right)}}{\pi} + \hat{\rho} & \text{for}\: s > \left(m_{a} + m_{b}\right)^{2} \\\frac{2 i \hat{\rho} \operatorname{atan}{\left(\frac{1}{\hat{\rho}} \right)}}{\pi} & \text{otherwise} \end{cases}\end{split}\]

Interactive plot

%matplotlib widget
import matplotlib.pyplot as plt
import mpl_interactions.ipyplot as iplt
import numpy as np

import symplot
m = sp.Symbol("m", real=True)
rho = phase_space_factor(m ** 2, m_a, m_b)
rho_ac = phase_space_factor_ac(m ** 2, m_a, m_b)
np_rho, sliders = symplot.prepare_sliders(plot_symbol=m, expression=rho)
np_rho_ac = sp.lambdify((m, m_a, m_b), rho_ac, "numpy")
plot_domain = np.linspace(0, 3, 1_000, dtype=np.complex64)
sliders.set_ranges(
    m_a=(0, 2, 200),
    m_b=(0, 2, 200),
)
sliders.set_values(
    m_a=0.45,
    m_b=1.4,
)
fig, axes = plt.subplots(1, 3, figsize=(10, 4), tight_layout=True, sharey=True)
ax_abs, ax_real, ax_imag = axes
for ax in axes:
    ax.set_xlabel("$m$")
ylim = (0, 0.05)

ax_abs.set_title(R"$\left|\rho\right|$")
controls = iplt.plot(
    plot_domain,
    lambda *args, **kwargs: np.abs(np_rho(*args, **kwargs)),
    label="normal",
    **sliders,
    ylim=ylim,
    ax=ax_abs,
    linestyle="dotted",
)
iplt.plot(
    plot_domain,
    lambda *args, **kwargs: np.abs(np_rho_ac(*args, **kwargs)),
    label="analytic",
    controls=controls,
    ylim=ylim,
    ax=ax_abs,
    linestyle="dashed",
)
plt.legend(loc="upper right")

ax_real.set_title(R"Re($\rho$)")
iplt.plot(
    plot_domain,
    lambda *args, **kwargs: np_rho(*args, **kwargs).real,
    label="normal",
    controls=controls,
    ylim=ylim,
    ax=ax_real,
    linestyle="dotted",
)
iplt.plot(
    plot_domain,
    lambda *args, **kwargs: np_rho_ac(*args, **kwargs).real,
    label="analytic",
    controls=controls,
    ylim=ylim,
    ax=ax_real,
    linestyle="dashed",
)
plt.legend(loc="upper right")

ax_imag.set_title(R"Im($\rho$)")
iplt.plot(
    plot_domain,
    lambda *args, **kwargs: np_rho(*args, **kwargs).imag,
    label="normal",
    controls=controls,
    ylim=ylim,
    linestyle="dotted",
    ax=ax_imag,
)
iplt.plot(
    plot_domain,
    lambda *args, **kwargs: np_rho_ac(*args, **kwargs).imag,
    label="analytic",
    controls=controls,
    ylim=ylim,
    ax=ax_imag,
    linestyle="dashed",
)
plt.legend(loc="upper right")

plt.show()
../../_images/analytic-continuation_20_0.svg