D⁰ → K⁰ K⁺ K⁻#

The decay \(D^0 \to K^0K^+K^-\) has a spinless initial and final state, which means that there is no need to align spin with Dalitz-plot decomposition. This notebook shows that the model formulated by ampform is the same as that formulated by AmpForm-DPD. To simplify this comparison, we do not define any dynamics.

%matplotlib widget

Hide code cell content

import logging
import os
import warnings

import ampform
import graphviz
import qrules
from IPython.display import Latex, Markdown

from ampform_dpd import DalitzPlotDecompositionBuilder
from ampform_dpd.adapter.qrules import normalize_state_ids, to_three_body_decay
from ampform_dpd.io import (
    as_markdown_table,
    aslatex,
    cached,
    mute_ampform_warnings,
    simplify_latex_rendering,
)

simplify_latex_rendering()
logging.getLogger("jax").setLevel(logging.ERROR)  # mute JAX
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"  # mute TF
warnings.simplefilter("ignore", category=RuntimeWarning)
if STATIC_PAGE := "EXECUTE_NB" in os.environ:
    mute_ampform_warnings()

Decay definition#

Hide code cell source

REACTION = qrules.generate_transitions(
    initial_state="D0",
    final_state=["K0", "K-", "K+"],
    allowed_intermediate_particles=["a(0)", "f(0)(980)", "pi(1)"],
    mass_conservation_factor=0.2,
    formalism="helicity",
)
REACTION123 = normalize_state_ids(REACTION)

Hide code cell source

dot = qrules.io.asdot(REACTION123, collapse_graphs=True)
graphviz.Source(dot)
../_images/25e94e57231eea7c223608927aecb8a95ac74c6026258ab45431c6f5b58c519d.svg

Hide code cell source

DECAY = to_three_body_decay(REACTION123.transitions, min_ls=True)
Markdown(as_markdown_table([DECAY.initial_state, *DECAY.final_state.values()]))

index

name

LaTeX

\(J^P\)

mass (MeV)

width (MeV)

0

D0

\(D^{0}\)

\(0^-\)

1,864

0

1

K0

\(K^{0}\)

\(0^-\)

497

0

2

K-

\(K^{-}\)

\(0^-\)

493

0

3

K+

\(K^{+}\)

\(0^-\)

493

0

Hide code cell source

resonances = sorted(
    {t.resonance for t in DECAY.chains},
    key=lambda p: (p.name[0], p.mass),
)
resonance_names = [p.name for p in resonances]
Markdown(as_markdown_table(resonances))

name

LaTeX

\(J^P\)

mass (MeV)

width (MeV)

a(0)(980)0

\(a_{0}(980)^{0}\)

\(0^+\)

980

75

a(0)(980)+

\(a_{0}(980)^{+}\)

\(0^+\)

980

75

a(0)(980)-

\(a_{0}(980)^{-}\)

\(0^+\)

980

75

f(0)(980)

\(f_{0}(980)\)

\(0^+\)

990

60

Hide code cell source

Latex(aslatex(DECAY, with_jp=True))
\[\begin{split}\begin{array}{c} D^{0}\left[0^-\right] \to \left(a_{0}(980)^{+}\left[0^+\right] \to K^{0}\left[0^-\right] K^{+}\left[0^-\right]\right) K^{-}\left[0^-\right] \\ D^{0}\left[0^-\right] \to \left(a_{0}(980)^{-}\left[0^+\right] \to K^{0}\left[0^-\right] K^{-}\left[0^-\right]\right) K^{+}\left[0^-\right] \\ D^{0}\left[0^-\right] \to \left(a_{0}(980)^{0}\left[0^+\right] \to K^{-}\left[0^-\right] K^{+}\left[0^-\right]\right) K^{0}\left[0^-\right] \\ D^{0}\left[0^-\right] \to \left(f_{0}(980)\left[0^+\right] \to K^{-}\left[0^-\right] K^{+}\left[0^-\right]\right) K^{0}\left[0^-\right] \\ \end{array}\end{split}\]

Model formulation#

DPD model#

Note that, as opposed to Λc⁺ → pπ⁺K⁻ and J/ψ → K⁰Σ⁺p̅, there are no Wigner-\(d\) functions, because the final state is spinless.

Hide code cell source

model_builder = DalitzPlotDecompositionBuilder(DECAY, min_ls=True)
DPD_MODEL = model_builder.formulate(cleanup_summations=True)
del model_builder
DPD_MODEL.intensity.cleanup()
\[\displaystyle \left|{A^{1}_{0, 0, 0, 0} + A^{2}_{0, 0, 0, 0} + A^{3}_{0, 0, 0, 0}}\right|^{2}\]

Hide code cell source

Latex(aslatex(DPD_MODEL.amplitudes, terms_per_line=1))
\[\begin{split}\begin{aligned} A^{1}_{0, 0, 0, 0} \;&=\; \sum_{\lambda_{R}=0}{\delta_{0 \lambda_{R}} \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{0}, 0, 0} \mathcal{H}^\mathrm{production}_{a_{0}(980)^{0}, \lambda_{R}, 0} d^{0}_{\lambda_{R},0}\left(\theta_{23}\right)} \\ \;&+\; \sum_{\lambda_{R}=0}{\delta_{0 \lambda_{R}} \mathcal{H}^\mathrm{decay}_{f_{0}(980), 0, 0} \mathcal{H}^\mathrm{production}_{f_{0}(980), \lambda_{R}, 0} d^{0}_{\lambda_{R},0}\left(\theta_{23}\right)} \\ A^{2}_{0, 0, 0, 0} \;&=\; \sum_{\lambda_{R}=0}{\delta_{0 \lambda_{R}} \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{+}, 0, 0} \mathcal{H}^\mathrm{production}_{a_{0}(980)^{+}, \lambda_{R}, 0} d^{0}_{\lambda_{R},0}\left(\theta_{31}\right)} \\ A^{3}_{0, 0, 0, 0} \;&=\; \sum_{\lambda_{R}=0}{\delta_{0 \lambda_{R}} \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{-}, 0, 0} \mathcal{H}^\mathrm{production}_{a_{0}(980)^{-}, \lambda_{R}, 0} d^{0}_{\lambda_{R},0}\left(\theta_{12}\right)} \\ \end{aligned}\end{split}\]

There is an isobar Wigner-\(d\) function, which takes the following helicity angles as argument:

Hide code cell source

\[\begin{split}\begin{aligned} \theta_{23} \;&=\; \operatorname{acos}{\left(\frac{2 \sigma_{1} \left(- m_{1}^{2} - m_{2}^{2} + \sigma_{3}\right) - \left(m_{0}^{2} - m_{1}^{2} - \sigma_{1}\right) \left(m_{2}^{2} - m_{3}^{2} + \sigma_{1}\right)}{\sqrt{\lambda\left(m_{0}^{2}, m_{1}^{2}, \sigma_{1}\right)} \sqrt{\lambda\left(\sigma_{1}, m_{2}^{2}, m_{3}^{2}\right)}} \right)} \\ \theta_{31} \;&=\; \operatorname{acos}{\left(\frac{2 \sigma_{2} \left(- m_{2}^{2} - m_{3}^{2} + \sigma_{1}\right) - \left(m_{0}^{2} - m_{2}^{2} - \sigma_{2}\right) \left(- m_{1}^{2} + m_{3}^{2} + \sigma_{2}\right)}{\sqrt{\lambda\left(m_{0}^{2}, m_{2}^{2}, \sigma_{2}\right)} \sqrt{\lambda\left(\sigma_{2}, m_{3}^{2}, m_{1}^{2}\right)}} \right)} \\ \theta_{12} \;&=\; \operatorname{acos}{\left(\frac{2 \sigma_{3} \left(- m_{1}^{2} - m_{3}^{2} + \sigma_{2}\right) - \left(m_{0}^{2} - m_{3}^{2} - \sigma_{3}\right) \left(m_{1}^{2} - m_{2}^{2} + \sigma_{3}\right)}{\sqrt{\lambda\left(m_{0}^{2}, m_{3}^{2}, \sigma_{3}\right)} \sqrt{\lambda\left(\sigma_{3}, m_{1}^{2}, m_{2}^{2}\right)}} \right)} \\ \end{aligned}\end{split}\]

AmpForm model#

AmpForm does not formulate alignment Wigner-\(D\) functions. For the case of this spinless final state, this means the intensity is the same as that of the DPD model.

Hide code cell source

model_builder = ampform.get_builder(REACTION)
model_builder.use_helicity_couplings = False
model_builder.config.scalar_initial_state_mass = True
model_builder.config.stable_final_state_ids = [0, 1, 2]
AMPFORM_MODEL = model_builder.formulate()
AMPFORM_MODEL.intensity.cleanup()
\[\displaystyle \left|{A^{01}_{0, 0, 0, 0} + A^{02}_{0, 0, 0, 0} + A^{12}_{0, 0, 0, 0}}\right|^{2}\]

Hide code cell source

\[\begin{split}\begin{aligned} A^{01}_{0, 0, 0, 0} \;&=\; C_{D^{0} \to K^{+}_{0} {a_{0}(980)^{-}}_{0}; a_{0}(980)^{-} \to K^{-}_{0} K^{0}_{0}} D^{0}_{0,0}\left(- \phi_{01},\theta_{01},0\right) D^{0}_{0,0}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\ A^{02}_{0, 0, 0, 0} \;&=\; C_{D^{0} \to K^{-}_{0} {a_{0}(980)^{+}}_{0}; a_{0}(980)^{+} \to K^{+}_{0} K^{0}_{0}} D^{0}_{0,0}\left(- \phi_{02},\theta_{02},0\right) D^{0}_{0,0}\left(- \phi^{02}_{0},\theta^{02}_{0},0\right) \\ A^{12}_{0, 0, 0, 0} \;&=\; C_{D^{0} \to K^{0}_{0} {a_{0}(980)^{0}}_{0}; a_{0}(980)^{0} \to K^{+}_{0} K^{-}_{0}} D^{0}_{0,0}\left(- \phi_{0},\theta_{0},0\right) D^{0}_{0,0}\left(- \phi^{12}_{1},\theta^{12}_{1},0\right) \\ \;&+\; C_{D^{0} \to K^{0}_{0} {f_{0}(980)}_{0}; f_{0}(980) \to K^{+}_{0} K^{-}_{0}} D^{0}_{0,0}\left(- \phi_{0},\theta_{0},0\right) D^{0}_{0,0}\left(- \phi^{12}_{1},\theta^{12}_{1},0\right) \\ \end{aligned}\end{split}\]

Hide code cell source

\[\begin{split}\begin{aligned} m_{01} \;&=\; m_{{p}_{01}} \\ m_{02} \;&=\; m_{{p}_{02}} \\ m_{12} \;&=\; m_{{p}_{12}} \\ \phi_{0} \;&=\; \phi\left({p}_{12}\right) \\ \phi^{01}_{0} \;&=\; \phi\left(\boldsymbol{B_z}\left(\frac{\left|\vec{{p}_{01}}\right|}{E\left({p}_{01}\right)}\right) \boldsymbol{R_y}\left(- \theta\left({p}_{01}\right)\right) \boldsymbol{R_z}\left(- \phi\left({p}_{01}\right)\right) p_{0}\right) \\ \phi^{02}_{0} \;&=\; \phi\left(\boldsymbol{B_z}\left(\frac{\left|\vec{{p}_{02}}\right|}{E\left({p}_{02}\right)}\right) \boldsymbol{R_y}\left(- \theta\left({p}_{02}\right)\right) \boldsymbol{R_z}\left(- \phi\left({p}_{02}\right)\right) p_{0}\right) \\ \phi_{01} \;&=\; \phi\left({p}_{01}\right) \\ \phi^{12}_{1} \;&=\; \phi\left(\boldsymbol{B_z}\left(\frac{\left|\vec{{p}_{12}}\right|}{E\left({p}_{12}\right)}\right) \boldsymbol{R_y}\left(- \theta\left({p}_{12}\right)\right) \boldsymbol{R_z}\left(- \phi\left({p}_{12}\right)\right) p_{1}\right) \\ \phi_{02} \;&=\; \phi\left({p}_{02}\right) \\ \theta_{0} \;&=\; \theta\left({p}_{12}\right) \\ \theta^{01}_{0} \;&=\; \theta\left(\boldsymbol{B_z}\left(\frac{\left|\vec{{p}_{01}}\right|}{E\left({p}_{01}\right)}\right) \boldsymbol{R_y}\left(- \theta\left({p}_{01}\right)\right) \boldsymbol{R_z}\left(- \phi\left({p}_{01}\right)\right) p_{0}\right) \\ \theta^{02}_{0} \;&=\; \theta\left(\boldsymbol{B_z}\left(\frac{\left|\vec{{p}_{02}}\right|}{E\left({p}_{02}\right)}\right) \boldsymbol{R_y}\left(- \theta\left({p}_{02}\right)\right) \boldsymbol{R_z}\left(- \phi\left({p}_{02}\right)\right) p_{0}\right) \\ \theta_{01} \;&=\; \theta\left({p}_{01}\right) \\ \theta^{12}_{1} \;&=\; \theta\left(\boldsymbol{B_z}\left(\frac{\left|\vec{{p}_{12}}\right|}{E\left({p}_{12}\right)}\right) \boldsymbol{R_y}\left(- \theta\left({p}_{12}\right)\right) \boldsymbol{R_z}\left(- \phi\left({p}_{12}\right)\right) p_{1}\right) \\ \theta_{02} \;&=\; \theta\left({p}_{02}\right) \\ \end{aligned}\end{split}\]

Confirm equivalence#

AMPFORM_EXPR = cached.unfold(AMPFORM_MODEL)
AMPFORM_EXPR
\[\displaystyle \left|{C_{D^{0} \to K^{+}_{0} {a_{0}(980)^{-}}_{0}; a_{0}(980)^{-} \to K^{-}_{0} K^{0}_{0}} + C_{D^{0} \to K^{-}_{0} {a_{0}(980)^{+}}_{0}; a_{0}(980)^{+} \to K^{+}_{0} K^{0}_{0}} + C_{D^{0} \to K^{0}_{0} {a_{0}(980)^{0}}_{0}; a_{0}(980)^{0} \to K^{+}_{0} K^{-}_{0}} + C_{D^{0} \to K^{0}_{0} {f_{0}(980)}_{0}; f_{0}(980) \to K^{+}_{0} K^{-}_{0}}}\right|^{2}\]
DPD_EXPR = cached.unfold(DPD_MODEL)
DPD_EXPR
\[\displaystyle \left|{\mathcal{H}^\mathrm{decay}_{a_{0}(980)^{+}, 0, 0} \mathcal{H}^\mathrm{production}_{a_{0}(980)^{+}, 0, 0} + \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{-}, 0, 0} \mathcal{H}^\mathrm{production}_{a_{0}(980)^{-}, 0, 0} + \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{0}, 0, 0} \mathcal{H}^\mathrm{production}_{a_{0}(980)^{0}, 0, 0} + \mathcal{H}^\mathrm{decay}_{f_{0}(980), 0, 0} \mathcal{H}^\mathrm{production}_{f_{0}(980), 0, 0}}\right|^{2}\]

Hide code cell source

coefficients = {s for s in AMPFORM_MODEL.parameter_defaults if s.name.startswith("C")}
couplings = {s for s in DPD_MODEL.parameter_defaults if "production" in s.name}
substitutions = {s: 1 for s in DPD_MODEL.parameter_defaults if "decay" in s.name}
for c in coefficients:
    resonance_name = c.name[24:].split(";", maxsplit=1)[0]
    resonance_name = resonance_name.rsplit("_", maxsplit=1)[0][:-1]
    coupling, *_ = {s for s in couplings if resonance_name in s.name}
    substitutions[coupling] = c
Latex(aslatex(substitutions))
\[\begin{split}\begin{aligned} \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{0}, 0, 0} \;&=\; 1 \\ \mathcal{H}^\mathrm{decay}_{f_{0}(980), 0, 0} \;&=\; 1 \\ \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{+}, 0, 0} \;&=\; 1 \\ \mathcal{H}^\mathrm{decay}_{a_{0}(980)^{-}, 0, 0} \;&=\; 1 \\ \mathcal{H}^\mathrm{production}_{a_{0}(980)^{0}, 0, 0} \;&=\; C_{D^{0} \to K^{0}_{0} {a_{0}(980)^{0}}_{0}; a_{0}(980)^{0} \to K^{+}_{0} K^{-}_{0}} \\ \mathcal{H}^\mathrm{production}_{f_{0}(980), 0, 0} \;&=\; C_{D^{0} \to K^{0}_{0} {f_{0}(980)}_{0}; f_{0}(980) \to K^{+}_{0} K^{-}_{0}} \\ \mathcal{H}^\mathrm{production}_{a_{0}(980)^{-}, 0, 0} \;&=\; C_{D^{0} \to K^{+}_{0} {a_{0}(980)^{-}}_{0}; a_{0}(980)^{-} \to K^{-}_{0} K^{0}_{0}} \\ \mathcal{H}^\mathrm{production}_{a_{0}(980)^{+}, 0, 0} \;&=\; C_{D^{0} \to K^{-}_{0} {a_{0}(980)^{+}}_{0}; a_{0}(980)^{+} \to K^{+}_{0} K^{0}_{0}} \\ \end{aligned}\end{split}\]
assert DPD_EXPR.xreplace(substitutions) == AMPFORM_EXPR