% Options for packages loaded elsewhere
% Options for packages loaded elsewhere
\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{hyphens}{url}
\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor}
%
\documentclass[
  letterpaper,
  DIV=11,
  numbers=noendperiod]{scrreprt}
\usepackage{xcolor}
\usepackage{amsmath,amssymb}
\setcounter{secnumdepth}{2}
\usepackage{iftex}
\ifPDFTeX
  \usepackage[T1]{fontenc}
  \usepackage[utf8]{inputenc}
  \usepackage{textcomp} % provide euro and other symbols
\else % if luatex or xetex
  \usepackage{unicode-math} % this also loads fontspec
  \defaultfontfeatures{Scale=MatchLowercase}
  \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
\fi
\usepackage{lmodern}
\ifPDFTeX\else
  % xetex/luatex font selection
\fi
% Use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\IfFileExists{microtype.sty}{% use microtype if available
  \usepackage[]{microtype}
  \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\makeatletter
\@ifundefined{KOMAClassName}{% if non-KOMA class
  \IfFileExists{parskip.sty}{%
    \usepackage{parskip}
  }{% else
    \setlength{\parindent}{0pt}
    \setlength{\parskip}{6pt plus 2pt minus 1pt}}
}{% if KOMA class
  \KOMAoptions{parskip=half}}
\makeatother
% Make \paragraph and \subparagraph free-standing
\makeatletter
\ifx\paragraph\undefined\else
  \let\oldparagraph\paragraph
  \renewcommand{\paragraph}{
    \@ifstar
      \xxxParagraphStar
      \xxxParagraphNoStar
  }
  \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}}
  \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}}
\fi
\ifx\subparagraph\undefined\else
  \let\oldsubparagraph\subparagraph
  \renewcommand{\subparagraph}{
    \@ifstar
      \xxxSubParagraphStar
      \xxxSubParagraphNoStar
  }
  \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}}
  \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}}
\fi
\makeatother

\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\usepackage{framed}
\definecolor{shadecolor}{RGB}{241,243,245}
\newenvironment{Shaded}{\begin{snugshade}}{\end{snugshade}}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}}
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.40,0.45,0.13}{#1}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\BuiltInTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}}
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{\textit{#1}}}
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{#1}}
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{\textbf{#1}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{\textit{#1}}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\ExtensionTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.28,0.35,0.67}{#1}}
\newcommand{\ImportTok}[1]{\textcolor[rgb]{0.00,0.46,0.62}{#1}}
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{\textbf{#1}}}
\newcommand{\NormalTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}}
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}}
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}}
\newcommand{\RegionMarkerTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}}
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}}
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}}
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.07,0.07,0.07}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{\textit{#1}}}

\usepackage{longtable,booktabs,array}
\usepackage{calc} % for calculating minipage widths
% Correct order of tables after \paragraph or \subparagraph
\usepackage{etoolbox}
\makeatletter
\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
\makeatother
% Allow footnotes in longtable head/foot
\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}
\makesavenoteenv{longtable}
\usepackage{graphicx}
\makeatletter
\newsavebox\pandoc@box
\newcommand*\pandocbounded[1]{% scales image to fit in text height/width
  \sbox\pandoc@box{#1}%
  \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}%
  \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}%
  \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both
  \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}%
  \else\usebox{\pandoc@box}%
  \fi%
}
% Set default figure placement to htbp
\def\fps@figure{htbp}
\makeatother


% definitions for citeproc citations
\NewDocumentCommand\citeproctext{}{}
\NewDocumentCommand\citeproc{mm}{%
  \begingroup\def\citeproctext{#2}\cite{#1}\endgroup}
\makeatletter
 % allow citations to break across lines
 \let\@cite@ofmt\@firstofone
 % avoid brackets around text for \cite:
 \def\@biblabel#1{}
 \def\@cite#1#2{{#1\if@tempswa , #2\fi}}
\makeatother
\newlength{\cslhangindent}
\setlength{\cslhangindent}{1.5em}
\newlength{\csllabelwidth}
\setlength{\csllabelwidth}{3em}
\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing
 {\begin{list}{}{%
  \setlength{\itemindent}{0pt}
  \setlength{\leftmargin}{0pt}
  \setlength{\parsep}{0pt}
  % turn on hanging indent if param 1 is 1
  \ifodd #1
   \setlength{\leftmargin}{\cslhangindent}
   \setlength{\itemindent}{-1\cslhangindent}
  \fi
  % set entry spacing
  \setlength{\itemsep}{#2\baselineskip}}}
 {\end{list}}
\usepackage{calc}
\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}}
\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}}
\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}}
\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}



\setlength{\emergencystretch}{3em} % prevent overfull lines

\providecommand{\tightlist}{%
  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}



 


\KOMAoption{captions}{tableheading}
\makeatletter
\@ifpackageloaded{bookmark}{}{\usepackage{bookmark}}
\makeatother
\makeatletter
\@ifpackageloaded{caption}{}{\usepackage{caption}}
\AtBeginDocument{%
\ifdefined\contentsname
  \renewcommand*\contentsname{Table of contents}
\else
  \newcommand\contentsname{Table of contents}
\fi
\ifdefined\listfigurename
  \renewcommand*\listfigurename{List of Figures}
\else
  \newcommand\listfigurename{List of Figures}
\fi
\ifdefined\listtablename
  \renewcommand*\listtablename{List of Tables}
\else
  \newcommand\listtablename{List of Tables}
\fi
\ifdefined\figurename
  \renewcommand*\figurename{Figure}
\else
  \newcommand\figurename{Figure}
\fi
\ifdefined\tablename
  \renewcommand*\tablename{Table}
\else
  \newcommand\tablename{Table}
\fi
}
\@ifpackageloaded{float}{}{\usepackage{float}}
\floatstyle{ruled}
\@ifundefined{c@chapter}{\newfloat{codelisting}{h}{lop}}{\newfloat{codelisting}{h}{lop}[chapter]}
\floatname{codelisting}{Listing}
\newcommand*\listoflistings{\listof{codelisting}{List of Listings}}
\makeatother
\makeatletter
\makeatother
\makeatletter
\@ifpackageloaded{caption}{}{\usepackage{caption}}
\@ifpackageloaded{subcaption}{}{\usepackage{subcaption}}
\makeatother
\usepackage{bookmark}
\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
\urlstyle{same}
\hypersetup{
  pdftitle={Aligning Baryons},
  pdfauthor={Remco de Boer},
  colorlinks=true,
  linkcolor={blue},
  filecolor={Maroon},
  citecolor={Blue},
  urlcolor={Blue},
  pdfcreator={LaTeX via pandoc}}


\title{Aligning Baryons}
\usepackage{etoolbox}
\makeatletter
\providecommand{\subtitle}[1]{% add subtitle to \maketitle
  \apptocmd{\@title}{\par {\large #1 \par}}{}{}
}
\makeatother
\subtitle{High-performance computations with symbolic, spin-aligned
amplitude models for hadron spectroscopy}
\author{Remco de Boer}
\date{September 2025}
\begin{document}
\maketitle

\renewcommand*\contentsname{Table of contents}
{
\hypersetup{linkcolor=}
\setcounter{tocdepth}{2}
\tableofcontents
}

\bookmarksetup{startatroot}

\chapter*{Introduction}\label{introduction}
\addcontentsline{toc}{chapter}{Introduction}

\markboth{Introduction}{Introduction}

\pagenumbering{arabic}

At the smallest scales of nature, particle and nuclear physics seek to
unravel the fundamental constituents of matter and the forces that bind
them. From the structure of nuclei to the search for fundamental
particles, the field seeks a unified understanding of nature's building
blocks and their interactions. Particle physics in particular has long
captured the public imagination: colliding particles at the Large Hadron
Collider, the hunt for the Higgs boson, and the effort to bring the
fundamental interactions under one theoretical roof in the Standard
Model. This is the world of \textbf{high-energy physics}, where
theorists strip matter to its most elementary constituents and
experiments probe phenomena at ever smaller scales.

Alongside this pursuit lies a domain less widely known yet no less
fundamental. This is the world of \textbf{hadron physics}, which focuses
not on the most elementary particles, but on the hadronic states that
the strong force binds together. The subdiscipline of \textbf{hadron
spectroscopy} in particular classifies and analyses the discrete, stable
and unstable states produced by strong-force dynamics, much as atomic
spectra reflect underlying electron configurations. It is a study not of
ultimate building blocks, but of the intricate structures that emerge
from them.

Where high-energy physics often aims to reduce, hadron spectroscopy
seeks to classify, understand, and predict emergent structures in the
strongly interacting regime~{[}\citeproc{ref-Castellani:2000bk}{1};
\citeproc{ref-Harlander:2023kak}{2}{]}. The challenge here is different:
hadron physicists must grapple with the non-perturbative regime of
Quantum Chromodynamics~{[}\citeproc{ref-Capstick:2000dk}{3}{]}. At these
lower energies, the basic question of ``What states can exist?''
requires experimental guidance. Each newly observed state provides
additional information about the underlying binding mechanism and the
principles that govern the formation of hadrons. The discipline has
therefore historically always drawn on experimental data to spot
patterns, guide classification, and build effective models of strong
interactions. Among the methods developed for this task,
\textbf{amplitude analysis} serves to process experimental data,
untangling interfering contributions, and extract information about
short-lived hadronic states.

The distinction between high-energy physics and hadron physics is a
relatively modern development. Both disciplines trace their roots to
\textbf{nuclear physics}, which emerged in the early 20th century with
the discovery of the atomic nucleus, the exploration of radioactive
decays, and the first investigations into nuclear forces. Early
accelerators and detectors were originally built to probe the structure
of nuclei, but soon began uncovering phenomena that pointed beyond them
and resulted in the discovery of new particles and short-lived
resonances in scattering
experiments~{[}\citeproc{ref-Neeman:1986ixa}{4}{]}. As the energy reach
of experiments grew from the 1960s, research began to
diverge~{[}\citeproc{ref-Pickering:1984tk}{5}{]}. One line of inquiry
led toward ever higher energies and the search for more elementary
constituents. The other gave rise to hadron physics, which remained
focused on the emergent complexity of the strong interaction and the
spectrum of hadrons it produces~{[}\citeproc{ref-Schweber:1997hk}{6}{]}.
Both, however, ultimately study aspects of the same underlying theory
that manifests differently across energy scales.

Against this historical backdrop, the present thesis is situated within
hadron physics, and more specifically in the study of \textbf{baryon
spectroscopy}. Here, the spin degrees of freedom of fermions add a level
of complexity that makes theoretical modelling especially demanding.
Nucleon excitations in particular form a challenging but rich arena:
their spectrum is dense, resonances often overlap, and many predicted
states remain difficult to isolate experimentally. Addressing these
excitations requires both advanced parametrisations and computational
techniques capable of evaluating models across vast experimental data
samples.

The central motivation of this work is therefore the need for flexible,
transparent, and computationally efficient tools that can bridge the gap
between the intricate theoretical description of hadron physics and the
rapidly growing body of experimental data. Much of this description
rests on scattering theory and partial-wave expansions, which provide
the language in which amplitudes are modelled. At its core, this thesis
develops a framework that unites symbolic, computer-algebra--assisted
model building with array-based high-performance computing to produce a
transparent, extendable, and self-documenting workflow to address these
needs. The techniques are validated through two case studies~-- nucleon
excitations in charmonium decays and polarimetry in
{\(\varLambda_c\)~decays.}

Beyond computational efficiency, this work places strong emphasis on
\textbf{reproducibility}, both in methodology and in exposition. The
computational methodology evolved with an eye for transparency and
long-term maintainability, with lock files, documentation, and open code
to make analyses verifiable and extendable. Hadron spectroscopy sits at
the crossroads of many disciplines~-- experiment, theory, statistics,
and computing~-- and newcomers must master a wide range of skills that
are rarely spelled out in one place. For this reason, the first three
chapters provide an overview of the theoretical background that builds
up concepts gradually. For a more interlinked reading experience, the
thesis is also available in an online form at
\href{https://redeboer.github.io/phd-thesis}{redeboer.github.io/phd-thesis},
the source code of which can be easily reused and extended. The
underlying philosophy is simple: in hadron spectroscopy, with its many
intersecting disciplines, both theory and code should strive for
reproducibility, clarity, and accessibility.

The remainder of the thesis is organised to first establish the physics
background and then develop and apply this methodological framework. The
first three chapters set the stage by introducing hadron spectroscopy
with emphasis on symmetries, quantum numbers, and nucleon excitations,
and by developing the theoretical framework of amplitude analysis. These
chapters are not meant as original contributions but as a structured
overview of the relevant physics background, presented with an emphasis
on clarity and gradual build-up of concepts.
{Chapters~}\ref{sec-computational-techniques} and~\ref{sec-compwa}
present the methodological contribution of this work, namely new
computational techniques based on symbolic representations and
high-performance computational implementations. Finally,
Chapters~\ref{sec-experiment} and~\ref{sec-application-to-data} turn to
the experimental situation and demonstrate the methods with real data
from the BESIII and LHCb experiments. The closing chapter offers a
summary and points to future developments, notably the implementation of
more advanced amplitude-model parametrisations using symbolic
expressions and the exploration of new optimisation techniques that
array computing makes feasible.

\bookmarksetup{startatroot}

\chapter{Hadron physics}\label{sec-hadron-physics}

\KOMAoptions{open=right}
\rehead{\bfseries Chapter~\leftmark}
\lohead{\S~\rightmark}

The origins of hadron physics lie in the same early 20th-century efforts
that shaped nuclear and high-energy physics. Following the discovery of
the electron in 1897, Rutherford's scattering experiments between 1906
and 1913 revealed a dense atomic nucleus by scattering helium nuclei
{(\(\alpha\)~particles)} on a metal
foil~{[}\citeproc{ref-Rutherford:1911zz}{7}{]}, which he later showed in
1919 as containing \textbf{protons}~{[}\citeproc{ref-FRS:1919nrm}{8}{]}.
The experiments mark the beginning of particle scattering, where
distributions are used as a quantitative measure to extract information
about the microscopic scale (Figure~\ref{fig-rutherford-scattering}),
and opened the door to formulating the problem in terms of probabilities
rather than classical trajectories
(Chapter~\ref{sec-scattering-theory}).

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/rutherford-scattering.pdf}}

}

\caption{\label{fig-rutherford-scattering}Sketch of Rutherford's
scattering experiments, in which {\(\alpha\)~particles} from a
radioactive source on the left were deflected by the nuclei in the gold
{foil~(\(\text{Au}\)).} Deflected particles hit a fluorescent screen
around it and some are deflected at large angles.}

\end{figure}%

By itself, however, the proton could not account for the differing
masses of isotopes, which called for a neutral counterpart to the
proton~{[}\citeproc{ref-Rutherford:1920-BakerianLectureNuclear}{9}{]}.
The puzzle was resolved in 1932, when James Chadwick proved the
existence of a
\textbf{neutron}~{[}\citeproc{ref-Chadwick:1932ma}{10}{]}, a particle
with similar properties to that of the protons, but without charge and
with a slightly larger mass. The nature of the force responsible for
holding protons and neutrons~-- collectively known as
\textbf{nucleons}~-- together within the atomic nucleus remained
unresolved. This nuclear force had to be strong enough to overcome the
electrostatic repulsion between positively charged protons, yet
short-ranged enough to prevent nuclei from growing indefinitely large.

\section{Symmetries and quantum numbers}\label{sec-quantum-numbers}

At the same time, quantum theory had revealed that particles such as the
proton, neutron, and electron possess an intrinsic form of angular
momentum known as \textbf{spin}. The idea was introduced to explain a
puzzling feature in atomic spectra: certain spectral lines appeared to
be subtly split. In 1925, Uhlenbeck and Goudsmit proposed that electrons
carry an internal twist or spin (``Eigenrotation'') that interacts with
the magnetic field generated by their motion around the nucleus,
producing this fine-structure
splitting~{[}\citeproc{ref-Uhlenbeck:1925pqz}{11}{]}. This new degree of
freedom was later formalised within quantum mechanics as an intrinsic
angular momentum, the operator of which is denoted by \(\mathbf{S}\),
which couples to the orbital angular momentum~\(\mathbf{L}\) of the
particle's motion to form the total angular momentum
\(\mathbf{J} = \mathbf{L} + \mathbf{S}\) (see
Section~\ref{sec-spin-coupling}). This relation is known as
\textbf{angular-momentum addition}, and it reflects the underlying
symmetry group \(\mathrm{SU}(2)\), the special unitary group of
\(2\times 2\) matrices,

\begin{equation}\phantomsection\label{eq-su2-group}{
\mathrm{SU}(2) = \left\{\,\mathbfit{U} \in \operatorname{Mat}_{2\times 2}(\mathbb{C}) \;\middle|\; \mathbfit{U}^\dagger \mathbfit{U} = \mathbf{1},\; \det \mathbfit{U} = 1 \,\right\}
\,,
}\end{equation}

\noindent whose algebra enforces that angular momenta can take only
discrete total values \(s=0,\tfrac{1}{2},1,\dots\) and discrete
projections \(-s,-s+1,\dots,+s\) along a chosen quantisation axis. For a
{spin‑\(\tfrac{1}{2}\)} particle such as the electron, this means only
two possible outcomes, conventionally called ``up'' and ``down''.

The quantisation of spin not only fixes the projections of individual
particles, but also dictates how systems of identical particles behave
collectively. Particles with half-integer spin, such as electrons and
nucleons, obey the Pauli exclusion
principle~{[}\citeproc{ref-Pauli:1925nmn}{12}{]}, which forbids two
identical particles from occupying the same quantum state. These
particles are known as \textbf{fermions}, since their wave functions are
antisymmetric (``flip sign'') under exchange and follow Fermi--Dirac
statistics~{[}\citeproc{ref-Fermi:1926-Quantelung}{13};
\citeproc{ref-Dirac:1926jz}{14}{]}. In contrast, particles with integer
spin are called \textbf{bosons} and follow Bose--Einstein
statistics~{[}\citeproc{ref-Bose:1924mk}{15}{]}, which allow any number
of identical particles to share the same state. This distinction also
determines which types of particles can mediate forces: bosons can be
exchanged between fermions, as they are unrestricted by exclusion.

Since the photon that mediates the electromagnetic force was already
known to obey Bose--Einstein statistics, it was natural to expect that
the nuclear force would be carried by a boson as well. In 1935, Yukawa
proposed a new particle~-- the \textbf{meson}~-- to transmit the
interaction between nucleons, ``just as the electromagnetic field is
accompanied by the photon''~{[}\citeproc{ref-Yukawa:1935xg}{16}{]}. To
account for the short range of the nuclear force, he argued that the
mediator must be far heavier than the electron, since light particles
give rise to long-range forces, but lighter than the proton so that it
could still be produced in nuclear processes. He therefore predicted a
mass between that of the electron and proton~-- hence, ``meson''~--
which would yield a range comparable to the size of the nucleus.

As Yukawa anticipated, cosmic rays soon offered a glimpse of this new
particle. In 1937, Anderson and Neddermeyer observed a charged particle
that behaved like a heavy
electron~{[}\citeproc{ref-Neddermeyer:1937md}{17};
\citeproc{ref-Street:1937me}{18}{]}
(``mesotron''~{[}\citeproc{ref-Anderson:1938-Mesotron}{19}{]}). It was
mistaken for Yukawa's meson, as it lay in the predicted mass range, and
it took another ten years before it was shown that this mesotron did not
interact strongly with the
nucleus~{[}\citeproc{ref-Fermi:1947zza}{20}{]}. Rather, the mesotron was
a secondary decay product~{[}\citeproc{ref-Lattes:1947mw}{21}{]}~-- a
{``\(\mu\)‑meson''~{[}\citeproc{ref-Lattes:1947mx}{22}{]},} or
\textbf{muon}~-- of a primary particle~-- a {``\(\pi\)''‑meson,} or
\textbf{pion}~-- which did interact through nuclear scattering and
absorption. Like the electron, the muon followed Fermi--Dirac statistics
and interacted electromagnetically, and was therefore put under a new
category of
\textbf{leptons}~{[}\citeproc{ref-Rosenfeld:1948-NuclearForces}{23,
p.~VIII}{]}.

What made these pions interact with nucleons? Already in
1932~{[}\citeproc{ref-Heisenberg:1932-uxdcberAtomkerne1}{24}{]},
Heisenberg had introduced the idea of a new spin-like quantum
{number~\(\rho\)}~-- later dubbed \textbf{isotopic spin}, or
\textbf{isospin}~{[}\citeproc{ref-Wigner:1936dx}{25}{]}~-- to explain
why protons and neutrons interacted so similarly via the strong
force~{[}\citeproc{ref-Rasche:1971-Isospin}{26}{]}. The two were seen as
a ``doublet'' representation of a single nucleon state that are
distinguished by a degree of freedom (isospin), much like up and down
spin states of the electron. Yukawa's meson field naturally fit into
this symmetry scheme as a force mediator with \emph{integral} isospin,
so that a nucleon flips its isospin by emitting a
pion~{[}\citeproc{ref-Kemmer:1938tur}{27}{]}. Extending the concept of
isospin to force mediators even led to the prediction of a neutral pion
state to complete the ``triplet'' of integral isospin
states~{[}\citeproc{ref-Frohlich:1938-NuclearForces}{28}{]}, which was
discovered soon after the charged
pions~{[}\citeproc{ref-Bjorklund:1950zz}{29}{]}.

At this stage, symmetry principles and quantum numbers had become an
important tool for classifying the proliferating array of new particles.
As detection methods improved, especially with accelerators in the
1950s, a growing number of short-lived particles were discovered (see
Table~\ref{tbl-particle-zoo}). To bring order to this chaos, physicists
grouped the heavier, strongly interacting particles~-- including the
proton and neutron~-- under the common label
\textbf{baryons}~{[}\citeproc{ref-Pais:1953jsv}{30}{]}, distinguishing
them from the lighter mesons. Some, however, like {``\(K\)~mesons''}
(\textbf{kaons}) and {``\(V\)~particles''}
(\textbf{hyperons}~{[}\citeproc{ref-Cronin:2011zz}{31}{]}), displayed
unexpectedly long lifetimes or unusual decay patterns. These new states
didn't fit into existing categories and formed a bewildering ``particle
zoo''.


\begin{longtable}[]{@{}
  >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.0976}}
  >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2927}}
  >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3415}}
  >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2683}}@{}}

\caption{\label{tbl-particle-zoo}Overview of the main findings of
hadrons and other related particles that eventually led to the
categorisation scheme for this ``particle zoo''. The discovery years are
not to be taken as absolute: often, first findings were mere indications
that were confirmed a few years
later~{[}\citeproc{ref-Ezhela:1996xi}{46}{]}. }

\tabularnewline

\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Particle
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Discovered
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Predicted
\end{minipage} \\
\midrule\noalign{}
\endhead
\bottomrule\noalign{}
\endlastfoot
\(e^-\) & electron &
1897~{[}\citeproc{ref-Thomson:1897cm}{32}{]}
& \\
\(p\) & proton &
1919~{[}\citeproc{ref-FRS:1919nrm}{8}{]}
& \\
\(n\) & neutron &
1932~{[}\citeproc{ref-Chadwick:1932ma}{10}{]}
&
1920~{[}\citeproc{ref-Rutherford:1920-BakerianLectureNuclear}{9}{]} \\
\(e^+\) & positron &
1932~{[}\citeproc{ref-Anderson:1933mb}{33}{]}
&
1931~{[}\citeproc{ref-Dirac:1931kp}{34}{]} \\
\(\mu^-\) & muon &
1936--1937~{[}\citeproc{ref-Anderson:1936zz}{35};\citeproc{ref-Street:1937me}{18}{]}
& \\
\(\pi^\pm\) & charged pion &
1947~{[}\citeproc{ref-Lattes:1947mw}{21}{]}
&
1935~{[}\citeproc{ref-Yukawa:1935xg}{16}{]} \\
\(\pi^0\) & neutral pion &
1950~{[}\citeproc{ref-Bjorklund:1950zz}{29}{]}
&
1938~{[}\citeproc{ref-Frohlich:1938-NuclearForces}{28}{]} \\
\(K^\pm\) & charged kaon &
1947~{[}\citeproc{ref-Rochester:1947mi}{36}{]}
& \\
\(K^0\) & neutral kaon &
1949~{[}\citeproc{ref-Brown:1949mj}{37}{]}
& \\
\(\varLambda\) & Lambda &
1950~{[}\citeproc{ref-Fowler:1953qpk}{38}{]}
& \\
\(\varXi\) & Xi or ``cascade'' &
1952~{[}\citeproc{ref-Armenteros:1952-XiMinus}{39};\citeproc{ref-Cowan:1954zz}{40}{]}
& \\
\(\varSigma^\pm\) & Sigma &
1953~{[}\citeproc{ref-Bonetti:1953-SigmaHyperon}{41}{]}
& \\
\(\eta\) & eta &
1961~{[}\citeproc{ref-Pevsner:1961pa}{42}{]}
&
1959~{[}\citeproc{ref-Ikeda:1959zz}{43}{]} \\
\(\varOmega\) & Omega &
1964~{[}\citeproc{ref-Barnes:1964pd}{44}{]}
&
1961~{[}\citeproc{ref-Gell-Mann:1961omu}{45}{]} \\

\end{longtable}

The proliferation of strongly interacting particles made it clear that
existing categories were no longer sufficient. Rather than postulate
entirely new constituents, physicists sought regularities in how these
particles could be grouped and
compared~{[}\citeproc{ref-Kragh:1999eb}{47}{]}. Quantum numbers~--
discrete labels associated with conserved quantities~-- emerged as the
guiding principle for this approach. The earlier concept of isospin,
which had already unified protons, neutrons, and pions into symmetrical
multiplets under an {\(\mathrm{SU}(2)\)~structure,} provided a
blueprint: perhaps other groupings could be understood in the same way.

Yet some of the newly discovered states, such as kaons and hyperons,
exhibited unusual behaviour. For example, while the
{\(\varLambda\)~hyperon} was produced abundantly in cosmic rays and
collisions, its dominant decay \(\varLambda \;\to\; p\,\pi^-\) would
violate isospin conservation if it proceeded through the strong force.
Instead, the decay occurred only via the weak interaction, giving the
{\(\varLambda\)~hyperon} its unusually long lifetime for a hadron. To
account for such anomalies, a new additive quantum number~--
\textbf{strangeness}~-- was
proposed~{[}\citeproc{ref-Gell-Mann:1953hzm}{48}{]}. Conserved in strong
interactions but violated in weak decays, it explained why these
particles were readily produced but decayed slowly, and allowed them to
be systematically included in extended symmetry
schemes~{[}\citeproc{ref-Gell-Mann:1956iqa}{49};
\citeproc{ref-Nishijima:1955gxk}{50}{]}.

As the study of neutral mesons and vector mesons advanced in the 1950s,
physicists realised that the concept of charge conjugation~-- exchanging
particles with their antiparticles~-- could be used to classify states
that are their own antiparticles (self-conjugate). This led to the
definition of
{\textbf{\(C\)‑parity}~{[}\citeproc{ref-Gell-Mann:1955ipe}{51}{]},} a
quantum number that tells whether the wave function of a self-conjugate
particle changes sign under this operation. Alongside charge
conjugation, {\textbf{parity}~(\(P\))} described how a particle's wave
function transforms under spatial inversion \(\vec{x} \to -\vec{x}\). To
extend similar symmetry constraints to charged members of isospin
multiplets, for which {\emph{\(C\)‑parity}} cannot be defined,
physicists introduced
{\textbf{\(G\)‑parity}~{[}\citeproc{ref-Lee:1956sw}{52}{]},} defined as
\(G=Ce^{i\pi I_2}\). The prediction and discovery of the
{\(\eta\)~meson} in 1961~{[}\citeproc{ref-Gell-Mann:1961omu}{45};
\citeproc{ref-Pevsner:1961pa}{42}{]} provided another example of a
neutral meson whose decays could be constrained by these discrete
symmetries. Together with total spin~\(J\), isospin~\(I\), and
strangeness, these quantum numbers formed a powerful labelling scheme.
It was in this context that the collective term \textbf{hadron} was
coined~{[}\citeproc{ref-Okun:1962kca}{53}{]}, denoting all particles
that participate in strong interactions, in contrast to leptons and
gauge bosons.

Although originally introduced case by case to solve specific
experimental puzzles, we today understand these quantum numbers as
manifestations of underlying symmetry principles, with conservation laws
arising from those symmetries. Some, like electric charge or baryon
number, are \emph{additive} because they derive from continuous internal
symmetries (such as a phase rotation, forming the group
\(\mathrm{U}(1)=\left\{e^{i\phi}\mid\phi\in\mathbb{R}\right\}\)), so the
total value is obtained by simple summation over constituents. Additive
quantum numbers also include strangeness and the separate lepton numbers
that apply to each lepton type {(\(e,\mu,\tau\)).} Others, like the
parity operations, are \emph{multiplicative}, because they reflect
discrete symmetries such as spatial inversion or particle--antiparticle
exchange; in these cases the wave function is either
{preserved~(\(+1\))} or changes {sign~(\(-1\)).} For orbital motion,
parity includes an additional factor \(\times(-1)^L\) with orbital
angular {momentum~\(L\).} Finally, spin and isospin follow the rules of
{\emph{\(\mathrm{SU}(2)\)~addition},} reflecting the non-Abelian
continuous algebra of rotations, where their conservation takes the form
of angular-momentum coupling. Hadrons are not labelled by the intrinsic
spin~\(s\) of their constituents, but by the total angular
{momentum~\(J\),} obtained through angular-momentum addition. Together,
the {labels~\(J\)} for total angular momentum and \(I, I_3\) for isospin
and its projection form the basis of the hadron classification scheme,
where states are organised by combinations such {as~\(J^{PC}(I^G)\).}
These categories are summarised in Table~\ref{tbl-conservation-laws}.


\begin{longtable}[]{@{}
  >{\raggedright\arraybackslash}p{(\linewidth - 10\tabcolsep) * \real{0.2762}}
  >{\centering\arraybackslash}p{(\linewidth - 10\tabcolsep) * \real{0.1333}}
  >{\centering\arraybackslash}p{(\linewidth - 10\tabcolsep) * \real{0.0762}}
  >{\centering\arraybackslash}p{(\linewidth - 10\tabcolsep) * \real{0.0762}}
  >{\centering\arraybackslash}p{(\linewidth - 10\tabcolsep) * \real{0.0762}}
  >{\raggedright\arraybackslash}p{(\linewidth - 10\tabcolsep) * \real{0.3619}}@{}}

\caption{\label{tbl-conservation-laws}Overview of the main quantum
numbers and their conservation laws for the strong force,
electromagnetic (EM) force, and weak force.}

\tabularnewline

\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
Quantum~number
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Symbol
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Strong
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
EM
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Weak
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Conservation rule
\end{minipage} \\
\midrule\noalign{}
\endhead
\bottomrule\noalign{}
\endlastfoot
Electric~charge & \(Q\) & ✅ & ✅ & ✅ & Additive \\
Spin & \(J\) & ✅ & ✅ & ✅ & \(\mathrm{SU}(2)\) addition \\
Baryon~number & & ✅ & ✅ & ✅ &
Additive~{[}\citeproc{ref-Stueckelberg:1938zz}{54}{]} \\
Lepton~number & & ✅ & ✅ & ✅ & Additive \\
Strangeness & & ✅ & ✅ & ❌ & Additive \\
Parity & \(P\) & ✅ & ✅ & ❌ & Multiplicative \(\times(-1)^L\) \\
\(C\)‑parity & \(C\) & ✅ & ✅ & ❌ & Multiplicative \\
\(G\)‑parity & \(G\) & ✅ & ❌ & ❌ & Multiplicative \\
Isospin & \((I, I_3)\) & ✅ & ❌ & ❌ & \(\mathrm{SU}(2)\) addition \\

\end{longtable}

\section{The Eightfold Way and the quark model}\label{sec-eightfold-way}

As more hadrons were discovered, their regularities pointed toward an
even deeper symmetry, what we now call \textbf{flavour} symmetry. In the
early 1960s, Gell-Mann and Ne'eman independently proposed the Eightfold
Way~{[}\citeproc{ref-Gell-Mann:1961omu}{45};
\citeproc{ref-Neeman:1961jhl}{55};
\citeproc{ref-Gell-Mann:1962yej}{56}{]}, a classification scheme based
on \(\mathrm{SU}(3)\) group symmetry. Isospin formed an
\(\mathrm{SU}(2)\) subgroup, as expressed in
Equation~\eqref{eq-su2-group}, and the inclusion of strangeness called
for an extension of that symmetry. Hadrons were organised into
\textbf{multiplets}, sets of states related by the symmetry, much as
angular-momentum coupling produces families of states in atomic physics.
The structure of these multiplets is conveniently displayed in weight
diagrams that plot the states according to their strangeness~\(S\) and
isospin projection \(I_3\) (Figure~\ref{fig-eightfold-way-mesons} for
mesons and Figure~\ref{fig-eightfold-way-baryons} for baryons). When
\(S\) and \(I_3\) are on the vertical and horizontal axes, the electric
charge~\(Q\) runs diagonally across the diagram, as it is related to
\(S\), \(I_3\), and baryon number~\(B\) via the Gell-Mann--Nishijima
relation,

\[Q = I_3 + \tfrac{1}{2}(B+S)
\,.
\]

\noindent Within each multiplet, states are distinguished by their total
spin and parity, which result from coupling intrinsic spin to orbital
angular momentum~\(L\). The clearest patterns arise for the
\textbf{ground states} with \(L=0\). These give the \(J^P=0^-\)
\textbf{pseudoscalar mesons} (e.g.~pions and kaons) and the \(J^P=1^-\)
\textbf{vector mesons} (e.g.~\(\rho\) {and~\(K^*\)).} Higher orbital
excitations generate further families such as the
{\textbf{scalar}~(\(0^+\)),} {\textbf{axial-vector}~(\(1^+\)),} and
{\textbf{tensor}~(\(2^+\))} mesons, but these have larger masses and
tend to mix more strongly.

For mesons, the most characteristic pattern is the \textbf{octet}: eight
states arranged in a hexagonal weight diagram with neutral members in
the centre. An additional singlet accompanies the octet, so the observed
spectrum forms a \textbf{nonet} of nine states. This is why the diagrams
in Figure~\ref{fig-eightfold-way-mesons} show three neutral entries in
the centre: one belongs to the octet, the other to the singlet, and
together they mix to form the observed \(\eta\)--\(\eta'\) and
\(\omega\)--\(\phi\) pairs. In the pseudoscalar case, the
{\(\eta'\)~meson} is sometimes omitted from the nonet diagram, since it
is predominantly a singlet state and its mass lies far above that of its
octet companions. For vector mesons, the octet and singlet mix better,
producing the physical \(\omega\) and \(\phi\) alongside the \(\rho\)
and \(K^*\).

\begin{figure}

\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/eightfold-way-pseudoscalar-mesons.pdf}}

\subcaption{\label{}Pseudoscalar-meson nonet (\(J^P=0^-\))}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/eightfold-way-vector-mesons.pdf}}

\subcaption{\label{}Vector-meson nonet (\(J^P=1^-\))}
\end{minipage}%

\caption{\label{fig-eightfold-way-mesons}Multiplets of the ground-state
mesons visualised as weight diagrams.}

\end{figure}%

In the baryon sector, shown in Figure~\ref{fig-eightfold-way-baryons},
the pattern differs. The {spin‑\(\tfrac{1}{2}\)} baryons (nucleon,
\(\varLambda\), \(\varSigma\), {and~\(\varXi\))} form an octet, while
the {spin‑\(\tfrac{3}{2}\)} states {(\(\varDelta\),} \(\varSigma^*\),
\(\varXi^*\), {and~\(\varOmega^-\))} arrange into a \textbf{decuplet}. A
spectacular confirmation of this scheme came in 1964 with the discovery
of the {\(\varOmega^-\)~{[}\citeproc{ref-Barnes:1964pd}{44}{]},} the
predicted missing member of the decuplet, whose mass and decay
properties matched the expectations of the Eightfold Way with remarkable
precision.

\begin{figure}

\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/eightfold-way-baryons-spin-half.pdf}}

\subcaption{\label{}Baryon spin‑\(\frac{1}{2}\) octet}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/eightfold-way-baryons-spin-three-half.pdf}}

\subcaption{\label{}Baryon spin‑\(\frac{3}{2}\) decuplet}
\end{minipage}%

\caption{\label{fig-eightfold-way-baryons}Multiplets of the ground-state
baryons visualised as weight diagrams.}

\end{figure}%

Out of this symmetry-based classification emerged a new idea: that
hadrons were not fundamental, but composite particles made of simpler
constituents. These hypothetical building blocks~-- eventually named
\textbf{quarks}~-- were proposed independently by
Gell-Mann~{[}\citeproc{ref-Gell-Mann:1964ewy}{57}{]} and
Zweig~{[}\citeproc{ref-Zweig:1964ruk}{58}{]} in the mid-1960s. The
Eightfold Way's multiplet structure hinted at an underlying triplet,
leading to the postulation of three quark types (flavours): \textbf{up},
\textbf{down}, and \textbf{strange}. These carry fractional electric
charges {(\({+}\tfrac{2}{3}\)~or} \({-}\tfrac{1}{3}\) of the electron
charge) and transform according to the fundamental representation of
\(\mathrm{SU}(3)\). Because no free particles with such fractional
charges were known, Gell-Mann described quarks as ``mathematical''
entities~-- permanently confined and not observable in isolation~--
whereas Zweig's ``aces'' were presented more straightforwardly as
physical constituents~{[}\citeproc{ref-Gell-Mann:1994aya}{59};
\citeproc{ref-Riordan:1987gw}{60}{]}. The \(\mathrm{SU}(2)\) isospin
subgroup now reflects the relative numbers of up and down quarks: its
projection \(I_3\) equals half the difference between the number of up
and down quarks, while the total isospin \(I\) determines the multiplet
the hadron belongs to.

As experiments ran into other anomalies and puzzling behaviour of the
weak interaction, theorists soon realised that a fourth quark,
\textbf{charm}, was needed to complete the picture, extending the
flavour symmetry to an approximate {\(\mathrm{SU}(4)\)~symmetry} (see
Figure~\ref{fig-su4-multiplets}) and explaining the absence of certain
flavour-changing neutral currents~{[}\citeproc{ref-Bjorken:1964gz}{61};
\citeproc{ref-Glashow:1970gm}{62}{]}. Initially conceived as a
mathematical tool to encode symmetry
patterns~{[}\citeproc{ref-Gell-Mann:1964hhf}{63, p.~73}{]}, the quark
model soon began to be taken more seriously as a physical picture of
hadrons, especially after deep inelastic scattering experiments at SLAC
revealed evidence of point-like constituents inside the
proton~{[}\citeproc{ref-Bloom:1969kc}{64};
\citeproc{ref-Breidenbach:1969kd}{65}{]}.

\begin{figure}

\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/multiplet-meson-pseudoscalar.pdf}}

\subcaption{\label{}Pseudoscalar mesons (16-plet)}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/multiplet-baryon-spin-half.pdf}}

\subcaption{\label{}Spin-half baryons (20-plet)}
\end{minipage}%

\caption{\label{fig-su4-multiplets}Extension of the baryon multiplet
weight diagrams of Figure~\ref{fig-eightfold-way-baryons} to an
approximate {\(\mathrm{SU}(4)\)~symmetry} to include the quantum number
``charm'' in the vertical direction. Adapted from
{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, §15}{]}. }

\end{figure}%

A theoretical foundation for the strong interaction arrived only later,
with the development of \textbf{Quantum Chromodynamics (QCD)} in the
early 1970s~{[}\citeproc{ref-Fritzsch:1975sr}{67}{]}. While the
Eightfold Way was based on a \emph{global} \(\mathrm{SU}(3)\) flavour
symmetry, QCD introduced a fundamentally different structure: a
\emph{local} \(\mathrm{SU}(3)\) gauge symmetry. This symmetry, acting in
an internal space later dubbed
\textbf{colour}~{[}\citeproc{ref-Greenberg:1964pe}{68};
\citeproc{ref-Fritzsch:1972jv}{69}{]}, governs the interactions between
quarks and massless vector bosons known as
\textbf{gluons}~{[}\citeproc{ref-Fritzsch:1973pi}{70}{]}. Unlike flavour
symmetry, which described patterns among hadrons, this local gauge
symmetry dictated the dynamics of the strong force at a fundamental
level. At the time, however, it was unclear whether such a theory could
be consistent: local gauge theories were thought to become
uncontrollably strong at high energies, making calculations divergent
and predictions unreliable. A turning point came in 1973 with the
discovery of \textbf{asymptotic freedom} by Gross, Wilczek, and
Politzer~{[}\citeproc{ref-Politzer:1973fx}{71};
\citeproc{ref-Gross:1973id}{72}{]}. They realised that, in non-Abelian
gauge theories like QCD, the coupling strength \emph{decreases} at high
energies, allowing for meaningful, perturbative calculations. This
behaviour is illustrated in Figure~\ref{fig-qcd-coupling-strength},
which shows experimental measurements of the coupling
strength~\(\alpha_s\) at different energy scales~\(Q\). The measurements
confirm the predictions of QCD: \(\alpha_s\) is large at low energies
(large distances), but decreases asymptotically with increasing~\(Q\)
(smaller distances).

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/qcd-running-constant.pdf}}}

}

\caption{\label{fig-qcd-coupling-strength}QCD coupling strength
\(\alpha_s\) as a function of energy scale \(Q\) with the current
average of \(\alpha_s(m_Z^2)\) from the Review of Particle Physics of
2023 as input. Coloured points show the calculated values based on NNLO
QCD with experimental input. Adapted from
{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, Fig.~9.5}{]}. }

\end{figure}%

This breakthrough explained why quarks, though nearly free in
high-energy collisions, can never be observed in isolation. Their new
quantum number of \textbf{colour charge}~-- coming in three types (red,
green, blue) and governed by a local {\(\mathrm{SU}(3)\)~symmetry}~--
implies that only \emph{colourless} combinations can exist as physical
states. This resolves puzzles such as the {spin‑\(\tfrac{3}{2}\)}
baryons like \(\varOmega^-=\ket{s\!\uparrow s\!\uparrow s\!\uparrow}\)
and \(\varDelta^{++}=\ket{u\!\uparrow u\!\uparrow u\!\uparrow}\), which
would violate the Pauli exclusion principle if quarks carried only
flavour and spin. QCD thus predicts a dual behaviour: quarks interact
almost as free particles at short distances (asymptotic freedom), but
are inseparably bound at long distances, giving rise to
\textbf{confinement}. The observable spectrum consists solely of
colour-singlet states: three quarks of different colours form a baryon,
while a quark--antiquark pair forms a meson (see
Figure~\ref{fig-quark-model}).

Once such colour-neutral combinations are admitted, the familiar
multiplet structure of the Eightfold Way naturally emerges. Quarks
transform in the fundamental representation of flavour
\(\mathrm{SU}(3)\), denoted as a \textbf{colour triplet}~\(\mathbf{3}\).
Tensor products of these triplets decompose into irreducible multiplets,
reproducing the observed hadron patterns. In particular, mesons arise
from
\(\mathbf{3}\otimes\overline{\mathbf{3}}=\mathbf{8}\oplus\mathbf{1}\)
(Figure~\ref{fig-eightfold-way-mesons}), while baryons follow from
\(\mathbf{3}\otimes\mathbf{3}\otimes\mathbf{3}=\mathbf{10}\oplus\mathbf{8}\oplus\mathbf{8}\oplus\mathbf{1}\)
(Figure~\ref{fig-eightfold-way-baryons}).

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/quark-model.pdf}}}

}

\caption{\label{fig-quark-model}Artistic representation of how quarks
and gluons combine to form different types of hadrons. Adapted
from~{[}\citeproc{ref-Wollenberg:2024}{73}{]}.}

\end{figure}%

Gell-Mann also predicted other colourless combinations, such as
\textbf{tetraquarks} (two quarks and two antiquarks) and
\textbf{pentaquarks} (four quarks and one antiquark). In recent decades,
other exotic configurations have been discussed, including
\textbf{glueballs} (bound states consisting of gluons only),
\textbf{hybrids} (quark--antiquark pairs with gluonic excitations), and
\textbf{hadronic molecules} (loosely bound states of mesons and
baryons). Unlike photons in QED, gluons themselves carry colour charge
and can interact with each other, which causes the QCD coupling to grow
stronger as the energy decreases. This strong coupling makes quarks and
gluons inseparable, but marks the \textbf{non-perturbative regime} at
low energies, where symmetry principles, phenomenology, and experiment
are our only tools for mapping the rich spectrum of bound states
emerging from QCD.

Today, we know there are six quark flavours within three generations of
increasing masses: up and down, strange and charm, and bottom and top.
The lightest pair build stable protons and neutrons, while strange,
charm, and bottom quarks give rise to heavier, short-lived hadrons. By
contrast, the top quark is so massive and short-lived that it decays
before hadronising. Alongside three families of leptons (the electron,
muon, tau, and their neutrinos), the force carriers (photon, gluons,
\(W\) and \(Z\) bosons), and the Higgs boson, these quarks complete the
\textbf{Standard Model} (Figure~\ref{fig-standard-model}), our most
fundamental description of nature's building blocks. Yet in the strongly
interacting regime, where quarks remain confined, hadron physics
investigates the emergent spectrum of composite states, with the aim of
understanding the non-perturbative dynamics of QCD and uncovering
mechanisms beyond current models.

\begin{figure}[t!]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/standard-model.pdf}}

}

\caption{\label{fig-standard-model}The Standard Model of particle
physics, showing all known elementary particles and force mediators,
coloured by category and generation. The mass, intrinsic spin~\(s\), and
charge~\(Q\) of each particle is also indicated. The light-yellow
shading in the background indicates which force carriers interact with
which matter particle. Inspired by
{[}\citeproc{ref-WikimediaCommons:2025-StandardModel}{74}{]}.}

\end{figure}%

\section{Nucleon excitations}\label{sec-nucleon-excitations}

Having seen how quantum numbers and symmetries organise hadrons into
meson and baryon multiplets, it is natural to ask how these patterns
extend beyond the ground states. This question is particularly pressing
for nucleons, because they, unlike strange or charmed baryons, are built
solely from three light quarks of nearly equal mass. With no heavy
constituent to dominate the dynamics, the complex interplay of all three
quarks and of the gluons that bind them becomes fully exposed.
Historically, scattering experiments revealed an increasing number of
baryon resonances whose squared masses and spins follow an approximately
linear relationship. These patterns became known as \textbf{Regge
trajectories}~{[}\citeproc{ref-Chew:1962eu}{75}{]}. This invited the
question of how such excitations arise in the quark model. Just as atoms
have discrete excited states when their electrons occupy higher
orbitals, hadrons can exist in configurations where their constituent
quarks rearrange their relative motion and spin alignments. These radial
and orbital excitations manifest as heavier, unstable resonances that
populate the observed Regge
trajectories~{[}\citeproc{ref-Thiel:2022xtb}{76}{]}.

An example is shown in Figure~\ref{fig-nucleon-trajectories}, where
excitations of the nucleon, also called {\textbf{\(N^*\)~resonances},}
align along straight lines when plotted as their squared mass \(M^2\)
versus orbital angular momentum~\(L\). The left panel displays the
radial excitation spectrum of positive-parity nucleons, where successive
radial quantum numbers~\(n\) generate parallel trajectories. The right
panel uses a ``light-front holographic
classification''~{[}\citeproc{ref-Brodsky:2014yha}{77}{]}, where
grouping excitations by parity results in two nearly parallel
trajectories.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/nucleon-trajectories.pdf}}}

}

\caption{\label{fig-nucleon-trajectories}Regge trajectories of orbital
and radial nucleon excitations. Left: positive-parity nucleons plotted
along fixed radial quantum number~\(n\). Right: nucleons organised by
``light-front'' orbital angular momentum~\(\nu\), giving two
trajectories for positive-parity and negative-parity nucleons. The
indicated masses are the averages from the PDG of
2014~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}. Adapted
from~{[}\citeproc{ref-Brodsky:2014yha}{77, Fig.~5.5}{]}.}

\end{figure}%

\subsection{Non-relativistic quark
model}\label{non-relativistic-quark-model}

To classify these possible states, the idea of \(\mathrm{SU}(3)\)
flavour symmetry for light hadrons~-- which applies to hadrons composed
of up, down, and strange quarks~-- can be extended by including the spin
degrees of freedom, which are described by an \(\mathrm{SU}(2)\)
symmetry. In the \textbf{non-relativistic quark
model}~{[}\citeproc{ref-Isgur:1978xj}{78}{]}, this leads to an
approximate \(\mathrm{SU}(6)\) spin--flavour symmetry,

\begin{equation}\phantomsection\label{eq-su6-supergroup}{
\mathrm{SU}(6) \supset \mathrm{SU}(3)_\text{flavour} \times \mathrm{SU}(2)_\text{spin}
\,,
}\end{equation}

\noindent where each quark transforms as a 6-dimensional spin--flavour
multiplet. Light baryons are then described by the tensor product of
three such quark states:

\[\mathbf{6}\otimes\mathbf{6}\otimes\mathbf{6} =
\mathbf{56}_{\mathcal{S}} \oplus
\mathbf{70}_{\mathcal{M}} \oplus
\mathbf{70}_{\mathcal{M}} \oplus
\mathbf{20}_{\mathcal{A}}
\,.
\]

The subscript of each multiplet indicates whether its spin--flavour wave
function is {symmetric~(\(\mathcal{S}\)),}
{antisymmetric~(\(\mathcal{A}\)),} or
mixed-{symmetric~(\(\mathcal{M}\))} under exchange of any two quarks.
Because quarks are fermions, the Pauli exclusion principle requires the
total baryon wave function~\(\Psi_\text{total}\) to be antisymmetric. In
the non-relativistic quark model, this wave function factorises into
three parts~-- colour, spin--flavour, and orbital (spatial):

\[
\Psi_\text{total}=
\Psi_\text{colour} \times
\Psi_\text{spin–flavour} \times
\Psi_\text{space} \,.
\]

The colour part of a baryon is always totally antisymmetric, because
\(\Psi_\text{colour}=\epsilon_{abc}\,\ket{q_a q_b q_c}\), ensuring that
the state is colourless. It follows that the product of the
spin--flavour and space components must be symmetric. Hence, once the
symmetry of the spin--flavour part is specified (as indicated by the
subscripts), the orbital part is fixed to carry the complementary
symmetry required to maintain an overall symmetric product.

In particular, the symmetric {\(\mathbf{56}\)‑plet} must combine with a
symmetric orbital wave function, which means that all three quarks
occupy the lowest S-wave orbital (no orbital angular momentum). Indeed,
this {\(\mathbf{56}\)‑plet} contains the familiar ground-state baryons.
These are the spin-1/2 octet and spin-3/2 decuplet shown in
Figure~\ref{fig-eightfold-way-baryons} of the
\(\mathrm{SU}(3)_\text{flavour} \times \mathrm{SU}(2)_\text{spin}\)
subgroup of Equation~\eqref{eq-su6-supergroup}. By contrast, the two
{\(\mathbf{70}_{\mathcal{M}}\)~multiplets} have spin--flavour wave
functions that are mixed-symmetric under quark exchange. To maintain the
required total antisymmetry, the orbital part must then also be
mixed-symmetric, which naturally occurs when the three quarks are
excited into states with non-zero orbital angular momentum. For example,
a {P-wave~(\(L = 1\))} orbital configuration introduces mixed symmetry
into the spatial part, allowing these
{\(\mathbf{70}_{\mathcal{M}}\)~states} to describe many of the excited
baryons with negative parity for \(L = 1\). The
{\(\mathbf{20}_{\mathcal{A}}\)~multiplet} has a spin--flavour wave
function that is fully antisymmetric, so its orbital part must be fully
symmetric, like the \(\mathbf{56}\). However, because of its
antisymmetric spin--flavour structure, it does not appear in the
simplest non-relativistic quark model for ground-state baryons and is
regarded mainly as a theoretical curiosity, since no clear experimental
evidence exists for such states.

In addition to these orbital excitations, the quark model also predicts
\textbf{radial excitations}, where the quarks remain in the same
spin--flavour and orbital configuration, but their spatial wave function
acquires additional nodes, much like atomic orbitals. The Roper
{resonance~\(N(1440)\)} is a classic example, which was traditionally
interpreted as the first radial excitation of the nucleon within the
{\(\mathbf{56}_{\mathcal{S}}\)~multiplet.} Its structure, however, may
be more intricate: strong coupling to meson--baryon channels suggests
the presence of a surrounding meson cloud, which could also account for
its unexpectedly low mass~{[}\citeproc{ref-Krehl:1999km}{79}{]}. These
radial excitations add even more predicted nucleon states to the
spectrum, many of which have yet to be observed.

The non-relativistic quark model is just one of several frameworks used
to describe the nucleon excitation spectrum. Other approaches include
effective field theories, lattice QCD calculations, and light-front
holography~{[}\citeproc{ref-Burkert:2025coj}{80}{]}. These frameworks
aim to reproduce the masses of experimentally observed resonances, but
typically predict many more states than have been confirmed.
Figure~\ref{fig-nucleon-excitation-prediction-comparison} shows the
measured {\(N^*\)~spectrum} placed between two sets of predictions from
theoretical models. While the overall structure is reproduced, clear
mismatches remain. Some predicted states, such as the many excited
states predicted in the {\(\mathbf{70}_{\mathcal{M}}\)~sector,} have not
been observed in experiment, while some observed states cannot easily
explained by theory. This ``\textbf{missing resonance} puzzle''
underscores that the nucleon spectrum reflects dynamics beyond the
simplest constituent-quark picture and provides a testing ground for
non-perturbative QCD.

\begin{figure}[t!]

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/nucleon-excitation-spectrum.pdf}}}

}

\caption{\label{fig-nucleon-excitation-prediction-comparison}Comparison
between theoretical predictions and experimental data for the \(N^*\)
spectrum. In each {\(J^P\)~bar,} the left and right sides show
predictions from {[}\citeproc{ref-Loring:2001kx}{81}{]} and
{[}\citeproc{ref-Ronniger:2011td}{82}{]}, respectively. The middle
column shows mean experimental values Review of Particle Physics of
2010~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}. Adapted from
{[}\citeproc{ref-Thiel:2022xtb}{76, Fig.~2};
\citeproc{ref-Ronniger:2011td}{82, Fig.~3}{]}. }

\end{figure}%

\subsection{\texorpdfstring{$N^*$~}{𝑁* }resonances in scattering processes} \label{sec-nucleon-scattering}

Unlike strange or charmed baryons, where a heavier quark dominates the
system and helps simplify the dynamics, the nucleon consists solely of
up and down quarks with nearly identical masses (approximately
\(2.2\text{ MeV}\) and \(4.7\text{ MeV}\), respectively). This absence
of an internal mass hierarchy means that all three quarks must be
treated on equal footing, making the nucleon an ideal system for testing
how confinement and dynamical chiral symmetry breaking emerge from the
underlying quark--gluon
interactions~{[}\citeproc{ref-Isgur:2000ad}{83}{]}. As we saw in
Figure~\ref{fig-eightfold-way-baryons}, light baryons fall into
{spin‑\(\tfrac{1}{2}\)} or {spin‑\(\tfrac{3}{2}\)} multiplets.
Excitations of the latter are the {\textbf{\(\varDelta\)~resonances},}
while excitations of the former are the {\textbf{\(N\)~resonances}} or
\(N^*\)'s~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, §81}{]}, which
are the focus of this study.

Most \(N^*\)'s are unstable and have to be produced and observed
indirectly. Instead, they appear as intermediate states in reactions
where an incoming probe excites a nucleon target (usually a proton).
Historically, \textbf{pion--nucleon scattering} {(\(\pi N\))} in
fixed-target experiments provided the first systematic evidence for
nucleon excitations, starting in
1957~{[}\citeproc{ref-Thiel:2022xtb}{76}{]}. Examples are experiments at
the Los Alamos Meson Physics Facility (LAMPF), at Brookhaven National
Laboratory (BNL) with the Crystal Ball detector, and at the
Paul-Scherrer-Institute (PSI) in Switzerland. In these experiments, a
pion beam excites the nucleon to a \(\varDelta^*\) or {\(N^*\)~state,}
which then decays into final states such as \(\pi N\), \(\pi\pi N\), or
\(\eta N\). An advantage of pion--nucleon scattering is that the number
of contributing partial waves (the different angular-momentum components
in which the scattering process can be decomposed) remains relatively
limited, which makes it easier to extract resonance properties, although
this also restricts the range of excitations that are
produced~{[}\citeproc{ref-Thiel:2022xtb}{76}{]}.

Photo- and electro-production experiments such as the Crystal Barrel
detector at the CB‑ELSA experiment (Bonn), the A2~experiment with the
Crystal Ball detector at the Mainz Microtron (MAMI), and the CEBAF Large
Acceptance Spectrometer (CLAS) at Jefferson Laboratory (JLab) later
extended the range of possible analyses. \textbf{Photo-production
experiments} use a beam of real photons, while in
\textbf{electro-production experiments}, electrons are scattered off the
nucleon, producing virtual photons that excite the nucleon. These
experiments not only have a higher luminosity than pion beams, but also
allow for a wider energy range and more complex final states. This gives
access to higher-mass resonances and provides additional information
through polarisation observables. However, both photo- and
electro-production involve a more complex initial state than hadronic
scattering, giving rise to a much larger number of contributing partial
waves.

The dominant decay channel for both {\(N^*\)~(\(I=\tfrac{1}{2}\))} and
{\(\varDelta^*\)~(\(I=\tfrac{3}{2}\))} resonances is the single-pion
mode {(\(N\pi\)),} often accompanied by multi-pion
{decays~(\(N\pi\pi\)).} In addition, {\(N^*\)~states} can decay into
channels such as \(\eta N\)~-- which cannot couple to \(\varDelta^*\)
and thus serves as an isospin filter~-- or into kaon--hyperon final
states (e.g.~\(K\varLambda\), {\(K\varSigma\)).} Single-pion decays were
studied first and have the lowest energy threshold, giving access to
lower excitations. They are also the most straightforward to analyse, as
they involve only two particles in the final state and have limited
numbers of partial waves. Multi-pion decays, on the other hand, often
involve intermediate resonances like {the~\(\varDelta\).}

Since \(N^*\)'s are short-lived, they appear as broad resonances in the
invariant mass distribution of the final state particles. However, a
characteristic feature across all these reactions is the appearance of
sharp structures when new channels open. In
Figure~\ref{fig-nucleon-cross-section}, the total cross section for
\(\gamma N \to \eta N\), measured by the A2~experiment, shows resonance
peaks interrupted by sudden drops or kinks at the thresholds for
\(K\varSigma\), \(\omega N\), {and~\(\eta' N\).} These threshold effects
indicate that the reaction strength is redistributed once additional
final states become kinematically accessible.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/eta-production-cross-section.pdf}}}

}

\caption{\label{fig-nucleon-cross-section}Total cross section as a
function of center-of-mass energy~\(W\) in
\(\gamma N \to N^* \to \eta N\) reactions studied by the
A2~collaboration at MAMI, compared with EtaMAID predictions. Dips or
edges in the cross section reveal threshold openings into other
channels. Adapted from {[}\citeproc{ref-Tiator:2018heh}{84}{]}. }

\end{figure}%

To fully disentangle broad, overlapping {\(N^*\)~resonances,} modern
studies therefore rely on coupled-channel analyses, which combine data
from the different production mechanisms and from multiple final states
into a single, consistent parametrisation of the energy-dependent
dynamics. We discuss the techniques that these programmes employ in
Section~\ref{sec-reactance-matrix}. The most well-known research
programs are (in chronological order) the Scattering Analysis
Interactive Dial-in (\textbf{SAID}) of George Washing
University~{[}\citeproc{ref-Arndt:1985-SAID}{85};
\citeproc{ref-Arndt:1989ww}{86}{]}, the Kent State University
model~{[}\citeproc{ref-Manley:1984zs}{87}{]}, the Mainz Unitary Isobar
Model (\textbf{MAID})~{[}\citeproc{ref-Drechsel:1998hk}{88}{]}, the
\textbf{Bonn--Gatchina} model~{[}\citeproc{ref-Anisovich:2004zz}{89}{]},
the \textbf{Jülich--Bonn} and Jülich--Bonn--Washington
model~{[}\citeproc{ref-Doring:2009yv}{90};
\citeproc{ref-Mai:2021vsw}{91}{]}, and the \textbf{Laurent--Pietarinen}
formalism~{[}\citeproc{ref-Svarc:2013laa}{92}{]}. An example by
predictions of the MAID model for \(\eta\) and \(\eta'\)
photo-production (EtaMAID) is shown in
Figure~\ref{fig-nucleon-cross-section}.

The success of these models lies in their ability to describe the
growing body of experimental data. By fitting a wide range of reactions
simultaneously, they allow resonance signals to be disentangled from
background channels and from one another. The outcome is reflected in
Table~\ref{tbl-nucleon-resonances}, which shows the {\(N^*\)~excitation}
spectrum currently determined from partial-wave analyses of experimental
data. The table uses star ratings that indicate the degree of confidence
assigned by the Review of Particle
Physics~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}. As can be
seen from the colours that highlight newer findings since 2004, the
understanding of {\(N^*\)~excitations} in the higher mass range has
improved significantly. However, as discussed, not all states can be
explained well by theory, and many states that are predicted, have not
yet been observed.

\begin{table}

\caption{\label{tbl-nucleon-resonances}Overview of the known nucleon
resonances with their spin and parity \(J^P\), adapted
from~{[}\citeproc{ref-Burkert:2025coj}{80}{]}. Masses and total widths
are given in MeV. The right columns show the studied decay channels and
the stars indicate how certain the evidence is, with four stars
indicating that existence is certain. Black values come from the Review
of Particle Physics (RPP) of 2004, while blue values come from the
RPP~2022~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}. Newer
results are indicated in red. Yellow resonances have only been observed
in \(J/\psi\) or \(\psi(2S)\)
decays~{[}\citeproc{ref-BESIII:2012ssm}{93}{]}, although it appears that
\href{https://pdglive.lbl.gov/Particle.action?init=0&node=B159&home=BXXX005}{\(N(2040)\)}
has also been observed in
{\(\pi N\)~scattering~{[}\citeproc{ref-Hunt:2018wqz}{94}{]}.}}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter1/nucleon-resonance-table-burkert.pdf}}

}

\end{table}%

\subsection{\texorpdfstring{$N^*$~}{𝑁* }resonances in charmonium decays} \label{sec-nucleons-in-charmonium}

Scattering experiments have long been the main source of information
about nucleon excitations, but they are not the only way to study these
states. Some of the higher-mass excitations listed in
Table~\ref{tbl-nucleon-resonances} have also been observed in decays of
the {\textbf{\(J/\psi\)~meson}} and higher charmonium states at the
\hyperref[sec-besiii]{BESIII experiment}. \textbf{Charmonium} denotes
bound states of a charm quark and an anticharm {quark~(\(c\bar{c}\))}
and includes states like \(J/\psi\). In these decays, the charmonium
state produces an antinucleon and a nucleon, one of which can be an
excited state. The main disadvantage is that the recoiling antinucleon
limits the available phase space, and the multi-body final state can
cause interference between different subsystems of completely different
hadronic states. However, these decays have clear advantages: the
\(J/\psi\) meson provides a precisely known production energy and
well-defined initial quantum numbers, which reduces the number of
partial waves and polarisation observables. Moreover,
{\(\varDelta\)~resonances} are heavily suppressed: because the
\(J/\psi\) meson carries no isospin, the \(\bar{N} N^*\) pair must
couple to \(I=0\), which excludes {\(\varDelta^*\)~states}
{(\(I=\tfrac{3}{2}\)).} {\(J/\psi\)~decays} therefore provide a clean
isospin filter that isolates {\(N^*\)~resonances} without contamination
{from~\(\varDelta\)'s.}

So far, the BESIII collaboration has performed only a few dedicated
studies of nucleon excitations. The main challenge has been to account
for interference effects between different subsystems in multi-body
decays involving baryons. Recently, however, correct solutions for this
``spin alignment'' problem (Section~\ref{sec-spin-alignment}) have been
developed and applied to studies at BESIII and LHCb. In this study, we
take first steps towards applying these solutions to the decay
\(J/\psi \to \bar{p}\left(N^*\to\varSigma^+K^0_S\right)\). In addition,
we have prepared the computational techniques to couple this channel to
\(J/\psi \to \bar{p}\left(N^*\to p \eta\right)\) and other future
selections, so that broad resonances can be studied properly in this
higher-mass region where simple Breit--Wigner parametrisations are
insufficient. Eventually, this paves the way to combining these results
with the extensive knowledge from scattering experiments, moving closer
to a unified description of the nucleon excitation spectrum.

\bookmarksetup{startatroot}

\chapter{Scattering theory}\label{sec-scattering-theory}

\[
\definecolor{C0}{RGB}{31, 119, 180}
\definecolor{C1}{RGB}{255, 127, 14}
\definecolor{MyBlue}{RGB}{0, 68, 136}
\definecolor{MyYellow}{RGB}{221, 170, 51}
\definecolor{MyRed}{RGB}{187, 85, 102}
\]

\noindent The ultimate goal in particle physics is to understand how
particles interact. Generally speaking, particle properties can only be
studied by measuring cross sections in particle accelerator experiments,
such as colliders or fixed-target experiments. We therefore need to
relate the cross sections that are measured experimentally to a theory
that describes the underlying particle reactions. In this chapter, we
will see how \textbf{scattering theory} is the bridge that connects
theory and experiment by giving us a means to formulate observable
transition amplitudes.

\section{The scattering matrix}\label{sec-scattering-matrix}

Any particle reaction in an experiment can be reduced to a scattering
process consisting of three
stages~{[}\citeproc{ref-Taylor:1972pty}{95}{]}:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\tightlist
\item
  approach of the incoming particles (\textbf{initial state}),
\item
  a process of interaction, during which the incoming particles may
  scatter, temporarily form intermediate states, or transform into new
  sets of outgoing particles,
\item
  and the scattered or formed particles moving away (\textbf{final
  state}).
\end{enumerate}

When the interaction stage (2.) occurs within a relatively short time,
both the initial and final states can be treated as collections of free,
non-interacting particles that are unaffected by the interaction
potential. This is a reasonable assumption, because the interaction
region is almost point-like in comparison to the detector
size~{[}\citeproc{ref-Taylor:1972pty}{95}{]}. The non-interacting
incoming and outgoing states may therefore be approximated as asymptotic
states. The challenge then is to relate the incoming asymptotes to the
outgoing ones by describing the interaction process. Importantly,
whether describing a classical or a non-relativistic interaction
potential, the scattering process is fully determined once the incoming
and outgoing asymptotic states are specified. This requirement is known
as the \textbf{asymptotic condition}.

In the classical picture, the scattering process can be visualised as in
Figure~\ref{fig-classical-scattering-process}. Far from the interaction
region, the trajectory of the particle approaches a well-defined
asymptote, which can be characterised by its incoming or outgoing
momentum. Within the interaction region, the path of the particle is
fully determined by the interaction potential. However, for most
practical purposes, it is unnecessary to determine the trajectory to
learn about the potential. Instead, one can define a continuous mapping
that relates each incoming momentum to a corresponding outgoing
momentum. Importantly, this mapping is expressed in terms of measurable
momenta, offering insight into the underlying potential and, by
extension, the Lagrangian that governs the system.

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/scattering-process-classical.pdf}}

}

\caption{\label{fig-classical-scattering-process}Sketch of the
asymptotic condition in a classical scattering process. The connected
continuum of incoming and outgoing momenta can be used to understand the
interaction potential. Inspired by {[}\citeproc{ref-Taylor:1972pty}{95,
Fig.~2.1}{]}.}

\end{figure}%

In the quantum-mechanical case, the incoming and outgoing states are
described by wave functions. Figure~\ref{fig-quantum-scattering-process}
is an artistic representation of that: an incoming plane wave travels
through an interaction region where an approximately localised potential
scatters it into a superposition of outgoing waves. In quantum
mechanics, the interaction process is described in terms of an operator
rather than a classical orbit. Wheeler first introduced the concept of a
``collision matrix''~{[}\citeproc{ref-Wheeler:1937zz}{96}{]}, which
Heisenberg formalised in the form of an {\(\mathbf{S}\)‑matrix}
{operator~{[}\citeproc{ref-Heisenberg:1943zz}{97}{]}} (not to be
confused with the spin operator). By abandoning the notion that the
scattering process is to be described as a positional wave function, the
scattering process is translated to a model of exact momentum states
that can be related through operators in the Heisenberg picture. This
better matches the observables that we measure in
experiment~{[}\citeproc{ref-Cushing:1990dt}{98};
\citeproc{ref-Blum:2017diy}{99}{]}, where the experimentalist
essentially prepares initial state wave packets in momentum space and
measures the outgoing state as a distribution of
four-momenta~{[}\citeproc{ref-Weinberg:1995mt}{100}{]}.

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/scattering-process-quantum.pdf}}

}

\caption{\label{fig-quantum-scattering-process}Scattering process of
quantum mechanical wave functions. Incoming state \(\psi_\text{in}\) and
outgoing state \(\psi_\text{out}\) are comparable to the asymptotes in
Figure~\ref{fig-classical-scattering-process}, but are defined as a
superposition of quantum states in a specific basis of observables.}

\end{figure}%

The idea of a scattering operator is quite general and can be applied to
any scattering process, including particle decays, even if multiple
decay channels are
involved~{[}\citeproc{ref-Goldberger:2004-CollisionTheory}{101}{]}.
Consider such an arbitrary incoming state \(\ket{\psi_\text{in}}\). This
can be any configuration of particles, such as \(e^-e^+\) about to
collide. We want to find a description for the resulting outgoing state
\(\ket{\psi_\text{out}}\) that can be a collection of decay products.
Here, we introduce an {\textbf{\(\mathbf{S}\)‑matrix}} that maps the
incoming state to the outgoing state by

\begin{equation}\phantomsection\label{eq-s-matrix-definition}{
\Ket{\psi_\text{out}} \;=\; \mathbf{S}\Ket{\psi_\text{in}} \,.
}\end{equation}

This expression encodes the entirety of the interaction. Although the
microscopic details of the dynamics may be complex or even unknown, the
{\(\mathbf{S}\)‑matrix} summarises their net effect on the asymptotic
particle states, which are accessible by experiments.

The {\(\mathbf{S}\)‑matrix} is an extremely general operator and has to
be further specified depending on the particle reaction that is being
studied. For instance, the dimension of the {\(\mathbf{S}\)‑matrix}
represents the number of possible states of the initial and final state,
which makes the {\(\mathbf{S}\)‑matrix} suitable for coupled channel
studies. The {\(\mathbf{S}\)‑matrix} and the incoming and outgoing
states also have to be further parametrised in terms of variables and
quantum numbers that are of relevance to the experiment, such as
collision energy, four-momenta, spin, parity, et cetera.

In practice, we separate the \emph{trivial} part of the scattering
process, where the incoming state passes through unaffected by the
interaction potential, from the \emph{non-trivial} part that contains
the effects of the interaction. This leads to the decomposition

\begin{equation}\phantomsection\label{eq-t-matrix-definition}{
\mathbf{S} \;=\; \mathbf{1} + i \mathbf{T},
}\end{equation}

\noindent where \(\mathbf{1}\) is the identity operator (corresponding
to no scattering) and \(\mathbf{T}\) is the \textbf{transition
operator}. In some literature, the {\(\mathbf{T}\)‑matrix} is multiplied
by a factor two, or a minus sign is used.

To relate these expressions back to experimental observables, we express
the incoming and outgoing states in terms of observable basis states
\(\ket{p_1,\dots,p_m;\alpha}\) and \(\ket{p_1',\dots,p_n';\beta}\),
where \(p_i^{(\prime)}\) are the observable four-momenta of the
particles, and \(\alpha, \beta\) label the set of discrete quantum
numbers (such as spin, isospin, parity, and rest masses) that
characterise the initial- and final-state channels. This leads to the
\textbf{transition matrix elements} \(\mathcal{M}_{\!\beta\alpha}\)
describing the process {\(\alpha \to \beta\),}

\begin{equation}\phantomsection\label{eq-transition-matrix-element}{
\begin{aligned}
& \Braket{p_1',\ldots,p_n';\beta|i\mathbf{T}|p_1,\ldots,p_m;\alpha} \\
& \quad =\;
  i (2\pi)^4 \, \delta^{(4)}\!\left(p_\beta - p_\alpha\right) \,
  \mathcal{M}_{\!\beta\alpha}\left(p_1, \dots; p_1', \dots\right)
\,,
\end{aligned}
}\end{equation}

\noindent where the {\(\delta^{(4)}\)‑function} ensures conservation of
incoming and outgoing four-momenta, \(p_\alpha=p_\beta\), with
\(p_\alpha=\sum_{i=1}^m p_i\) and \(p_\beta=\sum_{j=1}^n p_j'\). The
quantity \(\mathcal{M}_{\!\beta\alpha}\) is called a ``matrix element''
because it represents a component of the transition
{operator~\(\mathbf{T}\):} it is the (discrete) projection into the
transition \(\alpha \to \beta\) as a (continuous) function of their
asymptotic incoming and outgoing {four-momenta~\(p_i^{(\prime)}\).}

While the full {\(\mathbf{S}\)‑matrix} is a unitary operator acting on
the entire Hilbert space of asymptotic momentum
states~{[}\citeproc{ref-Weinberg:1995mt}{100}{]},
\(\mathcal{M}_{\!\beta\alpha}\) captures the physical content of a
particular transition and is the quantity that enters into the
calculation of cross sections, decay rates, and other observable
quantities. It is a complex-valued amplitude function that encodes the
likelihood of the process, with its modulus squared appearing in
measurable rates. For instance, for a scattering process with \(n\)
final-state particles, the \textbf{differential cross section} is given
by

\begin{equation}\phantomsection\label{eq-differential-cross-section}{
\mathrm{d}\sigma_{\beta\alpha} \;=\; \frac{1}{F_\alpha} \left|\mathcal{M}_{\!\beta\alpha}\right|^2 \, \mathrm{d}\Phi_n \,,
}\end{equation}

\noindent where \(F_\alpha\) is a flux factor determined by the initial
state~\(\alpha\) and \(\mathrm{d}\Phi_n\) is the Lorentz-invariant phase
space volume {element~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66,
§49}{]}}

\begin{equation}\phantomsection\label{eq-phase-space-element}{
\mathrm{d}\Phi_n \;=\;
    (2\pi)^4 \,
    \delta^{(4)}\!\left(p_\alpha-p_\beta\right)
    \prod_{i=1}^n \frac{\mathrm{d}^3 p_i'}{(2\pi)^3\,2E_i'}
}\end{equation}

\noindent for the {\(n\)‑body} final state. In decay processes, the
cross section is often denoted with \(\mathrm{d}\Gamma\) rather than
\(\mathrm{d}\sigma\) and is referred to as the partial or differential
\textbf{decay rate}. The differential cross section quantifies the
probability density for the transition from the initial
{state~\(\alpha\)} to the final {state~\(\beta\),} as a function of the
kinematic degrees of freedom in the final state and of the configuration
of the initial state.

The matrix {elements~\(\mathcal{M}_{\!\beta\alpha}\)} denote the
momentum projection of the transition {operator~\(\mathbf{T}\)} and are,
as such, continuous functions of the incoming and outgoing momenta. In
practice, we prefer to parametrise transition matrix elements as a
function of other kinematic variables that are more relevant to the
reaction process. The implicit convention in literature is to call such
functions \textbf{transition amplitudes} and we follow the conventional
notation to denote these functions with \(A\) or \(a\). Amplitudes are
like the \emph{response functions} that tell how a system responds to
external perturbations~{[}\citeproc{ref-Martin:1970hmp}{102, p.~274}{]},
and the fact that they are directly related to observable cross sections
makes them a powerful experimental tool for extracting information about
the underlying dynamics of particle interactions.

\section{\texorpdfstring{$\mathbf{S}$}{𝐒}‑matrix constraints} \label{sec-s-matrix-constraints}

In theory, it is impossible to derive proper parametrisations of
scattering amplitudes directly from the full QCD Lagrangian. The
non-perturbative nature of the strong coupling at low energies makes
exact solutions intractable. We can, however, derive a few basic
constraints for the {\(\mathbf{S}\)‑matrix} from fundamental principles
of quantum mechanics and special relativity. These constraints are
universal and model-independent: they must be satisfied by any theory of
scattering, including QCD.

From this perspective, the {\(\mathbf{S}\)‑matrix} provides an
alternative but complementary framework to QCD~-- even though it
historically preceded the concept of QCD
itself~{[}\citeproc{ref-Cushing:1990dt}{98, §7.1}{]}. Rather than
describing the microscopic dynamics of quarks and gluons, it focuses on
observable relations between asymptotic states. The
{\(\mathbf{S}\)‑matrix} formalism enables amplitude models that enforce
general physical principles while remaining agnostic about underlying
dynamics, and provides a bridge between QCD predictions and experimental
observables in the hadronic
regime~{[}\citeproc{ref-Briceno:2017max}{103}{]}. The most commonly
invoked constraints are Lorentz invariance, unitarity of the transition
amplitudes, and crossing symmetry.

\subsection{Lorentz invariance}\label{lorentz-invariance}

Given that we describe scattering entirely in terms of the momenta of
incoming and outgoing particles, we must ensure that this description
remains consistent under any change of inertial frame, so that we can
relate it to the laboratory frame in which we perform our measurements.
This requirement of \textbf{relativistic invariance} reflects the
symmetry of spacetime as described by special relativity. Any
theoretical description of scattering must respect the fact that the
outcome of a physical process should not depend on the inertial frame in
which it is described.

In relativistic quantum mechanics, this requirement is implemented
through the \textbf{Poincaré group}, which comprises both spacetime
translations and Lorentz transformations (rotations and boosts). The
{\(\mathbf{S}\)‑matrix} must commute with the generators of this
symmetry group to ensure that they transform appropriately under changes
of frame. In particular, Lorentz invariance implies that the
{\(\mathbf{S}\)‑matrix} must be invariant under Lorentz transformations.
If we {define~\(\mathbf{U}\)} as the unitary transformation that maps a
Lorentz transformation~\(\boldsymbol{\varLambda}\) to the corresponding
operator acting on the Hilbert space of quantum states, Lorentz
invariance implies that

\[
\mathbf{U}[\boldsymbol{\varLambda}] \; \mathbf{S} \; \mathbf{U}^\dagger[\boldsymbol{\varLambda}] \;=\; \mathbf{S} \,.
\]

This constraint has important practical implications. First, it means
that scattering amplitudes can only be a function of Lorentz-invariant
combinations of the asymptotic four-momenta. Second, Lorentz invariance
constrains how spin degrees of freedom must be treated. In a
non-relativistic regime, spins can be added using standard angular
momentum algebra, but the transformation of spin states under boosts
becomes non-trivial (Chapter~\ref{sec-helicity-formalism}).

\subsection{Unitarity}\label{unitarity}

The most natural constraint is that the transition preserves
probability, that is, `what comes in, comes out'. In the notation of
Equation~\eqref{eq-s-matrix-definition}, this means

\[
\begin{aligned}
\Braket{\psi_\text{in}|\psi_\text{in}}
\;&=\; \Braket{\psi_\text{out}|\psi_\text{out}} \\
\;&=\; \Braket{\psi_\text{in}|\mathbf{S}^\dagger\mathbf{S}|\psi_\text{in}} \,,
\end{aligned}
\]

\noindent which gives us the \textbf{unitarity condition} that ensures
that the total probability for any process remains normalised,

\[
\mathbf{S}^\dagger \mathbf{S} \;=\; \mathbf{S}\mathbf{S}^\dagger \;=\; \mathbf{1}
\,,
\]

\noindent with \(\mathbf{1}\) the identity matrix. Inserting
Equation~\eqref{eq-t-matrix-definition} gives us the unitarity condition
for the {\(\mathbf{T}\)‑matrix,}

\begin{equation}\phantomsection\label{eq-unitarity-t-matrix}{
\mathbf{T} - \mathbf{T}^\dagger \;=\;  i \mathbf{T}^\dagger \mathbf{T}
\,.
}\end{equation}

This equation shows that the imaginary part of the transition amplitude
is constrained by its own modulus. Physically, it implies that the
scattering process may involve not just direct deflection, but also the
temporary formation of intermediate states such as resonances
(\textbf{elastic scattering}), or transitions into entirely different
final states (\textbf{inelastic scattering}) that are not accounted for
in the model. In elastic scattering, the imaginary part of the amplitude
reflects the finite lifetime of the resonant state, while in inelastic
scattering, it indicates a genuine loss of flux from the initial channel
into other open channels. Both effects are captured by the complex
structure of the {\(\mathbf{T}\)‑matrix,} and its imaginary part plays a
central role in encoding how probability is redistributed across
scattering channels. In Section~\ref{sec-analytic-structure}, we will
see how this leads to observable phase shifts in the scattering
amplitude.

\subsection{Analyticity}\label{sec-analyticity}

In any physical process, causes must precede their effects. In
scattering theory, causality requires that the wave function of a
particle cannot ``respond'' before the interaction has taken place. This
causal requirement leads to a mathematical condition: the transition
matrix elements \(\mathcal{M}_{\!\beta\alpha}\) must be
\textbf{analytic} in energy and momentum, meaning that the
energy-momentum domain can be continued into the complex plane and that
it varies in a way that is smooth, except at well-defined singularities
associated with physical thresholds or states.

The connection between causality and analyticity becomes more
transparent when we recognise that the {\(\mathbf{S}\)‑matrix} relates
asymptotic momentum states in a way that is analogous to how a Fourier
transform relates position and momentum space. Just as a time-localised
function has a smooth (analytic) Fourier transform in frequency space, a
localised interaction in spacetime leads to an analytic amplitude
function in energy space~{[}\citeproc{ref-Mizera:2023tfe}{104};
\citeproc{ref-Martin:1970hmp}{102, p.~390}{]}. This analyticity implies
that the amplitude as a function of energy can be extended to a complex
plane, where singularities such as poles appear in specific regions.
These poles correspond to physical phenomena like bound states or
resonances. While bound states appear as poles on the real axis,
unstable states (resonances) correspond to poles with a negative
imaginary part. Causality ensures this sign: it guarantees that the
amplitude decays as time increases. A pole in the upper half-plane
(positive imaginary part) would imply that the amplitude grows with
time, violating the principle that effects cannot precede causes.

Analyticity gives the scattering amplitude an internal structure that
causes it to ``feed back'' into itself~-- its absorptive component is
determined by how likely it is to scatter into other channels, which is
itself encoded in the amplitude. This enables powerful tools such as
\textbf{dispersion relations}, which relate the value of an amplitude at
one energy to its values
elsewhere~{[}\citeproc{ref-Nussenzveig:1972tcd}{105}{]}. Once we know
the amplitude in one location, we can analytically continue it through
the complex plane into other regions of interest. Since the interaction
potential is itself governed by the underlying fundamental forces, these
relations allow us to extract information about the dynamics from
measured cross sections, and compare them to those predicted by the
formulated amplitude model~{[}\citeproc{ref-Newton:1982qc}{106}{]}.

\subsection{Crossing symmetry}\label{sec-crossing-symmetry}

Scattering processes can be visualised with Feynman diagrams, which
represent terms in the perturbative expansion of the
{\(\mathbf{S}\)‑matrix.} A striking feature is that a single Feynman
diagram can often describe multiple processes. For instance, the diagram
representing a 2-to-2 scattering process \(A + B \to C + D\) can, under
certain momentum substitutions, also describe
\(A + \bar{C} \to \bar{B} + D\). This observation reflects a property of
QFT known as \textbf{crossing symmetry}. Once this additional constraint
is combined with the unitarity and analyticity conditions, the
transition amplitudes of seemingly unrelated reactions become connected
representations of a single analytic object that is a manifestation of
the underlying field theory~{[}\citeproc{ref-Martin:1970hmp}{102,
p.~274}; \citeproc{ref-Eden:1966dnq}{107};
\citeproc{ref-Chew:1966-AnalyticSMatrix}{108}{]}.

Crossing symmetry was first described by Mandelstam
{[}\citeproc{ref-Mandelstam:1958xc}{109}{]}, in a paper that also
introduced the \textbf{Mandelstam variables}, or \textbf{invariants},
which provide a Lorentz-invariant description of two-body scattering
kinematics. For a process \(A+B \to C+D\), they are defined as

\begin{equation}\phantomsection\label{eq-mandelstam-variables}{
\begin{alignedat}{3}
s \;&=\; (p_A + p_B)^2 \;&&=\; (p_C + p_D)^2 \\
t \;&=\; (p_A - p_C)^2 \;&&=\; (p_D - p_B)^2 \\
u \;&=\; (p_A - p_D)^2 \;&&=\; (p_C - p_B)^2 \,,
\end{alignedat}
}\end{equation}

\noindent where \(p_A,p_B\) are the four-momenta of the incoming
particles and \(p_C,p_D\) those of the outgoing particles. Here, \(s\)
combines the incoming momenta as a \emph{sum}, giving the squared
center-of-mass energy, while \(t\) and \(u\) involve momentum
\emph{differences} and measure the momentum transfers between initial
and final states. The difference in structure indicates two distinct
reaction types: \(s\) characterises a ``direct'' reaction, in which the
two incoming momenta combine, whereas \(t\) and \(u\) characterise
``exchange'' reactions that pair an incoming with an outgoing leg and
describe momentum exchange (see Figure~\ref{fig-mandelstam-blob}).

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-blob.pdf}}

}

\caption{\label{fig-mandelstam-blob}The two reaction types that can be
distinguished in a 2-to-2 scattering process.}

\end{figure}%

Each of these variables is often associated with a distinct channel
topology or Feynman diagram (see Figure~\ref{fig-mandelstam-variables}),
which complements their broader role as analytic variables of the full
2-to-2 amplitude. The {\textbf{\(s\)‑channel}} corresponds to the
configuration in which the two incoming particles are combined, with
\(s\) equal to their squared invariant mass. The
{\textbf{\(t\)‑channel}} corresponds to the configuration in which an
incoming particle is paired with one of the outgoing particles,
characterised by the squared momentum {transfer~\(t\).} The
{\textbf{\(u\)‑channel}} corresponds to the alternative pairing, where
each incoming particle is combined with the other outgoing particle,
giving the squared momentum {transfer~\(u\).} By crossing symmetry, an
incoming particle can be reinterpreted as an outgoing antiparticle,
which reverses the sign of its momentum.

\begin{figure}

\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-variable-s.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-variable-t.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-variable-u.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-mandelstam-variables}Channel topologies that are
often associated with the three Mandelstam variables \(s\), \(t\), and
\(u\) in a 2-to-2 scattering process in terms of the four-momenta of the
incoming particles \(A\) and \(B\) and outgoing particles \(C\) and
\(D\). Momenta on the same side of the diagram contribute with a plus
sign, while those on opposite sides contribute with a minus sign.}

\end{figure}%

This perspective also clarifies how Mandelstam invariants appear in
three-body decays. If a three-body final state is viewed as a sequence
of two-body subprocesses, the same diagrammatic topologies reappear when
deforming the scattering diagrams of
Figure~\ref{fig-mandelstam-variables} into the decay diagrams of
Figure~\ref{fig-mandelstam-variables-3body}. In this case,
particle~\(B\) is no longer incoming but part of the final state, so its
momentum enters with the opposite sign. The resulting invariants are
just the squared masses of two-body subsystems, which play the same role
in Dalitz-plot analyses of decays as the Mandelstam variables do in
scattering.

\begin{figure}

\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-variable-3body-s.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-variable-3body-t.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-variable-3body-u.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-mandelstam-variables-3body}Mandelstam variables
defined in the two-body subsystems of a three-body decay, obtained from
the scattering topologies of Figure~\ref{fig-mandelstam-variables} by
reinterpreting incoming particle~\(B\) as part of the final state. In
this decay picture, all momenta that enter a given invariant lie
causally on the same side of the process and therefore appear with a
plus sign.}

\end{figure}%

Because of four-momentum conservation, the Mandelstam variables are not
independent but satisfy

\begin{equation}\phantomsection\label{eq-mandelstam-total}{
\begin{aligned}
s + t + u \;&=\; p_A^2 + p_B^2 + p_C^2 + p_D^2 \\
          \;&=\; m_A^2 + m_B^2 + m_C^2 + m_D^2 \,,
\end{aligned}
}\end{equation}

\noindent A 2-to-2 scattering process can therefore be described in
terms of only two independent invariants. This already hints that the
processes sketched in Figure~\ref{fig-mandelstam-variables} and
Figure~\ref{fig-mandelstam-variables-3body} are not isolated but
intrinsically connected.

These connections are visualised in Figure~\ref{fig-mandelstam-diagram},
which plots the Mandelstam variables over a real-valued, two-dimensional
\textbf{Mandelstam plane}. The plot uses a barycentric coordinate
system, with \(x=\frac{s-t}{(s+t+u)\sqrt{2}}\) and
\(y=\frac{s+t-2u}{(s+t+u)\sqrt{6}}\), to emphasise that the choice of
\(s\), \(t\), and \(u\) is arbitrary and that the three variables are
symmetrically related to each other through
Equation~\eqref{eq-mandelstam-total}. The yellow regions mark the values
kinematically allowed for given particle masses \(m_A, m_B, m_C, m_D\),
that is, the regions where experimental measurements can be made. They
are determined by the condition that the Kibble
function~{[}\citeproc{ref-Kibble:1960zz}{110}{]}

\begin{equation}\phantomsection\label{eq-kibble}{
\phi(s,t,u) \;=\; \lambda\!\left(
\lambda(s, m_B^2, m_A^2),\,
\lambda(t, m_C^2, m_A^2),\,
\lambda(u, m_D^2, m_A^2)
\right)
}\end{equation}

\noindent is negative~{[}\citeproc{ref-Martin:1970hmp}{102,
pp.~175--177}{]}. Here, \(\lambda\) denotes the Källén
function~{[}\citeproc{ref-Kallen:1964lxa}{111, pp.~11--12}{]}, a
symmetric polynomial in three variables, defined as

\begin{equation}\phantomsection\label{eq-kallen}{
\lambda(x,y,z) \;=\; x^2 + y^2 + z^2 - 2xy - 2yz - 2zx
\,.
}\end{equation}

Now, although these kinematically allowed regions are disjoint, and
their Feynman diagrams correspond to distinct physical reactions,
crossing symmetry tells us that they are analytically connected. Each
scattering or decay channel corresponds to a different real slice of the
same complex analytic function~\(A(s,t,u)\). What appear experimentally
as separate processes are therefore a mere set of boundary values of one
underlying analytic structure (``Mandelstam
Hypothesis''~{[}\citeproc{ref-Mandelstam:1958xc}{109};
\citeproc{ref-Omnes:1963-MandelstamTheoryRegge}{112};
\citeproc{ref-Chew:1960iv}{113, §III};
\citeproc{ref-Martin:1970hmp}{102, p.~274}{]}).

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/mandelstam-diagram.pdf}}

}

\caption{\label{fig-mandelstam-diagram}Barycentric visualisation of the
kinematically allowed regions (shaded yellow) in the Mandelstam plane.
The arrows indicate that the transition amplitudes for each reaction are
connected through analytic continuation in the complexified plane. In
this example, the regions are asymmetric, because each of the rest
masses are all chosen differently.}

\end{figure}%

Figure~\ref{fig-mandelstam-diagram} also shows that, unlike in
scattering, the three topologies of a three-body decay all occupy the
same physical region. As we will see later, the amplitude can be
expressed in terms of leading-order two-body subsystems, which are
realised simultaneously in the Dalitz plot. This decomposition
simplifies the analysis, but only approximates the full
crossing-symmetric amplitude, since truncating the two-body partial-wave
expansion (Section~\ref{sec-partial-wave-expansion}) inevitably violates
exact crossing symmetry.

By modelling three-body decays as a sequence of two-body decays
(Figure~\ref{fig-mandelstam-variables-3body}), the transition amplitude
can be split into separate amplitudes that are parametrised as a
function of a Mandelstam variable and a corresponding scattering angle
\(\theta\) (Chapter~\ref{sec-helicity-formalism}), giving us

\begin{equation}\phantomsection\label{eq-crossing-symmetric-amplitude}{
A_{\text{total}}(s,t,u) \;=\; A^{(s)}(s,\theta_s) + A^{(t)}(t,\theta_t) + A^{(u)}(u,\theta_u)
\,,
}\end{equation}

\noindent with \(A^{(s)}, A^{(t)}, A^{(u)}\) the amplitudes of the
individual subsystems and \(\theta_s, \theta_t, \theta_u\) the
corresponding scattering angles. Since \(\theta\) can itself be written
in terms of another Mandelstam variable
(Equation~\eqref{eq-cos-theta-in-terms-of-t}), the angular part acquires
a dynamical component that is analytically connected to the other
channels.

A fully crossing-symmetric amplitude \(A(s,t,u)\) that is analytic in
the three Mandelstam variables simultaneously is in principle the ideal
objective, but constructing such an object is extremely
challenging~{[}\citeproc{ref-Anisovich:2013gha}{114}{]}. The
Khuri--Treiman formalism~{[}\citeproc{ref-Khuri:1960zz}{115}{]} starts
from Equation~\eqref{eq-crossing-symmetric-amplitude} and refines the
partial amplitudes through dispersion-relation corrections constrained
by analyticity and two-body scattering data. The method has no
fundamental restriction to non-zero spin, but its extension to a spinful
final state is technically demanding. Regge theory is also relevant to
the broader programme of constructing crossing-symmetric amplitudes, as
it analytically continues the discrete angular momenta in the
partial-wave expansion to complex
values~{[}\citeproc{ref-Regge:1959mz}{116}{]}.

\section{Partial-wave expansion}\label{sec-partial-wave-expansion}

In Section~\ref{sec-quantum-numbers}, we saw that many of the quantum
numbers used to classify hadrons~-- such as spin, parity, and total
angular momentum~-- stem from the symmetries of space and time. For
example, spin and orbital angular momentum arise from rotational
invariance, while parity is associated with spatial inversion symmetry.
These symmetry-related quantum numbers remain relevant in scattering
theory, where they constrain the allowed transitions between incoming
and outgoing states.

This is the key idea: if the system is rotationally invariant, then the
total angular momentum must be conserved. Each amplitude component with
a specific total angular momentum therefore scatters independently. The
case of two-particle scattering \(A+B \to C+D\) again makes this
particularly clear. The sum of the momenta of the incoming particles
defines a preferred direction, typically taken to be the {\(z\)~axis.}
Once we boost into the center-of-mass (CM) frame, and consider a fixed
total energy~\(s\) (Equation~\eqref{eq-mandelstam-variables}), the
geometry of the scattering process can be captured purely in terms of
two angles, the \textbf{scattering angle} \(\theta\) (angle between
\(p'_C\) and {\(z\)~axis,} see Figure~\ref{fig-scattering-angles}) and
the \textbf{azimuthal angle} \(\phi\) (angle between the \(p'_A p'_B\)
plane and \(p'_Cp'_D\) plane). Indeed, once~\(s\) is fixed, only
rotational degrees of freedom remain, so any structure in the amplitude
at fixed energy must reflect how the interaction redistributes angular
momentum across different scattering angles.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/scattering-process-angles-lab.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/scattering-process-angles-cm.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-scattering-angles}The sum of the incoming
four-momenta can be used to define a {\(z\)~axis} in the laboratory
frame (left) and to boost into the CM frame (right). For a given total
energy~\(s\), the four-momenta in the CM frame define the scattering
angle~\(\theta\) (shown in the figure) and the azimuthal angle~\(\phi\)
(not shown).}

\end{figure}%

Similar to how a sound wave can be decomposed into pure tones of
different frequencies, the amplitude \(A(s, t)\) can be decomposed into
independent (orthogonal) functions over the scattering angles. The
result is called a \textbf{partial-wave
expansion}~{[}\citeproc{ref-Martin:1970hmp}{102, §4.4};
\citeproc{ref-Taylor:1972pty}{95, §6--c}{]}. When the scattered
particles have no intrinsic spin, these functions are given by the
\textbf{Legendre polynomials} \(P_\ell(\cos\theta)\) that depend only on
the scattering angle~\(\theta\). The amplitude at fixed total
energy~\(s\) can then be written as a sum over the orbital angular
momenta~\(\ell\),

\begin{equation}\phantomsection\label{eq-partial-wave-expansion-no-spin}{
A(s,\theta) \;=\; \sum_{\ell=0}^{\infty} (2\ell + 1) \, P_\ell(\cos\theta) \, a^{(\ell)}(s)
\,.
}\end{equation}

Here, \(a^{(\ell)}(s)\) are the \textbf{partial-wave amplitudes} that
encode the strength of the interaction in the orbital angular-momentum
channel~\(\ell\) purely as a function of energy~\(s\). Overall, this is
a \textbf{Fourier--Legendre expansion}, where \(P_\ell\) plays the role
of orthogonal basis functions.

In order to generalise the partial-wave expansion to particles of
arbitrary spin, we need to introduce a few additional quantum numbers.
If the incoming and outgoing particles \(i=\{A,B,C,D\}\) have spin
state~\(\ket{J_i,\lambda_i}\), with \(\lambda_i\) the spin projection of
particle~\(i\) along some quantisation axis, the amplitude can be
projected into independent
amplitudes~\(A_{\{\lambda\}}(s,\theta,\phi)\), with
\(\lambda=\{\lambda_A,\lambda_B;\lambda_C,\lambda_D\}\). These
amplitudes can be expressed in terms of \emph{total} angular
momenta~\(J\) (coupled basis of total spin and orbital angular
momentum), so that the expansion coefficients become a matrix of
functions of both \(\theta\) and
{\(\phi\)~{[}\citeproc{ref-Jacob:1959at}{117, p.~413}{]},}

\begin{equation}\phantomsection\label{eq-partial-wave-expansion}{
\begin{aligned}
A_{\{\lambda\}}(s,\theta,\phi)
\;&=\;
  \sum_{J} (2J + 1) \, D^{J\,*}_{\mu \mu'}(\phi, \theta, 0) \,
  a^{(J)}_{\{\lambda\}}(s) \\
\;&=\;
  e^{i(\mu-\mu')\phi} \,
  \sum_{J} (2J + 1) \, d^J_{\mu \mu'}(\theta) \,
  a^{(J)}_{\{\lambda\}}(s) \,,
\end{aligned}
}\end{equation}

\noindent with \(\mu=\lambda_A-\lambda_B\) and
\(\mu'=\lambda_C-\lambda_D\). The {Wigner~\(D\)‑} and {\(d\)‑functions}
are the matrix elements of rotation operators in the {spin‑\(J\)}
representation that generalise the Legendre polynomials for the spinless
case. We return to the relation between the Wigner functions, the
helicity basis, and the canonical spin basis in
Chapter~\ref{sec-helicity-formalism}. If the scattered particles have no
intrinsic spin, the total angular momentum~\(J\) equals the orbital
angular momentum~\(\ell\), and the familiar expansion of
Equation~\eqref{eq-partial-wave-expansion-no-spin} is recovered from
Equation~\eqref{eq-partial-wave-expansion}, because for any
{angles~\(\alpha,\beta,\gamma\),}

\[
D^\ell_{0,0}(\alpha,\beta,\gamma) \;=\;
d^\ell_{0,0}(\beta) \;=\;
P_\ell(\cos\beta)
\,.
\]

The key point is that we have factorised the transition
amplitude~\(A(s,t)\) into (1) \emph{angular} components that we know how
to parametrise as a function of angles and (2) \emph{dynamic}
partial-wave amplitudes~\(a^{(J)}_{\left\{\lambda\right\}}(s)\) that are
purely energy-dependent. By orthogonality, these dynamic partial-wave
projections are given by the inverse of
Equation~\eqref{eq-partial-wave-expansion-no-spin} and
Equation~\eqref{eq-partial-wave-expansion},

\begin{equation}\phantomsection\label{eq-partial-wave-projection}{
\begin{aligned}
a^{(\ell)}(s) \;&=\;
  \frac{1}{2}
  \int_{-1}^{1}\! \mathrm{d}(\cos\theta) \,
  P_\ell(\cos\theta)\,A(s,\theta) \\
a^{(J)}_{\{\lambda\}}(s) \;&=\;
  \frac{1}{4\pi}\!
  \int_{-1}^{1}\! \mathrm{d}(\cos\theta)
  \int_{0}^{2\pi}\! \mathrm{d}\phi \,
  D^J_{\mu\mu'}(\phi,\theta,0)\,
  A_{\{\lambda\}}(s,\theta,\phi)
\,.
\end{aligned}
}\end{equation}

For convenience, we often drop the quantum numbers \(\ell\), \(J\), and
\(\{\lambda\}\), so that \(a(s)\) refers to a partial-wave amplitude. In
Section~\ref{sec-analytic-structure}, we will model this dynamic
function \(a(s)\) in order to extract information about the interaction
potential from experimental data. Right now, however, we can already
further constrain this energy-dependent parametrisation purely on
kinematic grounds.

As a first step, the factorisation into partial waves simplifies the
unitarity condition on the transition matrix. When projected onto the
angular momentum eigenbasis, Equation~\eqref{eq-unitarity-t-matrix}
becomes an energy-dependent condition that works \emph{separately} for
each \(J\). By applying Equation~\eqref{eq-transition-matrix-element} to
Equation~\eqref{eq-unitarity-t-matrix}, we get the unitarity condition
for the matrix elements,

\begin{equation}\phantomsection\label{eq-unitarity-coupled-transition-amplitude-delta}{
\mathcal{M}_{\!\beta\alpha} - \mathcal{M}_{\!\alpha\beta}^*
\;=\;
i(2\pi)^4 \, \sum_{\gamma}\delta^{(4)}\!\left(p_\alpha - p_\beta\right) \, \mathcal{M}_{\!\gamma\beta}^* \, \mathcal{M}_{\!\gamma\alpha}
\,,
}\end{equation}

\noindent where \(\gamma\) runs over all considered transition channels.
This is known as the \textbf{generalised optical
theorem}~{[}\citeproc{ref-Landau:2007-QuantumMechanics}{118, p.~512};
\citeproc{ref-Weinberg:1995mt}{100, p.~147}{]}. Reformulating
Equation~\eqref{eq-unitarity-coupled-transition-amplitude-delta} in
terms of Lorentz-invariant variables \(s,t\) and applying the
partial-wave projection from
Equation~\eqref{eq-partial-wave-projection}, we get an energy-dependent
unitarity condition for the partial-wave amplitudes,

\begin{equation}\phantomsection\label{eq-unitarity-coupled-transition-amplitude}{
\operatorname{Im}a_{\beta\alpha}(s) \;=\;
\sum_{\gamma} a_{\gamma\beta}^*(s) \, \rho_\gamma(s) \, a_{\gamma\alpha}(s) \,,
}\end{equation}

\noindent or, in matrix form,

\begin{equation}\phantomsection\label{eq-unitarity-partial-wave-coupled}{
\operatorname{Im}\mathbfit{a}(s) \;=\;
\mathbfit{a}^\dagger(s) \, \mathbfit{\rho}(s) \, \mathbfit{a}(s) \,.
}\end{equation}

In the single-channel case, this partial-wave unitarity condition
becomes a more recognisable form of the optical theorem,

\begin{equation}\phantomsection\label{eq-unitarity-partial-wave}{
\operatorname{Im} a(s) \;=\; \rho(s)\,\left|a(s)\right|^2 \,,
}\end{equation}

\noindent which relates the imaginary part of the partial-wave amplitude
to its cross section. Here, we have introduced a Lorentz-invariant,
normalised \textbf{phase space factor}~\(\rho(s)\). In general, this
factor is defined as the integral of the phase space element of
Equation~\eqref{eq-phase-space-element} over the angular degrees of
freedom at fixed total centre-of-mass {energy~\(s\).} In the special
case of two-body scattering or decays, this integral has an analytic
solution and can be expressed in terms of the \textbf{breakup momentum}
{\(q(s)\)~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, §50, p.8}{]},}

\begin{equation}\phantomsection\label{eq-phase-space-factor}{
\rho(s)
  \;=\; 4 (2\pi)^5 \int\mathrm{d}\Phi_2
  \;=\; \frac{2q(s)}{\sqrt{s}}
  \;=\; \frac{\sqrt{\lambda(s, m_C^2, m_D^2)}}{s}
\,.
}\end{equation}

\noindent The factor \((2\pi)^4\) is often absorbed into \(\Phi\),
leaving a conventional {factor~\(8\pi\).}The precise form of
Equation~\eqref{eq-unitarity-partial-wave} also depends on the
normalisation of the scattering amplitude: with the convention of
Equation~\eqref{eq-differential-cross-section}, the inverse amplitude
satisfies \(\operatorname{Im} a^{-1}(s) = \rho(s)\), while alternative
normalisations shift factors such as \(16\pi\) into the definition of
\(\rho(s)\).

The appearance of \(\lambda\) from Equation~\eqref{eq-kallen} reflects
the same kinematic constraint \(\phi(s,t,u)<0\) of
Equation~\eqref{eq-kibble} that defines the boundary of the physical
region in Mandelstam space (see Figure~\ref{fig-mandelstam-diagram}).
The phase space {factor~\(\rho(s)\)} thus plays the role of an
\emph{energy-dependent normalisation}, arising directly from unitarity
and the kinematics of the two-body system.

As a reminder, when working with multiple channels, a subscript in the
phase space factor or breakup momentum indicates the channel for which
it is defined. For a two-body final {state~\(\alpha\)} with rest masses
\(m_{1,\alpha}, m_{2,\alpha}\), this means

\begin{equation}\phantomsection\label{eq-phase-space-factor-and-breakup-momentum}{
\begin{aligned}
\rho_\alpha(s) \;&=\; \frac{\sqrt{s-(m_{1,\alpha}-m_{2,\alpha})^2}\sqrt{s-(m_{1,\alpha}+m_{2,\alpha})^2}}{s} \\
q_\alpha(s) \;&=\; \frac{\sqrt{s-(m_{1,\alpha}-m_{2,\alpha})^2}\sqrt{s-(m_{1,\alpha}+m_{2,\alpha})^2}}{2\sqrt{s}} \,.
\end{aligned}
}\end{equation}

\noindent This form with a product of square roots is often preferred
over Equation~\eqref{eq-phase-space-factor}, as it has a simpler
analytic structure in the complex plane (one branch cut, see
Section~\ref{sec-analytic-continuation}).

Unitarity also motivates a useful parametrisation of the partial-wave
amplitudes in terms of a phase shift. We can rewrite
Equation~\eqref{eq-unitarity-partial-wave} to

\[
\left|1+i\rho(s)\,a(s)\right| \;=\; 1
\,,
\]

\noindent which confines \(\rho(s)\,a(s)\) to a circle in the complex
plane. Positions on that circle can be associated to angles, which
naturally leads to parametrising the amplitude in terms of a
\textbf{phase shift} \(\delta(s)\) via

\begin{equation}\phantomsection\label{eq-phase-shift}{
\begin{aligned}
&
  a(s) \;=\; \frac{e^{2i\delta(s)} - 1}{2i \, \rho(s)} \\
& \Rightarrow \;
  e^{i\delta(s)} \sin\delta(s) \;=\; \rho(s) \, a(s) \,.
\end{aligned}
}\end{equation}

Physically, \(\delta(s)\) represents the delay of the outgoing wave
relative to free propagation. Its behaviour as a function of energy
reveals features such as resonances and bound states~-- a rapid increase
in \(\delta(s)\) indicates elastic effects during the scattering
process.

As a first step in a \textbf{partial-wave analysis} (PWA), one often
applies the partial-wave expansion without committing to any detailed
dynamical model {of~\(a(s)\).} In practice, the experimental data is
divided into bins of the energy {variable~\(s\).} Within each bin, one
assumes that \(s\) is effectively constant and that the corresponding
partial-wave amplitude \(a^{(\ell)}(s)\) can be approximated by a single
complex parameter. The angular distribution observed in that bin is then
fitted by adjusting these complex coefficients, one for each included
partial wave. Each coefficient is thus treated as a free parameter of
the fit, with no energy dependence imposed across bins.

The result is a collection of complex values \(\{a^{(\ell)}(s_i)\}\) at
the bin {centers~\(\{s_i\}\).} If these values vary smoothly from bin to
bin, they can be interpolated to define a continuous amplitude function,
from which phase shifts can be extracted. Such
\textbf{model-independent} or energy-independent
PWAs~{[}\citeproc{ref-Cutkosky:1979zv}{119}{]} already provide valuable
insight into resonant behaviour, since characteristic phase motions
across the energy range can already reveal the presence of resonant
structures without assuming any specific parametrisation.

\section{Resonance identification}\label{sec-analytic-structure}

When we visualise measured cross sections as a function of energy, we
often observe sharp peaks or dips at specific energies. An example is
shown in Figure~\ref{fig-pion-nucleon-cross-section}, which displays the
differential cross section for three backward-angle pion--nucleon
scattering processes {(\(\pi^+p \to \pi^+p\),} and
\(\pi^-p \to \pi^-p\), and {\(\pi^-p \to \pi^0n\)).} The curves
represent fitted amplitude analyses that combine data from several
pion--proton scattering
experiments~{[}\citeproc{ref-Cutkosky:1979zv}{119}{]}. The observed
structures reflect the underlying dynamics of the strong interaction.
Scattering experiments are therefore like probing a bell, where the
peaks correspond to the characteristic frequencies at which the bell
resonates. The width of these peaks indicates how long the bell rings
before returning to equilibrium, which in the scattering case is related
to the lifetime of the excited state. In hadron physics, such structures
are interpreted as \textbf{resonances}~-- unstable states that exist for
a finite time before decaying into other particles.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/cutkosky-cross-section-light-left.pdf}}\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/cutkosky-cross-section-light-right.pdf}}\end{minipage}%

\caption{\label{fig-pion-nucleon-cross-section}Differential cross
sections~\(\mathrm{d}\sigma/\mathrm{d}\Omega\) for three different
pion--nucleon scattering processes at the backward scattering
angle~(\(\theta=180^\circ\)). Shown are two fitted solutions based on
amalgamated data from several pion--proton scattering experiments.
Adapted from {[}\citeproc{ref-Cutkosky:1979zv}{119, Fig.~10}{]}. }

\end{figure}%

Equation~\eqref{eq-differential-cross-section} allows us to relate the
observable cross section distribution to the matrix elements
\(\mathcal{M}_{\!\beta\alpha}\) and
Equation~\eqref{eq-partial-wave-expansion} helps us to further split up
the cross section into partial-wave {amplitudes~\(a^{(J)}(s)\)} for each
total angular {momentum~\(J\).} The bumps will now only appear in
certain total angular momentum channels, which we can identify by
looking at the phase shifts \(\delta(s)\) of the partial-wave
amplitudes. This suggests that the resonances are actual particles with
an intrinsic spin that couples to that total angular momentum.

In certain processes, such as pion--nucleon scattering, one can go
beyond spin and angular momentum and also extract the isospin of the
resonances. The individual charge channels shown in
Figure~\ref{fig-pion-nucleon-cross-section} are not themselves states of
definite isospin, but fixed linear combinations of the
\(I=\tfrac{1}{2}\) and \(I=\tfrac{3}{2}\) amplitudes. A partial-wave
analysis of a single channel therefore cannot separate the isospin
components. Only by fitting the elastic reactions \(\pi^+p\) and
\(\pi^-p\) together with the charge-exchange channel \(\pi^-p\to\pi^0n\)
can one extract information about the isospin amplitudes. This
coupled-channel treatment makes it possible to disentangle the isospin
structure of the partial waves and to assign resonances their total
isospin.

For \(\pi N\) scattering the situation is relatively simple, since the
initial state can only be in an \(I=\tfrac{1}{2}\) or \(I=\tfrac{3}{2}\)
configuration. The relation between the observable charge channels and
the isospin amplitudes is \[
\begin{aligned}
\pi^+ p \to \pi^+ p \; &: \; A_{3/2} \\
\pi^- p \to \pi^- p \; &: \; \tfrac{1}{3} A_{3/2} + \tfrac{2}{3} A_{1/2} \\
\pi^- p \to \pi^0 n \; &: \; \tfrac{\sqrt{2}}{3}\left(A_{3/2} - A_{1/2}\right) \;,
\end{aligned}
\]

\noindent where \(A_{1/2}\) and \(A_{3/2}\) denote the partial-wave
amplitudes with definite isospin. While the details of this isospin
decomposition are beyond the scope of this work, it helps to understand
what certain partial-wave labels mean and how these waves are extracted.
For example, the {\(P_{33}\)‑wave} (Figure~\ref{fig-pion-nucleon-p33})
denotes for a partial wave with orbital angular momentum~\(\ell=1\),
isospin~\(I=\tfrac{3}{2}\), and total angular
momentum~\(J=\tfrac{3}{2}\), and how they are extracted from total
differential cross sections. Similarly, the {\(D_{15}\)‑wave}
corresponds to \(\ell=2\), \(I=\tfrac{1}{2}\), and \(J=\tfrac{5}{2}\).
The scheme follows spectroscopic letter notation \(S,P,D,F,\dots\) for
orbital angular momentum~\(\ell=0,1,2,3,\dots\).

Figure~\ref{fig-pion-nucleon-p33} shows the imaginary and real parts of
the {\(P_{33}\)‑wave} obtained from the pion--nucleon cross sections of
Figure~\ref{fig-pion-nucleon-cross-section}~{[}\citeproc{ref-Cutkosky:1980rh}{120}{]}.
The prominent peak {around~\(1.23\ \text{GeV}\)} and the zero-crossing
of the imaginary part reveals the
{\href{https://pdglive.lbl.gov/Particle.action?init=0&node=B033&home=BXXX010}{\(\varDelta(1232)\)}~resonance}
with quantum numbers
\(I\left(J^P\right)=\tfrac{3}{2}\left(\tfrac{3}{2}^+\right)\). This is a
striking example of how resonances emerge from the partial-wave
amplitudes: once hidden in the energy spectrum, they stand out clearly
in the complex amplitude. The remainder of this section introduces the
techniques that make such extractions possible.

\begin{figure}

\centering{

\includegraphics[width=0.9\linewidth,height=\textheight,keepaspectratio]{index_files/mediabag/images/chapter2/cutkosky-p33-light.pdf}

}

\caption{\label{fig-pion-nucleon-p33}Real and imaginary part of the
{\(P_{33}\)‑wave} amplitude that was extracted from the pion--nucleon
scattering cross section in Figure~\ref{fig-pion-nucleon-cross-section}.
The position of the peak of one of the three bumps is highlighted in
red. Adapted from {[}\citeproc{ref-Cutkosky:1980rh}{120, Fig.~3}{]}. }

\end{figure}%

\subsection{Breit--Wigner parametrisation}\label{sec-breit-wigner}

To model the shape of a resonance, we need a function that captures both
the peak structure and a width that is associated with the lifetime of
the resonance. A simple but remarkably effective parametrisation is the
\textbf{Breit--Wigner function}~{[}\citeproc{ref-Breit:1936zzb}{121}{]},
which describes the relativistic scattering amplitude near a resonance
as a function of {energy~\(s\),}

\begin{equation}\phantomsection\label{eq-breit-wigner}{
a(s) \; \cong \; \frac{1}{M_R^2 - i M_R \Gamma_R - s} \,,
}\end{equation}

\noindent where \(M_R\) is the mass of the resonance and \(\Gamma_R\)
its total decay width. The numerator often includes a scaling factor or
is normalised to the peak by setting it equal to \(M_R\Gamma_R\), but
these factors are left out here (indicated {by~\(\cong\)).} This
functional form mirrors the response of a driven, damped harmonic
oscillator~-- a system that resonates when driven near its natural
frequency but loses energy due to damping. Similarly, the Breit--Wigner
function reflects how the system ``rings'' in response to a scattering
event and then decays.

Figure~\ref{fig-breit-wigner} visualises the Breit--Wigner function
through its modulus squared, real and imaginary parts, and the
associated phase. The resonance appears most clearly in the left panel,
where the modulus \(|a_J|^2\) forms its characteristic peak at
\(s = M_R^2\) with a finite width controlled by the imaginary term
\(iM_R\Gamma_R\) in the denominator. The \textbf{Argand diagram} in the
middle plots \(\operatorname{Im}a_J\) against \(\operatorname{Re}a_J\)
to show how an isolated Breit--Wigner traces out a circle, thereby
preserving unitarity with {inelasticity~\(\eta=1\).} The same diagram
also highlights the connection between the phase {shift~\(\delta(s)\)}
of Equation~\eqref{eq-phase-shift} and the modulus of the amplitude. The
right panel shows that the corresponding phase {shift~\(\delta(s)\)}
undergoes a rapid increase by approximately \(\pi\) across the resonance
region, which indicates a relative time delay of the outgoing wave.

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ os}

\ImportTok{import}\NormalTok{ matplotlib.pyplot }\ImportTok{as}\NormalTok{ plt}
\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np}
\ImportTok{from}\NormalTok{ matplotlib }\ImportTok{import}\NormalTok{ patches}

\NormalTok{plt.ioff()}
\NormalTok{plt.rc(}\StringTok{"font"}\NormalTok{, family}\OperatorTok{=}\StringTok{"serif"}\NormalTok{, serif}\OperatorTok{=}\StringTok{"Helvetica"}\NormalTok{, size}\OperatorTok{=}\DecValTok{13}\NormalTok{)}
\NormalTok{plt.rc(}\StringTok{"mathtext"}\NormalTok{, fontset}\OperatorTok{=}\StringTok{"dejavusans"}\NormalTok{)}
\NormalTok{plt.rc(}\StringTok{"text"}\NormalTok{, usetex}\OperatorTok{=}\VariableTok{True}\NormalTok{)}

\KeywordTok{def}\NormalTok{ breit\_wigner(s, m0, w0):}
    \ControlFlowTok{return} \DecValTok{1} \OperatorTok{/}\NormalTok{ (m0}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \OtherTok{1j} \OperatorTok{*}\NormalTok{ m0 }\OperatorTok{*}\NormalTok{ w0 }\OperatorTok{{-}}\NormalTok{ s)}


\KeywordTok{def}\NormalTok{ bw\_delta(s, m0, w0):}
\NormalTok{    bw }\OperatorTok{=}\NormalTok{ breit\_wigner(s, m0, w0)}
\NormalTok{    norm }\OperatorTok{=}\NormalTok{ np.}\BuiltInTok{abs}\NormalTok{(breit\_wigner(m0}\OperatorTok{**}\DecValTok{2}\NormalTok{, m0, w0))}
    \ControlFlowTok{return}\NormalTok{ np.angle(}\DecValTok{1} \OperatorTok{+} \OtherTok{2j} \OperatorTok{*}\NormalTok{ bw }\OperatorTok{/}\NormalTok{ norm) }\OperatorTok{/} \DecValTok{2}


\NormalTok{m0 }\OperatorTok{=} \FloatTok{1.0}
\NormalTok{Γ}\DecValTok{0} \OperatorTok{=} \FloatTok{0.25}
\NormalTok{R }\OperatorTok{=} \FloatTok{0.55}
\NormalTok{s }\OperatorTok{=}\NormalTok{ np.linspace(}\DecValTok{0}\NormalTok{, }\DecValTok{2}\NormalTok{, num}\OperatorTok{=}\DecValTok{1000}\NormalTok{)}
\NormalTok{bw }\OperatorTok{=}\NormalTok{ breit\_wigner(s, m0, Γ}\DecValTok{0}\NormalTok{)}

\NormalTok{fig, axes }\OperatorTok{=}\NormalTok{ plt.subplots(figsize}\OperatorTok{=}\NormalTok{(}\DecValTok{7}\NormalTok{, }\FloatTok{2.1}\NormalTok{), ncols}\OperatorTok{=}\DecValTok{3}\NormalTok{)}
\NormalTok{fig.subplots\_adjust(bottom}\OperatorTok{=}\DecValTok{0}\NormalTok{, left}\OperatorTok{=}\DecValTok{0}\NormalTok{, right}\OperatorTok{=}\DecValTok{1}\NormalTok{, top}\OperatorTok{=}\DecValTok{1}\NormalTok{, wspace}\OperatorTok{=}\FloatTok{0.12}\NormalTok{)}
\NormalTok{ax1, ax2, ax3 }\OperatorTok{=}\NormalTok{ axes}
\NormalTok{fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes:}
\NormalTok{    ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"left"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}

\NormalTok{ax1.axvline(m0}\OperatorTok{**}\DecValTok{2}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dashed"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{, zorder}\OperatorTok{={-}}\DecValTok{10}\NormalTok{)}
\NormalTok{ax1.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{m0}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \FloatTok{0.05}\NormalTok{,}
\NormalTok{    y}\OperatorTok{={-}}\FloatTok{0.5}\NormalTok{,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$M\_R\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"top"}
\NormalTok{)}
\NormalTok{ax1.plot(s, np.}\BuiltInTok{abs}\NormalTok{(R }\OperatorTok{*}\NormalTok{ bw)}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, label}\OperatorTok{=}\StringTok{"$|a\_}\SpecialCharTok{\{\_J\}}\StringTok{|\^{}2$"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax1.plot(s, R }\OperatorTok{*}\NormalTok{ bw.real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, label}\OperatorTok{=}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},a\_}\SpecialCharTok{\{\_J\}}\VerbatimStringTok{$"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax1.plot(s, R }\OperatorTok{*}\NormalTok{ bw.imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, label}\OperatorTok{=}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a\_}\SpecialCharTok{\{\_J\}}\VerbatimStringTok{$"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax1.legend(}
\NormalTok{    bbox\_to\_anchor}\OperatorTok{=}\NormalTok{(}\FloatTok{0.65}\NormalTok{, }\FloatTok{1.0}\NormalTok{),}
\NormalTok{    handlelength}\OperatorTok{=}\DecValTok{1}\NormalTok{,}
\NormalTok{    loc}\OperatorTok{=}\StringTok{"upper left"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax1.set\_xlabel(}\StringTok{"$s$"}\NormalTok{)}
\NormalTok{ax1.xaxis.set\_label\_coords(}\FloatTok{0.99}\NormalTok{, }\FloatTok{0.21}\NormalTok{)}
\NormalTok{ax1.set\_xticks([])}
\NormalTok{ax1.set\_yticks([])}

\NormalTok{sc }\OperatorTok{=}\NormalTok{ ax2.scatter(bw.real, bw.imag, c}\OperatorTok{=}\NormalTok{s, cmap}\OperatorTok{=}\StringTok{"cividis"}\NormalTok{, s}\OperatorTok{=}\DecValTok{8}\NormalTok{, edgecolors}\OperatorTok{=}\StringTok{"none"}\NormalTok{)}
\NormalTok{bw\_R }\OperatorTok{=}\NormalTok{ breit\_wigner(m0}\OperatorTok{**}\DecValTok{2}\NormalTok{, m0, Γ}\DecValTok{0}\NormalTok{)}
\NormalTok{ax2.scatter([bw\_R.real], [bw\_R.imag], c}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, s}\OperatorTok{=}\DecValTok{30}\NormalTok{)}
\NormalTok{ax2.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{bw\_R.real }\OperatorTok{+} \FloatTok{0.12}\NormalTok{,}
\NormalTok{    y}\OperatorTok{=}\NormalTok{bw\_R.imag }\OperatorTok{+} \FloatTok{0.05}\NormalTok{,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$s=M\_R\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"left"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"bottom"}
\NormalTok{)}
\NormalTok{s\_a }\OperatorTok{=} \FloatTok{0.85}
\NormalTok{bw\_a }\OperatorTok{=}\NormalTok{ breit\_wigner(s\_a, m0, Γ}\DecValTok{0}\NormalTok{)}
\NormalTok{delta\_a }\OperatorTok{=}\NormalTok{ bw\_delta(s\_a, m0, Γ}\DecValTok{0}\NormalTok{)}
\NormalTok{ax2.plot(}
\NormalTok{    [}\DecValTok{0}\NormalTok{, bw\_a.real],}
\NormalTok{    [bw\_R.imag }\OperatorTok{/} \DecValTok{2}\NormalTok{, bw\_a.imag],}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#BB5566"}\NormalTok{,}
\NormalTok{)}
\NormalTok{arc }\OperatorTok{=}\NormalTok{ patches.Arc(}
\NormalTok{    xy}\OperatorTok{=}\NormalTok{(}\DecValTok{0}\NormalTok{, bw\_R.imag }\OperatorTok{/} \DecValTok{2}\NormalTok{),}
\NormalTok{    angle}\OperatorTok{={-}}\DecValTok{90}\NormalTok{,}
\NormalTok{    height}\OperatorTok{=}\FloatTok{0.4} \OperatorTok{*}\NormalTok{ bw\_R.imag,}
\NormalTok{    width}\OperatorTok{=}\FloatTok{0.4} \OperatorTok{*}\NormalTok{ bw\_R.imag,}
\NormalTok{    theta2}\OperatorTok{=}\DecValTok{2} \OperatorTok{*}\NormalTok{ np.rad2deg(delta\_a),}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#BB5566"}\NormalTok{,}
\NormalTok{    linewidth}\OperatorTok{=}\DecValTok{2}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax2.add\_patch(arc)}
\NormalTok{ax2.text(}
\NormalTok{    x}\OperatorTok{=}\FloatTok{0.12} \OperatorTok{*}\NormalTok{ bw\_a.imag,}
\NormalTok{    y}\OperatorTok{=}\FloatTok{0.58} \OperatorTok{*}\NormalTok{ bw\_a.imag,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$2\textbackslash{}delta$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#BB5566"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax2.text(}
\NormalTok{    x}\OperatorTok{=}\FloatTok{0.92} \OperatorTok{*}\NormalTok{ (bw\_a.real }\OperatorTok{/} \DecValTok{2}\NormalTok{),}
\NormalTok{    y}\OperatorTok{=}\FloatTok{1.14} \OperatorTok{*}\NormalTok{ (bw\_a.imag }\OperatorTok{/} \DecValTok{2} \OperatorTok{+}\NormalTok{ bw\_R.imag }\OperatorTok{/} \DecValTok{4}\NormalTok{),}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$\textbackslash{}eta\textbackslash{}!=\textbackslash{}!1$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#BB5566"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    rotation}\OperatorTok{=}\DecValTok{26}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax2.arrow(}
\NormalTok{    x}\OperatorTok{=}\DecValTok{0}\NormalTok{,}
\NormalTok{    y}\OperatorTok{=}\DecValTok{0}\NormalTok{,}
\NormalTok{    dx}\OperatorTok{=}\NormalTok{bw\_a.real,}
\NormalTok{    dy}\OperatorTok{=}\NormalTok{bw\_a.imag,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{,}
\NormalTok{    head\_length}\OperatorTok{=}\FloatTok{0.15}\NormalTok{,}
\NormalTok{    head\_width}\OperatorTok{=}\FloatTok{0.08}\NormalTok{,}
\NormalTok{    length\_includes\_head}\OperatorTok{=}\VariableTok{True}\NormalTok{,}
\NormalTok{    linewidth}\OperatorTok{=}\DecValTok{2}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax2.set\_aspect(}\StringTok{"equal"}\NormalTok{)}
\NormalTok{ax2.set\_xlabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},a\_}\SpecialCharTok{\{\_J\}}\VerbatimStringTok{$"}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{)}
\NormalTok{ax2.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a\_}\SpecialCharTok{\{\_J\}}\VerbatimStringTok{$"}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{)}
\NormalTok{ax2.set\_xticks([])}
\NormalTok{ax2.set\_yticks([])}
\NormalTok{cbar }\OperatorTok{=}\NormalTok{ fig.colorbar(sc, ax}\OperatorTok{=}\NormalTok{ax2, pad}\OperatorTok{=}\DecValTok{0}\NormalTok{, shrink}\OperatorTok{=}\FloatTok{0.6}\NormalTok{)}
\NormalTok{cbar.ax.set\_title(}\StringTok{"$s$"}\NormalTok{)}
\NormalTok{cbar.ax.set\_yticks([])}

\NormalTok{ax3.scatter(s, bw\_delta(s, m0, Γ}\DecValTok{0}\NormalTok{), c}\OperatorTok{=}\NormalTok{s, cmap}\OperatorTok{=}\StringTok{"cividis"}\NormalTok{, s}\OperatorTok{=}\DecValTok{8}\NormalTok{, edgecolors}\OperatorTok{=}\StringTok{"none"}\NormalTok{)}
\NormalTok{ax3.axhline(}\OperatorTok{{-}}\NormalTok{np.pi }\OperatorTok{/} \DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{0.3}\NormalTok{)}
\NormalTok{ax3.axhline(}\OperatorTok{+}\NormalTok{np.pi }\OperatorTok{/} \DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{0.3}\NormalTok{)}
\NormalTok{ax3.axvline(m0}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dashed"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{, zorder}\OperatorTok{={-}}\DecValTok{10}\NormalTok{)}
\NormalTok{ax3.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{m0}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \FloatTok{0.05}\NormalTok{,}
\NormalTok{    y}\OperatorTok{={-}}\FloatTok{0.02} \OperatorTok{*}\NormalTok{ np.pi,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$M\_R\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"top"}
\NormalTok{)}
\NormalTok{ax3.set\_xlabel(}\StringTok{"$s$"}\NormalTok{)}
\NormalTok{ax3.xaxis.set\_label\_coords(}\FloatTok{0.99}\NormalTok{, }\FloatTok{0.5}\NormalTok{)}
\NormalTok{ax3.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}delta(s)$"}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#BB5566"}\NormalTok{, labelpad}\OperatorTok{={-}}\DecValTok{8}\NormalTok{)  }\CommentTok{\# cspell:ignore labelpad}
\NormalTok{ax3.set\_xticks([])}
\NormalTok{ax3.set\_yticks([}\OperatorTok{{-}}\NormalTok{np.pi }\OperatorTok{/} \DecValTok{2}\NormalTok{, }\DecValTok{0}\NormalTok{, }\OperatorTok{+}\NormalTok{np.pi }\OperatorTok{/} \DecValTok{2}\NormalTok{])}
\NormalTok{ax3.set\_yticklabels([}\VerbatimStringTok{R"${-}\textbackslash{}frac\{\textbackslash{}pi\}}\SpecialCharTok{\{2\}}\VerbatimStringTok{$"}\NormalTok{, }\StringTok{"$0$"}\NormalTok{, }\VerbatimStringTok{R"$+\textbackslash{}frac\{\textbackslash{}pi\}}\SpecialCharTok{\{2\}}\VerbatimStringTok{$"}\NormalTok{])}

\NormalTok{plt.show(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}[H]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-breit-wigner-output-1.pdf}}

}

\caption{\label{fig-breit-wigner}Visualisation of the real and imaginary
parts, the modulus, and the phase of the relativistic Breit--Wigner
function of Equation~\eqref{eq-breit-wigner}, with the
{position~\(M_R\)} of the resonance indicated in red.}

\end{figure}%

The width \(\Gamma_R\) in Equation~\eqref{eq-breit-wigner} is currently
treated as a constant. However, since the width is related to decay
probability per unit time, it should depend on the available phase space
for the decay products. As the total {energy~\(s\)} increases, the decay
products carry more momentum and the phase space volume grows. This
implies that the width should not be treated as a constant, but should
instead vary with \(s\). For a resonance decaying to two particles \(C\)
and \(D\), this energy dependence is therefore often encoded with an
\textbf{energy-dependent width} by replacing \(\Gamma_R\) in
Equation~\eqref{eq-breit-wigner} with

\begin{equation}\phantomsection\label{eq-energy-dependent-width}{
\Gamma_\ell(s) \;=  \;\Gamma_R
\frac{\rho(s)}{\rho(M_R^2)}
\frac{n_\ell^2\left(q^2(s)/q_0^2\right)}{n_\ell^2\left(q^2(M_R^2)/q_0^2\right)}
\,,
}\end{equation}

\noindent with phase space {factor~\(\rho\)} and breakup
{momentum~\(q\)} as defined in
Equation~\eqref{eq-phase-space-factor-and-breakup-momentum} at total
{energy~\(s\)} or squared {mass~\(M_R^2\),} \(\ell\) the orbital angular
momentum between \(C\) and \(D\), \(n_\ell\) a factor that encodes
angular-momentum suppression near threshold, and \(1/q_0\) a scaling
parameter that typically lies in the range
{\(1 \sim 5\text{ GeV}^{-1}\)~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66,
§50}{]}.} For brevity, we often shorten notation with
\(n_\ell(s) \equiv n_\ell(q^2(s)/q_0^2)\).

The factors \(n_\ell\) are often called \textbf{centrifugal barrier
factor} and they arise because partial waves with higher angular
momentum are suppressed~{[}\citeproc{ref-Perl:1974-HadronPhysics}{122,
§5--10}{]} when the decay products have low relative momentum (more on
that in Section~\ref{sec-vertex-parametrisation}). The barrier factor is
usually parametrised with a (unitless, normalised) Blatt--Weisskopf
formula via

\begin{equation}\phantomsection\label{eq-barrier-factor}{
\begin{aligned}
n_\ell^2(x^2) \;&=\;
  \frac{\left|h^{(1)}_\ell(1)\right|^2}{x^2\left|h^{(1)}_\ell(x)\right|^2} \\
h_\ell^{(1)}(x) \;&=\;
  \left(- i\right)^{\ell+1}
  \frac{e^{ix}}{x}
  \sum_{k=0}^\ell
    \frac{(\ell+k)!}{(\ell-k)! \, k!}
    \left(\frac{i}{2x}\right)^k \,,
\end{aligned}
}\end{equation}

\noindent where \(h_\ell^{(1)}\) are the Hankel functions of the first
kind, which can be written in this polynomial form if its
{argument~\(x\)} is real~{[}\citeproc{ref-VonHippel:1972fg}{123,
pp.~626, 637}{]}. This is the general form of the
\textbf{Blatt--Weisskopf factors} that
\href{https://compwa.github.io/report/029}{leads to} the specific cases
that are listed in most literature,

\[
n_\ell^2(x^2) \;=\;
\begin{cases}
    1 & \text{for } \ell = 0 \\
    \frac{2x^2}{x^2+1} & \text{for } \ell = 1 \\
    \frac{13x^4}{x^4+3x^2+9} & \text{for } \ell = 2 \\
    \cdots \; .
\end{cases}
\]

Figure~\ref{fig-breit-wigner-energy-dependent-width} shows that a
Breit--Wigner with energy-dependent width already captures several
important decay-specific features. Near threshold, where \(q(s) \to 0\),
the width vanishes as the phase space closes, which introduces an
asymmetry in the lineshape. The parametrisation is now also sensitive to
the orbital momentum, which offers a handle to select the dominant
partial wave through the damping factor. To examine whether this
parametrisation respects Equation~\eqref{eq-unitarity-partial-wave}, the
Argand diagram in Figure~\ref{fig-breit-wigner-energy-dependent-width}
plots the product \(\rho_\ell(s)\,a_\ell(s)\), with
\(\rho_\ell(s) \equiv \rho(s)\,n_\ell^2(s)\), rather than the amplitude
\(a_\ell(s)\) itself~{[}\citeproc{ref-Briceno:2017qmb}{124}{]}. This
shows that the parametrisation with energy-dependent width still
preserves unitarity for each angular {momentum~\(\ell\).}

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ typing }\ImportTok{import}\NormalTok{ Any}

\ImportTok{import}\NormalTok{ sympy }\ImportTok{as}\NormalTok{ sp}
\ImportTok{from}\NormalTok{ ampform.dynamics }\ImportTok{import}\NormalTok{ EnergyDependentWidth}
\ImportTok{from}\NormalTok{ ampform.dynamics.form\_factor }\ImportTok{import}\NormalTok{ FormFactor}
\ImportTok{from}\NormalTok{ ampform.sympy }\ImportTok{import}\NormalTok{ unevaluated}


\AttributeTok{@unevaluated}\NormalTok{(real}\OperatorTok{=}\VariableTok{False}\NormalTok{)}
\KeywordTok{class}\NormalTok{ PhaseSpaceFactor(sp.Expr):}
\NormalTok{    s: Any}
\NormalTok{    m1: Any}
\NormalTok{    m2: Any}
\NormalTok{    \_latex\_repr\_ }\OperatorTok{=} \VerbatimStringTok{R"\textbackslash{}rho\_}\SpecialCharTok{\{\{\{m1\}}\VerbatimStringTok{,}\SpecialCharTok{\{m2\}\}\}}\VerbatimStringTok{\textbackslash{}left(}\SpecialCharTok{\{s\}}\VerbatimStringTok{\textbackslash{}right)"}

    \KeywordTok{def}\NormalTok{ evaluate(}\VariableTok{self}\NormalTok{) }\OperatorTok{{-}\textgreater{}}\NormalTok{ sp.Expr:}
\NormalTok{        s, m1, m2 }\OperatorTok{=} \VariableTok{self}\NormalTok{.args}
        \ControlFlowTok{return}\NormalTok{ sp.sqrt(s }\OperatorTok{{-}}\NormalTok{ (m1 }\OperatorTok{{-}}\NormalTok{ m2)}\OperatorTok{**}\DecValTok{2}\NormalTok{) }\OperatorTok{*}\NormalTok{ sp.sqrt(s }\OperatorTok{{-}}\NormalTok{ (m1 }\OperatorTok{+}\NormalTok{ m2)}\OperatorTok{**}\DecValTok{2}\NormalTok{) }\OperatorTok{/}\NormalTok{ s}


\NormalTok{np.seterr(}\BuiltInTok{all}\OperatorTok{=}\StringTok{"ignore"}\NormalTok{)}

\NormalTok{m1 }\OperatorTok{=} \FloatTok{0.3}
\NormalTok{m2 }\OperatorTok{=} \FloatTok{0.4}
\NormalTok{s\_symbol }\OperatorTok{=}\NormalTok{ sp.Symbol(}\StringTok{"s"}\NormalTok{, nonnegative}\OperatorTok{=}\VariableTok{True}\NormalTok{, real}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{L }\OperatorTok{=}\NormalTok{ sp.Symbol(}\StringTok{"L"}\NormalTok{, integer}\OperatorTok{=}\VariableTok{True}\NormalTok{, positive}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{width }\OperatorTok{=}\NormalTok{ EnergyDependentWidth(}
\NormalTok{    s}\OperatorTok{=}\NormalTok{s\_symbol,}
\NormalTok{    mass0}\OperatorTok{=}\NormalTok{m0,}
\NormalTok{    gamma0}\OperatorTok{=}\NormalTok{Γ}\DecValTok{0}\NormalTok{,}
\NormalTok{    m\_a}\OperatorTok{=}\NormalTok{m1,}
\NormalTok{    m\_b}\OperatorTok{=}\NormalTok{m2,}
\NormalTok{    angular\_momentum}\OperatorTok{=}\NormalTok{L,}
\NormalTok{    meson\_radius}\OperatorTok{=}\DecValTok{1}\NormalTok{,}
\NormalTok{)}
\NormalTok{bw\_expr }\OperatorTok{=} \DecValTok{1} \OperatorTok{/}\NormalTok{ (m0}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ sp.I }\OperatorTok{*}\NormalTok{ m0 }\OperatorTok{*}\NormalTok{ width }\OperatorTok{{-}}\NormalTok{ s\_symbol)}
\NormalTok{rho\_l }\OperatorTok{=}\NormalTok{ (}
\NormalTok{    PhaseSpaceFactor(s\_symbol, m1, m2)}
    \OperatorTok{*}\NormalTok{ FormFactor(s\_symbol, m1, m2, L, meson\_radius}\OperatorTok{=}\DecValTok{1}\NormalTok{)}\OperatorTok{**}\DecValTok{2}
\NormalTok{)}
\NormalTok{bw\_func }\OperatorTok{=}\NormalTok{ sp.lambdify((s\_symbol, L), bw\_expr.doit())}
\NormalTok{rho\_func }\OperatorTok{=}\NormalTok{ sp.lambdify((s\_symbol, L), rho\_l.doit())}
\NormalTok{s\_thr }\OperatorTok{=}\NormalTok{ (m1 }\OperatorTok{+}\NormalTok{ m2)}\OperatorTok{**}\DecValTok{2}
\NormalTok{x }\OperatorTok{=}\NormalTok{ np.linspace(s\_thr, }\FloatTok{2.0}\NormalTok{, num}\OperatorTok{=}\DecValTok{1000}\NormalTok{)}

\NormalTok{fig, axes }\OperatorTok{=}\NormalTok{ plt.subplots(figsize}\OperatorTok{=}\NormalTok{(}\DecValTok{6}\NormalTok{, }\FloatTok{2.25}\NormalTok{), gridspec\_kw}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(width\_ratios}\OperatorTok{=}\NormalTok{[}\DecValTok{2}\NormalTok{, }\DecValTok{1}\NormalTok{]), ncols}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax1, ax2 }\OperatorTok{=}\NormalTok{ axes}
\NormalTok{fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes:}
\NormalTok{    ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"left"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}

\NormalTok{ax1.axvline(s\_thr, color}\OperatorTok{=}\StringTok{"\#004488"}\NormalTok{, linestyle}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{)}
\NormalTok{ax1.axvline(m0}\OperatorTok{**}\DecValTok{2}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, linestyle}\OperatorTok{=}\StringTok{"dashed"}\NormalTok{)}
\NormalTok{ax1.plot(s, np.}\BuiltInTok{abs}\NormalTok{(bw)}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, label}\OperatorTok{=}\StringTok{"BW"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ell }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(}\DecValTok{3}\NormalTok{):}
\NormalTok{    z }\OperatorTok{=}\NormalTok{ bw\_func(x, ell)}
\NormalTok{    ax1.plot(x, np.}\BuiltInTok{abs}\NormalTok{(z)}\OperatorTok{**}\DecValTok{2}\NormalTok{, label}\OperatorTok{=}\VerbatimStringTok{Rf"$\textbackslash{}ell=}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\VerbatimStringTok{$"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax1.legend(}
\NormalTok{    bbox\_to\_anchor}\OperatorTok{=}\NormalTok{(}\FloatTok{0.68}\NormalTok{, }\FloatTok{0.65}\NormalTok{),}
\NormalTok{    handlelength}\OperatorTok{=}\DecValTok{1}\NormalTok{,}
\NormalTok{    loc}\OperatorTok{=}\StringTok{"center left"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax1.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{s\_thr,}
\NormalTok{    y}\OperatorTok{={-}}\FloatTok{0.15}\NormalTok{,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$(m\_C+m\_D)\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#004488"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"top"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax1.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{m0}\OperatorTok{**}\DecValTok{2}\NormalTok{,}
\NormalTok{    y}\OperatorTok{={-}}\FloatTok{0.15}\NormalTok{,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$M\_R\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"top"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax1.set\_xlabel(}\StringTok{"$s$"}\NormalTok{)}
\NormalTok{ax1.xaxis.set\_label\_coords(}\FloatTok{0.97}\NormalTok{, }\OperatorTok{{-}}\FloatTok{0.01}\NormalTok{)}
\NormalTok{ax1.set\_ylabel(}\StringTok{"$|a\_}\SpecialCharTok{\{\_J\}}\StringTok{|\^{}2$"}\NormalTok{)}
\NormalTok{ax1.set\_xticks([}\DecValTok{0}\NormalTok{])}
\NormalTok{ax1.set\_yticks([])}
\NormalTok{ax1.set\_xlim(}\DecValTok{0}\NormalTok{, x.}\BuiltInTok{max}\NormalTok{())}
\NormalTok{ax1.set\_ylim(}\DecValTok{0}\NormalTok{, }\VariableTok{None}\NormalTok{)}

\NormalTok{l\_max }\OperatorTok{=} \DecValTok{3}
\ControlFlowTok{for}\NormalTok{ ell }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(l\_max):}
\NormalTok{    z }\OperatorTok{=}\NormalTok{ rho\_func(x, ell) }\OperatorTok{*}\NormalTok{ bw\_func(x, ell)}
\NormalTok{    z }\OperatorTok{/=}\NormalTok{ np.nanmax(z.imag)  }\CommentTok{\# cspell:ignore nanmax}
\NormalTok{    ax2.plot(z.real, z.imag, label}\OperatorTok{=}\VerbatimStringTok{Rf"$\textbackslash{}ell=}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\VerbatimStringTok{$"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax2.set\_aspect(}\StringTok{"equal"}\NormalTok{)}
\NormalTok{ax2.set\_xlabel(}\VerbatimStringTok{R"$\textbackslash{}rho\_\textbackslash{}ell\textbackslash{},\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},a\_}\SpecialCharTok{\{\_J\}}\VerbatimStringTok{$"}\NormalTok{)}
\NormalTok{ax2.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}rho\_\textbackslash{}ell\textbackslash{},\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a\_}\SpecialCharTok{\{\_J\}}\VerbatimStringTok{$"}\NormalTok{)}
\NormalTok{ax2.set\_xticks([])}
\NormalTok{ax2.set\_yticks([])}

\NormalTok{fig.tight\_layout()}
\NormalTok{plt.show(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}[H]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-breit-wigner-energy-dependent-width-output-1.pdf}}

}

\caption{\label{fig-breit-wigner-energy-dependent-width}Breit--Wigner
parametrisation with energy-dependent {width~\(\Gamma_\ell(s)\)} for a
{resonance~\(R\to CD\)} in different orbital angular {momenta~\(\ell\).}
Left: squared amplitudes \(|a_\ell|^2\) as a function of {energy~\(s\).}
Right: Argand representation {of~\(\rho_\ell(s)\,a_\ell(s)\).}}

\end{figure}%

\subsection{Vertex parametrisation}\label{sec-vertex-parametrisation}

The appearance of decay-specific parameters in the resonance
parametrisation suggests a broader physical interpretation: the resonant
amplitude can be viewed as the product of two interaction vertices and
an intermediate propagator. This picture is already implicit in the
Feynman diagram for the {\(s\)‑channel} of a 2-to-2 scattering process
shown in Figure~\ref{fig-mandelstam-variables}: the intermediate
{particle~\(R\)} is first produced in the \(AB \to R\) subprocess, and
then decays via \(R \to CD\). The Breit--Wigner function introduced in
Equation~\eqref{eq-breit-wigner} represents the \textbf{resonance
propagator} (the denominator of the amplitude), but the
\textbf{interaction vertices} remain to be modelled explicitly. This
leads to a more general form of the amplitude,

\begin{equation}\phantomsection\label{eq-breit-wigner-vertex}{
a^{(J)}_{\beta\alpha}(s) \cong \frac{n_\beta(s)\,n_\alpha(s)}{M_R^2 - i M_R \Gamma_{\ell_\beta}(s) - s} \,.
}\end{equation}

The vertex functions \(n_\alpha\) and \(n_\beta\) describe how the
resonance couples to the initial and final state as a function of \(s\).
In analogy to the energy-dependent width, they are often modelled with
barrier or damping factors like the Blatt--Weisskopf factor of
Equation~\eqref{eq-barrier-factor}, with orbital angular momentum
\(\ell_\alpha\) for \(AB\) and \(\ell_\beta\) for \(CD\) (see left panel
in Figure~\ref{fig-barrier-factor-effect}). Note that \(\ell_\alpha\)
and \(\ell_\beta\) can be different if the initial or final state
contains particles with spin, because they couple differently to the
total orbital momentum~\(J\) of the partial-wave expansion. The right
panel in Figure~\ref{fig-barrier-factor-effect} shows the suppressive
effect by barrier factors with \(\ell_\alpha=0,\ell_\beta=1\) on a
Breit--Wigner with energy-dependent width. We will see later why the
barrier factor that appears in the energy-dependent width of
Equation~\eqref{eq-energy-dependent-width} comes from the outgoing
vertex.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{ff\_out }\OperatorTok{=}\NormalTok{ FormFactor(s\_symbol, m1, m2, L)}
\NormalTok{ff\_bw\_expr }\OperatorTok{=}\NormalTok{ ff\_out }\OperatorTok{*}\NormalTok{ bw\_expr}
\NormalTok{ff\_bw\_func }\OperatorTok{=}\NormalTok{ sp.lambdify((s\_symbol, L), ff\_bw\_expr.doit())}
\NormalTok{x }\OperatorTok{=}\NormalTok{ np.linspace(s\_thr, }\FloatTok{2.1}\NormalTok{, num}\OperatorTok{=}\DecValTok{1000}\NormalTok{)}

\NormalTok{fig, ax }\OperatorTok{=}\NormalTok{ plt.subplots(figsize}\OperatorTok{=}\NormalTok{(}\DecValTok{5}\NormalTok{, }\DecValTok{3}\NormalTok{))}
\NormalTok{fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"left"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}

\NormalTok{ax.axvline(s\_thr, color}\OperatorTok{=}\StringTok{"\#004488"}\NormalTok{, linestyle}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{)}
\NormalTok{ax.axvline(m0}\OperatorTok{**}\DecValTok{2}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, linestyle}\OperatorTok{=}\StringTok{"dashed"}\NormalTok{)}
\NormalTok{ax.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{s\_thr,}
\NormalTok{    y}\OperatorTok{={-}}\FloatTok{0.15}\NormalTok{,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$(m\_C+m\_D)\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#004488"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"top"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax.text(}
\NormalTok{    x}\OperatorTok{=}\NormalTok{m0}\OperatorTok{**}\DecValTok{2}\NormalTok{,}
\NormalTok{    y}\OperatorTok{={-}}\FloatTok{0.15}\NormalTok{,}
\NormalTok{    s}\OperatorTok{=}\VerbatimStringTok{R"$M\_R\^{}2$"}\NormalTok{,}
\NormalTok{    color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{,}
\NormalTok{    ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{,}
\NormalTok{    va}\OperatorTok{=}\StringTok{"top"}\NormalTok{,}
\NormalTok{)}

\NormalTok{ell }\OperatorTok{=} \DecValTok{1}
\NormalTok{y }\OperatorTok{=}\NormalTok{ np.}\BuiltInTok{abs}\NormalTok{(bw\_func(x, ell))}\OperatorTok{**}\DecValTok{2}
\NormalTok{y }\OperatorTok{/=}\NormalTok{ np.nanmean(y)}
\NormalTok{ax.plot(x, y, c}\OperatorTok{=}\SpecialStringTok{f"C}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{, label}\OperatorTok{=}\VerbatimStringTok{Rf"$\textbackslash{}mathrm}\CharTok{\{\{}\VerbatimStringTok{BW}\CharTok{\}\}}\VerbatimStringTok{\_}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\VerbatimStringTok{$"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{y }\OperatorTok{=}\NormalTok{ np.}\BuiltInTok{abs}\NormalTok{(ff\_bw\_func(x, ell))}\OperatorTok{**}\DecValTok{2}
\NormalTok{y }\OperatorTok{/=}\NormalTok{ np.nanmean(y)}
\NormalTok{ax.plot(x, y, c}\OperatorTok{=}\SpecialStringTok{f"C}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{, label}\OperatorTok{=}\VerbatimStringTok{Rf"$\textbackslash{}mathrm}\CharTok{\{\{}\VerbatimStringTok{BW}\CharTok{\}\}}\VerbatimStringTok{\_}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\VerbatimStringTok{ \textbackslash{}cdot n\_}\SpecialCharTok{\{}\NormalTok{ell}\SpecialCharTok{\}}\VerbatimStringTok{$"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"{-}{-}"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}

\NormalTok{ax.legend(}
\NormalTok{    bbox\_to\_anchor}\OperatorTok{=}\NormalTok{(}\FloatTok{0.55}\NormalTok{, }\FloatTok{0.65}\NormalTok{),}
\NormalTok{    handlelength}\OperatorTok{=}\DecValTok{1}\NormalTok{,}
\NormalTok{    loc}\OperatorTok{=}\StringTok{"center left"}\NormalTok{,}
\NormalTok{)}
\NormalTok{ax.set\_xlabel(}\StringTok{"$s$"}\NormalTok{)}
\NormalTok{ax.xaxis.set\_label\_coords(}\FloatTok{0.97}\NormalTok{, }\OperatorTok{{-}}\FloatTok{0.01}\NormalTok{)}
\NormalTok{ax.set\_ylabel(}\StringTok{"$|a\_}\SpecialCharTok{\{\_J\}}\StringTok{|\^{}2$ (normalised)"}\NormalTok{)}
\NormalTok{ax.set\_xticks([}\DecValTok{0}\NormalTok{])}
\NormalTok{ax.set\_yticks([])}
\NormalTok{ax.set\_xlim(}\DecValTok{0}\NormalTok{, x.}\BuiltInTok{max}\NormalTok{())}
\NormalTok{ax.set\_ylim(}\DecValTok{0}\NormalTok{, }\VariableTok{None}\NormalTok{)}
\NormalTok{fig.tight\_layout()}
\NormalTok{fig.savefig(}\StringTok{"output/vertex{-}factor{-}plot.svg"}\NormalTok{, bbox\_inches}\OperatorTok{=}\StringTok{"tight"}\NormalTok{)}
\NormalTok{plt.close(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/dynamics-propagator-vertices.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/vertex-factor-plot.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-barrier-factor-effect}Effect of vertex barrier
factors on a Breit--Wigner amplitude. Left: Resonant 2-to-2 scattering
with orbital angular momenta \(\ell_\alpha\) and \(\ell_\beta\). Right:
Normalised squared amplitude for \(\ell_\alpha=0\), \(\ell_\beta=1\),
shown without (solid) and with (dashed) the production barrier factor.
Vertical lines mark the {\(CD\)~threshold} (blue) and the resonance
{mass~\(M_R\)} (red).}

\end{figure}%

Confusingly, there are different conventions in literature for barrier
factors. The reason is that these factors are related to angular
functions like \(P_\ell(\cos\theta)\) that appear in the partial-wave
expansion Equation~\eqref{eq-partial-wave-expansion-no-spin} and
Equation~\eqref{eq-partial-wave-expansion}. These factors depend on the
scattering angle, which can be computed from \(t\) and \(s\). Note that

\[
\begin{aligned}
t \;&=\; (p_A - p_C)^2 \\
  \;&=\; m_A^2 + m_C^2 - 2 E_A E_C + 2 |\vec{p}_A| |\vec{p}_C| \cos\theta
\end{aligned}
\]

\noindent with

\[
\begin{alignedat}{4}
|\vec{p}_A| \;&=\; \frac{\lambda^{1/2}(s, m_A^2, m_B^2)}{2\sqrt{s}} & \qquad &
|\vec{p}_C| \;&=\; \frac{\lambda^{1/2}(s, m_C^2, m_D^2)}{2\sqrt{s}} \\
E_A \;&=\; \frac{s + m_A^2 - m_B^2}{2\sqrt{s}} & \qquad &
E_C \;&=\; \frac{s + m_C^2 - m_D^2}{2\sqrt{s}} \,. \\
\end{alignedat}
\]

Solving for \(\cos\theta\), we get

\begin{equation}\phantomsection\label{eq-cos-theta-in-terms-of-t}{
\begin{aligned}
\cos\theta \;&=\; \frac{t - m_A^2 - m_C^2 + 2 E_A E_C}{2 |\vec{p}_A||\vec{p}_C|} \\
  &\cong \; \frac{\operatorname{Pol}_1(s,t)}{\lambda^{1/2}(s,m_A^2,m_B^2)\,\lambda^{1/2}(s,m_C^2,m_D^2)}
  \,,
\end{aligned}
}\end{equation}

\noindent where the second line highlights that the numerator scales as
a first-order polynomial of \(s, t\) and that the denominator depends on
two Källén functions \(\lambda^{1/2}(s,\dots)\). This form shows that
\(\cos\theta\) develops divergent behaviour as \(s\) approaches the
threshold, because that causes \(\lambda^{1/2}(s,\dots)\) to go to zero.
This would lead to an unphysical divergence in each term
\(a_\ell(s)\,P_\ell(\cos\theta)\) in
Equation~\eqref{eq-partial-wave-expansion-no-spin}, unless \(a_\ell(s)\)
compensates it. Rescaling \(a_\ell(s)\) with the breakup momenta
\(q_\alpha^{\ell_\alpha}(s)\) and \(q_\beta^{\ell_\beta}(s)\) of the
initial and final state
(Equation~\eqref{eq-phase-space-factor-and-breakup-momentum})
exponentiated with their associated orbital angular momenta does the
trick.

To model higher energies correctly, an additional centrifugal factor has
to be included as well, but this is a phenomenological choice that is
not directly related to the corrective factor described before. The
usual choice is the Blatt--Weisskopf barrier factor in
\emph{non-normalised} form, often written as \(\mathcal{F}_{\!\ell}\).
It is \href{https://compwa.github.io/report/029/}{related} to the
normalised form of Equation~\eqref{eq-barrier-factor}
by~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, p.~12}{]}

\[
\mathcal{F}_{\!\ell}^2(x^2)
\;=\; \frac{1}{x^{2(\ell+1)}\,\left|h_\ell^{(1)}(x)\right|^2}
\;=\; \frac{n^2_\ell(x^2)}{x^{2\ell}\,\left|h_\ell^{(1)}(1)\right|^2}
\,.
\]

All in all, this separates the vertex factors into a \emph{corrective}
and a \emph{phenomenological} component, which can be written as

\[
n_\ell\left(q^2(s)\right) \;=\; q^\ell(s) \; \mathcal{F}_{\!\ell}\left(q^2(s)\right) \, .
\]

\subsection{The reactance matrix}\label{sec-reactance-matrix}

Despite these improvements, the Breit--Wigner parametrisation remains
limited in scope. In practice, resonances in the same partial wave
rarely appear in isolation across the energy spectrum
(Figure~\ref{fig-pion-nucleon-p33}). Instead, they often overlap and
interfere, especially when multiple resonant structures or open decay
channels are present. Such interference effects cannot be accurately
described by a simple sum of Breit--Wigner terms. This breakdown
reflects the fact that the amplitude is no longer confined to a single
channel: part of the flux is dissipated into other channels that are not
accounted for.

As noted in Section~\ref{sec-scattering-matrix}, Heisenberg framed
scattering as a kind of response problem: a system is probed by
asymptotic incoming waves, and its internal structure governs the
outgoing response. This perspective inspired many physicists in the
1940s and 50s to draw analogies between scattering amplitudes and the
response of an electrical circuit, where the impedance characterises how
the system reacts to an external driving force. Notably, Blatt and
Weisskopf explicitly borrowed the concept of \textbf{reactance} from
electrical engineering to formulate a more general description of
scattering amplitudes~{[}\citeproc{ref-Blatt:1952ije}{125, p.~530}{]}~--
a framework now known as the {\textbf{\(\mathbfit{K}\)‑matrix
formalism}.}

The \textbf{reactance matrix} \(\mathbfit{K}\), or reaction
matrix~{[}\citeproc{ref-Dalitz:1961dx}{126}{]}, emerges naturally when
considering the unitarity condition
Equation~\eqref{eq-unitarity-partial-wave} for partial-wave amplitudes.
This condition imposes a non-linear constraint on the amplitude, which
is generally difficult to solve directly. However, if the amplitude is
parametrised as

\begin{equation}\phantomsection\label{eq-k-matrix-single-channel}{
a(s) \;=\; \frac{K(s)}{1 - i\,\rho(s)\,K(s)} \,,
}\end{equation}

\noindent then Equation~\eqref{eq-unitarity-partial-wave} is
automatically satisfied above threshold (where \(\rho(s)\) is real and
positive), provided that \(K(s)\) is itself a real-valued function. More
generally, the {\(\mathbfit{K}\)‑matrix} arises from a \textbf{Cayley
transform} of the {\(\mathbf{S}\)‑matrix.} This mathematical
transformation maps a unitary matrix (here \(\mathbf{S}\)) to a
Hermitian {operator~\(\mathbf{X}\)} via

\begin{equation}\phantomsection\label{eq-cayley-transform}{
\mathbf{X} \;=\;
\left(\mathbf{S}-\mathbf{1}\right)\left(\mathbf{S}+\mathbf{1}\right)^{-1} \,.
}\end{equation}

Similarly as in Equation~\eqref{eq-unitarity-partial-wave}, we introduce
an energy-dependent normalisation with the parametrisation

\[
\mathbfit{X}(s) = i\mathbfit{\rho}(s) \, \mathbfit{K}(s)
\,,
\]

\noindent where \(\mathbfit{\rho}(s)\) is a diagonal matrix of phase
space factors~\(\rho_\alpha(s)\) for each channel~\(\alpha\). Given that
the elements in \(\mathbfit{\rho}(s)\) are real and positive for \(s\)
above all thresholds, the {\(\mathbfit{K}\)‑matrix} has to be
real-valued to make \(\mathbf{X}\) Hermitian, and \(\mathbf{S}\)
unitary. This argument does not hold between or below thresholds (there
is a \textbf{left-hand cut}), but this will be solved through analytic
continuation later on. Using Equation~\eqref{eq-t-matrix-definition},
transition {operator~\(\mathbf{T}\)} and its corresponding partial-wave
{projection~\(\mathbfit{a}(s)\)} gets the same form as
Equation~\eqref{eq-k-matrix-single-channel}, but in matrix form

\begin{equation}\phantomsection\label{eq-t-matrix-from-k}{
\mathbfit{a}(s) \;=\; \mathbfit{K}(s) \, \left(\mathbfit{I} - i\,\mathbfit{\rho}(s)\,\mathbfit{K}(s) \right)^{-1} \,.
}\end{equation}

Just as reactance (the imaginary part of impedance) describes how a
circuit temporarily stores and returns energy without dissipation, the
{\(\mathbfit{K}\)‑matrix} captures the elastic component of scattering:
energy may be temporarily trapped, for instance in a resonant state, but
is not lost. Dissipative effects, such as the loss of flux into other
channels, are reintroduced in a controlled way through the phase space
factor, which supplies the imaginary part of the full amplitude.

Figure~\ref{fig-k-matrix-channels} shows the elements of the
\(\mathbfit{K}\) matrix for two-channel nucleon scattering, \(\pi N\)
{and~\(\eta N\).} The {\(\mathbfit{K}\)‑matrix} describes the
two-channel system as a whole by accounting for the flow between the two
channels through it's off-diagonal elements.

\begin{figure}

\begin{minipage}{0.25\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/k-matrix-nucleon-scattering-11.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.25\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/k-matrix-nucleon-scattering-12.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.25\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/k-matrix-nucleon-scattering-21.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.25\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/k-matrix-nucleon-scattering-22.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-k-matrix-channels}The four elements of the
{\(\mathbfit{K}\)‑matrix} for two-channel nucleon scattering, with final
state {\(\pi N\)~(1)} and {\(\eta N\)~(2).}}

\end{figure}%

Since the {\(\mathbfit{K}\)‑matrix} plays the role of an
energy-dependent kernel that captures the reactive core of the
scattering process, any resonant peak structures in the amplitude must
modelled through the (real-valued) elements of the
{\(\mathbfit{K}\)‑matrix.} The {\(\mathbfit{K}\)‑matrix} is therefore
usually parametrised as a spectral decomposition of \textbf{poles} via

\begin{equation}\phantomsection\label{eq-k-matrix-parametrisation}{
K_{\!\beta\alpha}(s) \;=\; \sum_r \frac{g^r_\beta\,g^r_\alpha}{m_r^2 - s}
\,,
}\end{equation}

\noindent where \(r\) is an index for each pole, \(m_r\) is \textbf{bare
mass} of pole~\(r\), and \(g^r_\alpha,g^r_\beta\) are \textbf{coupling
constants} that describe how strongly pole~\(r\) couples to initial
state~\(\alpha\) and final {state~\(\beta\)}
{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, §50};
\citeproc{ref-Chung:1995dx}{127};
\citeproc{ref-Aitchison:1972ay}{128}{]}. These poles do not correspond
directly to physical particles, but represent internal excitation modes
(bare states) of the multichannel system before unitarity and
channel-specific thresholds dress them into observable
amplitudes~{[}\citeproc{ref-JPAC:2021rxu}{129};
\citeproc{ref-Mai:2022eur}{130}{]}. In this sense, they play a role akin
to the normal modes of an oscillator or the eigenfrequencies of a
cavity: points at which the internal structure of the interaction
resonates most strongly.

The partial-wave decomposition from
Equation~\eqref{eq-partial-wave-expansion} still applies, because it is
a decomposition of total angular {momentum~\(J\),} not of internal
dynamics. However, similar to Figure~\ref{fig-barrier-factor-effect},
the partial-wave amplitude becomes suppressed by the centrifugal barrier
{factors~\(n_{\ell_\alpha},n_{\ell_\beta}\)} from
Equation~\eqref{eq-barrier-factor} due to the orbital angular
momenta~\(\ell_\alpha,\ell_\beta\) of the incoming and outgoing vertex,
respectively. Infusing Equation~\eqref{eq-t-matrix-from-k} and
Equation~\eqref{eq-transition-matrix-element} with these factors, we get
a partial-wave amplitude that is ``dressed'' with a diagonal
{matrix~\(\mathbfit{n}\)} of vertex
{functions~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, §50,
p.13}{]},}

\begin{equation}\phantomsection\label{eq-t-matrix-dressed}{
\mathbfit{a} \;=\;
\mathbfit{n}\, \mathbfit{K}\, \left( \mathbfit{I} - i\,\mathbfit{\rho}\,\mathbfit{n}^2\,\mathbfit{K} \right)^{-1} \mathbfit{n}
}\end{equation}

\noindent or explicitly, in terms of the matrix element functions,

\begin{equation}\phantomsection\label{eq-t-matrix-dressed-sum}{
a_{\beta\alpha}(s) \;=\;
  n_{\ell_\beta}(s)
  \sum_\gamma K_{\!\beta\gamma}(s) \left[
      \left(
        \mathbfit{I} -
        i\,\mathbfit{\rho}(s)\,\mathbfit{n}(s)^2\,\mathbfit{K}(s)
      \right)^{-1}
    \right]_{\!\gamma\alpha}
    n_{\ell_\alpha}(s)
\,.
}\end{equation}

\noindent One can derive that the single-channel version of
Equation~\eqref{eq-t-matrix-dressed} reduces to
Equation~\eqref{eq-breit-wigner-vertex} if there is only one pole with
bare mass \(M_R\) and coupling \(g_1^2=M_R\Gamma\).

Figure~\ref{fig-coupled-nucleon-scattering-amplitudes} shows the
resulting partial-wave amplitudes for the P‑wave (\(\ell_1=\ell_2=1\))
in \(\pi N\) and \(\eta N\) nucleon scattering. In this example, the
{\(\mathbfit{K}\)‑matrix} is modelled with one pole with a bare mass set
to that of the
\href{https://pdglive.lbl.gov/Particle.action?init=0&node=B061&home=BXXX005}{Roper
resonance \(N(1440)\)}~{[}\citeproc{ref-Roper:1964zza}{131}{]}. There
are four transition matrix elements, with the off-diagonal elements
describing the flow of flux between the two channels (inelastic
scattering). The amplitude \(a_{11}\) for elastic \(\pi N\) scattering
exhibits a ``cusp effect'' at the threshold where the \(\eta N\) channel
opens up. All other elements lie above the {\(\pi N\)~threshold.}

The figure shows the modulus squared, real part, and imaginary part of
each amplitude. Counter to expectations, the real part does not show the
characteristic shift around the bare mass position, like in
Figure~\ref{fig-breit-wigner}. This is because the couplings have been
set to a high value, moving the pole position further away from the real
axis.

\begin{Shaded}
\begin{Highlighting}[]
\AttributeTok{@unevaluated}\NormalTok{(real}\OperatorTok{=}\VariableTok{False}\NormalTok{)}
\KeywordTok{class}\NormalTok{ ChewMandelstamSWave(sp.Expr):}
\NormalTok{    s: Any}
\NormalTok{    m1: Any}
\NormalTok{    m2: Any}
\NormalTok{    \_latex\_repr\_ }\OperatorTok{=} \VerbatimStringTok{R"\textbackslash{}varSigma\_0\textbackslash{}left(}\SpecialCharTok{\{s\}}\VerbatimStringTok{\textbackslash{}right)"}

    \KeywordTok{def}\NormalTok{ evaluate(}\VariableTok{self}\NormalTok{) }\OperatorTok{{-}\textgreater{}}\NormalTok{ sp.Expr:}
\NormalTok{        s, m1, m2 }\OperatorTok{=} \VariableTok{self}\NormalTok{.args}
\NormalTok{        q }\OperatorTok{=}\NormalTok{ BreakupMomentum(s, m1, m2)}
        \ControlFlowTok{return}\NormalTok{ (}
\NormalTok{            (}\DecValTok{2} \OperatorTok{*}\NormalTok{ q }\OperatorTok{/}\NormalTok{ sp.sqrt(s))}
            \OperatorTok{*}\NormalTok{ sp.log((m1}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ m2}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s }\OperatorTok{+} \DecValTok{2} \OperatorTok{*}\NormalTok{ sp.sqrt(s) }\OperatorTok{*}\NormalTok{ q) }\OperatorTok{/}\NormalTok{ (}\DecValTok{2} \OperatorTok{*}\NormalTok{ m1 }\OperatorTok{*}\NormalTok{ m2))}
            \OperatorTok{{-}}\NormalTok{ (m1}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ m2}\OperatorTok{**}\DecValTok{2}\NormalTok{) }\OperatorTok{*}\NormalTok{ (}\DecValTok{1} \OperatorTok{/}\NormalTok{ s }\OperatorTok{{-}} \DecValTok{1} \OperatorTok{/}\NormalTok{ (m1 }\OperatorTok{+}\NormalTok{ m2) }\OperatorTok{**} \DecValTok{2}\NormalTok{) }\OperatorTok{*}\NormalTok{ sp.log(m1 }\OperatorTok{/}\NormalTok{ m2)}
\NormalTok{        ) }\OperatorTok{/}\NormalTok{ sp.pi}


\AttributeTok{@unevaluated}\NormalTok{(real}\OperatorTok{=}\VariableTok{False}\NormalTok{)}
\KeywordTok{class}\NormalTok{ BreakupMomentum(sp.Expr):}
\NormalTok{    s: Any}
\NormalTok{    m1: Any}
\NormalTok{    m2: Any}
\NormalTok{    \_latex\_repr\_ }\OperatorTok{=} \VerbatimStringTok{R"q\textbackslash{}left(}\SpecialCharTok{\{s\}}\VerbatimStringTok{\textbackslash{}right)"}

    \KeywordTok{def}\NormalTok{ evaluate(}\VariableTok{self}\NormalTok{) }\OperatorTok{{-}\textgreater{}}\NormalTok{ sp.Expr:}
\NormalTok{        s, m1, m2 }\OperatorTok{=} \VariableTok{self}\NormalTok{.args}
        \ControlFlowTok{return}\NormalTok{ sp.sqrt(s }\OperatorTok{{-}}\NormalTok{ (m1 }\OperatorTok{{-}}\NormalTok{ m2)}\OperatorTok{**}\DecValTok{2}\NormalTok{) }\OperatorTok{*}\NormalTok{ sp.sqrt(s }\OperatorTok{{-}}\NormalTok{ (m1 }\OperatorTok{+}\NormalTok{ m2)}\OperatorTok{**}\DecValTok{2}\NormalTok{) }\OperatorTok{/}\NormalTok{ (}\DecValTok{2} \OperatorTok{*}\NormalTok{ sp.sqrt(s))}


\KeywordTok{class}\NormalTok{ DiagonalMatrix(sp.DiagonalMatrix):}
    \KeywordTok{def}\NormalTok{ \_latex(}\VariableTok{self}\NormalTok{, printer, }\OperatorTok{*}\NormalTok{args):}
        \ControlFlowTok{return}\NormalTok{ printer.\_print(}\VariableTok{self}\NormalTok{.args[}\DecValTok{0}\NormalTok{])}


\KeywordTok{def}\NormalTok{ lambdify\_matrix\_expression(matrix\_expr):}
    \ControlFlowTok{return}\NormalTok{ np.array([}
\NormalTok{        [sp.lambdify(s, matrix\_expr[i, j].doit().subs(parameters)) }\ControlFlowTok{for}\NormalTok{ i }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(n\_ch)]}
        \ControlFlowTok{for}\NormalTok{ j }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(n\_ch)}
\NormalTok{    ])}


\NormalTok{n\_ch }\OperatorTok{=} \DecValTok{2}
\NormalTok{K }\OperatorTok{=}\NormalTok{ sp.MatrixSymbol(}\StringTok{"K"}\NormalTok{, n\_ch, n\_ch)}
\NormalTok{Σ }\OperatorTok{=}\NormalTok{ DiagonalMatrix(sp.MatrixSymbol(}\StringTok{"Sigma"}\NormalTok{, n\_ch, n\_ch))}
\NormalTok{n }\OperatorTok{=}\NormalTok{ DiagonalMatrix(sp.MatrixSymbol(}\StringTok{"n"}\NormalTok{, n\_ch, n\_ch))}
\NormalTok{I }\OperatorTok{=}\NormalTok{ sp.Identity(n\_ch)}
\NormalTok{T }\OperatorTok{=}\NormalTok{ n }\OperatorTok{*}\NormalTok{ K }\OperatorTok{*}\NormalTok{ (I }\OperatorTok{{-}}\NormalTok{ Σ }\OperatorTok{*}\NormalTok{ n}\OperatorTok{**}\DecValTok{2} \OperatorTok{*}\NormalTok{ K).inv() }\OperatorTok{*}\NormalTok{ n}

\NormalTok{s, g1, g2, mp1 }\OperatorTok{=}\NormalTok{ sp.symbols(}\StringTok{"s g1 g2 m\_}\SpecialCharTok{\{p\_1\}}\StringTok{"}\NormalTok{)}
\NormalTok{ma, mb, mc, md }\OperatorTok{=}\NormalTok{ sp.symbols(}\StringTok{"m\_A m\_B m\_C m\_D"}\NormalTok{)}
\NormalTok{definitions }\OperatorTok{=}\NormalTok{ \{}
\NormalTok{    K[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]: g1}\OperatorTok{**}\DecValTok{2} \OperatorTok{/}\NormalTok{ (mp1}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s),}
\NormalTok{    K[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]: g2}\OperatorTok{**}\DecValTok{2} \OperatorTok{/}\NormalTok{ (mp1}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s),}
\NormalTok{    K[}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{]: g1 }\OperatorTok{*}\NormalTok{ g2 }\OperatorTok{/}\NormalTok{ (mp1}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s),}
\NormalTok{    K[}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{]: g2 }\OperatorTok{*}\NormalTok{ g1 }\OperatorTok{/}\NormalTok{ (mp1}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s),}
\NormalTok{    n[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]: FormFactor(s, ma, mb, angular\_momentum}\OperatorTok{=}\DecValTok{1}\NormalTok{),}
\NormalTok{    n[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]: FormFactor(s, mc, md, angular\_momentum}\OperatorTok{=}\DecValTok{1}\NormalTok{),}
\NormalTok{    Σ[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]: ChewMandelstamSWave(s, ma, mb),}
\NormalTok{    Σ[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]: ChewMandelstamSWave(s, mc, md),}
\NormalTok{\}}
\NormalTok{T\_expr }\OperatorTok{=}\NormalTok{ T.as\_explicit().subs(definitions)}

\NormalTok{parameters }\OperatorTok{=}\NormalTok{ \{}
\NormalTok{    mp1: }\FloatTok{1.38}\NormalTok{,  }\CommentTok{\# https://pdglive.lbl.gov/Particle.action?init=0\&node=B061\&home=BXXX005}
\NormalTok{    g1: }\FloatTok{1.2}\NormalTok{,}
\NormalTok{    g2: }\FloatTok{3.2}\NormalTok{,  }\CommentTok{\# large to increase cusp effect}
\NormalTok{    ma: }\FloatTok{0.139}\NormalTok{,  }\CommentTok{\# pi}
\NormalTok{    mb: }\FloatTok{0.939}\NormalTok{,  }\CommentTok{\# nucleon}
\NormalTok{    mc: }\FloatTok{0.548}\NormalTok{,  }\CommentTok{\# eta}
\NormalTok{    md: }\FloatTok{0.939}\NormalTok{,  }\CommentTok{\# nucleon}
\NormalTok{\}}
\NormalTok{T\_func }\OperatorTok{=}\NormalTok{ lambdify\_matrix\_expression(T\_expr)}

\NormalTok{ϵi }\OperatorTok{=} \OtherTok{1e{-}7j}
\NormalTok{ϵ }\OperatorTok{=}\NormalTok{ ϵi.imag}
\NormalTok{thr1 }\OperatorTok{=}\NormalTok{ parameters[ma] }\OperatorTok{+}\NormalTok{ parameters[mb]}
\NormalTok{thr2 }\OperatorTok{=}\NormalTok{ parameters[mc] }\OperatorTok{+}\NormalTok{ parameters[md]}
\NormalTok{s1 }\OperatorTok{=}\NormalTok{ np.linspace(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\FloatTok{1.95}\OperatorTok{**}\DecValTok{2}\NormalTok{, num}\OperatorTok{=}\DecValTok{1000}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{s2 }\OperatorTok{=}\NormalTok{ np.linspace(thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\FloatTok{1.95}\OperatorTok{**}\DecValTok{2}\NormalTok{, num}\OperatorTok{=}\DecValTok{1000}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{sqrt\_s1 }\OperatorTok{=}\NormalTok{ np.sqrt(s1.real)}
\NormalTok{sqrt\_s2 }\OperatorTok{=}\NormalTok{ np.sqrt(s2.real)}

\NormalTok{fig, axes }\OperatorTok{=}\NormalTok{ plt.subplots(figsize}\OperatorTok{=}\NormalTok{(}\FloatTok{6.5}\NormalTok{, }\FloatTok{3.7}\NormalTok{), ncols}\OperatorTok{=}\NormalTok{n\_ch, nrows}\OperatorTok{=}\NormalTok{n\_ch, sharex}\OperatorTok{=}\VariableTok{True}\NormalTok{, sharey}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{ax11, ax12, ax21, ax22 }\OperatorTok{=}\NormalTok{ axes.flatten()}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes.flatten():}
\NormalTok{    ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_position(}\StringTok{"zero"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{    ax.axvline(parameters[mp1], color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dashed"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{    ax.axvline(thr1, color}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{    ax.axvline(thr2, color}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{    ax.set\_yticks([])}
\NormalTok{ax12.text(}\DecValTok{2}\NormalTok{, }\OperatorTok{{-}}\FloatTok{0.09}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}sqrt}\SpecialCharTok{\{s\}}\VerbatimStringTok{$ [GeV]"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{ax22.text(}\DecValTok{2}\NormalTok{, }\OperatorTok{+}\FloatTok{0.09}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}sqrt}\SpecialCharTok{\{s\}}\VerbatimStringTok{$ [GeV]"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}

\NormalTok{text\_kwargs }\OperatorTok{=} \BuiltInTok{dict}\NormalTok{(transform}\OperatorTok{=}\NormalTok{ax11.transAxes, ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{, va}\OperatorTok{=}\StringTok{"center"}\NormalTok{)}
\NormalTok{ax11.text(}\FloatTok{0.88}\NormalTok{, }\FloatTok{0.18}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},a(s)$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, }\OperatorTok{**}\NormalTok{text\_kwargs)}
\NormalTok{ax11.text(}\FloatTok{0.88}\NormalTok{, }\FloatTok{0.45}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a(s)$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, }\OperatorTok{**}\NormalTok{text\_kwargs)}
\NormalTok{ax11.text(}\FloatTok{0.59}\NormalTok{, }\FloatTok{0.71}\NormalTok{, }\VerbatimStringTok{R"$|a(s)|\^{}2$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, }\OperatorTok{**}\NormalTok{text\_kwargs)}
\NormalTok{ax11.text(}\FloatTok{0.30}\NormalTok{, }\FloatTok{0.93}\NormalTok{, }\VerbatimStringTok{R"$m\_p$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, }\OperatorTok{**}\NormalTok{text\_kwargs)}
\NormalTok{ax11.text(}\FloatTok{0.11}\NormalTok{, }\FloatTok{0.93}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}pi N$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, }\OperatorTok{**}\NormalTok{text\_kwargs)}
\NormalTok{ax11.text(}\FloatTok{0.53}\NormalTok{, }\FloatTok{0.93}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}eta N$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, }\OperatorTok{**}\NormalTok{text\_kwargs)}

\NormalTok{ax11.plot(sqrt\_s1, T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax11.plot(sqrt\_s1, T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax11.plot(sqrt\_s1, np.}\BuiltInTok{abs}\NormalTok{(T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1))}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax12.plot(sqrt\_s2, T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{](s2).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax12.plot(sqrt\_s2, T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{](s2).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax12.plot(sqrt\_s2, np.}\BuiltInTok{abs}\NormalTok{(T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{](s2))}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax21.plot(sqrt\_s2, T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax21.plot(sqrt\_s2, T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax21.plot(sqrt\_s2, np.}\BuiltInTok{abs}\NormalTok{(T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{](s2))}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax22.plot(sqrt\_s2, T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax22.plot(sqrt\_s2, T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax22.plot(sqrt\_s2, np.}\BuiltInTok{abs}\NormalTok{(T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{](s2))}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax11.set\_title(}\VerbatimStringTok{R"$a\_}\SpecialCharTok{\{11\}}\VerbatimStringTok{$ : $\textbackslash{}pi N \textbackslash{}to \textbackslash{}pi N$"}\NormalTok{)}
\NormalTok{ax12.set\_title(}\VerbatimStringTok{R"$a\_}\SpecialCharTok{\{12\}}\VerbatimStringTok{$ : $\textbackslash{}pi N \textbackslash{}to \textbackslash{}eta N$"}\NormalTok{)}
\NormalTok{ax21.set\_title(}\VerbatimStringTok{R"$a\_}\SpecialCharTok{\{21\}}\VerbatimStringTok{$ : $\textbackslash{}eta N \textbackslash{}to \textbackslash{}pi N$"}\NormalTok{)}
\NormalTok{ax22.set\_title(}\VerbatimStringTok{R"$a\_}\SpecialCharTok{\{22\}}\VerbatimStringTok{$ : $\textbackslash{}eta N \textbackslash{}to \textbackslash{}eta N$"}\NormalTok{)}
\NormalTok{fig.tight\_layout()}
\NormalTok{plt.show(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}[b!]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-coupled-nucleon-scattering-amplitudes-output-1.pdf}}

}

\caption{\label{fig-coupled-nucleon-scattering-amplitudes}Partial-wave
amplitudes (modulus squared, real part, and imaginary part) for
{\(\pi N\)~(1)} and {\(\eta N\)~(2)} nucleon scattering modelled with
the {\(\mathbfit{K}\)‑matrix,} with one pole at the bare mass~\(m_p\)
set to that of the Roper resonance \(N(1440)\) (P‑wave with
\(\ell_1=\ell_2=1\)). The coupling constant \(g_{\eta N}\) has been set
to a much higher value than in reality to enhance the cusp effect at the
\(\pi N\) threshold {in~\(a_{11}\).}}

\end{figure}%

The {\(\mathbfit{K}\)‑matrix} formalism is primarily formulated for
scattering processes. In the case of a decay, however, the underlying
production mechanism is not constrained in the same way and must be
parametrised independently. A common approach is the
\textbf{{\(\mathcal{P}\)‑vector} parametrisation}, in which the
amplitude is written in terms of \emph{vector} {elements~\(a_\beta(s)\)}
for each final {state~\(\beta\),} rather than \emph{matrix} elements,

\[
a_\beta(s) \;=\;
  n_{\ell_\beta}(s) \,
  \sum_\gamma \mathcal{P}_{\!\gamma}(s) \left[
      \left(
        \mathbfit{I} -
        i\,\mathbfit{\rho}(s) \, \mathbfit{n}(s)^2 \, \mathbfit{K}(s)
      \right)^{-1}
    \right]_{\gamma\beta}(s)
\,,
\]

\noindent or, in compact matrix notation like
Equation~\eqref{eq-t-matrix-dressed},

\[
\mathbfit{a} \;=\;
\mathbfit{n} \, \mathcal{P} \, \left(\mathbfit{I} - i\,\mathbfit{\rho}\,\mathbfit{n}^2\mathbfit{K}\right)^{-1}
\,.
\]

\noindent The \(\mathcal{P}\)-vector plays a role analogous to the
incoming vertex factor in Equation~\eqref{eq-t-matrix-dressed-sum}, but
is replaced here by a \textbf{production {vector~\(\mathcal{P}\)}}. Much
like the {\(\mathbfit{K}\)‑matrix,} it is usually parametrised as a sum
over poles~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66, §50, p.14};
\citeproc{ref-Chung:1995dx}{127, p.~425}{]},

\begin{equation}\phantomsection\label{eq-p-vector-parametrisation}{
\mathcal{P}_{\!\gamma}(s) \;=\; \sum_r \frac{\alpha_r g^r_\gamma}{m_r^2 - s}
\,,
}\end{equation}

\noindent where \(\alpha_r\) denotes the production coupling for each
{pole~\(r\).} While the {\(\mathbfit{K}\)‑matrix} must be real to
preserve unitarity, the production {coupling~\(\alpha_r\)} can be
complex, since it serves to absorb undetermined relative phases of the
unknown production mechanism.

In practice, both the \(\mathcal{P}\)-vector parametrisation of
Equation~\eqref{eq-p-vector-parametrisation} and the
{\(\mathbfit{K}\)‑matrix} parametrisation of
Equation~\eqref{eq-k-matrix-parametrisation} are often supplemented by
additional non-pole terms. These background contributions are omitted
from the present discussion.

\subsection{Analytic continuation}\label{sec-analytic-continuation}

While the {\(\mathbfit{K}\)‑matrix} is real-valued and primarily
constructed to preserve unitarity across overlapping resonances and
thresholds, it also offers a transparent way of disentangling the
underlying resonance structure. Whereas a traditional Breit--Wigner
parametrisation produces a peak in the cross section characterised by a
mass and a width, the {\(\mathbfit{K}\)‑matrix} leads to a pole in the
complex plane that serves as a channel-independent fingerprint of an
underlying physical state~{[}\citeproc{ref-Gribov:2009cfk}{132,
Ch.~3}{]}. These poles are more fundamental than the apparent mass and
width of a peak, because their positions are insensitive to
channel-dependent distortions and provide a process-independent
definition of the underlying hadronic state. This brings us back to the
analyticity of the scattering amplitude discussed in
Section~\ref{sec-analyticity}: the challenge now is to extract
information about these poles by \textbf{analytically continuing} the
physical amplitude into the complex domain where they reside.

\subsubsection{Leaving the real axis}\label{leaving-the-real-axis}

So far, the amplitudes in Equation~\eqref{eq-t-matrix-dressed-sum} are
specifically constructed over the real {\(s\)~axis} above each minimal
threshold (see Figure~\ref{fig-coupled-nucleon-scattering-amplitudes}).
This is the physical, observable domain, so we call these constructions
\emph{physical amplitudes}. As noted in Section~\ref{sec-analyticity},
we know that amplitudes have to be analytic over the full complex domain
{of~\(s\),} but we need a recipe to continue the physical amplitude over
the complex plane. Complex analysis gives us the tools to do this if we
know what analytic structure the amplitude has. Once we know the
location of branch cuts and poles, we can compute the amplitude at any
point in the complex plane, including the domain where the poles are
located. The recipe that follow applies generally to any physical
partial-wave {amplitude~\(a(s)\).}

As a first step, causality in perturbation theory dictates ``retarded
propagation'', which tells us that the physical amplitude is equal to
the limit from the upper half of the complex plane {of
\(s\)~{[}\citeproc{ref-Eden:1966dnq}{107, pp.~16, 90--99}{]},} that is

\begin{equation}\phantomsection\label{eq-analyticity-limit-uhp}{
a(s) \;=\; \lim_{\epsilon \to 0^+}a(s+i\epsilon) \,.
}\end{equation}

This gives us a stepping stone into the upper half of the complex plane
(UHP). The \textbf{Schwarz reflection principle} allows us to extend the
amplitude into the lower half of the complex plane. It tells that any
function~\(f\) can be extended to the lower half-plane by
\(f(z^*) = f^*(z)\) if it and only if
it~{[}\citeproc{ref-Ahlfors:1966-ComplexAnalysis}{133}{]}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\tightlist
\item
  is \emph{continuous} on
  \(\left\{z\in\mathbb{C}|\operatorname{Im} z \geq 0\right\}\) (closed
  UHP, including the real axis),
\item
  is \emph{analytic} on
  \(\left\{z\in\mathbb{C}|\operatorname{Im} z > 0\right\}\) (open UHP,
  excluding the real axis), and
\item
  returns real values on a segment of the real axis.
\end{enumerate}

We already know that amplitudes are analytic in the UHP and
Equation~\eqref{eq-analyticity-limit-uhp} tells us that it is continuous
on the closed UHP. The third condition is satisfied through unitarity.
Equation~\eqref{eq-unitarity-partial-wave} shows that the amplitude has
no imaginary part on the real axis below the smallest threshold: below
the smallest threshold, there is no cross section and \(|a(s)|^2\) goes
to zero. This means \(a(s)\) satisfies all three conditions, so that we
can write \(a(s^*)=a^*(s)\). The amplitude therefore has a
\textbf{right-hand branch cut} that runs along the real {\(s\)~axis}
(it's imaginary part `flips' sign when crossing the axis), starting at
the first threshold opening.

The reasoning so far only reveals the analytic structure of the
amplitude, but does not give a recipe to \emph{compute} \(a(s)\) for any
point \(s\) in the complex plane. \textbf{Cauchy's integral formula}
provides such a recipe. It tells that for any analytic function \(f\)
that is analytic on or inside a closed contour \(C\) on complex plane,
we can compute \(f(z)\) for any point \(z\) inside \(C\) as

\begin{equation}\phantomsection\label{eq-cauchy-integral-formula}{
f(z) \;=\; \frac{1}{2\pi i} \oint_C \frac{f(z')}{z'-z} \, \mathrm{d}z' \,.
}\end{equation}

The previous argumentation already indicates that there has to be one
and only one branch cut over the real axis above the threshold with a
\textbf{branch point} at \(s_\text{thr}=(m_C+m_D)^2\). These branch
points arise from threshold openings where a new channel becomes
accessible and correspond to the boundary of the physical regions in
Figure~\ref{fig-mandelstam-diagram}. In addition, causality tells us
that the physical amplitude contains no poles. We can therefore deform
any contour \(C\) that encloses a point \(s\) (see
Figure~\ref{fig-branch-cut-integral}) that is not on the branch cut in
such a way that it only encloses the right-hand cut. Elsewhere, the
contour can be deformed to infinity. If we assume that \(a(s) \to 0\) as
\(|s|\to\infty\), Equation~\eqref{eq-cauchy-integral-formula} over this
deformed contour \(C\) becomes

\begin{equation}\phantomsection\label{eq-amplitude-dispersion-integral}{
\begin{aligned}
a(s)
\;&=\; \frac{1}{2\pi i} \left(
  \int_{s_\text{thr}}^\infty \frac{a(s'+i\epsilon)}{s'-s} \, \mathrm{d}s' +
  \int_\infty^{s_\text{thr}} \frac{a(s'-i\epsilon)}{s'-s} \, \mathrm{d}s'
\right) \\
\;&=\; \frac{1}{2\pi i} \int_{s_\text{thr}}^\infty \frac{a(s'+i\epsilon) - a(s'-i\epsilon)}{s'-s} \, \mathrm{d}s' \\
\;&=\; \frac{1}{2\pi i} \int_{s_\text{thr}}^\infty \frac{\operatorname{Disc}a(s')}{s'-s} \, \mathrm{d}s'
\;  =\; \frac{1}{\pi} \int_{s_\text{thr}}^\infty \frac{\operatorname{Im}a(s')}{s'-s} \, \mathrm{d}s'
\,,
\end{aligned}
}\end{equation}

\noindent where in the final step, we have used Schwarz reflection to
rewrite the discontinuity as
\(\operatorname{Disc}a(s') = 2i\,\operatorname{Im}a(s')\). This is the
\textbf{dispersion integral} for partial-wave amplitudes, which allows
us to compute the amplitude at any point in the complex plane, provided
that we know its imaginary part on the right-hand cut. An overview of
more sophisticated treatments that describes subtractions in case
\(a(s)\) does \emph{not} vanish as \(|s|\to\infty\), see
{[}\citeproc{ref-Deineka:2023dcu}{134}{]}. It also discusses the
left-hand cut for negative~\(s\), such as the \(N/D\)
approach~{[}\citeproc{ref-Chew:1960iv}{113}{]}.

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter2/branch-cut-integral.pdf}}

}

\caption{\label{fig-branch-cut-integral}The contour \(C\) encloses the
right-hand branch cut above the threshold \(s_\text{thr}=(m_C+m_D)^2\)
and is deformed to \(|s|\to\infty\) elsewhere, so that closed integral
Equation~\eqref{eq-cauchy-integral-formula} can be used to compute the
amplitude \(a(s)\) for any point \(s\) in the complex plane with
Equation~\eqref{eq-amplitude-dispersion-integral}.}

\end{figure}%

\subsubsection{Continuing with the \texorpdfstring{$\mathbfit{K}$}{𝑲}‑matrix} \label{sec-k-matrix}

Computing the dispersion integral for arbitrary amplitude functions is
difficult and computationally intensive. This is another point where the
{\(\mathbfit{K}\)‑matrix} formalism shines: amplitudes constructed via
Equation~\eqref{eq-t-matrix-dressed} isolate the dispersive cut
structure (branch cuts) from their reactive core that contains the
poles. As a heuristic argument (ignoring that \(\mathbfit{K}\) is not
necessarily invertible), we write Equation~\eqref{eq-t-matrix-from-k} as

\begin{equation}\phantomsection\label{eq-t-matrix-from-chew-mandelstam-and-k-matrix}{
\mathbfit{a}(s) \;=\; \left(\mathbfit{K}^{-1}(s) - \boldsymbol{\varSigma}(s)\right)^{-1} \,,
}\end{equation}

\noindent where \(\boldsymbol{\varSigma}(s) = i\mathbfit{\rho}(s)\).
Since the {\(\mathbfit{K}\)‑matrix} parametrisation of
Equation~\eqref{eq-k-matrix-parametrisation} is analytic (apart from
poles) and does not contain cuts, the right-hand cut in the amplitude
has to come {from~\(\boldsymbol{\varSigma}\).}

Notice, however, that the standard phase space factor from
Equation~\eqref{eq-phase-space-factor-and-breakup-momentum} does not
have the correct cut structure. As can be seen in
Figure~\ref{fig-phase-space-factor-complex-plane}, it has a branch cut
in its real part across the real {\(s\)~axis} between \((m_C-m_D)^2\)
and \((m_C+m_D)^2\). We therefore need to construct a function
\(\boldsymbol{\varSigma}(s)\) that does have the expected right-hand
branch cut in the imaginary part, starting at branch point
\((m_C+m_D)^2\), but that does have the same imaginary part when
approaching the cut from the UHP. A similar argument holds for the more
general product \(i\rho(s)n_\ell^2(s)\) in
Equation~\eqref{eq-t-matrix-dressed}, which needs to be replace by an
analytic \textbf{Chew--Mandelstam function}
\(\boldsymbol{\varSigma_\ell}(s)\) with the expected right-hand
cut~{[}\citeproc{ref-Chew:1960iv}{113}{]}. The barrier factors on the
sides do not affect the positions of the poles and are therefore ignored
in the analytic continuation of the overall partial-wave amplitude.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{x\_min, x\_max }\OperatorTok{=} \DecValTok{0}\NormalTok{, }\OperatorTok{+}\DecValTok{3}
\NormalTok{y\_max }\OperatorTok{=} \FloatTok{0.9}
\NormalTok{z\_max }\OperatorTok{=} \DecValTok{1}
\NormalTok{X, Y }\OperatorTok{=}\NormalTok{ np.meshgrid(}
\NormalTok{    np.linspace(x\_min, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{),}
\NormalTok{    np.linspace(}\OperatorTok{{-}}\NormalTok{y\_max, }\OperatorTok{+}\NormalTok{y\_max, num}\OperatorTok{=}\DecValTok{300}\NormalTok{),}
\NormalTok{)}
\NormalTok{S }\OperatorTok{=}\NormalTok{ X }\OperatorTok{+} \OtherTok{1j} \OperatorTok{*}\NormalTok{ Y}

\NormalTok{thr\_neg }\OperatorTok{=}\NormalTok{ (parameters[ma] }\OperatorTok{{-}}\NormalTok{ parameters[mb]) }\OperatorTok{**} \DecValTok{2}
\NormalTok{thr\_pos }\OperatorTok{=}\NormalTok{ (parameters[ma] }\OperatorTok{+}\NormalTok{ parameters[mb]) }\OperatorTok{**} \DecValTok{2}

\NormalTok{rho\_func }\OperatorTok{=}\NormalTok{ sp.lambdify(s\_symbol, sp.I }\OperatorTok{*}\NormalTok{ PhaseSpaceFactor(s\_symbol, ma, mb).doit().subs(parameters))}
\NormalTok{cm\_func }\OperatorTok{=}\NormalTok{ sp.lambdify(s\_symbol, ChewMandelstamSWave(s\_symbol, ma, mb).doit().subs(parameters))}

\NormalTok{fig, axes }\OperatorTok{=}\NormalTok{ plt.subplots(dpi}\OperatorTok{=}\DecValTok{300}\NormalTok{, figsize}\OperatorTok{=}\NormalTok{(}\FloatTok{5.2}\NormalTok{, }\FloatTok{1.3}\NormalTok{), ncols}\OperatorTok{=}\DecValTok{2}\NormalTok{, sharey}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{fig.subplots\_adjust(bottom}\OperatorTok{=}\DecValTok{0}\NormalTok{, left}\OperatorTok{=}\DecValTok{0}\NormalTok{, right}\OperatorTok{=}\DecValTok{1}\NormalTok{, top}\OperatorTok{=}\DecValTok{1}\NormalTok{, wspace}\OperatorTok{=}\FloatTok{0.12}\NormalTok{)}
\NormalTok{ax1, ax2 }\OperatorTok{=}\NormalTok{ axes}
\NormalTok{fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes:}
\NormalTok{    ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.set\_xlabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},s$"}\NormalTok{, labelpad}\OperatorTok{={-}}\DecValTok{12}\NormalTok{)}
\NormalTok{    ax.set\_xticks([}\DecValTok{0}\NormalTok{])}
\NormalTok{ax1.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},s$"}\NormalTok{)}
\NormalTok{ax1.set\_ylim(}\OperatorTok{{-}}\NormalTok{y\_max, }\OperatorTok{+}\NormalTok{y\_max)}
\NormalTok{ax1.set\_yticks([}\DecValTok{0}\NormalTok{])}
\NormalTok{style }\OperatorTok{=} \BuiltInTok{dict}\NormalTok{(}
\NormalTok{    cmap}\OperatorTok{=}\StringTok{"coolwarm"}\NormalTok{,}
\NormalTok{    rasterized}\OperatorTok{=}\VariableTok{True}\NormalTok{,}
\NormalTok{    vmin}\OperatorTok{={-}}\NormalTok{z\_max,}
\NormalTok{    vmax}\OperatorTok{=+}\NormalTok{z\_max,}
\NormalTok{    zorder}\OperatorTok{={-}}\DecValTok{10}\NormalTok{,}
\NormalTok{)}
\NormalTok{mesh }\OperatorTok{=}\NormalTok{ ax1.pcolormesh(X, Y, rho\_func(S).real, }\OperatorTok{**}\NormalTok{style)}
\NormalTok{cbar }\OperatorTok{=}\NormalTok{ fig.colorbar(mesh, ax}\OperatorTok{=}\NormalTok{ax1, pad}\OperatorTok{=}\FloatTok{0.01}\NormalTok{)}
\NormalTok{cbar.ax.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},i\textbackslash{}rho$"}\NormalTok{, labelpad}\OperatorTok{=}\DecValTok{0}\NormalTok{, rotation}\OperatorTok{=}\DecValTok{270}\NormalTok{)}
\NormalTok{cbar.ax.set\_yticks([}\OperatorTok{{-}}\NormalTok{z\_max, }\OperatorTok{+}\NormalTok{z\_max])}
\NormalTok{cbar.ax.set\_yticklabels([}\StringTok{"${-}$"}\NormalTok{, }\StringTok{"$+$"}\NormalTok{])}
\NormalTok{mesh }\OperatorTok{=}\NormalTok{ ax2.pcolormesh(X, Y, cm\_func(S).imag, }\OperatorTok{**}\NormalTok{style)}
\NormalTok{cbar }\OperatorTok{=}\NormalTok{ fig.colorbar(mesh, ax}\OperatorTok{=}\NormalTok{ax2, pad}\OperatorTok{=}\FloatTok{0.01}\NormalTok{)}
\NormalTok{cbar.ax.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},\textbackslash{}mathit\{\textbackslash{}Sigma\}\_0$"}\NormalTok{, labelpad}\OperatorTok{=}\DecValTok{0}\NormalTok{, rotation}\OperatorTok{=}\DecValTok{270}\NormalTok{)}
\NormalTok{cbar.ax.set\_yticks([}\OperatorTok{{-}}\NormalTok{z\_max, }\OperatorTok{+}\NormalTok{z\_max])}
\NormalTok{cbar.ax.set\_yticklabels([}\StringTok{"${-}$"}\NormalTok{, }\StringTok{"$+$"}\NormalTok{])}

\NormalTok{ax1.plot(X[}\DecValTok{0}\NormalTok{], rho\_func(X[}\DecValTok{0}\NormalTok{] }\OperatorTok{+}\NormalTok{ ϵi).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{0.5}\NormalTok{, zorder}\OperatorTok{={-}}\DecValTok{5}\NormalTok{)}
\NormalTok{ax1.plot(X[}\DecValTok{0}\NormalTok{], rho\_func(X[}\DecValTok{0}\NormalTok{] }\OperatorTok{+}\NormalTok{ ϵi).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{0.5}\NormalTok{, zorder}\OperatorTok{={-}}\DecValTok{5}\NormalTok{)}
\NormalTok{ax2.plot(X[}\DecValTok{0}\NormalTok{], cm\_func(X[}\DecValTok{0}\NormalTok{] }\OperatorTok{+}\NormalTok{ ϵi).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{0.5}\NormalTok{, zorder}\OperatorTok{={-}}\DecValTok{5}\NormalTok{)}
\NormalTok{ax2.plot(X[}\DecValTok{0}\NormalTok{], cm\_func(X[}\DecValTok{0}\NormalTok{] }\OperatorTok{+}\NormalTok{ ϵi).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{0.5}\NormalTok{, zorder}\OperatorTok{={-}}\DecValTok{5}\NormalTok{)}

\NormalTok{ax1.text(}\FloatTok{0.99}\NormalTok{, }\FloatTok{0.47}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},i\textbackslash{}rho$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, transform}\OperatorTok{=}\NormalTok{ax1.transAxes, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{ax1.text(}\FloatTok{0.99}\NormalTok{, }\FloatTok{0.82}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},i\textbackslash{}rho$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, transform}\OperatorTok{=}\NormalTok{ax1.transAxes, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{ax2.text(}\FloatTok{0.99}\NormalTok{, }\FloatTok{0.30}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},\textbackslash{}mathit\{\textbackslash{}Sigma\}\_0$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, transform}\OperatorTok{=}\NormalTok{ax2.transAxes, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{ax2.text(}\FloatTok{0.99}\NormalTok{, }\FloatTok{0.82}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},\textbackslash{}mathit\{\textbackslash{}Sigma\}\_0$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, transform}\OperatorTok{=}\NormalTok{ax2.transAxes, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}

\NormalTok{ax1.hlines(}\DecValTok{0}\NormalTok{, thr\_neg, thr\_pos, color}\OperatorTok{=}\StringTok{"black"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax1.scatter([thr\_neg, thr\_pos], [}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{], color}\OperatorTok{=}\StringTok{"black"}\NormalTok{, s}\OperatorTok{=}\DecValTok{25}\NormalTok{)}
\NormalTok{ax2.hlines(}\DecValTok{0}\NormalTok{, thr\_pos, x\_max, color}\OperatorTok{=}\StringTok{"black"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax2.scatter([thr\_pos], [}\DecValTok{0}\NormalTok{], color}\OperatorTok{=}\StringTok{"black"}\NormalTok{, s}\OperatorTok{=}\DecValTok{25}\NormalTok{)}

\NormalTok{plt.show(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}[H]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-phase-space-factor-complex-plane-output-1.pdf}}

}

\caption{\label{fig-phase-space-factor-complex-plane}Analytic
continuation of the (rotated) phase space factor \(i\rho(s)\) to a
Chew--Mandelstam function \(\varSigma_0(s)\) that produces the expected
right-hand cut (black). The real~(\textcolor{RUBblue}{blue}) and
imaginary~(\textcolor{RUBgreen}{green}) part of the respective functions
evaluated just above the real {\(s\)~axis} are also plotted.}

\end{figure}%

To construct \(\varSigma_\ell(s)\) for {higher~\(\ell\),} we can again
apply the Cauchy integral formula. This time the logic that led to
Equation~\eqref{eq-amplitude-dispersion-integral} reverses: we start
with the assumption that we need a function \(\varSigma_\ell(s)\) that
has the desired right-hand cut with a discontinuity of

\[
\operatorname{Disc} \varSigma_\ell(s) \;=\; 2i\,\rho(s)\,n_\ell^2(s) \,.
\]

\noindent rather than its imaginary part. Since
\(\rho(s)\,n_\ell^2(s) \to s\) rather than \(0\) as \(|s|\to\infty\),
the dispersion integral needs to be
once-subtracted~{[}\citeproc{ref-Sugawara:1961zz}{135}{]}, giving
us~{[}\citeproc{ref-Edwards:1980sa}{136};
\citeproc{ref-ParticleDataGroup:2024cfk}{66, p.~15}{]}
\begin{equation}\phantomsection\label{eq-dispersion-integral-sigma}{
\varSigma_\ell(s) \;=\;
\frac{s-s_\text{thr}}{\pi} \int_{s_\text{thr}}^\infty
\frac{\rho(s') \, n_{\ell}^2(s') \, \mathrm{d}s'}{(s'-s_\text{thr})(s'-s-i\epsilon)} \,.
}\end{equation}

\noindent An analytic solution to this integral exists if \(\ell=0\) and
is given by~{[}\citeproc{ref-Reid:1982wt}{137}{]}

\begin{equation}\phantomsection\label{eq-chew-mandelstam-function}{
\begin{aligned}
\varSigma_0(s) \;&=\; \frac{1}{\pi} \left[
    \frac{2\,q(s)}{\sqrt{s}} \log \frac{m_C^2 + m_D^2 - s + 2\,q(s)\sqrt{s}}{2\,m_C\,m_D}
\right. \\ & \qquad\quad \left.
    - \, (m_C^2 - m_D^2) \left( \frac{1}{s} - \frac{1}{(m_C + m_D)^2} \right) \log \frac{m_C}{m_D}
\right] \,.
\end{aligned}
}\end{equation}

Simply by replacing \(i\rho(s)n_\ell^2(s)\) with its analytic version
\(\varSigma_\ell(s)\), the physical amplitude \(a_{11}(s)\) for elastic
\(\pi N\) scattering shown in
Figure~\ref{fig-coupled-nucleon-scattering-amplitudes} can be computed
anywhere in the complex plane.
Figure~\ref{fig-physical-amplitude-complex-plane} shows how the
{amplitude~\(a_{11}(s)\)} for \(\pi N \to \pi N\) scattering has been
analytically continued from the real axis into one smooth function over
the complex plane, with the expected right-hand branch cut along the
real {\(s\)~axis} starting at the {\(\pi N\)~threshold.} The second
branch point at the {\(\eta N\)~threshold} lies at the same position as
the cusp effect seen in the lineshapes.

\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{def}\NormalTok{ draw\_text(ax, x, y, text, }\OperatorTok{**}\NormalTok{kwargs):}
\NormalTok{    ax.text(x, y, text, transform}\OperatorTok{=}\NormalTok{ax.transAxes, }\OperatorTok{**}\NormalTok{kwargs)}


\NormalTok{T1 }\OperatorTok{=}\NormalTok{ (K.inv() }\OperatorTok{{-}}\NormalTok{ Σ).inv()}
\NormalTok{T1\_expr }\OperatorTok{=}\NormalTok{ T1.as\_explicit().subs(definitions)}
\NormalTok{parameters.update(\{}
\NormalTok{    g1: }\FloatTok{1.2}\NormalTok{,}
\NormalTok{    g2: }\FloatTok{0.8}\NormalTok{,}
\NormalTok{\})}
\NormalTok{T1\_func }\OperatorTok{=}\NormalTok{ lambdify\_matrix\_expression(T1\_expr)}

\NormalTok{x\_min, x\_max }\OperatorTok{=} \FloatTok{0.9}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\FloatTok{1.9}\OperatorTok{**}\DecValTok{2}
\NormalTok{y\_max }\OperatorTok{=} \FloatTok{1.0}
\NormalTok{z\_max }\OperatorTok{=} \DecValTok{2}
\NormalTok{X, Y }\OperatorTok{=}\NormalTok{ np.meshgrid(}
\NormalTok{    np.linspace(x\_min, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{),}
\NormalTok{    np.linspace(}\OperatorTok{{-}}\NormalTok{y\_max, }\OperatorTok{+}\NormalTok{y\_max, num}\OperatorTok{=}\DecValTok{300}\NormalTok{),}
\NormalTok{)}
\NormalTok{S }\OperatorTok{=}\NormalTok{ X }\OperatorTok{+} \OtherTok{1j} \OperatorTok{*}\NormalTok{ Y}

\NormalTok{fig }\OperatorTok{=}\NormalTok{ plt.figure(dpi}\OperatorTok{=}\DecValTok{300}\NormalTok{, figsize}\OperatorTok{=}\NormalTok{(}\FloatTok{3.5}\NormalTok{, }\FloatTok{1.8}\NormalTok{))}
\NormalTok{ax }\OperatorTok{=}\NormalTok{ fig.add\_axes([}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{])}
\NormalTok{fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{ax.set\_yticks([])}
\NormalTok{ax.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},s$"}\NormalTok{)}
\NormalTok{ax.set\_ylim(}\OperatorTok{{-}}\NormalTok{y\_max, }\OperatorTok{+}\NormalTok{y\_max)}
\NormalTok{draw\_text(ax, }\FloatTok{0.99}\NormalTok{, }\OperatorTok{{-}}\FloatTok{0.1}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},s$"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}

\NormalTok{kwargs }\OperatorTok{=} \BuiltInTok{dict}\NormalTok{(}
\NormalTok{    cmap}\OperatorTok{=}\StringTok{"coolwarm"}\NormalTok{,}
\NormalTok{    rasterized}\OperatorTok{=}\VariableTok{True}\NormalTok{,}
\NormalTok{    vmin}\OperatorTok{={-}}\NormalTok{z\_max,}
\NormalTok{    vmax}\OperatorTok{=+}\NormalTok{z\_max,}
\NormalTok{)}
\NormalTok{mesh }\OperatorTok{=}\NormalTok{ ax.pcolormesh(X, Y, T1\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](S).imag, }\OperatorTok{**}\NormalTok{kwargs)}
\NormalTok{cbar }\OperatorTok{=}\NormalTok{ fig.colorbar(mesh, ax}\OperatorTok{=}\NormalTok{ax, pad}\OperatorTok{=}\FloatTok{0.01}\NormalTok{)}
\NormalTok{cbar.ax.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a$"}\NormalTok{, labelpad}\OperatorTok{=}\DecValTok{12}\NormalTok{, rotation}\OperatorTok{={-}}\DecValTok{90}\NormalTok{)}
\NormalTok{cbar.ax.set\_yticks([}\OperatorTok{{-}}\NormalTok{z\_max, }\DecValTok{0}\NormalTok{, }\OperatorTok{+}\NormalTok{z\_max])}
\NormalTok{cbar.ax.set\_yticklabels([}\StringTok{"${-}$"}\NormalTok{, }\StringTok{"$0$"}\NormalTok{, }\StringTok{"$+$"}\NormalTok{])}

\NormalTok{scale }\OperatorTok{=} \FloatTok{0.5}
\NormalTok{s1 }\OperatorTok{=}\NormalTok{ np.linspace(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{s2 }\OperatorTok{=}\NormalTok{ np.linspace(thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{ax.plot(s1.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax.plot(s1.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax.plot(s1.real, scale }\OperatorTok{*}\NormalTok{ np.}\BuiltInTok{abs}\NormalTok{(T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1))}\OperatorTok{**}\DecValTok{2}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dotted"}\NormalTok{, lw}\OperatorTok{=}\FloatTok{1.5}\NormalTok{)}
\NormalTok{ax.hlines(}\DecValTok{0}\NormalTok{, thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, color}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax.hlines(}\DecValTok{0}\NormalTok{, thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, color}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{ax.scatter([thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{], [}\DecValTok{0}\NormalTok{], color}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, s}\OperatorTok{=}\DecValTok{30}\NormalTok{, zorder}\OperatorTok{=}\DecValTok{10}\NormalTok{)}
\NormalTok{ax.scatter([thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{], [}\DecValTok{0}\NormalTok{], color}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, s}\OperatorTok{=}\DecValTok{30}\NormalTok{, zorder}\OperatorTok{=}\DecValTok{10}\NormalTok{)}
\NormalTok{ax.text(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\OperatorTok{+}\FloatTok{0.05} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{R"$\textbackslash{}pi N$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}
\NormalTok{ax.text(thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\OperatorTok{{-}}\FloatTok{0.07} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{R"$\textbackslash{}eta N$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}

\NormalTok{draw\_text(ax, }\FloatTok{0.44}\NormalTok{, }\FloatTok{0.26}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},a$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{draw\_text(ax, }\FloatTok{0.99}\NormalTok{, }\FloatTok{0.58}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}
\NormalTok{draw\_text(ax, }\FloatTok{0.45}\NormalTok{, }\FloatTok{0.87}\NormalTok{, }\VerbatimStringTok{R"$|a|\^{}2$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#757575"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}
\NormalTok{plt.show(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}[H]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-physical-amplitude-complex-plane-output-1.pdf}}

}

\caption{\label{fig-physical-amplitude-complex-plane}Analytic
continuation into the complex plane of the physical amplitude
\(a_{11}(s)\) for elastic \(\pi N\) scattering shown in
Figure~\ref{fig-coupled-nucleon-scattering-amplitudes}. The modulus
squared (dashed gray), real part (dashed blue), and imaginary part
(solid green) of \(a_{11}(s)\) evaluated just above the real
{\(s\)~axis} are also shown, as well as the two overlapping branch cuts
for the \({\color{C0}\pi N}\) and \({\color{C1}\eta N}\) thresholds.}

\end{figure}%

\subsubsection{Crossing the branch cut}\label{crossing-the-branch-cut}

The analytic continuation of the amplitude has not yet revealed any
poles. This is because the amplitude function \(a(s)\), while analytic
and single-valued within its complex domain, becomes part of a
multivalued structure when continued across its branch cuts. These
continuations together form a smooth, connected complex manifold known
as a \textbf{Riemann surface}. {Figure~\ref{fig-riemann-surface-png}}
shows a three-dimensional rendering of
Figure~\ref{fig-physical-amplitude-complex-plane} that continues the
amplitude across its branch cuts. Each continuation defines a new
\textbf{Riemann sheet}, and the poles associated with resonances reside
on a sheet that is not directly accessible from the initial (physical)
one~{[}\citeproc{ref-Ketzer:2019wmd}{138, §3.1.5}{]}. What we typically
call ``the amplitude'' is therefore only one branch~-- a single-valued
function~-- on a particular sheet of a Riemann surface that encodes the
global analytic structure of the scattering process.

The amplitude function that we have constructed is called the
\textbf{physical sheet} as it is constructed from observable data on the
real axis~{[}\citeproc{ref-Perl:1974-HadronPhysics}{122,
pp.~344--345}{]}. Continuing across the cut leads us to an
\textbf{unphysical sheet} that contains the poles that we are interested
in. When considering multiple channels, each threshold defines a new
branch point with two associated sheets, leading to multiple overlapping
cuts along the real axis. The Riemann surface for \(n\) channels
therefore consists of \(2^n\) sheets, each corresponding to a different
combination of continuations across the cuts. The sheets are commonly
denoted with Roman numerals, like \(\mathbfit{a}^\mathrm{I}\),
\(\mathbfit{a}^\mathrm{II}\), et cetera, starting at physical
{sheet~\(\mathbfit{a}^\mathrm{I}\).}

\begin{Shaded}
\begin{Highlighting}[]
\CommentTok{\# cspell:ignore aspectratio colorscale showlegend showscale showticklabels surfacecolor xaxis yaxis zaxis}
\ImportTok{import}\NormalTok{ plotly.graph\_objects }\ImportTok{as}\NormalTok{ go}

\NormalTok{x\_min, x\_max }\OperatorTok{=} \FloatTok{0.6}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\FloatTok{1.9}\OperatorTok{**}\DecValTok{2}
\NormalTok{y\_max }\OperatorTok{=} \FloatTok{1.6}
\NormalTok{x }\OperatorTok{=}\NormalTok{ np.linspace(x\_min, x\_max, num}\OperatorTok{=}\DecValTok{200}\NormalTok{)}
\NormalTok{y }\OperatorTok{=}\NormalTok{ np.linspace(ϵ, y\_max, num}\OperatorTok{=}\DecValTok{50}\NormalTok{)}
\NormalTok{X, Y }\OperatorTok{=}\NormalTok{ np.meshgrid(x, y)}
\NormalTok{S }\OperatorTok{=}\NormalTok{ X }\OperatorTok{+} \OtherTok{1j} \OperatorTok{*}\NormalTok{ Y}
\NormalTok{Z1 }\OperatorTok{=}\NormalTok{ T1\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](S)}
\NormalTok{Z2 }\OperatorTok{=}\NormalTok{ T1\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](S.conj())}
\NormalTok{z\_max }\OperatorTok{=} \BuiltInTok{max}\NormalTok{(np.}\BuiltInTok{abs}\NormalTok{(Z1.imag).}\BuiltInTok{max}\NormalTok{(), np.}\BuiltInTok{abs}\NormalTok{(Z2.imag).}\BuiltInTok{max}\NormalTok{())}
\NormalTok{line\_style }\OperatorTok{=} \BuiltInTok{dict}\NormalTok{(}
\NormalTok{    line}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(color}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, width}\OperatorTok{=}\DecValTok{7}\NormalTok{),}
\NormalTok{    mode}\OperatorTok{=}\StringTok{"lines"}\NormalTok{,}
\NormalTok{    showlegend}\OperatorTok{=}\VariableTok{False}\NormalTok{,}
\NormalTok{)}
\NormalTok{marker\_style }\OperatorTok{=} \BuiltInTok{dict}\NormalTok{(}
\NormalTok{    marker\_size}\OperatorTok{=}\DecValTok{6}\NormalTok{,}
\NormalTok{    mode}\OperatorTok{=}\StringTok{"markers"}\NormalTok{,}
\NormalTok{    showlegend}\OperatorTok{=}\VariableTok{False}\NormalTok{,}
\NormalTok{)}
\NormalTok{surface\_style }\OperatorTok{=} \KeywordTok{lambda}\NormalTok{ z: }\BuiltInTok{dict}\NormalTok{(}
\NormalTok{    cmin}\OperatorTok{={-}}\FloatTok{0.8} \OperatorTok{*}\NormalTok{ z\_max,}
\NormalTok{    cmax}\OperatorTok{=+}\FloatTok{0.8} \OperatorTok{*}\NormalTok{ z\_max,}
\NormalTok{    colorscale}\OperatorTok{=}\StringTok{"RdBu\_r"}\NormalTok{,}
\NormalTok{    lighting}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(diffuse}\OperatorTok{=}\FloatTok{0.9}\NormalTok{),  }\CommentTok{\# https://plotly.com/python/v3/3d{-}surface{-}lighting}
\NormalTok{    opacity}\OperatorTok{=}\FloatTok{0.6}\NormalTok{,}
\NormalTok{    surfacecolor}\OperatorTok{=}\NormalTok{z.real,}
\NormalTok{    z}\OperatorTok{=}\NormalTok{z.imag,}
\NormalTok{)}
\NormalTok{s1 }\OperatorTok{=}\NormalTok{ np.linspace(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, num}\OperatorTok{=}\DecValTok{200}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{fig }\OperatorTok{=}\NormalTok{ go.Figure(data}\OperatorTok{=}\NormalTok{[}
\NormalTok{    go.Surface(x}\OperatorTok{=}\NormalTok{X, y}\OperatorTok{=+}\NormalTok{Y, }\OperatorTok{**}\NormalTok{surface\_style(Z1), name}\OperatorTok{=}\StringTok{"Physical sheet"}\NormalTok{, showscale}\OperatorTok{=}\VariableTok{True}\NormalTok{),}
\NormalTok{    go.Surface(x}\OperatorTok{=}\NormalTok{X, y}\OperatorTok{={-}}\NormalTok{Y, }\OperatorTok{**}\NormalTok{surface\_style(Z2), name}\OperatorTok{=}\StringTok{"Physical sheet"}\NormalTok{, showscale}\OperatorTok{=}\VariableTok{False}\NormalTok{),}
\NormalTok{    go.Scatter3d(}
\NormalTok{        x}\OperatorTok{=}\NormalTok{s1.real,}
\NormalTok{        y}\OperatorTok{=}\NormalTok{np.zeros\_like(s1.real),}
\NormalTok{        z}\OperatorTok{=}\NormalTok{T1\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).imag,}
\NormalTok{        name}\OperatorTok{=}\StringTok{"𝑎 on Re \textless{}i\textgreater{}s\textless{}/i\textgreater{}"}\NormalTok{,}
        \OperatorTok{**}\NormalTok{line\_style,}
\NormalTok{    ),}
\NormalTok{    go.Scatter3d(}
\NormalTok{        x}\OperatorTok{=}\NormalTok{[thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{],}
\NormalTok{        y}\OperatorTok{=}\NormalTok{[}\DecValTok{0}\NormalTok{],}
\NormalTok{        z}\OperatorTok{=}\NormalTok{[}\DecValTok{0}\NormalTok{],}
\NormalTok{        marker\_color}\OperatorTok{=}\StringTok{"\#1f77b4"}\NormalTok{,}
\NormalTok{        name}\OperatorTok{=}\StringTok{"𝜋𝑁 threshold"}\NormalTok{,}
        \OperatorTok{**}\NormalTok{marker\_style,}
\NormalTok{    ),}
\NormalTok{    go.Scatter3d(}
\NormalTok{        x}\OperatorTok{=}\NormalTok{[thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{],}
\NormalTok{        y}\OperatorTok{=}\NormalTok{[}\DecValTok{0}\NormalTok{],}
\NormalTok{        z}\OperatorTok{=}\NormalTok{[T1\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](thr2}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ ϵi).imag],}
\NormalTok{        marker\_color}\OperatorTok{=}\StringTok{"\#ff7f0e"}\NormalTok{,}
\NormalTok{        name}\OperatorTok{=}\StringTok{"𝜂𝑁 threshold"}\NormalTok{,}
        \OperatorTok{**}\NormalTok{marker\_style,}
\NormalTok{    ),}
\NormalTok{])}
\NormalTok{fig.update\_layout(}
\NormalTok{    font}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(color}\OperatorTok{=}\StringTok{"black"}\NormalTok{, family}\OperatorTok{=}\StringTok{"Computer Modern"}\NormalTok{, size}\OperatorTok{=}\DecValTok{18}\NormalTok{),}
\NormalTok{    height}\OperatorTok{=}\DecValTok{400}\NormalTok{,}
\NormalTok{    margin}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(l}\OperatorTok{=}\DecValTok{0}\NormalTok{, r}\OperatorTok{=}\DecValTok{0}\NormalTok{, t}\OperatorTok{=}\DecValTok{0}\NormalTok{, b}\OperatorTok{=}\DecValTok{0}\NormalTok{),}
\NormalTok{    paper\_bgcolor}\OperatorTok{=}\StringTok{"rgba(0, 0, 0, 0)"}\NormalTok{,  }\CommentTok{\# cspell:ignore bgcolor rgba}
\NormalTok{    plot\_bgcolor}\OperatorTok{=}\StringTok{"rgba(0, 0, 0, 0)"}\NormalTok{,}
\NormalTok{    scene}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(}
\NormalTok{        aspectratio}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(x}\OperatorTok{=}\FloatTok{1.8}\NormalTok{, y}\OperatorTok{=}\DecValTok{1}\NormalTok{, z}\OperatorTok{=}\FloatTok{0.9}\NormalTok{),}
\NormalTok{        camera}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(}
            \CommentTok{\# https://plotly.com/python/3d{-}camera{-}controls}
\NormalTok{            center}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(x}\OperatorTok{={-}}\FloatTok{0.12}\NormalTok{, y}\OperatorTok{=}\DecValTok{0}\NormalTok{, z}\OperatorTok{={-}}\FloatTok{0.2}\NormalTok{),}
\NormalTok{            eye}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(x}\OperatorTok{=}\FloatTok{0.8}\NormalTok{, y}\OperatorTok{={-}}\FloatTok{1.5}\NormalTok{, z}\OperatorTok{=}\FloatTok{1.1}\NormalTok{),}
\NormalTok{        ),}
\NormalTok{        xaxis}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(showticklabels}\OperatorTok{=}\VariableTok{False}\NormalTok{, title\_text}\OperatorTok{=}\StringTok{"Re \textless{}i\textgreater{}s\textless{}/i\textgreater{}"}\NormalTok{),}
\NormalTok{        yaxis}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(showticklabels}\OperatorTok{=}\VariableTok{False}\NormalTok{, title\_text}\OperatorTok{=}\StringTok{"Im \textless{}i\textgreater{}s\textless{}/i\textgreater{}"}\NormalTok{),}
\NormalTok{        zaxis}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(}\BuiltInTok{range}\OperatorTok{=}\NormalTok{[}\OperatorTok{{-}}\FloatTok{1.1} \OperatorTok{*}\NormalTok{ z\_max, }\OperatorTok{+}\FloatTok{1.1} \OperatorTok{*}\NormalTok{ z\_max], showticklabels}\OperatorTok{=}\VariableTok{False}\NormalTok{, title\_text}\OperatorTok{=}\StringTok{"Im 𝑎"}\NormalTok{),}
\NormalTok{    ),}
\NormalTok{)}
\NormalTok{fig.update\_traces(}
\NormalTok{    colorbar}\OperatorTok{=}\BuiltInTok{dict}\NormalTok{(}
\NormalTok{        ticktext}\OperatorTok{=}\NormalTok{[}\StringTok{"–"}\NormalTok{, }\StringTok{"0"}\NormalTok{, }\StringTok{"+"}\NormalTok{],  }\CommentTok{\# cspell:ignore ticktext}
\NormalTok{        tickvals}\OperatorTok{=}\NormalTok{[}\OperatorTok{{-}}\FloatTok{0.75} \OperatorTok{*}\NormalTok{ z\_max, }\DecValTok{0}\NormalTok{, }\OperatorTok{+}\FloatTok{0.75} \OperatorTok{*}\NormalTok{ z\_max],  }\CommentTok{\# cspell:ignore tickvals}
\NormalTok{        title}\OperatorTok{=}\StringTok{"Re 𝑎"}\NormalTok{,}
\NormalTok{    ),}
\NormalTok{    selector}\OperatorTok{=}\DecValTok{0}\NormalTok{,}
\NormalTok{)}

\NormalTok{rho }\OperatorTok{=}\NormalTok{ DiagonalMatrix(sp.MatrixSymbol(}\StringTok{"rho"}\NormalTok{, n\_ch, n\_ch))}
\NormalTok{Ti }\OperatorTok{=}\NormalTok{ (T1.inv() }\OperatorTok{{-}} \DecValTok{2} \OperatorTok{*}\NormalTok{ sp.I }\OperatorTok{*}\NormalTok{ rho).inv()}
\NormalTok{T2\_expr }\OperatorTok{=}\NormalTok{ Ti.as\_explicit().subs(\{}
    \OperatorTok{**}\NormalTok{definitions,}
\NormalTok{    rho[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]: PhaseSpaceFactor(s, ma, mb),}
\NormalTok{    rho[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]: }\DecValTok{0}\NormalTok{,}
\NormalTok{\})}
\NormalTok{T2\_func }\OperatorTok{=}\NormalTok{ lambdify\_matrix\_expression(T2\_expr)}
\NormalTok{X, Y }\OperatorTok{=}\NormalTok{ np.meshgrid(}
\NormalTok{    np.linspace(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, num}\OperatorTok{=}\DecValTok{50}\NormalTok{),}
\NormalTok{    np.linspace(ϵ, }\FloatTok{0.4} \OperatorTok{*}\NormalTok{ y\_max, num}\OperatorTok{=}\DecValTok{20}\NormalTok{),}
\NormalTok{)}
\NormalTok{S }\OperatorTok{=}\NormalTok{ X }\OperatorTok{+} \OtherTok{1j} \OperatorTok{*}\NormalTok{ Y}
\NormalTok{Z }\OperatorTok{=}\NormalTok{ T2\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](S.conj())}
\NormalTok{fig.add\_trace(go.Surface(x}\OperatorTok{=}\NormalTok{X, y}\OperatorTok{={-}}\NormalTok{Y, }\OperatorTok{**}\NormalTok{surface\_style(Z), name}\OperatorTok{=}\StringTok{"Unphysical sheet"}\NormalTok{, showscale}\OperatorTok{=}\VariableTok{False}\NormalTok{))}

\NormalTok{T4\_expr }\OperatorTok{=}\NormalTok{ Ti.as\_explicit().subs(\{}
    \OperatorTok{**}\NormalTok{definitions,}
\NormalTok{    rho[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]: }\OperatorTok{{-}}\NormalTok{PhaseSpaceFactor(s, ma, mb),}
\NormalTok{    rho[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]: }\OperatorTok{{-}}\NormalTok{PhaseSpaceFactor(s, mc, md),}
\NormalTok{\})}
\NormalTok{T4\_func }\OperatorTok{=}\NormalTok{ lambdify\_matrix\_expression(T4\_expr)}
\NormalTok{X, Y }\OperatorTok{=}\NormalTok{ np.meshgrid(}
\NormalTok{    np.linspace(}\FloatTok{0.95} \OperatorTok{*}\NormalTok{ thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, num}\OperatorTok{=}\DecValTok{50}\NormalTok{),}
\NormalTok{    np.linspace(ϵ, }\FloatTok{0.6} \OperatorTok{*}\NormalTok{ y\_max, num}\OperatorTok{=}\DecValTok{20}\NormalTok{),}
\NormalTok{)}
\NormalTok{S }\OperatorTok{=}\NormalTok{ X }\OperatorTok{+} \OtherTok{1j} \OperatorTok{*}\NormalTok{ Y}
\NormalTok{Z }\OperatorTok{=}\NormalTok{ T4\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](S)}
\NormalTok{fig.add\_trace(go.Surface(x}\OperatorTok{=}\NormalTok{X, y}\OperatorTok{=+}\NormalTok{Y, }\OperatorTok{**}\NormalTok{surface\_style(Z), name}\OperatorTok{=}\StringTok{"Unphysical sheet"}\NormalTok{, showscale}\OperatorTok{=}\VariableTok{False}\NormalTok{))}
\end{Highlighting}
\end{Shaded}

\begin{figure}

\centering{

\includegraphics[width=0.8\linewidth,height=\textheight,keepaspectratio]{images/chapter2/riemann-surface.png}

}

\caption{\label{fig-riemann-surface-png}Three-dimensional rendering of
the transition amplitude in
Figure~\ref{fig-physical-amplitude-complex-plane} with the amplitude
continued further across its branch cuts to form one Riemann surface.
The imaginary part of the amplitude along the real {\(s\)~axis} is
indicated in green and the \(\pi N\) and \(\eta N\) thresholds are
indicated by a blue and an orange dot, respectively.}

\end{figure}%

There is no generic recipe to compute an unphysical sheet from the
physical amplitude. However, we can analytically continue the physical
sheet just around threshold, because the transition between the sheets
has to be continuous. The unitarity relation for partial waves
Equation~\eqref{eq-unitarity-partial-wave} can be rewritten as

\[
a(s) \;=\; \frac{a(s^*)}{1-2i\rho(s)\,a(s^*)}\,,
\]

\noindent using the fact that \(2i\operatorname{Im}a=a-a^*\),
\(|a|^2=a^*a\), and \(a^*(s)=a(s^*)\) (Schwarz reflection). Continuity
between the sheets tells that
\(a^\mathrm{I}(s+i\epsilon) = a^\mathrm{II}(s-i\epsilon)\) around the
branch cut, which gives us

\begin{equation}\phantomsection\label{eq-analyticity-transition-between-sheets}{
a^\mathrm{II}(s-i\epsilon) \;=\; \frac{a^\mathrm{I}(s-i\epsilon)}{1-2i\rho(s)\,a^\mathrm{I}(s-i\epsilon)} \,.
}\end{equation}

In many studies, this is taken as a general transformation rule on the
whole complex plane for transitioning to the next sheet between each
branch cut. In matrix notation, this would be

\begin{equation}\phantomsection\label{eq-transition-rule-between-sheets}{
\mathbfit{a}_\mathrm{j} \;=\; \left(\mathbfit{a}_\mathrm{i}^{-1}-2i\mathbfit{\rho}_\mathrm{j \to i}\right)^{-1}
}\end{equation}

\noindent with \(\mathbfit{\rho}_\mathrm{j \to i}\) the diagonal matrix
of standard phase space factors if which some elements have been set to
zero for the transition from sheet \(i\) to
{sheet~\(j\)~{[}\citeproc{ref-Asokan:2022usm}{139}{]}.} Other sources
define sheets through sign flips of the diagonal matrix of phase space
elements~{[}\citeproc{ref-Basdevant:1977ya}{140, p.~666};
\citeproc{ref-Mai:2022eur}{130, p.~6}{]}.

As an illustration of
Equation~\eqref{eq-transition-rule-between-sheets}, we consider the
two-channel case in Figure~\ref{fig-physical-amplitude-complex-plane}.
Applying the matrix
\(\mathbfit{\rho}_\mathrm{j \to i}=\operatorname{diag}\!\left(\rho_1,0\right)\)
continues \(\mathbfit{a}^\mathrm{I}\) into \(\mathbfit{a}^\mathrm{II}\)
across the branch cut between the \(\pi N\) and {\(\eta N\)~thresholds.}
The outcome is displayed in
Figure~\ref{fig-coupled-nucleon-amplitude-unphysical-sheet}: the upper
half-plane and lower left of the plot show the original physical sheet,
while the lower right reveals the continuation onto the adjacent sheet,
where a pole emerges in the lower half-plane. This hidden pole is
precisely what generates the resonant peak we previously observed in the
physical {amplitude~\(a_{11}\)} of
Figure~\ref{fig-coupled-nucleon-scattering-amplitudes}. The figure also
illustrates that branch cuts are not intrinsic features of the function,
but arise only when a multi-valued Riemann surface is represented as a
single-valued function on the complex plane. Through analytic
continuation~-- effectively ``rotating'' the cut~-- one exposes
additional sheets where the underlying pole structure manifests itself.

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ itertools}


\NormalTok{x\_min, x\_max }\OperatorTok{=} \FloatTok{0.8}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\FloatTok{1.9}\OperatorTok{**}\DecValTok{2}
\NormalTok{y\_max }\OperatorTok{=} \FloatTok{1.3}
\NormalTok{z\_max }\OperatorTok{=} \DecValTok{3}
\NormalTok{x }\OperatorTok{=}\NormalTok{ np.linspace(x\_min, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{)}
\NormalTok{y }\OperatorTok{=}\NormalTok{ np.linspace(ϵ, y\_max, num}\OperatorTok{=}\DecValTok{150}\NormalTok{)}
\NormalTok{X, Y }\OperatorTok{=}\NormalTok{ np.meshgrid(x, y)}
\NormalTok{S }\OperatorTok{=}\NormalTok{ X }\OperatorTok{+} \OtherTok{1j} \OperatorTok{*}\NormalTok{ Y}

\NormalTok{figs }\OperatorTok{=}\NormalTok{ np.array([}
\NormalTok{    [plt.figure(dpi}\OperatorTok{=}\DecValTok{300}\NormalTok{, figsize}\OperatorTok{=}\NormalTok{(}\FloatTok{2.5}\NormalTok{, }\FloatTok{1.4}\NormalTok{)) }\ControlFlowTok{for}\NormalTok{ \_ }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(}\DecValTok{2}\NormalTok{)]}
    \ControlFlowTok{for}\NormalTok{ \_ }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(}\DecValTok{2}\NormalTok{)}
\NormalTok{])}
\NormalTok{axes }\OperatorTok{=}\NormalTok{ np.array([}
\NormalTok{    [figs[i, j].add\_axes([}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]) }\ControlFlowTok{for}\NormalTok{ j }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(}\DecValTok{2}\NormalTok{)]}
    \ControlFlowTok{for}\NormalTok{ i }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(}\DecValTok{2}\NormalTok{)}
\NormalTok{])}
\ControlFlowTok{for}\NormalTok{ fig, ax }\KeywordTok{in} \BuiltInTok{zip}\NormalTok{(figs.flatten(), axes.flatten()):}
\NormalTok{    fig.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes.flatten():}
\NormalTok{    ax.spines[}\StringTok{"bottom"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"right"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.spines[}\StringTok{"top"}\NormalTok{].set\_visible(}\VariableTok{False}\NormalTok{)}
\NormalTok{    ax.patch.set\_facecolor(}\StringTok{"none"}\NormalTok{)}
\NormalTok{    ax.axvline(parameters[mp1]}\OperatorTok{**}\DecValTok{2}\NormalTok{, color}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, ls}\OperatorTok{=}\StringTok{"dashed"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{    ax.set\_xticks([])}
\NormalTok{    ax.set\_yticks([])}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes[:, }\DecValTok{0}\NormalTok{]:}
\NormalTok{    ax.set\_ylabel(}\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},s$"}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes[:, }\OperatorTok{{-}}\DecValTok{1}\NormalTok{]:}
\NormalTok{    draw\_text(ax, }\FloatTok{1.01}\NormalTok{, }\FloatTok{0.5}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},s$"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"left"}\NormalTok{, va}\OperatorTok{=}\StringTok{"center"}\NormalTok{)}

\NormalTok{kwargs }\OperatorTok{=} \BuiltInTok{dict}\NormalTok{(}
\NormalTok{    cmap}\OperatorTok{=}\StringTok{"coolwarm"}\NormalTok{,}
\NormalTok{    rasterized}\OperatorTok{=}\VariableTok{True}\NormalTok{,}
\NormalTok{    vmin}\OperatorTok{={-}}\NormalTok{z\_max,}
\NormalTok{    vmax}\OperatorTok{=+}\NormalTok{z\_max,}
\NormalTok{)}
\NormalTok{channel\_names }\OperatorTok{=}\NormalTok{ [}\VerbatimStringTok{R"\textbackslash{}pi N"}\NormalTok{, }\VerbatimStringTok{R"\textbackslash{}eta N"}\NormalTok{]}
\NormalTok{x\_diff }\OperatorTok{=}\NormalTok{ x\_max }\OperatorTok{{-}}\NormalTok{ x\_min}
\ControlFlowTok{for}\NormalTok{ i, j }\KeywordTok{in}\NormalTok{ itertools.product(}\BuiltInTok{range}\NormalTok{(n\_ch), repeat}\OperatorTok{=}\DecValTok{2}\NormalTok{):}
\NormalTok{    ax }\OperatorTok{=}\NormalTok{ axes[i, j]}
\NormalTok{    ch1 }\OperatorTok{=}\NormalTok{ channel\_names[i]}
\NormalTok{    ch2 }\OperatorTok{=}\NormalTok{ channel\_names[j]}
\NormalTok{    ax.text(x\_min }\OperatorTok{+} \FloatTok{0.02} \OperatorTok{*}\NormalTok{ x\_diff, }\OperatorTok{+}\FloatTok{0.92} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{Rf"$a\_}\CharTok{\{\{}\SpecialCharTok{\{}\NormalTok{i}\OperatorTok{+}\DecValTok{1}\SpecialCharTok{\}\{}\NormalTok{j}\OperatorTok{+}\DecValTok{1}\SpecialCharTok{\}}\CharTok{\}\}}\VerbatimStringTok{\^{}\textbackslash{}mathrm}\CharTok{\{\{}\VerbatimStringTok{I}\CharTok{\}\}}\VerbatimStringTok{$"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"left"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{    ax.text(x\_max }\OperatorTok{{-}} \FloatTok{0.02} \OperatorTok{*}\NormalTok{ x\_diff, }\OperatorTok{{-}}\FloatTok{0.92} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{Rf"$a\_}\CharTok{\{\{}\SpecialCharTok{\{}\NormalTok{i}\OperatorTok{+}\DecValTok{1}\SpecialCharTok{\}\{}\NormalTok{j}\OperatorTok{+}\DecValTok{1}\SpecialCharTok{\}}\CharTok{\}\}}\VerbatimStringTok{\^{}\textbackslash{}mathrm}\CharTok{\{\{}\VerbatimStringTok{II}\CharTok{\}\}}\VerbatimStringTok{$"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}
\NormalTok{    ax.text(parameters[mp1]}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \FloatTok{0.03} \OperatorTok{*}\NormalTok{ x\_diff, }\OperatorTok{+}\FloatTok{0.92} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{R"$m\_p\^{}2$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#e6332a"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{    ax.text(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\FloatTok{0.05} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{R"$\textbackslash{}pi N$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"center"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}
\NormalTok{    ax.text(thr2}\OperatorTok{**}\DecValTok{2} \OperatorTok{+} \FloatTok{0.03} \OperatorTok{*}\NormalTok{ x\_diff, }\FloatTok{0.05} \OperatorTok{*}\NormalTok{ y\_max, }\VerbatimStringTok{R"$\textbackslash{}eta N$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"left"}\NormalTok{, va}\OperatorTok{=}\StringTok{"bottom"}\NormalTok{)}
\NormalTok{    ax.pcolormesh(X, }\OperatorTok{+}\NormalTok{Y, T1\_func[i, j](S).imag, }\OperatorTok{**}\NormalTok{kwargs)}
\NormalTok{    ax.pcolormesh(X, }\OperatorTok{{-}}\NormalTok{Y, np.select([X }\OperatorTok{\textless{}}\NormalTok{ thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{], [T1\_func[i, j](S.conj()).imag], default}\OperatorTok{=}\NormalTok{np.nan), }\OperatorTok{**}\NormalTok{kwargs)}
\NormalTok{    ax.pcolormesh(X, }\OperatorTok{{-}}\NormalTok{Y, np.select([X }\OperatorTok{\textgreater{}}\NormalTok{ thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{], [T2\_func[i, j](S.conj()).imag], default}\OperatorTok{=}\NormalTok{np.nan), }\OperatorTok{**}\NormalTok{kwargs)}

\NormalTok{scale }\OperatorTok{=} \FloatTok{0.8}
\NormalTok{s1 }\OperatorTok{=}\NormalTok{ np.linspace(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{s2 }\OperatorTok{=}\NormalTok{ np.linspace(thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, num}\OperatorTok{=}\DecValTok{500}\NormalTok{) }\OperatorTok{+}\NormalTok{ ϵi}
\NormalTok{ax11, ax12, ax21, ax22 }\OperatorTok{=}\NormalTok{ axes.flatten()}
\NormalTok{ax11.plot(s1.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax12.plot(s2.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{](s2).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax21.plot(s2.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax22.plot(s2.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).imag, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax11.plot(s1.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{](s1).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax12.plot(s2.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{0}\NormalTok{](s2).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax21.plot(s2.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\NormalTok{ax22.plot(s2.real, scale }\OperatorTok{*}\NormalTok{ T\_func[}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{](s2).real, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{1}\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ ax }\KeywordTok{in}\NormalTok{ axes.flatten():}
\NormalTok{    ax.vlines(thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\OperatorTok{{-}}\NormalTok{y\_max, }\DecValTok{0}\NormalTok{, color}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{    ax.hlines(}\DecValTok{0}\NormalTok{, thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{, x\_max, color}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, lw}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{    ax.scatter([thr1}\OperatorTok{**}\DecValTok{2}\NormalTok{], [}\DecValTok{0}\NormalTok{], color}\OperatorTok{=}\StringTok{"C0"}\NormalTok{, s}\OperatorTok{=}\DecValTok{35}\NormalTok{, zorder}\OperatorTok{=}\DecValTok{10}\NormalTok{)}
\NormalTok{    ax.scatter([thr2}\OperatorTok{**}\DecValTok{2}\NormalTok{], [}\DecValTok{0}\NormalTok{], color}\OperatorTok{=}\StringTok{"C1"}\NormalTok{, s}\OperatorTok{=}\DecValTok{35}\NormalTok{, zorder}\OperatorTok{=}\DecValTok{10}\NormalTok{)}
\NormalTok{    ax.set\_ylim(}\OperatorTok{{-}}\NormalTok{y\_max, }\OperatorTok{+}\NormalTok{y\_max)}

\NormalTok{draw\_text(ax22, }\FloatTok{0.99}\NormalTok{, }\FloatTok{0.45}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Re\}}\VerbatimStringTok{\textbackslash{},a$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#17365c"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}
\NormalTok{draw\_text(ax22, }\FloatTok{0.99}\NormalTok{, }\FloatTok{0.91}\NormalTok{, }\VerbatimStringTok{R"$\textbackslash{}mathrm}\SpecialCharTok{\{Im\}}\VerbatimStringTok{\textbackslash{},a$"}\NormalTok{, c}\OperatorTok{=}\StringTok{"\#8dae10"}\NormalTok{, ha}\OperatorTok{=}\StringTok{"right"}\NormalTok{, va}\OperatorTok{=}\StringTok{"top"}\NormalTok{)}

\ControlFlowTok{for}\NormalTok{ fig }\KeywordTok{in}\NormalTok{ figs.flatten():}
\NormalTok{    plt.show(fig)}
\end{Highlighting}
\end{Shaded}

\begin{figure}[t!]

\begin{minipage}{0.50\linewidth}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-coupled-nucleon-amplitude-unphysical-sheet-output-1.pdf}}

}

\subcaption{\label{fig-coupled-nucleon-amplitude-unphysical-sheet-1}\(\pi N \to \pi N\)
(elastic)}

\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-coupled-nucleon-amplitude-unphysical-sheet-output-2.pdf}}

}

\subcaption{\label{fig-coupled-nucleon-amplitude-unphysical-sheet-2}\(\pi N \to \eta N\)
(inelastic)}

\end{minipage}%
\newline
\begin{minipage}{0.50\linewidth}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-coupled-nucleon-amplitude-unphysical-sheet-output-3.pdf}}

}

\subcaption{\label{fig-coupled-nucleon-amplitude-unphysical-sheet-3}\(\eta N \to \pi N\)
(inelastic)}

\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter2_files/figure-latex/fig-coupled-nucleon-amplitude-unphysical-sheet-output-4.pdf}}

}

\subcaption{\label{fig-coupled-nucleon-amplitude-unphysical-sheet-4}\(\eta N \to \eta N\)
(elastic)}

\end{minipage}%

\caption{\label{fig-coupled-nucleon-amplitude-unphysical-sheet}Analytic
continuation of the physical amplitudes of \(\pi\)/\(\eta\)--nucleon
scattering into the unphysical sheet between the two thresholds. The
\(\pi N\) cut between sheet I and II is rotated downwards rather than to
the left in order to avoid the wrong cut structure of the standard phase
space factor \(\rho_1(s)\) appearing in transformation
Equation~\eqref{eq-transition-rule-between-sheets}.}

\end{figure}%

\subsubsection{Extracting poles and
residues}\label{sec-pole-residue-extraction}

Finally, we are in a position to locate pole positions. These can be
found by determining where the denominator of an unphysical sheet goes
to zero. Using Equation~\eqref{eq-transition-rule-between-sheets}, we
can translate this to the condition

\[
\operatorname{det}\left(\mathbfit{a}_\mathrm{I}(s)^{-1} - 2i\mathbfit{\rho}_\mathrm{j \to i}(s)\right) = 0\,.
\]

This equation cannot be solved analytically, even given the simple pole
parametrisation of Equation~\eqref{eq-k-matrix-parametrisation}. A
common trick is to numerically minimise the modulus
\(\left|\mathbfit{a}_\mathrm{I}(s)^{-1} - 2i\mathbfit{\rho}_\mathrm{j \to i}(s)\right|\)
with regard to \(s\), for instance with a gradient-descent algorithm.
This gives us a number of \textbf{pole positions} \(s_r\) that are
potentially located in different sheets. With the
{\(\mathbfit{K}\)‑matrix} parametrisation described so far, these
positions are affected by threshold parameters, coupling constants, and
bare masses.

Poles have a \textbf{residue} associated with each channel transition.
It reveals how strongly the state couples to specific decay or
production channels. The coupling constants \(g^r_\alpha\) in
Equation~\eqref{eq-k-matrix-single-channel} encode this interaction
strength and determine where and how the resonance becomes visible in
the cross section of each channel. The residue can be computed
numerically with the Cauchy integral formula over a small closed
contour~\(C\) around the pole position \(s_r\), giving us

\[
\mathrm{Res}(a, s_r) \;=\; \frac{1}{2\pi i} \oint_\gamma a(s') \, ds' \,.
\]

Pole positions characterise the analytic structure of the entire system
and define hadronic states independently of the specific process or
channel in which they appear. Unlike peaks in measured cross section,
which may vary with kinematic effects and interference between channels,
a pole's location in the complex energy plane is a property of the
underlying dynamics. It provides a channel-independent reference point
that can be compared directly with non-perturbative consequences of QCD,
such as those obtained from lattice calculations, dispersive analyses,
or effective field theories. In this way, pole positions offer a direct
connection between experimental observations and the fundamental
structure of the strong interaction.

\section{Connecting to experiment}\label{sec-connecting-to-experiment}

The theory developed in this chapter provides the foundation for
constructing amplitude models that respect fundamental physical
principles of Section~\ref{sec-s-matrix-constraints}. These models
encode dynamical information in terms of physically meaningful
parameters, such as coupling constants and bare pole positions, and can
be directly linked to observable quantities. Specifically, amplitude
models give us an \textbf{intensity function}, a real-valued function of
measurable kinematic variables, via the expression for the differential
cross section (see Equation~\eqref{eq-differential-cross-section}). This
intensity function serves as the interface between theory and the event
distributions measured by experiment, enabling the extraction of model
parameters from experimental
data~{[}\citeproc{ref-Omnes:1963-MandelstamTheoryRegge}{112}{]}.

In practice, the input to an amplitude analysis consists of
reconstructed four-momenta of the final-state particles for each event.
These four-momenta are the raw, Lorentz-covariant observables measured
in the detector. From them, one computes the relevant \textbf{kinematic
variables}~-- such as helicity angles and Mandelstam invariants~-- which
serve as arguments to the intensity function. Denoting the set of
kinematic variables as \(x\), the intensity function gets the form
\(I(x; \mathbfit{\theta})\), with \(\mathbfit{\theta}\) the set of model
parameters.

The function \(I(x; \mathbfit{\theta})\) determines the expected density
of events in phase space and can be interpreted as a
\textbf{probability-density function} after normalisation

\[
P(x; \mathbfit{\theta}) \;=\; \frac{I(x; \mathbfit{\theta})}{\int_{\Phi} I(x'; \mathbfit{\theta}) \, \mathrm{d}x'}
\]

\noindent over the physically allowed region of phase space \(\Phi\)
(often implicitly weighted by detector acceptance). Given a sample of
\(N\) observed events \(\{x_i\}\), the \textbf{likelihood function} is
defined as the joint probability of the data for a given set of model
parameters \(\mathbfit{\theta}\)
as~{[}\citeproc{ref-Fisher:1922saa}{141}{]}

\[
\mathcal{L}(\mathbfit{\theta})
\;=\; \prod_{i=1}^N P(x_i; \mathbfit{\theta})
\;=\; \prod_{i=1}^N \frac{I(x_i; \mathbfit{\theta})}{\int_{\Phi} I(x; \mathbfit{\theta}) \, \mathrm{d}x} \,.
\]

In experimental data, \(N\) is so large that it makes the product
computationally infeasible. We therefore instead take the logarithm,
which turns the likelihood into a sum: the \textbf{log-likelihood}
function

\[
\log \mathcal{L}(\mathbfit{\theta}) \;=\; \sum_{i=1}^N \log I(x_i; \mathbfit{\theta}) - N \log \left[ \int_{\Phi} I(x; \mathbfit{\theta}) \, \mathrm{d}x \right] \,.
\]

This has the additional benefit that the log-likelihood is additive over
independent datasets, which is useful for combining results from
different analyses or experiments (coupled analysis).

The integral over phase space generally has no analytical solution,
particularly in multi-body decays or when accounting for detector
effects. Instead, it is estimated using Monte Carlo (MC) integration,
typically by generating a simulated sample uniformly distributed in
phase space and summing over
weights~{[}\citeproc{ref-Lyons:1986em}{142}{]}, giving us

\[
\int_{\Phi} I(x; \mathbfit{\theta}) \, \mathrm{d}x \approx \frac{1}{M} \sum_{j=1}^M I(x_j^{\mathrm{MC}}; \mathbfit{\theta}) \,.
\]

The (log-)likelihood function provides a measure (\textbf{estimator})
for how well an amplitude model with parameters \(\mathbfit{\theta}\)
describes \emph{all} observed events, even across different channels.
The goal of an amplitude analysis is to find the parameter values that
maximise this likelihood, which corresponds to minimising the
\textbf{negative log-likelihood} (NLL) function. Finding the global
minimum in the parameter space of the NLL for a specific model and
dataset is often referred to as ``fitting'' the model to the
experimental data sets.

Model fitting is a high-dimensional, non-linear optimisation problem,
often complicated by strong correlations between parameters and the
presence of local minima in parameter space. Standard optimisation tools
such as \textbf{Minuit} are widely used due to their robustness and
built-in handling of parameter boundaries and
uncertainties~{[}\citeproc{ref-James:1975dr}{143}{]}. These algorithms
typically rely on gradient-based minimisation (e.g.~MIGRAD), combined
with error estimation techniques such as MINOS or Hessian-based
covariance extraction. The computational cost of these fits is dominated
by the repeated evaluation of the intensity function over all measured
data events and MC-generated integration points. The efficient,
vectorised, and parallelisable evaluation of arbitrary amplitude models
will be the focus of Chapter~\ref{sec-computational-techniques}.

\bookmarksetup{startatroot}

\chapter{Helicity formalism}\label{sec-helicity-formalism}

\[
\definecolor{C0}{RGB}{31, 119, 180}
\definecolor{C1}{RGB}{255, 127, 14}
\definecolor{MyBlue}{RGB}{0, 68, 136}
\definecolor{MyYellow}{RGB}{221, 170, 51}
\definecolor{MyRed}{RGB}{187, 85, 102}
\]

\noindent Chapter~\ref{sec-scattering-theory} developed scattering
theory techniques starting from 2-to-2 processes. In particular, this
led to the partial-wave expansion
(Section~\ref{sec-partial-wave-expansion}), which separates the
amplitude into a universal angular dependence and a reduced amplitude
that contains the full information about the interaction as a function
of energy. Extending this framework to \emph{multi-body} decays is more
challenging, because a proper relativistic treatment of spin states must
account for their dependence on the chosen reference frame. Several spin
formalisms have been developed to describe transitions involving spinful
particles, such as the Rarita--Schwinger
formalism~{[}\citeproc{ref-Rarita:1941mf}{144}{]},
Lorentz-\emph{covariant} tensor
approaches~{[}\citeproc{ref-Chung:1993da}{145}--\citeproc{ref-Chung:2007nn}{148}{]},
and spin-projection formalisms. Among these, spin-projection
formalisms~-- particularly the helicity formalism~-- are most widely
used in amplitude analyses, as they are computationally convenient and
align naturally with how experimental observables are expressed.
However, as we will see, amplitudes constructed from helicity states are
inherently frame-dependent and do not transform covariantly under
Lorentz transformations. This \emph{non-covariant} nature requires
careful treatment when combining amplitudes from different spin
projections across different decay chains.

The helicity formalism assumes that a multi-body decay can be described
as a sequence of two-body decays~{[}\citeproc{ref-Jacob:1959at}{117}{]}.
In the rest frame of the parent particle, constructing the amplitude for
each two-particle spin state is relatively straightforward, because
conservation of angular momentum fixes how the spins couple at each
vertex. By choosing convenient spin quantisation axes, the amplitudes
for each decay step can then be combined into a single expression for
the full decay chain, with the Lorentz-invariant parametrisations
developed in Chapter~\ref{sec-scattering-theory} inserted at each
two-body amplitude.

Using the helicity formalism effectively requires a clear understanding
of how Lorentz transformations (boosts and rotations) affect spin
states. For this reason, treatises on the helicity formalism typically
follow the following
structure~{[}\citeproc{ref-Richman:1984gh}{149}--\citeproc{ref-Kutschke:1996-AngularDistributionCookbook}{151};
\citeproc{ref-Martin:1970hmp}{102}; \citeproc{ref-Weinberg:1995mt}{100};
\citeproc{ref-Leader:2011vwq}{152}{]}:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\tightlist
\item
  Review how single-particle spin states at rest change under spatial
  rotations.
\item
  Boost and rotate these states to a convenient quantisation axis.
\item
  Investigate the coupling of two-particle spin states using
  conservation of angular momentum.
\item
  Construct the amplitude for a chain of two-body decays.
\end{enumerate}

In this chapter, we follow the same build-up and extend the discussion
to multi-body decays with decay chains that are topologically distinct.

\section{Single-particle states}\label{sec-single-particle-states}

\subsection{Rotating spin states}\label{sec-rotating-spin-states}

Consider a single massive particle with spin~\(j\) (massless particles
will be treated later in terms of their helicity). Its spin state can be
denoted \(\ket{j,m}\), where \(m\) is the spin projection along a chosen
quantisation axis, typically the {\(z\)~axis.} We seek to determine how
this quantum state transforms under an arbitrary spatial rotation
\(\mathbfit{R}(\alpha,\beta,\gamma)\), which rotates coordinate
{system~\((x,y,z)\)} {into~\((x',y',z')\)} over \textbf{Euler angles}
\(\alpha,\beta,\gamma\) in the {\textbf{\(zyz\)‑convention}}. In the
active convention used here, the coordinate axes remain fixed while the
particle three-vectors themselves are rotated: first by an ``intrinsic
twist'' angle~\(\gamma\) around the {\(z\)~axis,} then by a ``polar''
angle \(\beta\) around the new {\(y\)~axis,} and finally by an
``azimuthal'' angle~\(\alpha\) around the new {\(z\)~axis} (see
Figure~\ref{fig-euler-angles}). In this thesis, we use the symbols
\(\alpha, \beta, \gamma\) when deriving general angular properties and
use other Greek letters like \(\phi, \theta, \chi\) to refer to
rotations between specific physical frames.

\begin{figure}

\begin{minipage}{\linewidth}
\end{minipage}%
\newline
\begin{minipage}{\linewidth}

\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/zyz-euler-angles.pdf}}
\end{center}

\end{minipage}%

\caption{\label{fig-euler-angles}Euler angles for
rotation~\(\mathbfit{R}({\color{MyBlue}\alpha},{\color{MyYellow}\beta},{\color{MyRed}\gamma})\)
in the {\(zyz\)‑convention.} }

\end{figure}%

In the context of spin states, the
{operator~\(\mathbf{U}[\mathbfit{R}]\)} represents the effect of the
spatial rotation~\(\mathbfit{R}\) on the Hilbert space in which the spin
state~\(\ket{j,m}\) resides. Since spatial rotations are represented in
quantum mechanics by unitary operators, \(\mathbf{U}[\mathbfit{R}]\) is
itself unitary. For this reason, \(\mathbf{U}[X]\) is often referred to
as the \textbf{unitary operator} corresponding to the spatial
{transformation~\(X\).} It now becomes important to keep track of the
labels in bra-ket states like \(\ket{j,m}\), as they can refer to
different bases and degrees of freedom that are not always in the same
Hilbert space. The operator \(\mathbf{U}[\mathbfit{R}]\) must rotate
\(\ket{j,m}\) according to the same group action that the spatial
rotation \(\mathbfit{R}(\alpha,\beta,\gamma)\) induces in three
dimensions. Because \(\ket{j,m}\) is an eigenstate of the total angular
momentum operators~\(\mathbf{J}^2\) and its {\(z\)~component~\(J_z\),} a
rotation about the {\(z\)~axis} is generated by exponentiating \(J_z\).
Similarly, a rotation about the {\(y\)~axis} is generated by
exponentiating \(J_y\), the {\(y\)~component} of the total angular
momentum~\(\mathbf{J}\). This yields the standard factorisation for a
rotation,

\begin{equation}\phantomsection\label{eq-rotation-generators}{
\mathbf{U}\!\left[\mathbfit{R}(\alpha, \beta, \gamma)\right] \;=\; e^{-i\alpha J_z} \, e^{-i\beta J_y} \, e^{-i\gamma J_z}
\,.
}\end{equation}

The rotated state can be expanded as a linear combination of basis
states~\(\ket{j,m'}\) defined with respect to the new quantisation
axis~\(z'\). Because we have decomposed \(\mathbfit{R}\) into a sequence
of rotations in which two are about the quantisation axis~\(z\), the
expansion can be written explicitly as

\begin{equation}\phantomsection\label{eq-rotation-decomposition}{
\begin{aligned}
\mathbf{U}\!\left[\mathbfit{R}(\alpha, \beta, \gamma)\right]\ket{j,m}
\;&=\;
  \sum_{m'} e^{-i m'\alpha} \, d^j_{m'm}(\beta) \, e^{-i m\gamma}\,\ket{j,m'} \\
\;&=\;
  \sum_{m'} D^j_{m'm}(\alpha, \beta, \gamma)\,\ket{j,m'}\,,
\end{aligned}
}\end{equation}

\noindent where \(d^j_{m'm}\) and \(D^j_{m'm}\) are the elements of the
(small)
{\href{https://en.wikipedia.org/wiki/Wigner_D-matrix\#Wigner_\%28small\%29_d-matrix}{Wigner~\(d\)‑}}
and
{\href{https://en.wikipedia.org/wiki/Wigner_D-matrix}{Wigner~\(D\)}}-matrices
of the total angular momentum representation (German:
``\textbf{D}arstellung'') in spin
space~{[}\citeproc{ref-Wigner:1931-Gruppentheorie}{153}{]}. The
{Wigner~\(d\)}-matrix is a {\(2j+1\)‑dimensional} matrix that encodes
the rotation about the {\(y\)~axis,} while the {Wigner~\(D\)}-matrix
represents the full unitary operator in the spin basis. Note that a
rotation about the {\(z\)~axis} acts only by shifting the phase of the
{\(z\)~component} of the angular momentum, since
\(e^{i\phi J_z} \ket{j,m} = e^{i\phi m} \ket{j,m}\), giving us

\[
\begin{aligned}
D^j_{m'm}(\alpha, \beta, \gamma) \;&=\; \Braket{j,m'| \mathbf{U}\!\left[\mathbfit{R}(\alpha, \beta, \gamma)\right] |j,m} \,, \\
d^j_{m'm}(\beta) \;&=\; \Braket{j,m'| e^{-i\beta J_y} |j,m}
\,.
\end{aligned}
\]

It is important to keep track of the direction of rotation, as in some
instances, the inverse rotation will be used. This results in a
conjugate of the {Wigner~\(D\)}-matrix with flipped lower indices,
giving

\begin{equation}\phantomsection\label{eq-inverse-rotation-decomposition}{
\mathbf{U}\!\left[\mathbfit{R}(\alpha, \beta, \gamma)^{-1}\right]\ket{j,m}
\;=\;
\sum_{m'} D^{j\,*}_{m m'}(\alpha, \beta, \gamma)\,\ket{j,m'}\,.
}\end{equation}

It should be noted that the spatial rotations \(\mathbfit{R}\) belong to
the \textbf{special orthogonal group~\(\mathrm{SO}(3)\)}, whereas the
corresponding unitary {operators~\(\mathbf{U}[\mathbfit{R}]\)} belong to
the \textbf{special unitary group~\(\mathrm{SU}(2)\)}. These two Lie
groups are not isomorphic. Rather, there is a two-to-one homomorphism
between \(\mathrm{SU}(2)\) and \(\mathrm{SO}(3)\), meaning that
\(\mathrm{SU}(2)\) is a \textbf{double cover} of \(\mathrm{SO}(3)\). As
a result, while a spatial rotation in \(\mathrm{SO}(3)\) by \(2\pi\)
around any axis leaves the spatial orientation unchanged, its
corresponding rotation in \(\mathrm{SU}(2)\) produces a spin state with
reversed sign. Only after a {\(4\pi\)~rotation} in space does the spin
state return to its original form. We will return to this subtlety in
Section~\ref{sec-spin-alignment}.

\subsection{Boosting spin states}\label{sec-boosting-spin-states}

Knowing how spin states at rest transform under spatial rotations, we
can now examine how they transform under general Lorentz
transformations. This provides a consistent description of a massive
particle with {spin~\(j\)} and four-momentum \(p=(E,p_x,p_y,p_z)\),
which is an essential ingredient for constructing amplitudes in two-body
decay chains.

So far, we described spin states in terms of spinors transforming under
the rotation group \(\mathrm{SU}(2)\), which is isomorphic to the
three-dimensional spin group \(\mathrm{Spin}(3)\). To include boosts as
well as rotations, the symmetry group must be extended to the
(orthochronous) Lorentz group \(\mathrm{SO}^+(1,3)\). Its double cover
is \(\mathrm{Spin}(1,3)\cong \mathrm{SL}(2,\mathbb{C})\), under which
spin states transform. This extension introduces two additional
features: {(1)~Wigner} rotations, which describe the induced rotation of
spin under Lorentz boosts, and {(2)~the} coupling of spin with
four-momentum, most commonly expressed through helicity.

Lorentz transformations include both pure boosts and rotations. A boost
that brings the rest-frame momentum to a spatial
momentum~\(\vec{p}=(p_x,p_y,p_z)\) is denoted
by~\(\boldsymbol{\varLambda}(\vec{p})\). Analogous to
\(\mathbf{U}[\mathbfit{R}]\), the action of this boost on a spin state
is represented by a unitary
{operator~\(\mathbf{U}[\boldsymbol{\varLambda}(\vec{p})]\).} This
relates the moving spin state~\(\ket{\vec{p},j,m}\) to the
\textbf{rest-frame spin state}~\(\ket{j,m}\equiv\ket{\vec{0},j,m}\) via

\[
\ket{\vec{p},j,m} \;=\; \mathbf{U}[\boldsymbol{\varLambda}(\vec{p})] \, \ket{j,m}
\,.
\]

\noindent Here, the spin projection~\(m\) is defined in the particle's
rest frame. As with spatial rotations
(Equation~\eqref{eq-rotation-generators}), the
{operator~\(\mathbf{U}[\boldsymbol{\varLambda}(\vec{p})]\)} can be
written in terms of the boost {generators~\(\vec{\mathbf{K}}\).}
Together with the rotation generators~\(\vec{\mathbf{J}}\), the six
operators~\(\mathbf{K}_i\) and~\(\mathbf{J}_i\) span the Lie
algebra~\(\mathfrak{so}(1,3)\) of the Lorentz
group~\(\mathrm{SO}(1,3)\). Explicitly, this gives us

\[
\mathbf{U}[\boldsymbol{\varLambda}(\vec{p})]
\;=\; \exp(-i\,\vec{p} \cdot \vec{\mathbf{K}})
\;=\; e^{-i\,\mathbf{K}_x p_x}\,e^{-i\,\mathbf{K}_y p_y}\,e^{-i\,\mathbf{K}_z p_z}.
\]

However, unlike in Equation~\eqref{eq-rotation-decomposition}, this
representation does not directly help to decompose the boosted state
\(\ket{\vec{p},j,m}\) into a linear combination of basis states with
definite angular properties. Instead, we exploit the fact that a Lorentz
boost along an arbitrary direction \(\vec{p}=(p,\theta,\phi)\) can be
written as a rotation and a boost along the {\(z\)~axis.} This
factorisation will allow us to construct one convenient description of
the spin state for a particle with momentum \(\vec{p}\). Later, we will
see that there is an alternative but equivalent description that is
often more practical for analysing angular distributions in decays.

The factorisation works as follows. To boost a state with
{momentum~\(\vec{p}\),} we first rotate the momentum into the
{\(z\)~direction} {with~\(\mathring{\mathbfit{R}}^{-1}\),} then apply
the {boost~\(\boldsymbol{\varLambda_z}(p)\)} {along~\(z\),} and finally
rotate back {with~\(\mathring{\mathbfit{R}}\):}

\[
\boldsymbol{\varLambda}(\vec{p}) \;=\; \mathring{\mathbfit{R}}(\phi,\theta,0) \, \boldsymbol{\varLambda_z}(p) \, \mathring{\mathbfit{R}}^{-1}(\phi,\theta,0)
\,.
\]

\noindent Crucially, since unitary representations are multiplicative,

\begin{equation}\phantomsection\label{eq-unitary-multiplicative}{
\mathbf{U}[\boldsymbol{\varLambda}_1\,\boldsymbol{\varLambda}_2] \;=\; \mathbf{U}[\boldsymbol{\varLambda}_1] \, \mathbf{U}[\boldsymbol{\varLambda}_2]
\,,
}\end{equation}

\noindent and satisfies
\(\mathbf{U}[\mathbfit{R}^{-1}] = \mathbf{U}^{-1}[\mathbfit{R}]\), we
find

\begin{equation}\phantomsection\label{eq-boost-decomposition}{
\mathbf{U}[\boldsymbol{\varLambda}(\vec{p})] \;=\;
  \mathbf{U}[\mathring{\mathbfit{R}}(\phi,\theta,0)] \,
  \mathbf{U}[\boldsymbol{\varLambda_z}(p)] \,
  \mathbf{U}^{-1}[\mathring{\mathbfit{R}}(\phi,\theta,0)]
\,.
}\end{equation}

The state \(\ket{\vec{p},j,m}\) defined in this way is known as the
\textbf{canonical basis} of the spin state (see
Figure~\ref{fig-relativistic-spin-state-bases}). It is obtained by
applying a pure Lorentz boost to the rest-frame state:

\begin{equation}\phantomsection\label{eq-canonical-state}{
\Ket{\vec{p},j,m}
\;=\; \mathbf{U}[\boldsymbol{\varLambda}] \, \Ket{j,m}
\;=\; \mathbf{U}[\mathring{\mathbfit{R}}] \, \mathbf{U}[\boldsymbol{\varLambda_z}] \, \mathbf{U}^{-1}[\mathring{\mathbfit{R}}] \, \ket{j,m}
\,.
}\end{equation}

Importantly, Equation~\eqref{eq-canonical-state} shows that a spin state
in the canonical basis transforms under spatial rotations just like the
spin state at rest in Equation~\eqref{eq-rotation-decomposition}.
Applying a rotation \(\mathbfit{R}\) to the canonical state
\(\ket{\vec{p},j,m}\), we find

\begin{equation}\phantomsection\label{eq-rotate-canonical}{
\begin{aligned}
\mathbf{U}[\mathbfit{R}] \, \Ket{\vec{p},j,m}
\;&=\; \mathbf{U}[\mathbfit{R}]
  \; \underbrace{\mathbf{U}[\mathring{\mathbfit{R}}] \, \mathbf{U}[\boldsymbol{\varLambda_z}] \, \mathbf{U}^{-1}[\mathring{\mathbfit{R}}]}_{\mathbf{U}[\boldsymbol{\varLambda}(\vec{p})]}
  \; \underbrace{\mathbf{U}[\mathbfit{R}^{-1}] \, \mathbf{U}[\mathbfit{R}]}_{\mathbfit{1}}
  \; \ket{j,m} \\
\;&=\;
  \underbrace{\mathbf{U}[\mathbfit{R}\,\mathring{\mathbfit{R}}] \, \mathbf{U}[\boldsymbol{\varLambda_z}] \, \mathbf{U}^{-1}[\mathbfit{R}\,\mathring{\mathbfit{R}}]}_{\mathbf{U}[\boldsymbol{\varLambda}(\mathbfit{R}\,\vec{p})]}
  \; \mathbf{U}[\mathbfit{R}] \, \ket{j,m} \\
\;&=\; \mathbf{U}[\boldsymbol{\varLambda}(\mathbfit{R}\,\vec{p})] \, \sum_{m'} D^j_{m'm}(\mathbfit{R}) \, \ket{j,m'} \\
\;&=\; \sum_{m'} D^j_{m'm}(\mathbfit{R}) \, \Ket{\mathbfit{R}\,\vec{p},j,m'}
\,.
\end{aligned}
}\end{equation}

In the canonical basis, the spin quantisation axis is fixed (e.g.~along
the laboratory {\(z\)~axis)} and therefore not generally aligned with
the momentum of the particle. An alternative is the \textbf{helicity
basis} (see Figure~\ref{fig-relativistic-spin-state-bases}), in which
the quantisation axis is chosen along the particle's momentum direction.
In this basis, the spin projection along the momentum is called the
{\textbf{helicity}~\(\lambda\),} and the spin state is denoted by
\(\ket{\vec{p},j,\lambda}\). An additional advantage of the helicity
basis is that it remains well-defined even for massless particles.

The relativistic helicity state can be constructed from the rest-frame
spin state by first boosting along the {\(z\)~axis} and then rotating
the momentum direction into \(\vec{p}\), or equivalently (using
Equation~\eqref{eq-boost-decomposition}), by boosting directly along
\(\vec{p}\) and then rotating the spin quantisation axis accordingly.
Explicitly, this yields

\[
\begin{aligned}
\Ket{\vec{p},j,\lambda}
\;&=\; \mathbf{U}[\mathring{\mathbfit{R}}(\phi,\theta,0)] \, \mathbf{U}[\boldsymbol{\varLambda_z}(p)] \ket{j,\lambda} \\
\;&=\; \mathbf{U}[\boldsymbol{\varLambda}(\vec{p})] \, \mathbf{U}[\mathring{\mathbfit{R}}(\phi,\theta,0)] \ket{j,\lambda}
\,,
\end{aligned}
\]

\noindent which is essentially the same as
Equation~\eqref{eq-canonical-state}, but without the final rotation
\(\mathbf{U}^{-1}[\mathring{\mathbfit{R}}]\) that restores the canonical
orientation. The {helicity~\(\lambda\)} is invariant under rotations
about the momentum direction and under boosts along \(\vec{p}\). For an
arbitrary {rotation~\(\mathbfit{R}\),} we find

\begin{equation}\phantomsection\label{eq-rotate-helicity}{
\begin{aligned}
\mathbf{U}[\mathbfit{R}] \, \Ket{\vec{p},j,\lambda}
\;&=\; \mathbf{U}[\mathbfit{R}\,\mathring{\mathbfit{R}}] \, \mathbf{U}[\boldsymbol{\varLambda_z}]\,  \ket{j,\lambda} \\
\;&=\; \Ket{\mathbfit{R}\,\vec{p},j,\lambda}
\,.
\end{aligned}
}\end{equation}

Compare this to Equation~\eqref{eq-rotate-canonical} for the canonical
basis, where the rotation mixes different spin projection states.
Similarly, a {boost~\(\boldsymbol{\varLambda}'\)} that maps \(\vec{p}\)
to a new {momentum~\(\vec{p}'\)} \emph{parallel} to \(\vec{p}\) leaves
the helicity unchanged:

\begin{equation}\phantomsection\label{eq-boost-helicity-with-parallel-momentum}{
\begin{aligned}
\mathbf{U}[\boldsymbol{\varLambda}(\vec{p}')] \, \Ket{\vec{p},j,\lambda}
\;&=\; \mathbf{U}[\boldsymbol{\varLambda}(\vec{p}')] \, \mathbf{U}[\boldsymbol{\varLambda}(\vec{p})] \, \mathbf{U}[\mathring{\mathbfit{R}}] \, \ket{j,\lambda} \\
\;&=\; \mathbf{U}[\boldsymbol{\varLambda}(\vec{p}')] \, \mathbf{U}[\mathring{\mathbfit{R}}] \, \ket{j,\lambda} \\
\;&=\; \Ket{\vec{p}',j,\lambda}
\,.
\end{aligned}
}\end{equation}

In summary, helicity states are invariant under rotations and boosts
along the momentum direction, which makes the helicity basis especially
convenient for describing multi-body decays. In this basis, the
sequential factorisation into two-body amplitudes becomes transparent,
with each two-body decay carrying an angular structure that arises from
the coupling of spin and orbital angular momenta.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/canonical-basis.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/helicity-basis.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-relativistic-spin-state-bases}The canonical basis
\(\ket{\vec{p},j,m}\) (left) and the helicity basis
\(\ket{\vec{p},j,\lambda}\) (right). The quantisation axes in each frame
are indicated with a blue arrow.}

\end{figure}%

\section{Two-particle states}\label{sec-two-particle-states}

We now construct the \textbf{two-particle spin state} for a decay
\(a \to 1\,2\), in which a parent particle \(a\) decays into two
daughter particles~\(1\) and~\(2\). We first review the standard theory
of how spin states couple in the rest frame, which is necessary to
correctly extend the construction to the relativistic case. Just like in
the single-particle spin state
(Section~\ref{sec-single-particle-states}), this leads to two practical
spin bases for describing the two-particle state: the canonical basis
and the helicity basis. The canonical basis is more intuitive, as it is
built from the canonical spin states of the decay products. The helicity
basis is more convenient for constructing amplitudes in decay chains,
because, like the single-particle helicity basis, it is invariant under
rotations (up to phases coming from the {\(\mathrm{SU}(2)\)~group,}
which must be tracked carefully to avoid apparent contradictions).

\subsection{Joint tensor product
state}\label{joint-tensor-product-state}

Two-particle spin states can be constructed from the tensor product of
two single-particle spin states. This is the next step towards
formulating the amplitude of a multi-body decay as a chain of two-body
decays. The tensor product combines the two states into a single state
that lives in a Hilbert space of higher dimension. If \(J\) is the
(total) angular momentum of a state~\(\ket{J,M}\) with spin
projection~\(M\), then the dimension of its Hilbert space is \(2J+1\).
The dimension of the tensor product space is the product of the
dimensions of the individual spaces, i.e.~\((2J_1+1)(2J_2+1)\), and its
possible total angular momentum quantum numbers range from
\(|J_1 - J_2|\) to \(J_1 + J_2\).

Imagine we have two such states, \(\ket{J_1,M_1}\) and
\(\ket{J_2,M_2}\), where \(J_1\) and \(J_2\) are the intrinsic spins (or
total angular momenta) of the two particles, and \(M_1, M_2\) are their
respective projections along a chosen quantisation axis. In the helicity
formalism, these spins \(J_1,J_2\) are assumed to be known: each
two-body decay product is either a known final-state particle or an
intermediate resonance, in which case its spin state is itself treated
as a definite \(\ket{J,M}\) state. The composite two-particle state, or
\textbf{joint state}, is then given in the uncoupled basis by the
\textbf{tensor product}

\[
\ket{J_1,M_1;J_2,M_2}\equiv\ket{J_1,M_1} \otimes \ket{J_2,M_2}
\,.
\]

At this stage, we only know that this is a mathematical object living in
a Hilbert space that is the tensor product of the two Hilbert spaces of
the individual particles. For our purposes, it is more convenient to
represent this higher-dimensional state in terms of \textbf{total spin}
basis vectors, denoted \(\ket{S,M_S}\), which form the irreducible
representation basis (see also Section~\ref{sec-eightfold-way}) for the
combined spin. The individual spin states \(\ket{J_i,M_i}\) are
eigenstates of the spin operators \(\mathbf{J}_i\), while the coupled
states \(\ket{S,M_S}\) are eigenstates of the total spin operator
\(\mathbf{S}=\mathbf{J}_1+\mathbf{J}_2\).

The relation between these two bases is given by a unitary
transformation, whose matrix elements are the
\textbf{\href{https://pdg.lbl.gov/2024/reviews/rpp2024-rev-clebsch-gordan-coefs.pdf}{Clebsch--Gordan
coefficients}},

\[
C^{S,M_S}_{J_1,M_1;J_2,M_2} \;=\; \braket{J_1,M_1;J_2,M_2|S,M_S}
\,.
\]

Written as a matrix (for fixed \(J_1, J_2, S\)), the rows correspond to
the uncoupled basis \(\bra{J_1,M_1;J_2,M_2}\) and the columns to the
coupled basis
{\(\ket{S, M_S}\)~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66,
§46}{]}.} These coefficients show which combinations of individual spin
projections contribute to each allowed total spin state. A familiar
consequence is that the total spin \(S\) can only take values between
\(|J_1-J_2|\) and \(J_1+J_2\) in integer steps, and that
\(M_S = M_1 + M_2\).

Applying this unitary transformation explicitly yields:

\begin{equation}\phantomsection\label{eq-total-spin-tensor-product-s-ms}{
\ket{S,M_S} \;=\; \sum_{M_1,M_2} C^{S,M_S}_{J_1,M_1; J_2,M_2} \left(\ket{J_1,M_1} \otimes \ket{J_2,M_2}\right)
\,,
}\end{equation}

\noindent or, equivalently,

\begin{equation}\phantomsection\label{eq-total-spin-tensor-product-j1-times-j2}{
\ket{J_1, M_1} \otimes \ket{J_2, M_2}
\;=\; \sum_{S, M_S} C^{S, M_S}_{J_1, M_1; J_2, M_2} \ket{S, M_S}
\,.
}\end{equation}

\noindent The inverse relation takes the same form, because the
Clebsch--Gordan coefficients are real in the standard convention, so the
same coefficients appear in both directions of the basis change.

\subsection{Coupling to the decaying particle}\label{sec-spin-coupling}

Once we assume that two particles are produced in the decay of a parent
state \(\ket{J_a, M_a}\), their joint state is described as a
\textbf{coupled state}. The decay process must conserve total angular
momentum, so the spin \(J_a\) of particle \(a\) is carried by the
combination of the two final-state spins and their relative motion. To
describe this, we introduce the \textbf{orbital angular momentum}
\(\ket{L,M_L}\), which accounts for the relative motion of the two
particles in the decay. The \textbf{total angular momentum}
\(\ket{J,M_J}\) is then formed by coupling the joint total spin state
\(\ket{S,M_S}\) to the orbital part \(\ket{L, M_L}\). In operator terms,
if \(\ket{L,M_L}\) are eigenstates of the orbital angular momentum
operator~\(\mathbf{L}\), then the total angular momentum operator is
given by angular-momentum addition, \(\mathbf{J}=\mathbf{L}+\mathbf{S}\)
(see Figure~\ref{fig-two-stage-coupling-scheme}).

Applying the same Clebsch--Gordan machinery as before, we have

\[
\ket{J,M_J} \;=\; \sum_{\substack{L,M_L\\S,M_S}} C^{J,M_J}_{L,M_L;S,M_S} \left(\ket{L,M_L} \otimes \ket{S,M_S}\right)
\,.
\]

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/two-stage-coupling-scheme.pdf}}

}

\caption{\label{fig-two-stage-coupling-scheme}The two spin-coupling
stages, \(\mathbf{S}=\mathbf{J}_1+\mathbf{J}_2\) and
\(\mathbf{J}=\mathbf{L}+\mathbf{S}\), for the decay \(a \to 1\,2\).}

\end{figure}%

Unlike in Equation~\eqref{eq-total-spin-tensor-product-s-ms}, we sum
over all allowed values of \(L,M_L,S,M_S\), because the intrinsic spins
\(J_1, J_2\) are known, but the intermediate total spin \(S\) and
orbital angular momentum \(L\) are \emph{not} fixed in advance.
Alternatively, we can keep \(L\) and \(S\) explicit as known quantum
numbers and write

\begin{equation}\phantomsection\label{eq-total-angular-momentum-tensor-product}{
\ket{J,M_J,L,S} \;=\; \sum_{M_L,M_S} C^{J,M_J}_{L,M_L;S,M_S} \left(\ket{L,M_L} \otimes \ket{S,M_S}\right)
\,.
}\end{equation}

\noindent Combining this with
Equation~\eqref{eq-total-spin-tensor-product-s-ms} yields a fully
expanded form in terms of the known intrinsic spin states,

\begin{equation}\phantomsection\label{eq-total-angular-momentum-tensor-product-expanded}{
\begin{aligned}
& \ket{J,M_J,L,S} \;= \\
& \qquad
  \sum_{M_L,M_S,M_1,M_2}
  C^{J,M_J}_{L,M_L;S,M_S}\,
  C^{S,M_S}_{J_1,M_1;J_2,M_2} \\
& \qquad \qquad
  \left(\ket{L,M_L}\otimes\ket{J_1,M_1}\otimes\ket{J_2,M_2}\right)
\,.
\end{aligned}
}\end{equation}

Finally, conservation of angular momentum requires that the quantum
numbers match those of the initial parent particle: \(J = J_a\) and
\(M_J = M_a\). The resulting state defines the \textbf{canonical basis}
for the two-particle system. It plays a role analogous to the canonical
basis of a single-particle spin state, but now the pair \((L, S)\)
serves as the two-particle analogue of the single spin projection \(m\).
Unlike the single-particle case (see
Figure~\ref{fig-relativistic-spin-state-bases}), these internal quantum
numbers do not have a simple interpretation as directions in physical
space. We will revisit this when introducing the helicity basis, which
reformulates the spin states in a relativistic way using the
four-momenta of the decay products.

\subsection{Relativistic, coupled
states}\label{sec-relativistic-coupled-states}

In the rest frame, two spin states are coupled with Clebsch--Gordan
coefficients. To describe decays where the particles carry momentum,
this tensor-product construction must be extended to account for Lorentz
boosts. As in the single-particle case
(Section~\ref{sec-boosting-spin-states}), we first obtain the canonical
basis from the boosted canonical spin states of the decay products, and
then the helicity basis through spin projections along the momentum of
each particle. In both cases, the kinematic degrees of freedom are
separated step by step{(see Figure~\ref{fig-transformation-schemes})}.

\subsubsection{Canonical basis}\label{canonical-basis}

The ``relativistic'' spin states of the decay products take the
form~\(\ket{\vec{p}_i, J_i, M_i}\), as introduced in
Equation~\eqref{eq-canonical-state}. The relativistic analogue of the
coupled spin state from
Equation~\eqref{eq-total-spin-tensor-product-s-ms} can then be written
as

\begin{equation}\phantomsection\label{eq-tensor-product-relativistic-canonical}{
\Ket{\vec{p}_a, S, M_S}
\;=\;
  \sum_{M_1, M_2} C^{S, M_S}_{J_1, M_1;\, J_2, M_2}
  \left( \Ket{\vec{p}_1, J_1, M_1} \otimes \Ket{\vec{p}_2, J_2, M_2} \right)
\,.
}\end{equation}

\noindent Here, \(\vec{p}_a\) denotes the total three-momentum of the
two-particle system. While formally
\(\vec{p}_a = \vec{p}_1 + \vec{p}_2\), it is crucial to note that the
individual spin states depend on the reference frame. The coupling in
Equation~\eqref{eq-tensor-product-relativistic-canonical} strictly
applies only in the rest frame of the two-body system. The necessary
Lorentz transformations introduce Wigner rotations of the spin states,
as discussed in Section~\ref{sec-spin-alignment}.

In the center-of-mass (CM) frame, where \(\vec{p}_a = 0\), the
two-particle state of
Equation~\eqref{eq-tensor-product-relativistic-canonical} is fully
characterised by the magnitude of the relative momentum,
\(p = |\vec{p}_1| = |\vec{p}_2|\), and its orientation given by the
polar and azimuthal angles \(\theta, \phi\) (see
Figure~\ref{fig-two-particle-frame-definitions}). The magnitude~\(p\) is
related to the CM energy \(s\) via the breakup momentum \(q(s)\) defined
in Equation~\eqref{eq-phase-space-factor-and-breakup-momentum}.

Factoring out the total-momentum eigenstate~\(\ket{p_a}\) of the
four-momentum operator~\(\mathbf{P}\), the two-particle state becomes

\[
\Ket{\vec{p}_a, \theta, \phi, S, M_S} \;=\;
  (2\pi)^3 \left[\frac{4\sqrt{s}}{p}\right]^{\frac{1}{2}}
  \left( \Ket{\theta, \phi, S, M_S} \otimes \Ket{p_a} \right)
\,.
\]

\noindent Since we work in the CM frame with \(\vec{p}_a = 0\), the
dependence on \(\Ket{p_a}\) can be omitted, leaving only the
energy-dependent normalisation factor.

To construct the relativistic equivalent of
\(\ket{L, M_L} \otimes \ket{S, M_S}\) as in
Equation~\eqref{eq-total-angular-momentum-tensor-product}, we integrate
over the angular variables \((\theta, \phi)\). This procedure mirrors
the discrete Clebsch--Gordan decomposition but now employs spherical
harmonics \(Y^L_{M_L}(\theta, \phi)\) as continuous basis functions. The
resulting integral reads

\begin{equation}\phantomsection\label{eq-relativistic-fixed-orbital-angular-momentum}{
\ket{L, M_L, S, M_S} \;=\; N_L \iint d\phi \, d\theta \, Y^L_{M_L}(\theta, \phi) \ket{\theta, \phi, S, M_S}
\,,
}\end{equation}

\noindent with normalisation
{\(N_L = \sqrt{\frac{2L + 1}{4\pi}}\)~{[}\citeproc{ref-Chung:1971ri}{154,
§4.2}{]}.} This integration removes the angular dependence, yielding
states that are labelled by fixed orbital angular momentum~\(L\). These
states \(\ket{L, M_L, S, M_S}\) transform under rotations just like
tensor-product states of angular momentum eigenstates. Specifically,
applying a rotation~\(\mathbfit{R}\)
yields~{[}\citeproc{ref-Chung:2014-SpinFormalismsUpdated}{150, p.~9}{]}

\[
\mathbf{U}[\mathbfit{R}] \, \ket{L, M_L, S, M_S}
\;=\; \sum_{M_L', M_S'}
  D^L_{M_L' M_L}(R) \,
  D^S_{M_S' M_S}(R) \,
  \ket{L, M_L', S, M_S'}
\,.
\]

\noindent Likewise, for the tensor-product states, we have

\[
\mathbf{U}[\mathbfit{R}] \left( \Ket{L, M_L} \otimes \Ket{S, M_S} \right)
\;=\; \sum_{M_L', M_S'}
  D^L_{M_L' M_L}(R) \,
  D^S_{M_S' M_S}(R) \,
  \ket{L, M_L'} \otimes \ket{S, M_S'}
\,.
\]

\noindent For all practical purposes, we can therefore identify
\(\ket{L, M_L, S, M_S} \equiv \ket{L, M_L} \otimes \ket{S, M_S}\). In
analogy with Equation~\eqref{eq-total-angular-momentum-tensor-product},
we can couple these and form states of definite total angular
momentum~\(J\) using

\[
\begin{aligned}
\ket{J_a, M_a, L, S}
\;&=\;
  \sum_{M_L, M_S} C^{J_a, M_a}_{S, M_S; L, M_L} \ket{L, M_L, S, M_S} \\
\;&=\;
  N_L
  \sum_{M_L, M_S} C^{J_a, M_a}_{S, M_S; L, M_L}
  \iint d\phi \, d\theta \, Y^L_{M_L}(\theta, \phi) \ket{\theta, \phi, S, M_S}
\,.
\end{aligned}
\]

This completes the construction of the \textbf{canonical basis} of
Equation~\eqref{eq-total-angular-momentum-tensor-product} from
two-particle momentum states, serving as the two-body analogue of
Equation~\eqref{eq-canonical-state}. Note that \(L\) and \(S\) label
rotationally invariant properties, meaning that

\[
\mathbf{U}[\mathbfit{R}] \, \ket{J_a, M_a, L, S} \;=\; \sum_{M'} D^J_{M' M_a}(R) \, \ket{J_a, M', L, S}
\,.
\]

Expressing two-particle states in this form provides access to the
angular-momentum content explicit, which facilitates the inclusion of
dynamical factors, such as the centrifugal suppression factors discussed
in Section~\ref{sec-vertex-parametrisation}.

\subsubsection{Helicity basis}\label{helicity-basis}

One limitation of the canonical basis is that it is not invariant under
Lorentz boosts. This becomes problematic when constructing amplitudes
for cascades of two-body decays, where intermediate frames vary along
different decay chains. As we saw in the single-particle case
(Section~\ref{sec-single-particle-states}), it is often more convenient
to choose the particle's direction of motion as the spin quantisation
axis. For a two-particle system, we typically define the quantisation
axis along the momentum of particle~\(1\) (consistent with how the
angle~\(\theta, \phi\) were defined). This leads naturally to the
helicity quantum numbers \(\lambda_1, \lambda_2\) and their
corresponding helicity states \(\ket{J_1, \lambda_1}\) and
\(\ket{J_2, \lambda_2}\). The difference between the canonical and
helicity constructions is shown in
Figure~\ref{fig-two-particle-frame-definitions}.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/canonical-basis-scheme.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/helicity-basis-scheme.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-transformation-schemes}Construction schemes for the
canonical basis (left) and helicity basis (right) of the two-particle
system.}

\end{figure}%

In analogy with
Equation~\eqref{eq-tensor-product-relativistic-canonical}, to construct
the two-particle state in the helicity basis, we again start from the
tensor product of the individual helicity states. However, because
helicity is defined as the projection of spin along the particle's own
momentum direction, we must first rotate our standard frame's
{\(z\)~axis} into the direction of \(\vec{p}_1\). This is accomplished
by a rotation~\(\mathring{\mathbfit{R}}(\theta, \phi, 0)\), which aligns
the {\(z\)~axis} with the momentum of particle~\(1\).

Starting from a reference state \(\ket{0, 0, \lambda_1, \lambda_2}\),
where both particles in the direction of the {\(z\)~axis} along which
the helicities are defined, we obtain the physical state via

\[
\begin{aligned}
\ket{\theta, \phi, \lambda_1, \lambda_2}
\;&=\; \mathbf{U}[\mathring{\mathbfit{R}}(\theta, \phi, 0)] \left( \ket{s_1, \lambda_1} \otimes \ket{s_2, \lambda_2} \right) \\
\; &\equiv \; \mathbf{U}[\mathring{\mathbfit{R}}] \, \ket{0, 0, \lambda_1, \lambda_2}
\,.
\end{aligned}
\]

This ensures that the helicities \(\lambda_1, \lambda_2\) are defined
with respect to the physical momentum directions of the particles.

Similar to
Equation~\eqref{eq-relativistic-fixed-orbital-angular-momentum}, we
integrate over the solid angle
\(\mathrm{d}\Omega' = \sin\theta'\,\mathrm{d}\theta'\,\mathrm{d}\phi'\)
to obtain states of definite total angular {momentum~\(J\).}
Conservation of angular momentum implies \(J_a = J\) and \(M_a = M_J\),
leading to the \textbf{helicity basis} state

\begin{equation}\phantomsection\label{eq-two-particle-helicity-state}{
\ket{J_a, M_a, \lambda_1, \lambda_2}
\;=\;
  \frac{N_J}{2\pi} \iint \mathrm{d}\Omega'\,
  D^{J\,*}_{M_a, \lambda_1 - \lambda_2}(\theta', \phi') \,
  \mathbf{U}[\mathring{\mathbfit{R}}]\,\ket{0, 0, \lambda_1, \lambda_2}
\,.
}\end{equation}

\noindent The appearance of the difference \(\lambda_1 - \lambda_2\) in
the {Wigner~\(D\)}-function reflects the fact that the two decay
products emerge back-to-back in the parent rest frame
(Figure~\ref{fig-two-particle-frame-definitions}, right). Under a
rotation with {angle~\(\phi\)} about the parent's momentum axis,
particle~1 picks up a phase \(e^{-i\lambda_1\phi}\) while particle~2
picks up {\(e^{+i\lambda_2\phi}\).} The combined state therefore
transforms with net phase \(e^{-i(\lambda_1-\lambda_2)\phi}\), which
fixes the lower index of the {Wigner~\(D\)}-function. The rotation
{angles~\((\theta,\phi)\)} are defined as the polar and azimuthal angles
of particle~1 in the parent rest frame, so the convention of
``\(\lambda_1-\lambda_2\)'' is tied to choosing particle~1 as the
helicity reference axis.

Importantly, these states transform under rotations just like the
single-particle helicity states introduced in
Equation~\eqref{eq-rotate-helicity}, with \(J\) and \(M_J\) being
invariant under any
{rotation~\(\mathbfit{R}\)~{[}\citeproc{ref-Chung:2014-SpinFormalismsUpdated}{150,
p.~10}{]},} meaning that

\[
\mathbf{U}[\mathbfit{R}] \, \ket{J_a, M_a, \lambda_1, \lambda_2}
\;=\; \sum_{M_a'} D^J_{M_a' M_a}(R) \, \ket{J_a, M_a', \lambda_1, \lambda_2}
\,.
\]

\noindent This property will later enable the construction of amplitudes
for decay chains involving sequential two-body decays.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/two-particle-state-canonical.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/two-particle-state-helicity.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-two-particle-frame-definitions}Two-particle state in
the canonical basis (left) and the helicity basis (right).}

\end{figure}%

\subsubsection{Transformation between the two
bases}\label{transformation-between-the-two-bases}

The two formulations serve as basis vectors to the Hilbert space of spin
states. One can therefore find a transformation to switch between the
helicity and canonical bases~{[}\citeproc{ref-Chung:1971ri}{154,
§4.3}{]}

\begin{equation}\phantomsection\label{eq-transformation-canonical-helicity}{
\begin{aligned}
{\color{DarkOrange}\ket{J,M,{\color{DarkOrange}\lambda_1},{\color{DarkOrange}\lambda_2}}} \;&=\;
  \sum_{{\color{RoyalBlue}L},{\color{RoyalBlue}S}}
  \sqrt{\frac{2{\color{RoyalBlue}L}+1}{2J+1}}
  C^{J,{\color{DarkOrange}\lambda}}_{{\color{RoyalBlue}L},0,{\color{RoyalBlue}S},{\color{DarkOrange}\lambda}}
  C^{{\color{RoyalBlue}S},{\color{DarkOrange}\lambda}}_{J_1,{\color{DarkOrange}\lambda_1},J_2,\,\text{-}{\color{DarkOrange}\lambda_2}}
  {\color{RoyalBlue}\ket{J,M,{\color{RoyalBlue}L},{\color{RoyalBlue}S}}} \\
{\color{RoyalBlue}\ket{J,M,{\color{RoyalBlue}L},{\color{RoyalBlue}S}}} \;&=\;
  \sum_{{\color{DarkOrange}\lambda_1},{\color{DarkOrange}\lambda_2}}
  \sqrt{\frac{2{\color{RoyalBlue}L}+1}{2J+1}}
  C^{J,{\color{DarkOrange}\lambda}}_{{\color{RoyalBlue}L},0,{\color{RoyalBlue}S},{\color{DarkOrange}\lambda}}
  C^{{\color{RoyalBlue}S},{\color{DarkOrange}\lambda}}_{J_1,{\color{DarkOrange}\lambda_1},J_2,\,\text{-}{\color{DarkOrange}\lambda_2}}
  {\color{DarkOrange}\ket{J,M,{\color{DarkOrange}\lambda_1},{\color{DarkOrange}\lambda_2}}}
\end{aligned}
}\end{equation}

\noindent with \(\lambda = \lambda_1 - \lambda_2\). Note how the
coefficients of the transformations are the same in both directions.
Equation~\eqref{eq-transformation-canonical-helicity} allows us to
construct the amplitude for a sequential two-body decay chain with the
helicity basis and transform it to the canonical basis in order to get
access to the angular-momentum content of each decay node.

\section{Amplitude construction}\label{amplitude-construction}

Finally, we have the mechanisms to construct the amplitude of a general
multi-body decay of the form~\(0\to 1\,2\dots n\). As discussed in
Chapter~\ref{sec-scattering-theory}, the transition amplitude for a
transition from initial state~\(\ket{\psi_\text{in}}\) to final
state~\(\ket{\psi_\text{out}}\) comes from the application of the
transition operator~\(\mathbf{T}\) to these states using
Equation~\eqref{eq-transition-matrix-element}. In the helicity
formalism, the initial state is a single spin state
\(\ket{\psi_\text{in}} = \ket{p_0, j_0, \lambda_0}\). The final state is
a set of \(n\) spin states that are assumed to be stable and
non-interacting and can therefore be written as a tensor product,

\[
\ket{\psi_\text{out}} \;=\;
  \ket{p_1,j_1,\lambda_1} \times
  \ket{p_2,j_2,\lambda_2} \times
  \dots
  \ket{p_n,j_n,\lambda_n} \,.
\]

To construct the amplitude explicitly, we exploit the fact that
conservation laws (in particular angular momentum conservation at each
vertex) allow us to decompose the full multi-body transition into a
product of two-body transitions, analogous to internal lines in a
Feynman diagram, connected through sums over intermediate helicities.
This leads naturally to the sequential-decay parametrisation of the
amplitude.

\subsection{Sequential-decay
parametrisation}\label{sequential-decay-parametrisation}

The strategy for formulating the transition amplitude is to split up the
decay into two-body decays, which we can describe using our knowledge of
relativistic, coupled two-particle spin states. This approach is often
referred to as the \emph{isobar model}, but a better term would be
\textbf{sequential-decay}~{[}\citeproc{ref-Chung:2014-SpinFormalismsUpdated}{150};
\citeproc{ref-Richman:1984gh}{149};
\citeproc{ref-Kutschke:1996-AngularDistributionCookbook}{151};
\citeproc{ref-Chen:2017gtx}{155}{]} or
\emph{cascade-decay}~{[}\citeproc{ref-Habermann:2024sxs}{156}{]}
parametrisation.

In the sequential-decay parametrisation, we consider the multi-body
decay~\(0\to 1\,2\dots n\) to proceed via a cascade of two-body decays.
For \(n>2\), there are multiple two-body decay topologies that can be
constructed. We call such a topology a \textbf{chain}, or path, and
denote it with a Fraktur
{index~\(\mathfrak{c}\)~{[}\citeproc{ref-Habermann:2024sxs}{156}{]}.} A
decay chain can be visualised in the form of a directed graph of
two-body decay nodes labelled by \(\kappa\). The naming scheme for each
node~\(\kappa\) is shown in
Figure~\ref{fig-topology-symbol-definitions}: the digits of the
final-state particles to which it decays are listed and grouped with
parentheses depending on how it decays further. In each node~\(\kappa\),
the parent state is denoted by \(\kappa_0\), and the two decay products
by \(\kappa_1\) and \(\kappa_2\). Decay chains can be named with the
same labeling scheme by taking the label of its first decay node. For
instance, the left chain in Figure~\ref{fig-topology-symbol-definitions}
would be labelled~\(1(2(34))\).

\begin{figure}

\begin{minipage}{0.55\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/4-body-topology-1.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.46\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/4-body-topology-2.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-topology-symbol-definitions}Vertex notations for two
decay chains, \(1(2(34))\) and \((12)(34)\), in a sequential four-body
decay. Topologies and nodes are labelled by grouping the children of
each node in parentheses.}

\end{figure}%

Parametrisations of the scattering matrix can be found with
path-integral methods~{[}\citeproc{ref-Weinberg:1995mt}{100, §9.2}{]}.
The decay topologies in the sequential-decay parametrisation can be seen
as a `discrete' path integral from the initial to the final state once
we assume that each of the two-body decay nodes in the chain takes place
independently. The \textbf{helicity amplitude for
chain~\(\mathfrak{c}\)} can therefore be constructed as the product of
the helicity amplitudes of all its two-body decay nodes~\(\kappa\), that
is

\begin{equation}\phantomsection\label{eq-sequential-decay-amplitude-helicity-formalism}{
\begin{aligned}
& A^{\mathfrak{c}}_{\lambda_0,\{\lambda\}}(\tau_{\mathfrak{c}}) \;=\;
  \sum_{\{\lambda_\text{int.}\}} \,
  \prod_{\kappa}^{n-1}
  D^{j_{\kappa_0}\,*}_{\lambda_{\kappa_0}, \lambda_{\kappa_1}-\lambda_{\kappa_2}}\!\left(\Omega^{\mathfrak{c}}_\kappa\right) \\
& \qquad \times \;
  X_\kappa\!\left(\mu_{\kappa_0}\right) \,
  H^{\kappa_0\to \kappa_1,\kappa_2}_{\lambda_{\kappa_1},\lambda_{\kappa_2}}\!\left(\mu_{\kappa_0},\mu_{\kappa_1},\mu_{\kappa_2}\right) \,.
\end{aligned}
}\end{equation}

\noindent with \(\tau_{\mathfrak{c}}\) the set of relevant kinematic
variables for the chain~\(\mathfrak{c}\), such as the helicity
angles~\(\Omega^{\mathfrak{c}}_\kappa\) for node~\(\kappa\) and the
invariant masses~\(\mu_{\kappa_0},\mu_{\kappa_1},\mu_{\kappa_2}\) of its
parent and decay products. We have denoted the set of allowed helicities
of the final-state particles with
\(\{\lambda\}=\{\lambda_1,\dots,\lambda_n\}\) and those of the
intermediate spin states with \(\{\lambda_\text{int.}\}\). The latter
helicities cannot be observed and have to be summed over, but this has
to be done carefully, as some decay products of each node appear as the
parent of the next node. Also note that
\(\lambda_{\kappa_0},\lambda_{\kappa_1},\lambda_{\kappa_2}\) can be any
of \(\lambda_0\), \(\{\lambda\}\), or \(\{\lambda_\text{int.}\}\),
depending on which node~\(\kappa\) is considered. The
{Wigner~\(D\)}-functions originate from the rotations over the helicity
angle
\(\Omega^{\mathfrak{c}}_\kappa=(\theta^{\mathfrak{c}}_\kappa,\phi^{\mathfrak{c}}_\kappa)\)
applied before boosting into the rest frame of the next helicity state
in the decay chain. The function~\(X_\kappa\) parametrises the lineshape
of the decaying resonance~\(\kappa_0\) (propagator) in the two-body
decay~\(\kappa\), whereas the
function~\(H^{\kappa_0\to\kappa_1,\kappa_2}_{\lambda_{\kappa_1},\lambda_{\kappa_2}}\)
parametrises its vertex (see Section~\ref{sec-analytic-structure}). The
angular-momentum content can be applied by inserting the transformation
of Equation~\eqref{eq-transformation-canonical-helicity}.

Each symbol \(\mu_i\) indicates the \emph{invariant} mass of state
~\(i\). The initial and final state are considered stable, that is,
their masses are not variables of the dynamics functions. For example,
in single-channel analyses, \(X_k\!\left(\mu_{\kappa_0}\right)\) is
often parametrised as Equation~\eqref{eq-breit-wigner-vertex}. For
non-zero angular momenta, the energy-dependent width depends on the
masses of the decay products, \(\mu_{\kappa_1},\mu_{\kappa_2}\), but
these are taken to be constant. From a computational point of view, one
has to assume these masses to be fixed if one implements a proper
analytic continuation, otherwise the dispersion integral
Equation~\eqref{eq-dispersion-integral-sigma} has to be solved for each
each iteration during a fit.

The {Wigner~\(D\)}-functions in
Equation~\eqref{eq-sequential-decay-amplitude-helicity-formalism}
originate from the rotations over the helicity angle
\(\Omega^{\mathfrak{c}}_\kappa\) applied before boosting into the rest
frame of the next helicity state in the decay chain. As explained in
Equation~\eqref{eq-two-particle-helicity-state}, their lower index
\(\lambda_{\kappa 1}-\lambda_{\kappa 2}\) encodes this
helicity-difference phase, which ensures the correct angular-momentum
coupling at each decay node.

\subsection{Wigner rotations}\label{sec-spin-alignment}

In a sequential-decay amplitude that contains topologically distinct
decay chains, the same set of final-state helicities can be reached
through different sequences of Lorentz boosts and rotations. Because the
spin quantisation axis that defines the helicity of each final-state
particle (Figure~\ref{fig-relativistic-spin-state-bases}) is determined
by the specific boost sequence of its decay chain, the helicity labels
from different chains correspond to different physical axes. In this
case, the \textbf{total transition
amplitude}~\(A_{\lambda_0,\{\lambda\}}\) cannot be obtained by simply
summing all chain
amplitudes~\(A^{\mathfrak{c}}_{\lambda_0,\{\lambda\}}\) of
Equation~\eqref{eq-sequential-decay-amplitude-helicity-formalism}. To
combine them meaningfully, the final-state helicities from each chain
must first be rotated into a common reference frame, ensuring that all
spin quantisation axes are aligned.

The mismatch between the different chains can be corrected by an
alignment
factor~\(W^{\mathfrak{c}(\mathfrak{o})}_{\{\lambda'\},\{\lambda\}}(\tau_{\mathfrak{c}}\mid\tau_{\mathfrak{o}})\)
for each chain~\(\mathfrak{c}\) and a selected \textbf{reference
chain}~\(\mathfrak{o}\). The total transition amplitude for all chains
is then given by

\begin{equation}\phantomsection\label{eq-total-transition-amplitude}{
A_{\lambda_0,\{\lambda\}}(\tau_{\mathfrak{o}})
\;=\;
  \sum_{\{\lambda'\}} \sum_{\mathfrak{c}}
  A^{\mathfrak{c}}_{\lambda_0,\{\lambda'\}}(\tau_{\mathfrak{c}}) \,
  W^{\mathfrak{c}(\mathfrak{o})}_{\{\lambda'\},\{\lambda\}}(\tau_{\mathfrak{c}}\mid\tau_{\mathfrak{o}})
\,.
}\end{equation}

\noindent The alignment factor is a product of (inverse) \textbf{Wigner
rotations} in spin space, one for each final-state particle~\(i\) with
spin~\(j_i\),

\begin{equation}\phantomsection\label{eq-spin-alignment-factor}{
W^{\mathfrak{c}(\mathfrak{o})}_{\{\lambda'\},\{\lambda\}}(\tau_{\mathfrak{c}}\mid\tau_{\mathfrak{o}})
\;=\;
  \prod_{i=1}^n D^{j_i\,*}_{\lambda'_i \lambda_i}\!\left(
  \phi^i_{\mathfrak{c}(\mathfrak{o})},
  \theta^i_{\mathfrak{c}(\mathfrak{o})},
  \chi^i_{\mathfrak{c}(\mathfrak{o})}
\right)
\,.
}\end{equation}

\noindent Here,
\(\phi^i_{\mathfrak{c}(\mathfrak{o})}, \theta^i_{\mathfrak{c}(\mathfrak{o})}, \chi^i_{\mathfrak{c}(\mathfrak{o})}\)
are the Euler angles (Figure~\ref{fig-euler-angles}) describing the
spatial rotation~\(\mathbfit{R}^i_{\mathfrak{c}(\mathfrak{o})}\) that
connects the two helicity frames for particle~\(i\). Computing these
angles is a non-trivial task that generally requires a numerical
procedure~{[}\citeproc{ref-Habermann:2024sxs}{156}{]}. The key idea is
that the product of Lorentz transformations from the initial state~\(0\)
to a final-state particle~\(i\) along chain~\(\mathfrak{c}\), followed
by the inverse transformations along reference chain~\(\mathfrak{o}\),
cancels the net boost and yields a pure (Wigner) rotation,

\begin{equation}\phantomsection\label{eq-wigner-rotation}{
\mathbfit{R}^i_{\mathfrak{c}(\mathfrak{o})} \;=\;
\left( \prod_{a}^{0 \to i} \boldsymbol{\varLambda}^{\mathfrak{c}}_{a \leftarrow a_{\text{next}}} \right)^{-1}
\times \left( \prod_{b}^{0 \to i} \boldsymbol{\varLambda}^{\mathfrak{o}}_{b \leftarrow b_{\text{next}}} \right)
\,.
}\end{equation}

The Euler angles of \(\mathbfit{R}^i_{\mathfrak{c}(\mathfrak{o})}\) can
be extracted by applying Equation~\eqref{eq-wigner-rotation} to a
four-momentum in a suitably chosen coordinate system. Although
\(\mathbfit{R}^i_{\mathfrak{c}(\mathfrak{o})}\) is an element of the
Lorentz group \(\mathrm{SO}^+(1,3)\), its action on spin states is
represented in the spinor space \(\mathrm{SL}(2,\mathbb{C})\), the
double cover of \(\mathrm{SO}^+(1,3)\) (see
Section~\ref{sec-relativistic-coupled-states}). In this representation,
a spatial rotation of~\(2\pi\) changes the sign of a half-integer spin
state, so spinors exhibit a {\(4\pi\)~periodicity.} This phase behaviour
must be tracked when combining amplitudes from different decay chains.
To determine whether a sign flip occurs, the same transformation
sequence can be applied with Lorentz transformation matrices
in~\(\mathrm{SL}(2,\mathbb{C})\) to a reference Dirac spinor, and the
resulting phase compared to the original.

Figure~\ref{fig-wigner-rotations} illustrates this procedure for
final-state particle~\(1\) in two topologically distinct four-body decay
chains, \(\mathfrak{c}=(1(23))4\) and \(\mathfrak{o}=((12)3)4\), showing
how the Lorentz transformations differ and how their combination yields
the required Wigner rotations for the spin-alignment factor.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/wigner-rotation.pdf}}}

}

\caption{\label{fig-wigner-rotations}Sketch of how aligning a four-body
decay chain \(\mathfrak{c}=(1(23))4\) (left) to a reference chain
\(\mathfrak{o}=((12)3)4\) (right) leads to four {Wigner~\(D\)} rotation
functions. The symbols in the arguments of the {Wigner~\(D\)}-functions
indicate how angles for these rotations are obtained: boost and rotate
along the reference chain from the initial state (yellow) to each final
state (green), then back along chain~\(\mathfrak{c}\). The lower row
shows the sequence of Lorentz transformations that lead to the rest
frame of particle~\(1\) and that is coloured in the chains. Adapted
from~{[}\citeproc{ref-Habermann:2024sxs}{156, Fig.~2}{]}.}

\end{figure}%

\subsection{Differential decay rate}\label{sec-differential-decay-rate}

Finally, the total transition amplitudes from
Equation~\eqref{eq-total-transition-amplitude} can be combined into an
expression for the differential decay rate of a general multi-body
decay. This is the analogue of
Equation~\eqref{eq-differential-cross-section} for differential cross
sections, but now applied to a decay process with an arbitrary number of
final-state particles. To write down this expression, we must first
identify the relevant degrees of freedom in the differential. The
decaying particle~\(0\) is produced with a certain spatial orientation,
which is typically described relative to the production plane in terms
of Euler angles \(\Omega = (\phi, \theta, \chi)\). In addition, the
{\(n\)‑body} decay process itself has \(k=3n-7\) internal degrees of
freedom: \(3n\) for each three-momentum, minus \(4\) for the overall
energy-momentum conservation, and minus \(3\) for the spatial
orientation of the decay. These \(k\) variables are collected in the
{set~\(\tau\)}, and they govern the internal dynamics of the decay, that
is, they only affect the helicity amplitudes.

In contrast to the internal decay {variables~\(\tau\),} the angles
\(\Omega = (\phi, \theta, \chi)\) encode the orientation of an external
spin quantisation axis of the decaying particle~ \(0\) with respect to
the production frame. An example of this is discussed in
Section~\ref{sec-polarimeter-vector-field}, particularly
Figure~\ref{fig-rotation-angles}. Since the production process may leave
\(0\) in a polarised state, we must account for the statistical mixture
of spin projections \(m_0\) that it can occupy. This information is
encoded in the elements~~\(\rho_{m_0' m_0}\) of \textbf{spin-density
matrix}~\(\mathbfit{\rho}\), which describe the coherence between spin
projections \(m_0\) and \(m_0'\) along a quantisation axis defined by
the production mechanism.

However, the helicity formalism expresses decay amplitudes in terms of
spin projections~\(\lambda_0\) along the momentum direction of the
decaying particle. This direction is determined by the first decay node
of reference chain~\(\mathfrak{o}\) in
Equation~\eqref{eq-total-transition-amplitude}, that is, by the two
states to which particle~\(0\) decays in chain~\(\mathfrak{o}\). To
relate the two frames, we rotate the total transition
amplitudes~\(A_{\lambda_0,\{\lambda\}}\) \emph{back} over the
{angles~\(\Omega\)} using
Equation~\eqref{eq-inverse-rotation-decomposition}, giving

\begin{equation}\phantomsection\label{eq-production-aligned-amplitude}{
\widetilde{A}_{m_0,\{\lambda\}}(\Omega, \tau)
\;=\; \sum_{\lambda_0} D^{j_0\,*}_{m_0 \lambda_0}(\phi,\theta,\chi) \, A_{\lambda_0,\{\lambda\}}(\tau)
}\end{equation}

The resulting sum over matrix elements~\(D^{j_0\,*}_{m_0 \lambda_0}\)
implement the change of spin basis from the decay frame to the
production frame, allowing us to coherently sum over all possible spin
orientations in the decay process. This gives the \textbf{differential
decay rate},

\begin{equation}\phantomsection\label{eq-differential-cross-section-multi-body-polarised}{
\begin{aligned}
\frac{\mathrm{d}\Gamma}{\mathrm{d}^3\Omega\,\mathrm{d}^k\tau} \;
&\cong \;
  \sum_{\{\lambda\}}
  \sum_{m_0, m_0'}
  \widetilde{A}^*_{m_0',\{\lambda\}}(\Omega, \tau) \,
  \rho_{m_0' m_0} \,
  \widetilde{A}_{m_0,\{\lambda\}}(\Omega, \tau) \,
  \\
&=\;
  \sum_{\{\lambda\}} \sum_{m_0, m_0'} \rho_{m_0' m_0} \\
&\qquad \times \;
  \sum_{\lambda_0}
  D^{j_0\,*}_{m_0 \lambda_0}(\phi,\theta,\chi) \, A_{\lambda_0,\{\lambda\}}(\tau) \\
&\qquad \times \;
  \sum_{\lambda_0'}
  D^{j_0}_{m_0' \lambda_0'}(\phi,\theta,\chi) \, A_{\lambda_0',\{\lambda\}}^*(\tau)
\,.
\end{aligned}
}\end{equation}

The spin-density matrix \(\rho_{m_0' m_0}\) is a Hermitian matrix of
dimension~\(2j_0+1\). Its diagonal elements give the distribution of the
spin projections along a chosen quantisation axis in the production
plane and its off-diagonal elements encode any coherences between them.
As discussed in Section~\ref{sec-connecting-to-experiment}, the
differential cross section serves as an intensity function that
describes the measured data distributions over each degree of freedom.
Since this function is fit to data using maximum likelihood techniques,
any normalisation factors can be left out (indicated by \(\cong\)) in
practical applications.

In many analyses, the polarisation of the decaying particle is not of
interest and the Euler angles \(\phi, \theta, \chi\) in
Equation~\eqref{eq-differential-cross-section-multi-body-polarised} are
effectively integrated out. This results in an \textbf{unpolarised}
intensity function

\begin{equation}\phantomsection\label{eq-differential-cross-section-multi-body-unpolarised}{
\begin{aligned}
I_0(\tau)
\;&=\;
  \int_{0}^{2\pi} \!\! \mathrm{d}\phi \int_{0}^{\pi} \!\! \sin\theta \, \mathrm{d}\theta \int_{0}^{2\pi} \!\! \mathrm{d}\chi \;
  \frac{\mathrm{d}\Gamma}{\mathrm{d}^3\Omega\,\mathrm{d}^k\tau} \\
\; &\cong \;
  \sum_{\{\lambda\}} \sum_{m_0,m_0'}
    \rho_{m_0' m_0}
    \delta_{m_0 m_0'}
  \sum_{\lambda_0,\lambda_0'}
    \delta_{\lambda_0 \lambda_0'}
    A_{\lambda_0,\{\lambda\}}(\tau) \,
    A_{\lambda_0',\{\lambda\}}^*(\tau) \\
\;&=\;
  \sum_{\{\lambda\}} \operatorname{Tr}\,\rho
  \sum_{\lambda_0}
    A_{\lambda_0,\{\lambda\}}(\tau) \,
    A_{\lambda_0',\{\lambda\}}^*(\tau) \\
\; &\cong \;
  \sum_{\lambda_0} \sum_{\{\lambda\}}
  \left|A_{\lambda_0,\{\lambda\}}(\tau)\right|^2
\,.
\end{aligned}
}\end{equation}

\noindent Here, we have used the fact that the {Wigner~\(D\)}-functions
form a set of orthogonal functions over the Euler angles, meaning that

\[
\begin{aligned}
& \int_{0}^{2\pi} \!\! \mathrm{d}\alpha \int_{0}^{\pi} \!\! \sin\beta \, \mathrm{d}\beta \int_{0}^{2\pi} \!\! \mathrm{d}\gamma \;
  D^j_{m n}(\alpha, \beta, \gamma) \, D^{j'\,*}_{m' n'}(\alpha, \beta, \gamma) \\
& \quad\quad =\;
  \frac{8 \pi^{2}}{2j + 1} \, \delta_{j j'} \, \delta_{m m'} \, \delta_{n n'}
\,.
\end{aligned}
\]

\subsection{Dalitz-Plot Decomposition}\label{sec-dpd}

In the case of a three-body decay~\(0 \to 1 2 3\), the three-momenta of
final-state particles \(\vec{p}_1, \vec{p}_2, \vec{p}_3\) in the rest
frame of the decaying particle span a unique plane, since momentum
conservation enforces \(\vec{p}_1 + \vec{p}_2 + \vec{p}_3 = 0\) (see
Figure~\ref{fig-three-body-decay-variables}). We refer to the plane
spanned by these momenta as the \textbf{Dalitz plane}, as it fully
captures the internal kinematic degrees of freedom of the decay,
analogous to the Dalitz plot. As before, the remaining degrees of
freedom are the Euler angles \(\Omega=(\phi,\theta,\chi)\) that specify
the orientation of the Dalitz plane with respect to the production
frame.

Since all kinematically relevant variables lie within the Dalitz plane,
the amplitude construction only requires {Wigner~\(d\)}-functions to
describe rotations within the plane, without an `off-plane' azimuthal
component. The \textbf{Dalitz-Plot Decomposition} (DPD) method exploits
this fact to derive analytic expressions for the remaining polar
rotation angles in terms of Mandelstam
invariants~\(\sigma_1=(p_2+p_3)^2\), \(\sigma_2=(p_3+p_1)^2\),
\(\sigma_3=(p_1+p_2)^2\) and rest masses
{\(\mu_0,\mu_1,\mu_2,\mu_3\)~{[}\citeproc{ref-JPAC:2019ufm}{157}{]}.}
Using Equation~\eqref{eq-mandelstam-total}, that leaves only \(k=2\)
degrees of freedom within the Dalitz plane, as expected.

\begin{figure}

\begin{minipage}{0.43\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/space-fixed-cm-frame.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.56\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter3/three-body-decay-variables.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-three-body-decay-variables}In the rest frame of
decaying particle~\(0\) in a three-body decay, the momenta
\(\vec{p}_1, \vec{p}_2, \vec{p}_3\) of the final state span the Dalitz
plane (left). The orientation of this plane is specified by the Euler
angles \(\color{MyRed} \phi, \theta, \chi\). Within the plane (right),
the Mandelstam invariants
\(\color{MyBlue} \sigma_1, \sigma_2, \sigma_3\) and the rest masses
\(\color{MyBlue} \mu_0, \mu_1, \mu_2, \mu_3\) fully describe the
internal dynamics of Dalitz-plot
function~\(\mathcal{O}^{\lambda_0}_{\{\lambda\}}\).}

\end{figure}%

Sequential three-body decays have only one type of topological structure
with two decay nodes: particle~\(0\) decays to a spectator~\(k\) and an
intermediate state~\(i,j\) (the \textbf{production node}), and then the
intermediate state decays to final-state particles \(i,j\) (the
\textbf{decay node}). Such a decay chain~\(\mathfrak{c}=(ij)k\) is often
referred to as a \textbf{subsystem} and is sometimes simply labelled by
index~\(k\). The decay chain with regard to which we align the other
decay chains (chain~\(\mathfrak{o}\) in
Equation~\eqref{eq-total-transition-amplitude}) is called the
\textbf{reference subsystem}, and we label it with index~\(l\) of its
spectator. With this notation, the three-body analogue of
Equation~\eqref{eq-total-transition-amplitude} is the
\textbf{Dalitz-plot function},

\begin{equation}\phantomsection\label{eq-dpd-aligned-amplitude}{
\begin{aligned}
\mathcal{O}^{\lambda_0}_{\{\lambda\}}(\tau) \;
&=\;
  \sum_{\{\lambda'\}} \sum_{(ij)k} \sum_s^{(ij)\to i,j} \sum_{\lambda_s}
  n_{j_0} \, n_s \\
&\times \;
  d^{j_0}_{\lambda_0,\lambda_s-\lambda'_k}(\hat\theta_{k(l)}) \,
  d^s_{\lambda_s,\lambda'_i-\lambda'_j}(\theta_{ij}) \\
&\times \;
  H^{0 \to (ij),k}_{\lambda_s,\lambda'_k}(\mu_0^2,\sigma_k,\mu_k^2) \,
  X_s(\sigma_k) \,
  H^{(ij) \to i,j}_{\lambda'_i,\lambda'_j}(\sigma_k,\mu_i^2,\mu_j^2) \\
&\times \;
  d^{j_1}_{\lambda'_1 \lambda_1}(\zeta^{1}_{k(0)}) \,
  d^{j_2}_{\lambda'_2 \lambda_2}(\zeta^{2}_{k(0)}) \,
  d^{j_3}_{\lambda'_3 \lambda_3}(\zeta^{3}_{k(0)}) \,.
\end{aligned}
}\end{equation}

Here, \((ij)k\) sums over all decay chains \((23)1\), \((31)2\), and
\((12)3\), label~\(s\) indicates all expected intermediate spins in the
two-body decay~\((ij)\to i,j\), and \(\lambda_s\) are the helicities of
that intermediate spin state. The normalisation factors
\(n_{j_0}=\sqrt{2j_0+1}\) and \(n_s=\sqrt{2s+1}\) are similar to those
appearing
Equation~\eqref{eq-relativistic-fixed-orbital-angular-momentum}. Two
{Wigner~\(d\)}-functions follow: one for the production node with
angle~\(\hat\theta_{k(l)}\) measured in the rest frame of~\(0\), and one
for the decay node with scattering angle~\(\theta_{ij}\) measured in the
rest frame of~\((ij)\to i,j\). The vertex functions~\(H\) and propagator
function \(X_s\) were introduced in
Equation~\eqref{eq-sequential-decay-amplitude-helicity-formalism}.
Finally, the three {Wigner~\(d\)}-functions with angles
\(\zeta^{i}_{k(0)}\) describe the Wigner rotations required to align the
three decay chains \((ij)k\) with regard to the production frame.

Since \(\hat\theta_{k(l)} = {\color{RoyalBlue}\zeta^{0}_{k(l)}}\), the
{Wigner~\(d\)} for the production node can be interpreted as a Wigner
rotation. In addition, for computations it is more efficient to compute
the Wigner rotation angles with regard to the reference subsystem~\(l\),
meaning that \(\zeta^i_{k(0)} \to \zeta^i_{k({\color{RoyalBlue}l})}\),
so that the Wigner rotations in the amplitude for that subsystem vanish
(this choice affects the definition of the Euler {angles~\(\Omega\)} of
the decay plane orientation in
Equation~\eqref{eq-differential-cross-section-multi-body-polarised}).
This results in the alternative form of
Equation~\eqref{eq-dpd-aligned-amplitude},

\begin{equation}\phantomsection\label{eq-dpd-aligned-amplitude-ampform}{
\begin{aligned}
\mathcal{O}^{\lambda_0}_{\{\lambda\}}(\tau) \;
&=\;
  {\color{RoyalBlue}\sum_{\lambda'_0}} \sum_{\{\lambda'\}} \sum_{(ij)k} \sum_s^{(ij)\to i,j} \sum_{\lambda_s}
  n_{j_0} \, n_s \\
&\times \;
  {\color{RoyalBlue}\delta_{\lambda'_0, \lambda_s - \lambda'_k}} \,
  d^s_{\lambda_s,\lambda'_i-\lambda'_j}(\theta_{ij}) \\
&\times \;
  H^{0 \to (ij),k}_{\lambda_s,\lambda'_k}(\mu_0^2,\sigma_k,\mu_k^2) \,
  X_s(\sigma_k) \,
  H^{(ij) \to i,j}_{\lambda'_i,\lambda'_j}(\sigma_k,\mu_i^2,\mu_j^2) \\
&\times \;
  {\color{RoyalBlue}d^{j_0}_{\lambda_0 \lambda'_0}(\zeta^{0}_{k(l)})} \,
  d^{j_1}_{\lambda'_1 \lambda_1}(\zeta^{1}_{k({\color{RoyalBlue}l})}) \,
  d^{j_2}_{\lambda'_2 \lambda_2}(\zeta^{2}_{k({\color{RoyalBlue}l})}) \,
  d^{j_3}_{\lambda'_3 \lambda_3}(\zeta^{3}_{k({\color{RoyalBlue}l})}) \,.
\end{aligned}
}\end{equation}

An unpolarised intensity function for the decay
\(J/\psi \to \bar{p} K^0_S \varSigma^+\) with only two subsystems, \(2\)
and \(3\) as reference subsystem, is provided in
Equation~\eqref{eq-ampform-dpd-intensity}. The model also uses
Equation~\eqref{eq-transformation-canonical-helicity} to transform the
chain amplitudes to the canonical basis and get access to the angular
momentum content of each decay node
(Equation~\eqref{eq-ampform-dpd-amplitudes}).

The angles \(\theta_{ij}\), \(\hat\theta_{k(l)}=\zeta^{0}_{k(l)}\), and
\(\zeta^{i}_{k(0)}\) can be computed analytically from Mandelstam
invariants \(\sigma_1, \sigma_2, \sigma_3\) and the rest masses
\(\mu_0, \mu_1, \mu_2, \mu_3\) of the initial- and final-state
particles. The expressions are given in Appendix~A of
{[}\citeproc{ref-JPAC:2019ufm}{157}{]}. Taking
\((ij)k \in \set{(23)1, (31)2, (12)3}\), the three relevant Wigner
rotation angles in Equation~\eqref{eq-dpd-aligned-amplitude} and
Equation~\eqref{eq-dpd-aligned-amplitude-ampform} are

\begin{equation}\phantomsection\label{eq-dpd-angles}{
\begin{aligned}
\cos\theta_{ij}
\;&=\;
  \frac{
    2\sigma_k(\sigma_j-\mu_k^2-\mu_i^2)
    - (\sigma_k+\mu_i^2-\mu_j^2)(\mu_0^2-\sigma_k-\mu_k^2)
  }{
    \lambda^{1/2}(\mu_0^2,\mu_k^2,\sigma_k) \,
    \lambda^{1/2}(\sigma_k,\mu_i^2,\mu_j^2)
  } \\
\cos\hat\theta_{i(j)}
\;&=\;
  \frac{
    (\mu_0^2+\mu_i^2-\sigma_i)(\mu_0^2+\mu_j^2-\sigma_j)
    - 2\mu_0^2(\sigma_k-\mu_i^2-\mu_j^2)
  }{
    \lambda^{1/2}(\mu_0^2,\mu_j^2,\sigma_j) \,
    \lambda^{1/2}(\mu_0^2,\sigma_i,\mu_i^2)
  } \\
\cos\zeta_{k(0)}^{i}
\;&=\;
  \frac{
    2\mu_i^2(\sigma_j-\mu_0^2-\mu_j^2)
    + (\mu_0^2+\mu_i^2-\sigma_i)(\sigma_k-\mu_i^2-\mu_j^2)
  }{
    \lambda^{1/2}(\mu_0^2,\mu_i^2,\sigma_i) \,
    \lambda^{1/2}(\sigma_k,\mu_i^2,\mu_j^2)
  } \,. \\
\end{aligned}
}\end{equation}

In addition, \(\zeta^i_{k(i)}=\zeta^i_{k(0)}\), and
\(\hat\theta_{l(k)}\) can be found by replacing it with
\(\hat\theta_{k(l)}\) at the cost of a sign flip, following
\(d^j_{\lambda\lambda'}(\hat\theta_{l(k)}) = (-1)^{\lambda-\lambda'}d^j_{\lambda\lambda'}(\hat\theta_{k(l)})\).
Angles with equal indices are zero, so \(\theta_{kk}=0\),
\(\hat\theta_{k(k)}=0\), and \(\zeta^i_{k(k)}=0\). In some decays, this
fact can be used to simplify the expression for the Dalitz-plot function
with a suitable choice of reference subsystem.

\bookmarksetup{startatroot}

\chapter{Computational techniques}\label{sec-computational-techniques}

In the past decades, scattering experiments have produced steadily
growing datasets. These larger samples allow us to apply more
sophisticated parametrisations without overfitting. However, this
progress comes at a cost: the complexity of these amplitude models as
well as the increased size of the data samples requires significantly
more computational power.

This chapter explores some of the modern techniques for high-performance
computing that have become available in recent years and that have been
employed for this work within the
\href{https://compwa.github.io}{ComPWA} project
(Chapter~\ref{sec-compwa}). It first outlines how advancements in
computing hardware have driven the popularity of array-oriented
programming libraries that are nowadays commonplace in data analysis and
Machine Learning. It then examines how Computer Algebra Systems can
simplify the formulation of amplitude models and generate code for fast
numerical computations over large data arrays. The chapter concludes by
showing how a dynamic programming language like Python enables the
generation of publication-ready content directly from the analysis
codebase, with symbolic expressions naturally complementing this
approach.

\section{Array-oriented programming}\label{sec-array-oriented}

Traditionally, most analyses in high-energy physics and hadron
spectroscopy have been written in performance-focused languages like C++
and Fortran. These languages dominated because they offered fine-grained
control and precision at a time when particle physics began producing
large volumes of collision data~{[}\citeproc{ref-Brun:1997pa}{158};
\citeproc{ref-Antcheva:2009zz}{159}{]}, see
Figure~\ref{fig-programming-languages}. In many cases, C++ is a good
choice for high-performance computing, as it allows for low-level
control over memory and processor usage and can therefore implement any
kind of logic efficiently. Beyond raw performance, C++ offered stronger
support for abstraction and modularity through features like namespaces
and object-oriented
design~{[}\citeproc{ref-Stroustrup:2007-EvolvingLanguage}{160}{]}, which
made it well suited for the growing complexity of large-scale physics
software. Since the early 2000s, however, there has been a broader shift
across scientific computing towards higher-level languages such as
Python, which trade low-level control for better readability,
flexibility, and easier tool integration.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/programming-languages.pdf}}}

}

\caption{\label{fig-programming-languages}Popularity of C, C++, Python,
and Fortran since 1985 according to TIOBE
{[}\citeproc{ref-TIOBE:2025-TIOBEIndex}{161}{]}. The lower the index,
the higher the popularity of the language.}

\end{figure}%

\subsection{Code complexity and hardware
diversity}\label{code-complexity-and-hardware-diversity}

The challenge with these performant, low-level languages is that it
often results in complex, verbose code. This is especially problematic
in analysis code that repetitively performs similar mathematical
operations over columnar data. The mathematical operations of interest
have to be implemented through iterative loops over the data (often
called ``scalar-based loops''), which makes it is hard to recognise the
physics formulas that are being
implemented~{[}\citeproc{ref-Press:1992-NumericalRecipesC}{162}{]},
although modern language extensions partly alleviate these
issues~{[}\citeproc{ref-Iglberger:2012-ExpressionTemplatesRevisited}{163}{]}.
This makes it particularly challenging to express amplitude models in
these traditional high-performance languages.

An additional difficulty in scientific computing is that low-level
implementations in languages like C++ or Fortran are difficult for the
broader programming community to maintain across the diversity of modern
hardware architectures. In recent decades, chips are hitting physical
limits, which prompts hardware manufacturers to develop a great variety
of chips and accelerators that often have to be parallelised to achieve
higher performance. With the advent of GPUs, TPUs, and other specialised
accelerators, the need for code that can run efficiently on various
types of parallelised hardware has therefore become increasingly
important.

Furthermore, the widespread use of mobile devices that prioritise energy
efficiency has driven the broad adoption of Reduced Instruction Set
Computer (RISC) chip architectures like ARM. These chips feature a
distinct memory hierarchy and instruction set compared to the more
prevalent Complex Instruction Set Computer (CISC) architectures like
x86-64 that are found in desktop and server CPUs. ARM chips are
therefore increasingly adopted in cloud computing services as well, as
they are more energy-efficient and can be scaled to larger numbers of
cores at lower cost.

Amplitude analysis almost always involves those repetitive, scalar-based
loops, where the amplitude model is evaluated uniformly over each event
in a dataset. This process is inherently parallel, as the evaluation of
the amplitude model for one event does not rely on the outcome of any
other~-- a scenario often described as ``embarrassingly
parallel''~{[}\citeproc{ref-Herlihy:2012-ArtMultiprocessorProgramming}{164,
p.~14}{]}. The parallel nature of amplitude model evaluations therefore
allows us to distribute the data sample over the memory of different
computational devices and performing the scalar evaluations concurrently
over different processors, which is ideal in an age of multi-core CPUs
and hardware accelerators like GPUs.

\subsection{Arrays and code conciseness}\label{sec-code-conciseness}

Parallelism naturally lends itself to \textbf{array programming}.
Instead of treating each event as an isolated scalar computation
executed in a loop, array-oriented programming conceptualises the entire
dataset as a single, contiguous entity~-- an ``\textbf{array}''. Arrays
can be multidimensional and are therefore also called \textbf{tensors}.
Each dimension corresponds to an \textbf{axis}, a direction along which
the array can be indexed, and together the axis lengths define the
\textbf{shape} of the array. For example, a {\(4\times3\)~array} has
shape \texttt{(4,\ 3)}, meaning two axes (rows and columns), and is
therefore a rank‑2 tensor. As can be seen in Figure~\ref{fig-array}, an
array consists of a continuous block of memory (typically of a uniform
type), along with metadata for interpreting the data stored in it. The
metadata provides a pointer to the start of the memory block, a data
type, a shape, and strides that define how to move through the memory
block to access the elements~{[}\citeproc{ref-vanderWalt:2011bqk}{165};
\citeproc{ref-Harris:2020xlr}{166}{]}. As such, arrays are essentially
recipes for nested loops over memory blocks that represent
multidimensional data structures, which array libraries then optimise to
improve memory locality and parallel
execution~{[}\citeproc{ref-Wolf:1991-DataLocalityOptimizing}{167}{]}.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/array-memory.pdf}}}

}

\caption{\label{fig-array}Memory layout of a rank-2 array of shape
\(4\times3\) with 12~integers. The strides and data type tell the
machine how to iterate over the memory block, while the shape tells the
size of the array in each dimension. Adapted
from~{[}\citeproc{ref-Harris:2020xlr}{166, Fig.~1a}{]}.}

\end{figure}%

In array-oriented programming languages or libraries, the operations are
defined in terms of these arrays, which allows for more concise and
readable code. For example, in the following code, we see how an array
of 12~integers, organised in a \(4 \times 3\) shape, are defined as a
single variable~\texttt{x}. In this chapter, the return value of the
last line in each code cell is shown as output directly beneath it.

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np}

\NormalTok{size }\OperatorTok{=} \DecValTok{12}
\NormalTok{x }\OperatorTok{=}\NormalTok{ np.arange(size).reshape((}\DecValTok{4}\NormalTok{, }\DecValTok{3}\NormalTok{))}
\NormalTok{x}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
\end{verbatim}

The code to generate this array is not important for this example: the
array could be also be generated with a random-number generator or
imported from a data file. Rather, the fact that the array is
represented as a single variable allows for concise and readable code
and highlights array-oriented
thinking~{[}\citeproc{ref-Iverson:1980-NotationToolThought}{168}{]}. For
example, a simple polynomial evaluation \(x^2-7x+3\) can be written as:

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{x}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \DecValTok{7}\OperatorTok{*}\NormalTok{x }\OperatorTok{+} \DecValTok{3}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
array([[ 3, -3, -7],
       [-9, -9, -7],
       [-3,  3, 11],
       [21, 33, 47]])
\end{verbatim}

Behind the scenes, the array library takes care of the nested loops over
the memory block. Operations that are less arithmetic can be performed
through functions provided by the library:

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{np.sqrt(x)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
array([[0.        , 1.        , 1.41421356],
       [1.73205081, 2.        , 2.23606798],
       [2.44948974, 2.64575131, 2.82842712],
       [3.        , 3.16227766, 3.31662479]])
\end{verbatim}

\noindent This also allows us to perform operations that pertain to
certain axes of the array. For instance, the following example computes
the mean along the first axis (that is, across the rows), using the
\href{https://numpy.org/doc/2.1/reference/generated/numpy.ndarray.mean.html}{\texttt{mean()}}
method of the array.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{x.mean(axis}\OperatorTok{=}\DecValTok{0}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
array([4.5, 5.5, 6.5])
\end{verbatim}

Array libraries can also automatically handle arrays of different
dimension or different shapes. This is called \textbf{broadcasting} and
allows us to perform operations on array objects without specifying the
operation in a loop. In many cases, the array library will further
optimise the computation by reusing memory and avoiding unnecessary
copies. A simple example of broadcasting is multiplying an array times a
scalar, as happens in the examples above. Broadcasting also happens when
the value type of the array has to be modified, for instance when
multiplying an integer times a float.

The following example uses broadcasting to add two arrays of different
shapes. The first array is a rank-1 array of shape \texttt{(3,)} and the
second is a rank-2 array of shape~\texttt{(4,\ 3)}. The library
automatically expands the first array to match the shape of the second
array, so that the operation can be carried out element-wise. In this
case, the rank‑1 array~\texttt{a} is turned into a rank‑2 array of
shape~\texttt{(3,\ 1)} (column vector) and multiplied with each row
of~\texttt{b}, resulting in a {\(3\times4\)~array} where every row
of~\texttt{b} is scaled by the corresponding entry of~\texttt{a}.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{a }\OperatorTok{=}\NormalTok{ np.array([}\DecValTok{1}\NormalTok{, }\DecValTok{2}\NormalTok{, }\DecValTok{3}\NormalTok{])}
\NormalTok{b }\OperatorTok{=}\NormalTok{ np.array([[}\DecValTok{4}\NormalTok{, }\DecValTok{5}\NormalTok{, }\DecValTok{6}\NormalTok{, }\DecValTok{7}\NormalTok{], [}\DecValTok{8}\NormalTok{, }\DecValTok{9}\NormalTok{, }\DecValTok{10}\NormalTok{, }\DecValTok{11}\NormalTok{], [}\DecValTok{12}\NormalTok{, }\DecValTok{13}\NormalTok{, }\DecValTok{14}\NormalTok{, }\DecValTok{15}\NormalTok{]])}
\NormalTok{a[np.newaxis].T }\OperatorTok{*}\NormalTok{ b}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
array([[ 4,  5,  6,  7],
       [16, 18, 20, 22],
       [36, 39, 42, 45]])
\end{verbatim}

Broadcasting is powerful because it scales seamlessly to arrays of much
larger size and applies the same operation just as well to higher-rank
tensors. This flexibility makes array code agnostic to the shape of the
data, removing the need to manually reorganise loops when the input
changes.

\subsection{Vectorisation and
parallelism}\label{vectorisation-and-parallelism}

Crucially, a key benefit of writing concise array-based code, is that it
naturally exposes opportunities for parallel execution and other
optimisations. In other words, the same design choices that improve
\hyperref[sec-code-conciseness]{readability} also make it easier for the
array library to take advantage of modern hardware. The Python code we
have seen is the set of instructions that we want to apply to each
element, or axis of elements, in the array. Under the hood, the
computational loops over the array are automatically implemented in
low-level, highly optimised routines (often written in C, C++, or
Fortran). To make these routines readily available, Python extension
modules are typically distributed as pre-compiled binaries
(\href{https://peps.python.org/pep-0427}{``wheels''}), so the user does
not need to compile them locally.

This approach of delegating repetitive work to specialised routines is
generally referred to as \textbf{vectorisation} and opens the door to
several optimisations. The core idea of vectorisation is that
computational operations can be applied to all elements of an array
without caring about their order, if computation on each element is
independent of previous iterations. This allows the array library to
reorder operations, execute them in parallel across multiple cores or
vector units, and optimise memory access patterns.

A simple example of parallel processing is Single Instruction, Multiple
Data (SIMD), which applies the same instruction to multiple data
elements simultaneously on a
CPU~{[}\citeproc{ref-Flynn:1972-ComputerOrganizations}{169}{]}. Modern
CPUs have larger registers that can hold several data elements at once,
and SIMD instructions operate on all elements in the register
simultaneously (see Figure~\ref{fig-sisd-vs-simd}). In low-level
languages, one typically relies on the compiler to detect which parts of
the code can be vectorised (this behaviour can be tuned with compiler
optimisation flags such as
\href{https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html}{\texttt{-O3}}).
By contrast, array-oriented code naturally assumes uniform input data,
making it much easier to translate the code directly into SIMD
instructions. To take advantage of this, array libraries include
optimisations for different vector instruction sets, such as SSE and
AVX-512. Advanced Vector Extensions (AVX) like these are a CPU feature
that implement the SIMD principle by allowing registers to hold more
data elements at once and by introducing operations that act on all of
them simultaneously, so arithmetic (such as addition or multiplication)
can be carried out on many numbers in parallel. In practice, these
libraries automatically detect the available CPU features and use the
most efficient instructions, so the same code runs optimally on
different machines.

\begin{figure}

\begin{minipage}{0.50\linewidth}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/sisd.pdf}}

}

\subcaption{\label{fig-sisd}SISD}

\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/simd.pdf}}

}

\subcaption{\label{fig-simd}SIMD}

\end{minipage}%

\caption{\label{fig-sisd-vs-simd}Comparison between Single Instruction,
Single Data (SISD) and Single Instruction, Multiple Data (SIMD)
processing. In SISD, a single instruction is executed on a single data
element, while in SIMD, a single instruction is executed on multiple
data elements.}

\end{figure}%

\subsection{Memory locality}\label{sec-memory-locality}

The parallel nature of arrays also allows for multi-core and
multi-threaded computations. In this case, the array library distributes
work across several cores that share the same memory space. This is
conceptually similar to SIMD in that the same operation is applied to
many elements, but here it is carried out on different cores or threads
rather than within a single register.

Additionally, these lower-level routines can also optimise memory access
patterns, since arrays are typically stored in a compact, contiguous
block of memory. Because modern processors are built around deeply
layered memory hierarchies, their performance strongly depends on
keeping data close to the processing units in fast caches rather than
repeatedly fetching it from slower main memory, which lies relatively
far away from the processor on the scale of microchips. If data is
stored in a continuous block and accessed in order, processors can cache
it more efficiently. This is especially important when arrays are large,
as memory bandwidth often becomes the limiting factor in numerical
calculations. By contrast, naive implementations of scalar loops may
scatter data in ways that are harder to optimise. The \textbf{locality}
of arrays therefore inherently results in better computational
performance.

\subsection{Accelerated linear
algebra}\label{accelerated-linear-algebra}

Many of these optimisations come together in operations that involve
linear algebra operations or reductions on certain axes of the array.
These operations are usually outsourced to highly optimised libraries
like BLAS (Basic Linear Algebra Subprograms, see
{[}\citeproc{ref-Lawson:1979-BLAS}{170}{]}) and LAPACK (Linear Algebra
PACKage, see {[}\citeproc{ref-Angerson:1990-LAPACK}{171}{]}). BLAS and
LAPACK not only make use of SIMD and parallelism, but also optimise
usage of the memory hierarchy and multi-level caches (L1, L2, and L3)
while evaluating operations over subsets (tiles) of the arrays.
Similarly to SIMD, these linear algebra operations also usually include
hand-tuned assembly code for the specific hardware on which the compiled
code runs. Some library offer additional optimisations like constant
folding and algebraic simplifications.

\subsection{Hardware accelerators}\label{sec-hardware-accelerators}

Finally, array-oriented libraries can offload computations to
domain-specific accelerator hardware, such as GPUs. Traditionally, code
is compiled for Central Processing Units (CPUs), which are ideal for
general-purpose, logical tasks. CPUs have a powerful Control Unit (CU),
Arithmetic Logic Units (ALUs), and hierarchical caches that can run
complex, branching code efficiently (see
Figure~\ref{fig-gpu-architecture}). By contrast Graphics Processing
Units (GPUs) are designed for parallel, arithmetic-heavy tasks. GPUs
contain thousands of smaller CUDA cores (NVIDIA) or Stream Processors
(AMD) that are optimised for running the same instruction on many
uniform data elements in parallel. Both CPUs and GPUs get their input
data from Random Access Memory (RAM), but GPUs use this random access to
feed many cores in parallel, while CPUs use it to feed its ALUs cores
with complex, branching code.

\begin{figure}

\begin{minipage}{0.43\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/cpu.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.56\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/gpu.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-gpu-architecture}Architecture of a Central
Processing Unit (CPU) on the left and a Graphics Processing Unit (GPU)
on the right. Both have one or more multi-purpose Control Units (pink),
Arithmetic Logic Units (blue), and caches (yellow).}

\end{figure}%

The growing interest and investment into Machine Learning (ML) and
training of Large Language Models (LLMs) has driven the development of
even more specialised hardware accelerators. Prompted by the high
operational costs of running hardware clusters, companies are starting
to design their own in-house chip architectures that are designed to
handle specific ML workloads. An early example of this are Google's
Tensor Processing Units (TPUs), which are specialised in running matrix
multiplications at even higher throughput at the cost of lower machine
precision~{[}\citeproc{ref-Jouppi:2017-InDatacenterPerformanceAnalysis}{172}{]}.
The key point is that, while high-performance computing is moving
towards a highly heterogeneous landscape of chip architectures, array
libraries are continuously adapting to these changes.

NumPy itself can delegate certain operations to GPUs through add-on
libraries (e.g., \href{https://cupy.dev}{CuPy}), while other popular
array-oriented frameworks (like TensorFlow, PyTorch, or JAX) are built
from the ground up to harness GPU and TPU acceleration. Using such
devices directly is far from trivial, as they have their own separate
memory, data transfers are relatively slow, and one normally has to work
with vendor-specific programming models such as CUDA or OpenCL. Array
libraries take care of these complexities: thanks to the uniform array
abstraction, switching between CPU and GPU can be as simple as moving
your data to a GPU-backed array. They also integrate with specialised
backends, ranging from device-specific libraries like
\href{https://developer.nvidia.com/cublas}{cuBLAS} to compiler
frameworks such as \href{https://openxla.org}{XLA} (Accelerated Linear
Algebra), which generate optimised kernels for the selected hardware.
The code itself remains unchanged, since these libraries still provide
high-level instructions that operate on arrays.

\subsection{JIT-compilation and lazy
evaluation}\label{jit-compilation-and-lazy-evaluation}

In some libraries, further optimisations come from lazy evaluation~--
deferring certain calculations until they are strictly necessary~-- so
that the library can fuse multiple operations into a single, optimised
kernel call (\textbf{kernel fusion}). This approach reduces the overhead
of running many small, separate operations and having to store the
intermediate results in memory. Although NumPy does not provide lazy
evaluation, frameworks such as JAX or Dask
do~{[}\citeproc{ref-Sapunov:2024-DeepLearningJAX}{173}{]}. The core idea
is consistent across these tools: writing code in terms of entire arrays
makes it easier for the underlying engine to schedule, parallelise, and
optimise the calculations.

A natural complement to lazy evaluation is Just-in-Time (JIT)
compilation, which analyses high-level operations right before execution
and compiles them into efficient, low-level machine code. In the context
of array-oriented programming, this approach allows the compiler to
specialise the resulting code to the exact shapes and data types of the
input arrays. By knowing at compile time how large an array is and what
data type it holds, JIT compilers can prepare and optimise memory access
patterns based on the resources that the hardware has available. JIT
compilers designed for hardware accelerators also use the incoming array
information to minimise copy operations between the CPU and the
accelerator, which can be a significant bottleneck in heterogeneous
computations.

JIT compilation is even useful for operations that are not easily
vectorised, such as if-else logic. Vectorised programs and hardware
accelerators are inefficient at handling conditional logic, because they
require all elements of the array to be processed in the same way. A
common solution is to use \textbf{masks}, which are arrays of boolean
values that select elements from another array. This produces a new view
of the data block in which only the relevant elements remain, so the
processor can run straight through without branching. In this way,
conditional logic is turned into parallel operations, where masking
operations replace explicit if-else statements~-- a style known as
\textbf{branchless programming}. Such branchless formulations are a must
for fast numerical performance on SIMD architectures and hardware
accelerators, where conditional logic reduces the number of cores that
can be used in parallel~ {[}\citeproc{ref-Harris:2020xlr}{166}{]}.

\subsection{Automatic differentiation}\label{sec-autodiff}

Another benefit of array-oriented programming is that it naturally lends
itself to automatic differentiation (AD, or ``autodiff''). This
technique makes it possible to compute the partial derivative of a
function with respect to the input variables of interest. This is
particularly useful in Machine Learning, where the derivative of the
loss function with respect to the model parameters is used to update the
model parameters through gradient descent.

The same technique can be applied in physics analyses, where we usually
minimise the log-likelihood function for the amplitude model over large,
unbinned data sets using a gradient-descent algorithm. Traditionally,
the gradient at the current evaluation point is computed numerically by
evaluating the function at multiple points around the current evaluation
point and taking the finite
difference~{[}\citeproc{ref-James:1975dr}{143}{]}. These
finite-difference approximations are easier to implement, but become
computationally expensive and numerically unstable when the number of
parameters or the size of the data sample
grows~{[}\citeproc{ref-Griewank:2008-EvaluatingDerivatives}{174}{]}. So
far it has however been the only option in amplitude analysis, as it is
almost impossible to manually derive and implement the gradient of
chained, nested, and non-linear amplitude formulas.

The core idea of AD is to break down the function into a series of
elementary operations, for which the derivative is known. By applying
the chain rule, the derivative of the function can be computed by
combining the derivatives of the elementary operations. In
array-oriented programming, the function is already expressed in terms
of operations to uniform arrays, which makes it easier to break down the
function into elementary operations. This is why many Machine Learning
frameworks, like TensorFlow, PyTorch, and JAX, provide automatic
differentiation as a core feature.

Automatic differentiation uses the chain rule of calculus to compute
exact derivatives without symbolic manipulation in two distinct modes:

\begin{itemize}
\tightlist
\item
  \textbf{Forward-mode AD} propagates derivatives with respect to each
  function parameter ``forward'' through the computational graph. It
  does so by defining a dual space algebra, with the first element in
  each dual number being the function value and the second element being
  the derivative, and propagating the operation of each node in the
  function forward through the graph. This makes forward-mode efficient
  when the number of inputs (parameters) is small compared to the number
  of outputs.
\item
  \textbf{Reverse-mode AD} (often referred to as ``backpropagation'' in
  the context of neural networks) instead starts from the outputs and
  propagates derivatives ``backward'' through the graph. At each node,
  the chain rule distributes the contribution of the node to all of its
  inputs, so that in the end the derivative of the output with respect
  to every input parameter has been accumulated. This approach is
  efficient when the number of inputs is large but the number of outputs
  is small, as in amplitude analysis or maximum-likelihood fits, where
  we optimise a single scalar function (the likelihood) with respect to
  many parameters. Most machine-learning libraries, including
  TensorFlow, JAX, and PyTorch, implement reverse-mode AD under the hood
  to allow efficient gradient computation at scale.
\end{itemize}

Figure~\ref{fig-ad-modes} illustrates the difference between
reverse-mode and forward-mode automatic differentiation for a composite
{function~\(f(g(x,y))\).} In reverse-mode (left), the computation first
evaluates the inner function \(g(x,y)\) and then applies \(f\) to its
result. The {derivative~\(\tfrac{\partial f}{\partial g}\)} is
propagated backward {to~\(g\),} which is then multiplied by the partial
{derivatives~\(\tfrac{\partial g}{\partial x}\)} and
\(\tfrac{\partial g}{\partial y}\) to yield
\(\tfrac{\partial f}{\partial x}\)
{and~\(\tfrac{\partial f}{\partial y}\).} In forward-mode (right), the
procedure begins by attaching derivative information to each input (dual
space), such as \(\tfrac{\partial x}{\partial x} = 1\)
{and~\(\tfrac{\partial y}{\partial x} = 0\).} This information is
propagated forward {through~\(g(x,y)\),} producing {both~\(g\)}
{and~\(\tfrac{\partial g}{\partial x}\).} Finally, {applying~\(f\)} to
this dual information yields not {only~\(f(g(x,y))\)} but also the
{derivative~\(\tfrac{\partial f}{\partial x}\).}

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/autodiff-reverse-mode.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter4/autodiff-forward-mode.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-ad-modes}Comparison between reverse-mode AD (left)
and forward-mode AD (right).}

\end{figure}%

Employing AD in an array-oriented framework involves writing a function
that accepts arrays and returns one or more arrays or scalars. The
framework ``traces'' the function~-- either during execution (eager
tracing) or via a separate compilation stage~-- and constructs a
computational graph that records how each output depends on each input.
It then applies the chain rule to this graph to compute partial
derivatives.

As an example, the code below derives the gradient of

\begin{equation*}
f(x, y, z) = x^2 \sin(y) + \log(1 + z^2) / y
\end{equation*}

\noindent using JAX. The function is defined in Python with arithmetic
from the
\href{https://docs.jax.dev/en/latest/jax.numpy.html}{\texttt{jax.numpy}}
module, which allows JAX to trace the operations and build a
computational graph. Calling
\href{https://docs.jax.dev/en/latest/_autosummary/jax.jacrev.html}{\texttt{jax.jacrev}}
with respect to the {arguments~\((x, y)\)} (indices~\texttt{0}
and~\texttt{1}) applies reverse-mode AD to evaluate the partial
derivatives \(\tfrac{\partial f}{\partial x}\)
{and~\(\tfrac{\partial f}{\partial y}\).} The example also illustrates
broadcasting: \(x\) is given as a one-dimensional array, while \(y\) is
a scalar, so JAX computes the gradient element-wise. The resulting
\texttt{f\_gradient} function returns two arrays: a
{\(4\times 4\)~Jacobian} with respect to the input {array~\(x\),} since
each of the four outputs depends on every element of \(x\), and a
length‑4 array with derivatives with respect to the {scalar~\(y\).} The
output is returned as JAX arrays, so every operation remains part of the
computational graph and can be extended with further calculations,
including gradients, for efficient execution on the chosen hardware
accelerator.

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ jax}
\ImportTok{import}\NormalTok{ jax.numpy }\ImportTok{as}\NormalTok{ jnp}

\KeywordTok{def}\NormalTok{ f(x, y, z):}
    \ControlFlowTok{return}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{*}\NormalTok{ jnp.sin(y) }\OperatorTok{+}\NormalTok{ jnp.log(}\DecValTok{1} \OperatorTok{+}\NormalTok{ z}\OperatorTok{**}\DecValTok{2}\NormalTok{) }\OperatorTok{/}\NormalTok{ y}

\NormalTok{f\_gradient }\OperatorTok{=}\NormalTok{ jax.jacrev(f, argnums}\OperatorTok{=}\NormalTok{(}\DecValTok{0}\NormalTok{, }\DecValTok{1}\NormalTok{))}
\NormalTok{x\_array }\OperatorTok{=}\NormalTok{ jnp.array([}\OperatorTok{{-}}\FloatTok{1.8}\NormalTok{, }\FloatTok{3.1}\NormalTok{, }\OperatorTok{{-}}\FloatTok{0.7}\NormalTok{, }\FloatTok{2.5}\NormalTok{])}
\NormalTok{y\_value }\OperatorTok{=} \FloatTok{0.5}
\NormalTok{z\_value }\OperatorTok{=} \OperatorTok{{-}}\FloatTok{1.5}
\NormalTok{f\_gradient(x\_array, y\_value, z\_value)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
(Array([[-1.726,  0.   , -0.   ,  0.   ],
        [-0.   ,  2.972, -0.   ,  0.   ],
        [-0.   ,  0.   , -0.671,  0.   ],
        [-0.   ,  0.   , -0.   ,  2.397]], dtype=float64),
 Array([-1.871,  3.719, -4.285,  0.77 ], dtype=float64, weak_type=True))
\end{verbatim}

What makes this particularly powerful for high-performance computing is
that AD benefits from all of the hardware optimisations that have been
described so far. The parallelisation schemes apply equally to the
constructed computational graph of the gradient function and
JIT-compilation can fuse both the forward pass (function evaluation) and
backward pass (derivative evaluation) into efficient kernels. Frameworks
like JAX further optimise the derivative pass by reusing intermediate
results from the forward pass.

\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}

\noindent In summary, abstracting away the scalar-based loops in terms
of arrays allows us to outsource the work of writing machine-specific,
optimised code to the array library. Driven by the surge in data
analysis, Machine Learning, and training of Large Language Models
(LLMs), arrays have become the standard data container for
parallelisation and hardware accelerators. Array programming has become
a popular paradigm in many programming languages. The popularity of
array-oriented programming is therefore not limited to Python, but is
also present in other languages like Julia and even C++, where libraries
like \href{https://juliadiff.org}{JuliaDiff},
\href{https://github.com/eschnett/SIMD.jl}{SIMD.jl},
\href{https://eigen.tuxfamily.org/index.php?title=Main_Page}{Eigen}, and
\href{https://arma.sourceforge.net/}{Armadillo} provide similar
functionality. The challenge for the developers of all these libraries
and languages is to tailor compilation to the plethora of hardware
architectures that are becoming available. This device abstraction makes
it possible to keep the array-based code that formulates physics models
unaffected, as the libraries that power the computations adapt to the
advances in computational techniques.

\section{Computer Algebra Systems}\label{sec-cas}

The previous section introduced array-oriented programming as a means to
express calculations concisely, while leveraging modern hardware for
performance gains. Array-oriented code already bridges the gap between
theory and code quite well, but it turns out that symbolic
representations offer a structured intermediate step before numerical
evaluation. This is especially true in the context of amplitude
analysis, where the mathematical expressions can be complicated and
involve many parameters.

Computer Algebra Systems (CAS) allow us to define and manipulate
amplitude models symbolically before implementing them in numerical
computations. This ``\textbf{CAS-assisted model building}'' enables us
to explore the mathematical structure of the amplitude model, simplify
sub-expressions, and ensure correctness before transitioning to
efficient numerical evaluation. This section explores these ideas using
SymPy as a CAS, and using JAX and NumPy as numerical backends. As we
will see in Chapter~\ref{sec-application-to-data}, the combination of
SymPy with JAX turned out to work best for large-scale amplitude
analyses.

\subsection{Mathematical expressions as
trees}\label{sec-expression-trees}

Computer Algebra Systems emerged in the 1960s as tools for performing
symbolic mathematical manipulations, mostly driven by the needs of
physics and engineering~{[}\citeproc{ref-Moses:2012-Macsyma}{175}{]}.
Early systems like MACSYMA~{[}\citeproc{ref-Martin:1971-MACSYMA}{176}{]}
and REDUCE pioneered symbolic computation by introducing algebraic
manipulation techniques that enabled automated mathematical reasoning.
Mathematica~{[}\citeproc{ref-Wolfram:1988-Mathematica}{177}{]} later
expanded these capabilities with an interactive, user-friendly
environment and a broad range of built-in symbolic and numerical
functions, making symbolic computation more accessible to scientists and
engineers. In the world of Python,
SymPy~{[}\citeproc{ref-Meurer:2017yhf}{178}{]} has become the most
popular CAS that provides similar interactive experience since the
advent of Jupyter notebooks (see Section~\ref{sec-self-documenting} and
the examples below).

The key idea of a CAS is that mathematical expressions are treated as
\textbf{expression trees}, where each node represents an operation
(e.g., addition, multiplication, differentiation), and the leaves
represent variables or constants. This representation allows CAS to
perform exact algebraic manipulations by applying standard
transformations to the leaves and branches of the tree. Crucially, such
CAS operations are exact, meaning that they preserve the mathematical
structure of the expression without introducing numerical errors. This
is in contrast to numerical computations, which are subject to
floating-point approximations and rounding errors.

The following example demonstrates how SymPy builds a simple
Breit--Wigner expression as an expression tree. It shows the Python
code, the automatically rendered formula, and the corresponding
expression tree. The fundamental building blocks are symbols
(\(s, m_0, \Gamma_0\), indicated in blue), constants (\({-}1, 2, i\),
indicated in grey), and algebraic operations (multiplication, addition,
and exponentiation, indicated in black). The graph is a rendering of the
hierarchical structure with which SymPy inherently represents the
expression. Note that SymPy reorders commutative terms alphabetically,
which is why both the expression tree and the {\(\text{\LaTeX}\)}
rendering differ slightly from the code.

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ sympy }\ImportTok{as}\NormalTok{ sp}
\NormalTok{s, mass, width }\OperatorTok{=}\NormalTok{ sp.symbols(}\StringTok{"s m0 Gamma0"}\NormalTok{)}
\NormalTok{expression }\OperatorTok{=}\NormalTok{ mass }\OperatorTok{*}\NormalTok{ width }\OperatorTok{/}\NormalTok{ (mass}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s }\OperatorTok{{-}}\NormalTok{ sp.I }\OperatorTok{*}\NormalTok{ width }\OperatorTok{*}\NormalTok{ mass)}
\NormalTok{expression}
\end{Highlighting}
\end{Shaded}

$\displaystyle \frac{\Gamma_{0} m_{0}}{- i \Gamma_{0} m_{0} + m_{0}^{2} - s}$

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter4_files/figure-latex/cell-10-output-2.pdf}}

\vspace{0.5\baselineskip} When substituting symbols with numerical
values, the CAS applies exact, algebraic transformations to the relevant
branches in the expression tree. In the following example, the symbols
\(m_0\) and \(\Gamma_0\) in the Breit--Wigner expression are replaced
with numerical values. Even though these values are floating-point
numbers, the result of the substitution is still an exact symbolic
expression, so that floating-point errors are avoided. This is achieved
through the arbitrary-precision floating-point library
\href{https://mpmath.org}{\texttt{mpmath}}~{[}\citeproc{ref-mpmath:2023}{179}{]}.
Importantly, the expression tree corresponding to the result of the
substitution has a simpler structure with fewer mathematical nodes.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{expression.subs(\{mass: }\FloatTok{0.980}\NormalTok{, width: }\FloatTok{0.06}\NormalTok{\})}
\end{Highlighting}
\end{Shaded}

$\displaystyle \frac{0.0588}{- s + 0.9604 - 0.0588 i}$

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter4_files/figure-latex/cell-12-output-1.pdf}}

Beyond algebraic computations, most CAS systems also provide tensor
algebras, symbolic integration techniques, series expansions, and
differential equation solvers. Within hadron spectroscopy, CAS systems
like Mathematica and Maple are therefore popular with theorists in
particular for verifying analytical properties of functions, such as
identifying singularities in resonance models or ensuring symmetry
constraints in decay amplitudes.

As a simple example, the following code snippet demonstrates how a CAS
can derive the simple Breit--Wigner expression from above directly from
a one-dimensional {\(K\)‑matrix.} First, we construct the symbolic
{\(\mathbfit{T}\)‑matrix} in terms of the {\(\mathbfit{K}\)‑matrix,}
using symbolic placeholders that represent the full matrices rather than
individual entries. This way, the algebraic relation
\(\mathbfit{T} = \mathbfit{K}\,(1 - i\,\mathbfit{K})^{-1}\) is preserved
at the matrix level and would also work for larger
matrices~{[}\citeproc{ref-Poepping:2024-MScThesis}{180}{]}. In the final
line, we expand the result explicitly and extract the element
{\texttt{T{[}0,\ 0{]}}} (denoted mathematically {as~\(T_{11}\)).}

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{dimension }\OperatorTok{=} \DecValTok{1}
\NormalTok{I }\OperatorTok{=}\NormalTok{ sp.Identity(n}\OperatorTok{=}\NormalTok{dimension)}
\NormalTok{K }\OperatorTok{=}\NormalTok{ sp.MatrixSymbol(}\StringTok{"K"}\NormalTok{, m}\OperatorTok{=}\NormalTok{dimension, n}\OperatorTok{=}\NormalTok{dimension)}
\NormalTok{T }\OperatorTok{=}\NormalTok{ K }\OperatorTok{/}\NormalTok{ (I }\OperatorTok{{-}}\NormalTok{ sp.I }\OperatorTok{*}\NormalTok{ K)}
\NormalTok{T.as\_explicit()[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]}
\end{Highlighting}
\end{Shaded}

$\displaystyle \frac{{K}_{0,0}}{- i {K}_{0,0} + 1}$

\vspace{0.75\baselineskip} Next, the {\(\mathbfit{K}\)‑matrix} elements
are parametrised in terms of a single pole {position~\(m_0\)} and a
{coupling~\(g\)}, and then substituted into the
{\(\mathbfit{T}\)‑matrix} expression. Since \(m_0\) and \(s\) were
defined earlier, the only new symbol here is the {coupling~\(g\),} which
must be declared first.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{g }\OperatorTok{=}\NormalTok{ sp.Symbol(}\StringTok{"g"}\NormalTok{)}
\NormalTok{K\_parametrisation }\OperatorTok{=}\NormalTok{ \{}
\NormalTok{    K[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]: g}\OperatorTok{**}\DecValTok{2} \OperatorTok{/}\NormalTok{ (mass}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ s),}
\NormalTok{\}}
\NormalTok{T\_expr }\OperatorTok{=}\NormalTok{ T.as\_explicit().subs(K\_parametrisation)[}\DecValTok{0}\NormalTok{, }\DecValTok{0}\NormalTok{]}
\NormalTok{T\_expr}
\end{Highlighting}
\end{Shaded}

$\displaystyle \frac{g^{2}}{\left(m_{0}^{2} - s\right) \left(- \frac{i g^{2}}{m_{0}^{2} - s} + 1\right)}$

\vspace{0.75\baselineskip} Finally, we can derive that the this
single-pole, single-channel expression for the {\(\mathbfit{T}\)‑matrix}
is the same as the Breit--Wigner expression constructed earlier, by
setting the coupling to \(g^2 = m_0 \Gamma_0\). In the expression
rendering, the minus sign has been pulled before the fraction, but this
is mathematically equivalent.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{BW\_expr }\OperatorTok{=}\NormalTok{ T\_expr.subs(g}\OperatorTok{**}\DecValTok{2}\NormalTok{, mass }\OperatorTok{*}\NormalTok{ width)}
\NormalTok{BW\_expr.simplify()}
\end{Highlighting}
\end{Shaded}

$\displaystyle - \frac{\Gamma_{0} m_{0}}{i \Gamma_{0} m_{0} - m_{0}^{2} + s}$

\vspace{0.75\baselineskip} \noindent The CAS simplifies the expression
to a more compact form, which is not only more recognisable, but also
more computationally numerically, as its expression tree contains fewer
mathematical operations.

\subsection{Code generation, lambdification, and numerical
computations}\label{sec-code-generation-pdf}

While a CAS excels at symbolic manipulation and algebraic exactness, it
is not designed for high-performance numerical computations. To bridge
this gap, CAS-generated expressions can be converted into efficient
numerical code. In SymPy, this is known as \textbf{code generation}. The
CAS goes over the expression tree and serialises the mathematical nodes
to numerical code. Subtrees are naturally grouped with the required
brackets and parentheses and common subexpressions are identified and
reused.

SymPy provides code generation for a variety of programming languages,
including Python, C++, Fortran, Julia, and Rust, but the printing
mechanism can be extended for any custom language or
format~{[}\citeproc{ref-Schmitt:2022-sympy2c}{181}{]}. The following
demonstrates how the Breit--Wigner expression translates to some of the
popular languages.

\begin{Shaded}
\begin{Highlighting}[]
\BuiltInTok{print}\NormalTok{(sp.pycode(expression))}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
Gamma0*m0/(-1j*Gamma0*m0 + m0**2 - s)
\end{verbatim}

\begin{Shaded}
\begin{Highlighting}[]
\BuiltInTok{print}\NormalTok{(sp.cxxcode(expression, standard}\OperatorTok{=}\StringTok{"c++17"}\NormalTok{))}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
Gamma0*m0/(-I*Gamma0*m0 + std::pow(m0, 2) - s)
\end{verbatim}

\begin{Shaded}
\begin{Highlighting}[]
\BuiltInTok{print}\NormalTok{(sp.fcode(expression).strip())}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
Gamma0*m0/(-cmplx(0,1)*Gamma0*m0 + m0**2 - s)
\end{verbatim}

\begin{Shaded}
\begin{Highlighting}[]
\BuiltInTok{print}\NormalTok{(sp.julia\_code(expression))}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
Gamma0 .* m0 ./ (-im * Gamma0 .* m0 + m0 .^ 2 - s)
\end{verbatim}

\begin{Shaded}
\begin{Highlighting}[]
\BuiltInTok{print}\NormalTok{(sp.rust\_code(expression))}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
Gamma0*m0/(-I*Gamma0*m0 + m0.powi(2) - s)
\end{verbatim}

These example code snippets are not necessarily evaluatable, because the
variables that appear, are undefined. SymPy therefore offers a more
extensive code generation mechanism, that embeds the generated code in
numerical functions. SymPy refers to this process as
\textbf{lambdification}, because the result is not just source code, but
a Python function object. This object is anonymous (commonly called a
``lambda'' function, after {\(\lambda\)~calculus)} and can be assigned
to a variable and called like any regular function. The following code
snippet demonstrates how the earlier Breit--Wigner expression is
lambdified to a JAX function, with the symbols \(s\), \(m_0\),
{and~\(\Gamma_0\)} marked as arguments to the generated function. The
names of the function arguments come from the symbol names
(e.g.~\texttt{Gamma0}), not the names of the corresponding symbol
objects (e.g.~\texttt{width}).

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{func }\OperatorTok{=}\NormalTok{ sp.lambdify(args}\OperatorTok{=}\NormalTok{(s, mass, width), expr}\OperatorTok{=}\NormalTok{expression, modules}\OperatorTok{=}\StringTok{"jax"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
def _lambdifygenerated(s, m0, Gamma0):
    return Gamma0*m0/(-1j*Gamma0*m0 + m0**2 - s)
\end{verbatim}

\noindent The generated function has the same array-oriented form as the
Python function defined in the{~first} JAX example and can be used to
evaluate the Breit--Wigner expression over large data arrays. As a
simple example, the snippet below defines an array of {\(10\,000\)~real}
values between \(0\) {and~\(10\)} as input for the {variable~\(s\),}
while \(m_0\) and \(\Gamma_0\) are fixed to scalar constants. The
function then returns an array of {\(10\,000\)~complex} values,
corresponding to the Breit--Wigner evaluated at {each~\(s\).}

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{s\_array }\OperatorTok{=}\NormalTok{ jnp.linspace(}\DecValTok{0}\NormalTok{, }\DecValTok{10}\NormalTok{, num}\OperatorTok{=}\DecValTok{10\_000}\NormalTok{)}
\NormalTok{func(s\_array, m0}\OperatorTok{=}\FloatTok{0.98}\NormalTok{, Gamma0}\OperatorTok{=}\FloatTok{0.06}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
Array([ 0.061+3.734e-03j, ..., -0.007+4.231e-05j], dtype=complex128)
\end{verbatim}

The lambdified function is also compatible with JAX's JIT compilation
and automatic differentiation, enabling both efficient numerical
evaluation and gradient computation. In the example below, we use
reverse-mode AD to compute derivatives of the Breit--Wigner function
with respect to \(m_0\) and \(\Gamma_0\) (arguments~\texttt{1}
and~\texttt{2}). Because the Breit--Wigner is complex-valued, the
function is marked as holomorphic so that JAX applies the correct rules
for complex differentiation. The resulting gradient function is then
JIT-compiled and evaluated at the same point in parameter space.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{gradient }\OperatorTok{=}\NormalTok{ jax.jacrev(func, argnums}\OperatorTok{=}\NormalTok{(}\DecValTok{1}\NormalTok{, }\DecValTok{2}\NormalTok{), holomorphic}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{jit\_gradient }\OperatorTok{=}\NormalTok{ jax.jit(gradient)}
\NormalTok{jit\_gradient(s\_array, }\FloatTok{0.98}\OperatorTok{+}\OtherTok{0j}\NormalTok{, }\FloatTok{0.06}\OperatorTok{+}\OtherTok{0j}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
(Array([-0.062-0.008j, ..., -0.008+0.j   ], dtype=complex128, weak_type=True),
 Array([ 1.009+0.124j, ..., -0.108+0.001j], dtype=complex128, weak_type=True))
\end{verbatim}

Since the numerical function is generated from a symbolic expression,
its gradient can also be obtained analytically. This provides a
straightforward way to check the correctness of the numerical gradient,
and may in some cases even yield higher numerical precision thanks to
algebraic simplifications. The example below shows this for the
Breit--Wigner expression, where the gradients with respect to \(m_0\)
{and~\(\Gamma_0\)} are derived and simplified symbolically.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{derivative\_m0 }\OperatorTok{=}\NormalTok{ sp.diff(expression, mass).simplify()}
\end{Highlighting}
\end{Shaded}

$\displaystyle \frac{\Gamma_{0} \left(- i \Gamma_{0} m_{0} + m_{0}^{2} + m_{0} \left(i \Gamma_{0} - 2 m_{0}\right) - s\right)}{\left(i \Gamma_{0} m_{0} - m_{0}^{2} + s\right)^{2}}$

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{derivative\_w0 }\OperatorTok{=}\NormalTok{ sp.diff(expression, width).simplify()}
\end{Highlighting}
\end{Shaded}

$\displaystyle \frac{m_{0} \left(m_{0}^{2} - s\right)}{\left(i \Gamma_{0} m_{0} - m_{0}^{2} + s\right)^{2}}$

\vspace{0.75\baselineskip} \noindent These symbolic derivatives can then
again be lambdified into numerical functions, making them directly
usable in the same JAX-based workflow as the original expression. When
evaluated over the {\(10\,000\)~values} {of~\(s\)}, the analytically
derived gradients indeed agree with those obtained through automatic
differentiation.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{df\_dm }\OperatorTok{=}\NormalTok{ sp.lambdify(args}\OperatorTok{=}\NormalTok{(s, mass, width), expr}\OperatorTok{=}\NormalTok{derivative\_m0, modules}\OperatorTok{=}\StringTok{"jax"}\NormalTok{)}
\NormalTok{df\_dw }\OperatorTok{=}\NormalTok{ sp.lambdify(args}\OperatorTok{=}\NormalTok{(s, mass, width), expr}\OperatorTok{=}\NormalTok{derivative\_w0, modules}\OperatorTok{=}\StringTok{"jax"}\NormalTok{)}
\NormalTok{df\_dm(s\_array, }\FloatTok{0.98}\NormalTok{, }\FloatTok{0.06}\NormalTok{), df\_dw(s\_array, }\FloatTok{0.98}\NormalTok{, }\FloatTok{0.06}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
(Array([-0.062-0.008j, ..., -0.008+0.j   ], dtype=complex128),
 Array([ 1.009+0.124j, ..., -0.108+0.001j], dtype=complex128))
\end{verbatim}

\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}

\noindent As we have seen in Chapter~\ref{sec-scattering-theory},
amplitude models involve complex analytical functions composed of
polynomials, exponentials, and trigonometric terms, particularly those
arising from {Wigner~\(D\)}-functions in relativistic spin formalisms.
Writing these models directly in numerical code is cumbersome and can
obscure their structure. The examples from the previous sections
demonstrate how a CAS can be used to simplify the formulation of these
models, inspect the structure of the expressions, and generate efficient
numerical code for large-scale computations. In
Chapter~\ref{sec-compwa}, we will see that this also applies for the
more complex models that are used in amplitude analysis and that the
remarkable performance of array libraries is still available through
code generation. In addition, SymPy can simplify trigonometric
identities that emerge in angular momentum recoupling and verify that
model expressions are correctly formulated before they are transformed
into efficient computational implementations. Similar ``symbolic-numeric
approaches'' have been applied using
SymForce~{[}\citeproc{ref-Martiros:2022-SymForceSymbolicComputation}{182}{]}
and
Julia~{[}\citeproc{ref-Gowda:2024-SymbolicnumericProgrammingScientific}{183}{]},
but we are not aware of similar approaches in high-energy physics or
hadron spectroscopy.

For large expression trees, CAS-assisted model effectively serves as an
additional layer of compiler optimisations. This is comparable to XLA in
JAX, which is a hardware-aware optimisation. A CAS is specialised in
algebraic simplification, which may result in more efficient numerical
function trees and higher numerical precision. An example of this is
Linnea~{[}\citeproc{ref-Barthels:2021-LinneaAutomaticGeneration}{184}{]},
where a CAS is used to even further speed up linear algebra kernels like
BLAS. The combination of CAS and array-oriented programming therefore
provides a powerful toolset for high-performance computing in amplitude
analysis.

\section{Self-documenting workflow}\label{sec-self-documenting}

The developments in hadron spectroscopy of the passed few decades have
reached a point where transparency, adaptability, and verifiability are
not just desirable, but necessary. The increasing complexity of
amplitude models, combined with the availability of larger datasets from
high-luminosity experiments, requires workflows that ensure that the
results are reliable and reproducible, while remaining flexible enough
to accommodate new theoretical insights, as well as new computational
techniques. The combination of CAS-assisted model building and array
programming can make it easier to construct workflows that not only
speed up computations, but also document their assumptions, derivations,
and numerical implementations in a self-explanatory manner.

\subsection{Reproducibility}\label{sec-reproducibility}

The ``replicability crisis'', which was initially identified in medical
and social
sciences~{[}\citeproc{ref-Ioannidis:2005-WhyMostPublished}{185}{]}, has
increasingly affected the natural sciences, including physics and
computational research. Studies have shown that a significant portion of
published findings cannot be reproduced due to inadequate documentation,
inconsistencies in data handling, or reliance on proprietary
software~{[}\citeproc{ref-Baker:2016-1500ScientistsLift}{186}{]}.
Scientific disciplines that rely on computational methods, may seem less
susceptible to these issues due to the deterministic nature of numerical
calculations. High-performance computing, however, introduces additional
complexities, such as parallelism, hardware dependencies, and software
versioning, that can lead to subtle errors and
discrepancies~{[}\citeproc{ref-Antunes:2024-Reproducibility}{187}{]}. In
the case of amplitude analysis, there is the additional challenge of
quickly integrating theoretical insights with new experimental data,
which often leads to ad-hoc workflows that are difficult to reproduce.

In industry, practices such as automated testing, continuous
integration, and environment management have long been the standard for
software development, ensuring that code remains stable and deployable
across different platforms. The scientific community has started to
adopt many of these software development
practices~{[}\citeproc{ref-Wilson:2017-GoodEnoughPractices}{188};
\citeproc{ref-Kitzes:2018-PracticeReproducibleResearch}{189}{]}, such as
version control and automated testing through continuous integration
(CI). It has also led to initiatives for archiving code in a way that
makes it permanently accessible, either simply through Git repository
hosting services like GitHub, or through dedicated platforms like
Zenodo~{[}\citeproc{ref-Stodden:2013-ReproducibleComputationalResearch}{190}{]}.
More initiatives that specifically tailor to particle physics are being
developed~{[}\citeproc{ref-Khoo:2022pja}{191};
\citeproc{ref-Bierlich:2019rhm}{192}{]}.

In addition, containerisation technologies such as Docker, Singularity,
and Podman have become popular for creating reproducible computational
environments. These tools allow researchers to package their code,
dependencies, and environment settings into a single, shareable image
that can be run on any platform that supports the container
runtime~{[}\citeproc{ref-Stodden:2014-BestPracticesComputational}{193}{]}.
However, containers have the limitation that they are not always
compatible with high-performance computing environments, because their
virtualisation overhead can slow down computations. In addition,
containers have a tendency to become black boxes that cannot be extended
later.

An alternative solution in the form of \textbf{lock files} may be more
suitable for high-performance computing environments, as they capture
the specific versions of all declared dependencies used in an analysis.
Examples are
\href{https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html}{\texttt{Cargo.lock}}
in Rust,
\href{https://pkgdocs.julialang.org/v1/toml-files}{\texttt{Manifest.toml}}
in Julia, \href{https://docs.conan.io}{\texttt{conan.lock}} for C++, and
\href{https://peps.python.org/pep-0751}{\texttt{pylock.lock}} for
Python. Lock files make it possible to reconstruct the same software
environment across machines and over time, though not necessarily with
identical binaries~{[}\citeproc{ref-Gamage:2025-LockFiles}{194}{]}. They
therefore support reproducible software outputs, even if compilers or
system libraries differ. At the level of the analysis results, numerical
outcomes may vary slightly due to differences in hardware and build
configurations. Such variations are usually well within statistical or
systematic uncertainties and can themselves be studied across different
devices. In this way, lock files provide a reproducible and extensible
basis for software, whereas containers go further by freezing entire
toolchains. The goal is not strict bitwise equivalence of the software
stack, but reproducibility of analyses up to the usual numerical
variations.

In Chapter~\ref{sec-compwa} and Chapter~\ref{sec-application-to-data},
we see how lock files are used to offer reproducibility and
extensibility when using array-oriented programming libraries with
CAS-assisted model building in the Python ecosystem.

\subsection{Methodological clarity}\label{sec-methodological-clarity}

Ultimately, scientists need to share their computational work in
publishable form. To a large degree, such publications still come out in
their traditional, static form that can be printed, even if they are
distributed electronically. Even though there are initiatives to provide
a more interactive, interlinked, and dynamic form of
publication~{[}\citeproc{ref-Procko:2024-SemanticScience}{195};
\citeproc{ref-Heer:2023-LivingPapers}{196}{]}, there remains a need to
clearly document the computational methods that have led to the
published analysis results.

One of the first notable attempts to strengthen the link between code
implementation and the eventual publication is the concept of ``literate
programming''~{[}\citeproc{ref-Knuth:1984-LiterateProgramming}{197}{]}.
Literate programming encourages the programmer to write code in a way
that is readable and understandable to humans, rather than to the
computer. The code is interspersed with explanatory text, which can be
formatted in a way that is suitable for publication. The code and text
are then ``tangled'' into a machine-readable form that can be executed
by the computer.

While ``literate programming'' has had its influence on analyses that
were written in Pascal and C, its application remained limited to the
translation of code to {\(\text{\LaTeX}\)}-only documents that are not
necessarily publication-ready. In addition, these tools have the
limitation that they are not interactive and do not allow for the
exploration of the code in a dynamic way. In parallel,
\href{https://orgmode.org}{Org-mode} for
Emacs~{[}\citeproc{ref-Schulte:2012-OrgMode}{198}{]} extended the
paradigm to a multi-language environment, in which source code, text,
and publication-quality output could be woven into an executable
document. The increasing popularity of dynamic languages like Python and
R led to more widely adopted interactive tools such as R~Markdown,
IPython~{[}\citeproc{ref-Perez:2007emg}{199};
\citeproc{ref-Perkel:2022-CopyPasteTyranny}{200}{]}, and Jupyter
notebooks~{[}\citeproc{ref-Kluyver:2016-JupyterNotebooks}{201}{]}, which
allow the interleaving of code, text, and visualisations in a single
document that can be executed and inspected interactively.

These tools starkly remind of CAS systems like Mathematica, Sage,
Maxima, and Maple, but offer the additional benefit that they are
open-source and can be extended with custom code in popular programming
languages. This more interactive form of computational science has been
termed ``literate
computing''~{[}\citeproc{ref-Millman:2018-DevelopingOpenSourceScientific}{202}{]},
because they open the door to more extensive software development behind
the interactive environment. As an example, a typical workflow in our
experience starts with trying out new ideas in a Jupyter notebook using
SymPy, NumPy, and JAX, and then extracting common functionality into an
underlying Python package as the implementations become more advanced.
The eventual analysis still naturally evolves along in the notebooks as
the underlying codebase matures and can be tested using the continuous
integration techniques {as mentioned earlier}.

Motivated by a surge in data science and Machine Learning, Jupyter
notebooks are also gaining traction in data-rich, high-performance
environments~{[}\citeproc{ref-Perkel:2018-WhyJupyter}{203}{]}. Jupyter
notebooks separate the user interface from the computation: the notebook
interface runs in a local client (such as a browser), while a dedicated
kernel can run on a remote server or high-performance cluster. This
makes it possible to carry out heavy computations on powerful hardware,
while the user still interacts with them through the same notebook
interface. For instance, CERN has developed the
\href{https://swan.cern.ch}{SWAN service} that allows users to run
Jupyter notebooks on the CERN computing grid. And with tools like
\href{https://www.dask.org}{Dask}, computations over array-based data
can be scaled and parallelised behind the scenes, while the user still
interacts with the data in a familiar way. The web-based server approach
also makes it easier to collaborate on the same analysis, whether
through
\href{https://jupyterlab-realtime-collaboration.readthedocs.io}{shared
kernels} or through platforms like
\href{https://mybinder.readthedocs.io}{Binder}, which encourages
transparency and reproducibility. More broadly, this separation of
interface and computation aligns with a larger shift in industry toward
cloud computing, where machine learning and other high-performance
workloads are executed on specialised remote infrastructure rather than
on local machines.

Finally, the original spirit of ``literate programming'' is still alive
in these more interactive and scaled environments. Tools and platforms
like Quarto, the Executable Book Project, Curvenote, and Stencila can
render collections of analysis notebooks to a variety of formats,
including {\(\text{\LaTeX}\)}, Portable Document Format (PDF), and
static HTML pages~{[}\citeproc{ref-Allaire_Quarto_2024}{204};
\citeproc{ref-Cockett:2024-ContinuousToolsScientific}{205}{]}. The
continuous deployment of these notebooks to a publishable form
encourages to continuously consider reproducibility and methodological
clarity from the start of the analysis, rather than as an
afterthought~{[}\citeproc{ref-Antunes:2024-Reproducibility}{187}{]}.

The combination of CAS-assisted model building and array-oriented
programming in an interactive Jupyter environment therefore provides a
powerful toolset for high-performance computing in amplitude analysis.
Symbolic amplitude models can directly be inspected in both the
interactive environment as well as the static rendering.
High-performance computations can be scaled and parallelised behind the
scenes through array computations, and common implementations can be
extracted and published in the form of a Python package. The resulting
workflow is not only efficient, but also transparent, reproducible, and
methodologically clear.

\subsection{Knowledge transfer and academic
continuity}\label{sec-academic-continuity}

The hadron spectroscopy community covers a wide range of expertise
across theory and experiment, which often makes it difficult to
communicate results. When amplitude analyses are performed with
CAS-assisted model building and published using the tools described
{above}, they not only present the implemented mathematics in a readable
mathematical form, but also enable the reader to inspect the
implementation if formulations are discipline-specific. Offering ways to
launch the code repository and the Jupyter notebooks in a cloud
environment, like Binder, can further offer the possibility to try out
and modify the analysis to gain a better understanding of the results.
This is especially important when communicating results between
theorists and experimentalists and between different experimental
collaborations.

In addition, code generation using CAS models can be used to serialise
models to human-readable, hierarchical formats like JSON that can be
parsed into other programming languages or analysis frameworks. This not
only allows for cross-verifiability, but also makes it possible to pick
up analyses at a much later stage, when implementations are no longer
supported or when the original authors are no longer active in the
field. The JSON format can also be used to store the model in a
database, which can be queried and analysed in a more structured way.
This can be particularly useful for large-scale analyses that involve
many different models, or for analyses that are performed over long
periods of time and need to be revisited and updated.

The latter point touches on a more societal aspect of the field. The
hadron spectroscopy community is relatively small and, like many
academic disciplines, has a high turnover rate, with many researchers
transitioning to other fields after a few years. This makes it essential
to document and preserve knowledge systematically to prevent the loss of
expertise. The combination of CAS-assisted model building and ability to
continuously document analyses can help to bridge the gap between
theoretical understanding and practical implementation, and allow future
generations of researchers to pick up and extend existing analyses.

This shift is also more generally relevant in the continuous cycle of
education and knowledge transfer, where students, graduates, and
postdocs must continually familiarise themselves with the computational
and theoretical intricacies of the field. The more transparent and
self-explanatory the computational workflows are, the easier it is to
bring new researchers on board, so that they can more quickly make the
step to correctly apply amplitude analysis techniques to the rapidly
growing experimental datasets.

\bookmarksetup{startatroot}

\chapter{The ComPWA project}\label{sec-compwa}

In this chapter, we discuss how the Common Partial-Wave Analysis
(ComPWA) project has evolved from a single C++ framework for amplitude
analysis to a collection of more dynamic Python tools and documentation
workflows that use the techniques described in
Chapter~\ref{sec-computational-techniques}. The end of the chapter
describes how we exposed and extended different functionalities of the
original ComPWA framework as easily installable Python packages that can
be used independently of each other.

\section{\cxx origins} \label{sec-compwa-cpp}

{M}ost analysis code in high-energy physics and amplitude analysis is
written in C++ to facilitate efficient computation and manipulation of
large datasets. However, the complexity of C++ can be a barrier to
implement and extend large amplitude models. To address this, many
projects organise their analysis code as a framework that (1) can build
up amplitude models dynamically at runtime and (2) offers a high-level
interface for users to define these models through a configuration file
that is loaded at runtime without requiring recompilation.

Originally, the Common Partial-Wave Analysis (ComPWA) project also
started as a single C++~framework for amplitude analysis. The initial
requirement specifications were drafted in 2012 with the intention of
designing a collaboration-independent framework that could formulate
arbitrary amplitude models, can be flexibly configured, and documents
the model in a human-readable
format~{[}\citeproc{ref-ComPWA:2012-RequirementSpecifications}{206}{]}.
Inspiration was taken from frameworks like Tara for the Crystal Barrel
experiment~{[}\citeproc{ref-DEGENER199934}{207}{]},
PWA2000~{[}\citeproc{ref-Cummings:2003-ObjectOrientedPWA}{208}{]},
\href{https://github.com/ROOTPWA-Maintainers/ROOTPWA}{ROOTPWA} for the
COMPASS experiment, GPUPWA for
BESIII~{[}\citeproc{ref-Berger:2011rx}{209}{]}, and Laura++ for BaBar
and LHCb~{[}\citeproc{ref-Back:2017zqt}{210}{]}. The idea was to design
a framework with a more modular design, with interfaces that are
abstract enough to allow for different implementations for different
spin formalisms, estimator methods, minimiser strategies and algorithms,
and data sample formats for different
collaborations~{[}\citeproc{ref-Michel:2014nza}{211}{]}.

Figure~\ref{fig-compwa-modules} shows the core modules of the original
ComPWA framework. Further details can be found in the doctoral theses of
M.~Michel, P.~Weidenkaff, and S.~Pflüger
{[}\citeproc{ref-Michel:2016acw}{212}--\citeproc{ref-Pfluger:2017ybr}{214}{]}.
The modules provide interfaces that could essentially operate
independently of each other and served as protocols for streaming data
through the framework. Four-momenta \textbf{data} could be either loaded
from different file formats or generated using different Monte Carlo
generators. \textbf{Physics}, such as coherent sum of amplitudes, would
be implemented through a function tree (model) that can operate on that
data. Different \textbf{estimator} implementations could quantise the
discrepancy between the model and the data sample. And finally,
different \textbf{optimiser} implementations could tweak the parameters
in the function in order to minimise the estimator value. The key part
is that interfaces were general and simple enough that they encapsulated
the expected data flow, but still allowed for extending the
functionality through specific implementations of the interfaces. ComPWA
followed the classic definition of a framework as an object-oriented
\emph{abstract} design, with the preference that classes inherit from an
(abstract) base class at
most~{[}\citeproc{ref-Johnson:1988-DesigningReusableClasses}{215};
\citeproc{ref-Michel:2016acw}{212, §3.5}{]}.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter5/compwa-modules.pdf}}}

}

\caption{\label{fig-compwa-modules}Main modules of the ComPWA framework.
Inspired by~{[}\citeproc{ref-Michel:2016acw}{212}{]}.}

\end{figure}%

The concept of a \textbf{function tree} deserves special attention. As
we will see later, the concept is widely used in other computational
frameworks. ComPWA implemented models in the physics module as tree-like
representations, with the nodes representing mathematical operations on
branches (data points or numbers) or other nodes. This not only provided
an interface that can be called agnostically by other modules, but also
to facilitate techniques to optimise computations. A case in point is
that one can track which nodes depend on certain parameters. If
parameters are kept fixed during a minimisation process, the
corresponding nodes can be precomputed and cached. In addition, specific
nodes can be optimised directly based on their structure. For example, a
node with one child can be directly `collapsed' (restructured) into a
single node. Initial tests showed that the speed-ups for certain
parameter combinations could be up to 50 times
faster~{[}\citeproc{ref-Michel:2016acw}{212, p.~82}{]}.

Function trees could also be easily serialised, which was intended as a
way to document an analysis as well as to export and modify models for
reevaluation, as intended by the original requirement
specifications~{[}\citeproc{ref-ComPWA:2012-RequirementSpecifications}{206}{]}.
The fact that function trees could be built up from a human-readable
format led to the idea of an ``expert system'' that could automatically
generate models based on a set of rules. In the case of amplitude
analysis, this means generating decay topologies based on quantum number
conservation rules and using that as a template to build up a function
tree for the amplitude model.

Finally, a Python interface,
\href{https://github.com/ComPWA/pycompwa}{\texttt{pycompwa}}, was
developed to provide a more dynamic workflow with the ComPWA
framework~{[}\citeproc{ref-ComPWA-pycompwa-2019}{216}{]}. First, it
provided Python bindings to the C++ implementations of each of the core
modules, so that the user could interact with the framework through
Python scripts and Jupyter notebooks without having to compile the C++
code. Second, it was complemented by the
\href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}},
which was implemented purely in
Python~{[}\citeproc{ref-Pfluger:2021-PWAExpertSystem}{217}{]}. The
combination of the bindings and the
\href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}}
allowed for a more dynamic workflow with higher-level analysis code.

\section{Transition to Python}\label{sec-compwa-python}

{A}rray programming allows for concise and expressive code that is
easier to read and write. While array-oriented code has been popular in
the Python community since the 2000s with libraries like NumPy, it
gained more traction with the emergence of Machine Learning (ML)
libraries like Numba since 2012~{[}\citeproc{ref-Lam:2015bfh}{218}{]},
TensorFlow in 2015~{[}\citeproc{ref-Abadi:2016kic}{219}{]}, PyTorch in
2016~{[}\citeproc{ref-Paszke:2019xhz}{220}{]}, and JAX in
2018~{[}\citeproc{ref-jax2018github}{221}{]}. Importantly, these
libraries represent their computations (such as neural networks) in the
form of a computational graph, which is similar to the function tree
concept in ComPWA. Computational graphs, however, usually provide the
more advanced features discussed in Section~\ref{sec-array-oriented},
such as optimisations through backtracing on the JIT-compiled functions
that those graphs represent, or automatic differentiation.

The popularity of these ML frameworks and the fact that they are
developed by companies and large groups of professional software
developers, makes the effort to maintain an own implementation of a
function tree futile. In 2020, it was therefore decided to reimplement
the ComPWA framework purely using the Python APIs of those libraries.
The decision was further encouraged by initiatives like
\href{https://gitlab.cern.ch/poluekt/TensorFlowAnalysis}{TensorFlowAnalysis}
and its follow-up \href{https://github.com/apoluekt/AmpliTF}{AmpliTF}
for the amplitude analysis
community~{[}\citeproc{ref-Poluektov:2021-TFA}{222};
\citeproc{ref-Poluektov:2022-AmpliTF}{223}{]}, as well as
\href{https://zfit.readthedocs.io}{\texttt{zfit}}, which serves as an
alternative to RooFit with TensorFlow as computational
backend~{[}\citeproc{ref-Eschle:2019jmu}{224}{]}.

As a first step, we reimplemented the ComPWA framework using only
TensorFlow as computational backend, following the design of
Figure~\ref{fig-compwa-modules}. The first release candidate was able to
reproduce the standard test cases of the original ComPWA framework and
demonstrated that similar fit performance could be achieved with
TensorFlow as computational backend. A first release candidate was
released on July 9th, 2020, see
\href{https://github.com/ComPWA/tensorwaves/releases/tag/0.0.0-alpha0}{v0.0.0-alpha0}.
Unit tests and tutorial examples of the
\href{https://github.com/ComPWA/tensorwaves/tree/0.0.0-alpha0}{repository
at that point in time} showed the feasibility of the reimplementation.

The TensorFlow computational graphs were still built up from the same
XML files generated from the
\href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}}
that were used as input for the ComPWA C++ framework, which we used as a
cross-check for the new implementation. This led us to the realisation
that we could use the same input file for constructing computational
graphs with different computational libraries. Similarly to AmpliTF, we
therefore implemented the amplitude model builder with JAX, next to the
existing TensorFlow implementation.

As a final step that led towards the adoption of a CAS
(Section~\ref{sec-cas}), we explored alternative representations of the
XML format for the generated amplitude model. The fact that amplitude
models are inherently large mathematical expressions suggested that we
adopt a standardised format, such as MathML, for serialising such
expressions. Constructing a tree of mathematical nodes to serve as a
template for such a serialisation format is essentially a
reimplementation of the expression trees used in Computer Algebra
Systems, or for instance Python's built-in
\href{https://docs.python.org/3/library/operator.html}{\texttt{operator}}
module~{[}\citeproc{ref-ComPWA-ExpertSystem-ADR001}{225}{]}. We
therefore decided formulate the amplitude model in the
\href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}}
using SymPy.

SymPy has the additional benefit that it already provides code
generation capabilities for expression serialisation as well as for
different programming languages. The rest of the software packages
therefore became more of a wrapper around SymPy code generation that
streamlines the process of performing amplitude analyses with different
computational backends, following the original design of the ComPWA
framework of Figure~\ref{fig-compwa-modules}. All in all, the transition
to Python and the adoption of a CAS removed the workload of maintaining
a computational backend, while opening the door to more flexible
workflows, a much easier developer experience, and the more advanced
computational features described in Section~\ref{sec-array-oriented}.
This lead us to transition the project completely to Python.

\section{Main Python packages}\label{sec-compwa-python-packages}

Python makes it easier to split up frameworks into smaller, specialised
packages and allows for a fast release flow. Naturally, during the
transition to Python, the ComPWA framework evolved into a collection of
dedicated Python packages that can mostly be used independently of each
other. Figure~\ref{fig-python-packages} shows the components of the
original C++ framework and the new core packages that the ComPWA project
has evolved into. The ComPWA framework provided Python bindings to its
C++ backend through the
\href{https://compwa.github.io/pycompwa}{\texttt{pycompwa}} package.
This package was replaced by the Python-only TensorWaves package, which
streamlines the conversion of SymPy expressions to numerical functions
and provides additional functionality for performing amplitude analyses.
The \href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}}
was split into the QRules and Ampform packages, which together provide
the necessary tools for formulating symbolic amplitude models. All
packages are all available on \href{https://pypi.org}{PyPI} as well as
\href{https://conda-forge.org}{conda-forge}, so that they can be easily
installed or used as libraries in downstream projects.

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter5/compwa-python-transition.pdf}}

}

\caption{\label{fig-python-packages}ComPWA C++ framework and related
Python packages before the transition for Python (left) and the recent
main Python packages (right). The yellow arrows indicate from which
original framework components the new packages evolved. While the
original framework mainly revolved around the C++ framework, the new
packages are implemented fully in Python.}

\end{figure}%

\subsection{QRules}\label{qrules}

Many steps in the construction of an amplitude model can be
standardised, especially once a decay is modelled with the helicity
formalism (Chapter~\ref{sec-helicity-formalism}). Deciding which decays
are allowed, and what resonances one can expect, is something one can
work out on paper using quantum conservation laws. This is, however,
error-prone and something that can be automated. Already at the
inception of the ComPWA
project~{[}\citeproc{ref-ComPWA:2012-RequirementSpecifications}{206}{]},
this led to the idea of developing a rule-based ``expert system'' that
can automatically generate decay topologies based on quantum number
conservation rules.

An expert system emulates the decision-making ability of a human expert.
It consists of two main components: a knowledge base and an inference
engine. In the case of formulating particle decays, the knowledge base
consists of conservation laws, such as charge conservation, and input
information about the decay, such as the initial state and final state.
The inference engine can be any algorithm that deduces what kind of
decay topologies can connect the initial and final state, based on the
facts and rules in the knowledge base. The ``expert'' implements
knowledge through the knowledge base, while a user can use the inference
engine to query (``ask advice'') the knowledge base.

The inference engine can be implemented in many ways, such as a decision
tree, a set of rules, or a neural network. The latter has become more
popular in recent years. At the time of writing, the main inference
engine used in the ComPWA project is a Constraint Satisfaction Problem
(CSP) solver~{[}\citeproc{ref-python-constraint-v1.4.0}{226}{]}. In most
cases, the user specifies outside constraints, such as initial and final
state, expected decay topology types, and the conservation rules that
apply (such as parity conservation in the case of a strong-force decay).
The CSP then tries to satisfy these constraints by building decay
topologies and filling them with quantum numbers that comply with the
conservation rules.

{T}he ComPWA framework originally included a package named
\href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}}.
However, since this also had the responsibility of formulating amplitude
models and exporting them to XML, we extracted a specialised package
called QRules with (PyPI name
\href{https://pypi.org/project/qrules}{\texttt{qrules}}) that only
contains the particle reaction
solver~{[}\citeproc{ref-ComPWA-QRules-v0.10.5}{227}{]}.

As an example, the following code
(Listing~\ref{lst-qrules-problem-definition}) shows how a user can
request QRules to find which decays can occur in a \(J/\psi\) meson
decaying to \(K^0_S\), \(\varSigma^+\), and \(\bar{p}\) if one assumes
sequential two-body decays (isobar) and applies conservation rules for
the strong force. QRules works with flavour eigenstates, because it can
only handle the quantum numbers of the particles. In this case, the user
has to select \(K^0\) instead of the short-lived mass eigenstate
\(K^0_S\). Additional information, such as the maximum angular momentum
and a factor that specifies how far resonance may lay outside the
kinematically allowed phase space, can be optionally be specified.

\begin{codelisting}

\caption{\label{lst-qrules-problem-definition}Problem definition for
QRules to find allowed decays for
\(J/\psi \to K^0_S \varSigma^+ \bar{p}\).}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ qrules}

\NormalTok{reaction }\OperatorTok{=}\NormalTok{ qrules.generate\_transitions(}
\NormalTok{    initial\_state}\OperatorTok{=}\NormalTok{[(}\StringTok{"J/psi(1S)"}\NormalTok{, (}\OperatorTok{{-}}\DecValTok{1}\NormalTok{, }\OperatorTok{+}\DecValTok{1}\NormalTok{))],}
\NormalTok{    final\_state}\OperatorTok{=}\NormalTok{[}\StringTok{"K0"}\NormalTok{, }\StringTok{"Sigma+"}\NormalTok{, }\StringTok{"p\textasciitilde{}"}\NormalTok{],}
\NormalTok{    allowed\_interaction\_types}\OperatorTok{=}\StringTok{"strong"}\NormalTok{,}
\NormalTok{    mass\_conservation\_factor}\OperatorTok{=}\FloatTok{0.0}\NormalTok{,}
\NormalTok{    max\_angular\_momentum}\OperatorTok{=}\DecValTok{3}\NormalTok{,}
\NormalTok{    topology\_building}\OperatorTok{=}\StringTok{"isobar"}\NormalTok{,}
\NormalTok{)}
\end{Highlighting}
\end{Shaded}

}

\end{codelisting}%

In this example, the user has specified that the initial state does not
have longitudinal polarisation, which is indicated by the
\texttt{(-1,\ +1)} in the initial state. This is the case in the BESIII
experiment, where the \(J/\psi\) meson is produced in
{\(e^+ e^-\)~collisions.} The \texttt{allowed\_interaction\_types}
argument specifies which conservation rules
(Table~\ref{tbl-conservation-laws}) are enforced at each node of the
sequential decay chains built in the ``isobar'' topology (two-body decay
chain). The CSP solver is then instructed to restrict intermediate
states to those with an orbital angular momentum of at most {\(L=3\)}
and a mass conservation factor {of~\(f=0\)}, which means that any
intermediate {state~\(r\)} must lie within \(m_r \pm f \, \Gamma_r\) of
the available kinematic phase space.

\begin{figure}

\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/output/topology1.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/output/topology2.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.33\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/output/topology3.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-allowed-topologies}Allowed decay topologies that
QRules finds for the decay
\(J/\psi \to K^0_S(1)\,\varSigma^+(2)\,\bar{p}(3)\). QRules renders the
topologies with
\href{https://qrules.readthedocs.io/0.10.5/usage/visualize.html}{Graphviz}
in the form of Feynman-like directed graphs, with the initial state on
the left and the final state on the right. The edges represent states
(particles, or propagators) and the nodes (labelled~\texttt{(0)}
and~\texttt{(1)}) represent decay vertices with information like angular
momentum.}

\end{figure}%

Internally, QRules first builds a list of all possible decay topologies
for three-body decay (Figure~\ref{fig-allowed-topologies}). It then
fetches the quantum numbers of the initial- and final-state particles
(outer edges) that the user has specified in the definition of the
problem. By default, this information is obtained from the Particle Data
Group~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]} through the
\href{https://github.com/scikit-hep/particle}{\texttt{particle}}
package~{[}\citeproc{ref-scikit-hepux2fparticle-v0.25.2}{228}{]}, but
the user can also provide a database of custom particle definitions when
searching for unknown or exotic resonances. Next, QRules fills the inner
edges of the topologies with quantum numbers, conservation rules, and
expected quantum number domains.

Figure~\ref{fig-qrules-problem-set} shows a QRules rendering of one such
filled topology. It represents only one of many possible graphs, since
the CSP inference engine explores the full set of topologies from
Figure~\ref{fig-allowed-topologies} as well as different combinations of
quantum numbers. The outer edges correspond to the initial- and
final-state particles, with one particular set of allowed spin
projections shown in brackets. Each node and intermediate edge is
annotated with conservation rules, together with priorities that
determine the order in which they are applied. They also specify domains
for each quantum number type considered at that node or edge during the
CSP solving process. For instance, baryon number conservation has the
highest priority at both nodes, with possible values of --1, 0, or~+1 on
the intermediate edge. Strangeness has slightly lower priority and can
take values from --3 to~+3.

\begin{landscape}

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter5_files/figure-latex/fig-qrules-problem-set-output-1.pdf}}

}

\caption{\label{fig-qrules-problem-set}Example of a decay topology with
quantum numbers and conservation rules filled in. Nodes and intermediate
edges show conservation rules along with an assigned priority as well as
domains that the CSP inference engine is to consider when solving the
problem set later on.}

\end{figure}%

\end{landscape}

The CSP solver now determines which sets of quantum numbers can be
assigned to the graph edges and nodes, while satisfying the conservation
rules at each two-body decay node and the fixed quantum numbers on the
outer edges. Figure~\ref{fig-qrules-solution-example} shows one of the
solutions for the problem defined in
Figure~\ref{fig-qrules-problem-set}. Here, edges and nodes are assigned
explicit quantum numbers such as spin {magnitude~\(J\)}, spin
{projection~\(J_3\)}, {parity~\(P\)}, strangeness, and others, along
with Particle Data Group (PDG) identifiers of the matching particle
definitions. Quantum numbers with {value~\(0\)} are omitted from the
listing. For example, the antiproton \(\bar{p}\) (PDG~ID~\texttt{-2212})
carries no strangeness, while the {\(K^0\)~meson} (PDG~ID~\texttt{311})
carries no baryon number.

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/chapter5_files/figure-latex/fig-qrules-solution-example-output-1.pdf}}

}

\caption{\label{fig-qrules-solution-example}Example of a solution with
the quantum number sets for the edges and nodes that the CSP has found
for the problem set shown in Figure~\ref{fig-qrules-problem-set}.}

\end{figure}%

Finally, QRules searches through the particle database for candidates
that match the quantum number sets assigned to the intermediate edges of
the graph. Figure~\ref{fig-qrules-particle-solution} shows the decay
topologies that QRules identified for the problem defined in
Listing~\ref{lst-qrules-problem-definition}, collapsed into two graphs.
The full reaction object also records the allowed combinations of spin
projections. In this case, only two decay-chain topologies were found:
one with a subsystem \(\varSigma^* \to K^0_S \bar{p}\) and another with
\(N^* \to K^0_S \varSigma^+\). QRules did not find transitions for a
third subsystem, since no {\(K^*\)~mesons} were found with masses that
satisfy conservation in the topology
\(J/\psi \to K^0_S (K^* \to \bar{p} \varSigma^+)\). This is a
consequence the \texttt{mass\_conservation\_factor} chosen in
Listing~\ref{lst-qrules-problem-definition}, together with the particle
definitions available in the default database provided by the
\href{https://github.com/scikit-hep/particle}{\texttt{particle}}
package.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/output/subsystem1.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/output/subsystem2.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-qrules-particle-solution}Matching particle names for
all the solutions that the CSP has found for the problem definition in
Listing~\ref{lst-qrules-problem-definition}. To reduce the number of
graphs, we collapse the graphs that have the same topology, remove the
spin projections, and show all found resonance names as above each other
next to the one intermediate edge in each graph.}

\end{figure}%

While the figures shown in this section illustrate the strategy that
QRules uses to generate allowed decay topologies, the system allows for
other solver strategies. For example, instead of using sequential-decay
topologies, the system can also check whether a particle reaction is
allowed at all by checking whether the quantum numbers of the initial
and final state simply add up and comply with conservation rules (such
as net charge conservation). The system is also designed to be
extendible to more general reactions, for instance involving an initial
state of multiple particles. For the purposes of this thesis, this
functionality has not been further developed.

\subsection{AmpForm}\label{sec-ampform}

As can already be seen from Figure~\ref{fig-qrules-solution-example},
the decay graphs that QRules generates, contain much more information
than just which resonances can be expected. For example, the graphs
contain LS-coupling values, parities, spin projections, and masses and
widths of the particles. This information can be used to formulate an
amplitude model with the helicity formalism
(Chapter~\ref{sec-helicity-formalism}).

For this purpose, we extracted a second package, AmpForm (PyPI name
\href{https://pypi.org/project/ampform}{\texttt{ampform}}), from the
original
\href{https://github.com/ComPWA/expertsystem}{\texttt{expertsystem}}
package~{[}\citeproc{ref-ComPWA-AmpForm-v0.15.9}{229}{]}. The package
formulates amplitude models symbolically using SymPy rather than
serialising them directly to XML, as happened in the original C++
framework. As such, AmpForm serves both as an extension of SymPy~-- a
library of expression classes that are useful for amplitude analysis~--
and as a tool for formulating amplitude models using different spin
formalisms. In the usual workflow, particle reaction graphs generated by
QRules serve as input to AmpForm's amplitude model builder, but the user
can also use the expression classes directly to build up their own
amplitude models or any other parametrisations that are of interest to
the analysis.

\subsubsection{Amplitude model building}\label{amplitude-model-building}

Listing~\ref{lst-ampform-intensity} shows how the amplitude model is
built up for the decay \(J/\psi \to K^0_S \varSigma^+ \bar{p}\) that was
generated with QRules in Listing~\ref{lst-qrules-problem-definition}. It
first creates an amplitude model builder, which is a factory class that
can be configured dynamically before formulating the model. Next, a
dynamics builder class is instantiated that can formulate a relativistic
Breit-Wigner functions with an energy-dependent width and two vertex
form factors for a given intermediate edge. This dynamics builder is
then assigned to each of the intermediate edges in the decay graph.
Finally, the
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.helicity.html\#ampform.helicity.HelicityAmplitudeBuilder.formulate}{\texttt{formulate()}}
method returns a class structure that contains all the relevant
definitions for an amplitude model.

\begin{codelisting}

\caption{\label{lst-ampform-intensity}Example of building an amplitude
model with the helicity formalism (no spin alignment) for the decay
\(J/\psi \to K^0_S \varSigma^+ \bar{p}\)
(Listing~\ref{lst-qrules-problem-definition}) using AmpForm with
relativistic Breit--Wigner functions.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{import}\NormalTok{ ampform}
\ImportTok{from}\NormalTok{ ampform.dynamics.builder }\ImportTok{import}\NormalTok{ RelativisticBreitWignerBuilder}

\NormalTok{model\_builder }\OperatorTok{=}\NormalTok{ ampform.get\_builder(reaction)}
\NormalTok{dynamics\_builder }\OperatorTok{=}\NormalTok{ RelativisticBreitWignerBuilder(}
\NormalTok{    energy\_dependent\_width}\OperatorTok{=}\VariableTok{True}\NormalTok{,}
\NormalTok{    form\_factor}\OperatorTok{=}\VariableTok{True}\NormalTok{,}
\NormalTok{)}
\ControlFlowTok{for}\NormalTok{ resonance }\KeywordTok{in}\NormalTok{ reaction.get\_intermediate\_particles():}
\NormalTok{    model\_builder.dynamics.assign(resonance.name, dynamics\_builder)}
\NormalTok{model }\OperatorTok{=}\NormalTok{ model\_builder.formulate()}
\NormalTok{model.intensity}
\end{Highlighting}
\end{Shaded}

$\displaystyle \sum_{m_{0}\in\left\{1,-1\right\}} \sum_{m_{1}=0} \sum_{m_{2}=-1/2}^{1/2} \sum_{m_{3}=-1/2}^{1/2}{\left|{A^{12}_{m_{0}, m_{1}, m_{2}, m_{3}} + A^{13}_{m_{0}, m_{1}, m_{2}, m_{3}}}\right|^{2}}$

}

\end{codelisting}%

The model is formulated in terms of SymPy expressions, which can be
combined into a single expression for generating numerical code of the
full amplitude model. At the top level, this is represented by
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.helicity.html\#ampform.helicity.HelicityModel.intensity}{\texttt{model.intensity}}.
As its rendering in Listing~\ref{lst-ampform-intensity} shows, it is a
coherent sum over amplitudes (excluding the longitudinal polarisation of
the {\(J/\psi\)~meson}). The {amplitudes~\(A^{12}_{m_0,m_1,m_2,m_3}\)}
{and~\(A^{13}_{m_0,m_1,m_2,m_3}\)} describes the transition of
{a~\(J/\psi\)} with {spin projection~\(m_0\)} into the final
{state~\(K^0_S\),} \(\varSigma^+\), {and~\(\bar{p}\)} with spin
projections \(m_1\), \(m_2\), and \(m_3\), respectively. They correspond
to intermediate states in {chain~\((12)3\)}
{(subsystem~\(K^0_S\varSigma^+\))} and {chain~\((13)3\)}
{(subsystem~\(K^0_S\bar{p}\)),} respectively. Note that this amplitude
model does not take spin alignment of the baryons in the final state
into account and naively implements polarisation by excluding the
longitudinal polarisation of the {\(J/\psi\)~meson} {(\(m_0 \neq 0\)).}

\begin{landscape}

\begin{codelisting}

\caption{\label{lst-ampform-amplitudes}Definition of the amplitudes in
the intensity expression Listing~\ref{lst-ampform-intensity} formulated
by AmpForm.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{model.amplitudes}
\end{Highlighting}
\end{Shaded}

$\displaystyle \begin{aligned}
A^{12}_{-1, 0, - \frac{1}{2}, - \frac{1}{2}}
  \;&=\; \textstyle \frac{C_{J/\psi \xrightarrow[S=1]{L=0} N^*_{1} \overline{p}; N^*_{1} \xrightarrow[S=1/2]{L=1} K^0_S \varSigma^+} \Gamma_{N^*_{1}} m_{N^*_{1}} C^{\frac{1}{2},\frac{1}{2}}_{0,0,\frac{1}{2},\frac{1}{2}} C^{1,0}_{0,0,1,0} C^{1,0}_{\frac{1}{2},- \frac{1}{2},\frac{1}{2},\frac{1}{2}} C^{\frac{1}{2},\frac{1}{2}}_{1,0,\frac{1}{2},\frac{1}{2}} \mathcal{F}_{1}\left(m_{12}^{2}, m_{1}, m_{2}\right) D^{\frac{1}{2}}_{- \frac{1}{2},\frac{1}{2}}\left(- \phi^{12}_{1},\theta^{12}_{1},0\right) D^{1}_{-1,0}\left(- \phi_{12},\theta_{12},0\right)}{- m_{12}^{2} + \left(m_{N^*_{1}}\right)^{2} - i m_{N^*_{1}} \Gamma_{1}\left(m_{12}^{2}\right)} \\
  \;&+\; \textstyle \cdots \\
  \;&+\; \textstyle \frac{C_{J/\psi \xrightarrow[S=2]{L=2} N^*_{3} \overline{p}; N^*_{3} \xrightarrow[S=1/2]{L=1} K^0_S \varSigma^+} \Gamma_{N^*_{3}} m_{N^*_{3}} C^{\frac{1}{2},\frac{1}{2}}_{0,0,\frac{1}{2},\frac{1}{2}} C^{\frac{3}{2},\frac{1}{2}}_{1,0,\frac{1}{2},\frac{1}{2}} C^{2,-1}_{\frac{3}{2},- \frac{3}{2},\frac{1}{2},\frac{1}{2}} C^{1,-1}_{2,0,2,-1} \mathcal{F}_{1}\left(m_{12}^{2}, m_{1}, m_{2}\right) D^{1}_{-1,-1}\left(- \phi_{12},\theta_{12},0\right) D^{\frac{3}{2}}_{- \frac{3}{2},\frac{1}{2}}\left(- \phi^{12}_{1},\theta^{12}_{1},0\right)}{- m_{12}^{2} + \left(m_{N^*_{3}}\right)^{2} - i m_{N^*_{3}} \Gamma_{3}\left(m_{12}^{2}\right)} \\
A^{12}_{-1, 0, - \frac{1}{2}, \frac{1}{2}}
  \;&=\; \textstyle \frac{C_{J/\psi \xrightarrow[S=1]{L=0} N^*_{1} \overline{p}; N^*_{1} \xrightarrow[S=1/2]{L=1} K^0_S \varSigma^+} \Gamma_{N^*_{1}} m_{N^*_{1}} C^{\frac{1}{2},\frac{1}{2}}_{0,0,\frac{1}{2},\frac{1}{2}} C^{1,0}_{0,0,1,0} C^{1,0}_{\frac{1}{2},\frac{1}{2},\frac{1}{2},- \frac{1}{2}} C^{\frac{1}{2},\frac{1}{2}}_{1,0,\frac{1}{2},\frac{1}{2}} \mathcal{F}_{1}\left(m_{12}^{2}, m_{1}, m_{2}\right) D^{\frac{1}{2}}_{\frac{1}{2},\frac{1}{2}}\left(- \phi^{12}_{1},\theta^{12}_{1},0\right) D^{1}_{-1,0}\left(- \phi_{12},\theta_{12},0\right)}{- m_{12}^{2} + \left(m_{N^*_{1}}\right)^{2} - i m_{N^*_{1}} \Gamma_{1}\left(m_{12}^{2}\right)} \\
  \;&+\; \textstyle \cdots \\
  \;&+\; \textstyle \frac{C_{J/\psi \xrightarrow[S=2]{L=2} N^*_{3} \overline{p}; N^*_{3} \xrightarrow[S=1/2]{L=1} K^0_S \varSigma^+} \Gamma_{N^*_{3}} m_{N^*_{3}} C^{\frac{1}{2},\frac{1}{2}}_{0,0,\frac{1}{2},\frac{1}{2}} C^{\frac{3}{2},\frac{1}{2}}_{1,0,\frac{1}{2},\frac{1}{2}} C^{2,-1}_{\frac{3}{2},- \frac{1}{2},\frac{1}{2},- \frac{1}{2}} C^{1,-1}_{2,0,2,-1} \mathcal{F}_{1}\left(m_{12}^{2}, m_{1}, m_{2}\right) D^{1}_{-1,-1}\left(- \phi_{12},\theta_{12},0\right) D^{\frac{3}{2}}_{- \frac{1}{2},\frac{1}{2}}\left(- \phi^{12}_{1},\theta^{12}_{1},0\right)}{- m_{12}^{2} + \left(m_{N^*_{3}}\right)^{2} - i m_{N^*_{3}} \Gamma_{3}\left(m_{12}^{2}\right)} \\\vdots \qquad \\
A^{13}_{1, 0, \frac{1}{2}, \frac{1}{2}}
  \;&=\; \textstyle \frac{C_{J/\psi \xrightarrow[S=0]{L=1} \varSigma^*_{1} \varSigma^+; \varSigma^*_{1} \xrightarrow[S=1/2]{L=0} K^0_S \overline{p}} \Gamma_{\varSigma^*_{1}} m_{\varSigma^*_{1}} \left(C^{\frac{1}{2},- \frac{1}{2}}_{0,0,\frac{1}{2},- \frac{1}{2}}\right)^{2} C^{0,0}_{\frac{1}{2},\frac{1}{2},\frac{1}{2},- \frac{1}{2}} C^{1,0}_{1,0,0,0} \mathcal{F}_{0}\left(m_{13}^{2}, m_{1}, m_{3}\right) D^{\frac{1}{2}}_{\frac{1}{2},- \frac{1}{2}}\left(- \phi^{13}_{1},\theta^{13}_{1},0\right) D^{1}_{1,0}\left(- \phi_{13},\theta_{13},0\right)}{- m_{13}^{2} + \left(m_{\varSigma^*_{1}}\right)^{2} - i m_{\varSigma^*_{1}} \Gamma_{1}\left(m_{13}^{2}\right)} \\
  \;&+\; \textstyle \cdots \\
  \;&+\; \textstyle \frac{C_{J/\psi \xrightarrow[S=2]{L=1} \varSigma^*_{2} \varSigma^+; \varSigma^*_{2} \xrightarrow[S=1/2]{L=2} K^0_S \overline{p}} \Gamma_{\varSigma^*_{2}} m_{\varSigma^*_{2}} C^{\frac{1}{2},- \frac{1}{2}}_{0,0,\frac{1}{2},- \frac{1}{2}} C^{1,-1}_{1,0,2,-1} C^{\frac{5}{2},- \frac{1}{2}}_{2,0,\frac{1}{2},- \frac{1}{2}} C^{2,-1}_{\frac{5}{2},- \frac{1}{2},\frac{1}{2},- \frac{1}{2}} \mathcal{F}_{2}\left(m_{13}^{2}, m_{1}, m_{3}\right) D^{1}_{1,-1}\left(- \phi_{13},\theta_{13},0\right) D^{\frac{5}{2}}_{- \frac{1}{2},- \frac{1}{2}}\left(- \phi^{13}_{1},\theta^{13}_{1},0\right)}{- m_{13}^{2} + \left(m_{\varSigma^*_{2}}\right)^{2} - i m_{\varSigma^*_{2}} \Gamma_{2}\left(m_{13}^{2}\right)} \\
\end{aligned}$

}

\end{codelisting}%

\end{landscape}

Listing~\ref{lst-ampform-amplitudes} shows some of amplitudes contained
in the
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.helicity.html\#ampform.helicity.HelicityModel.amplitudes}{\texttt{model.amplitudes}}
mapping, with the {\(\text{\LaTeX}\)} rendering generated directly by
the codebase. For example, the first amplitude,
\(A^{12}_{-1,0,-\frac{1}{2},-\frac{1}{2}}\) is a coherent sum of all
amplitudes in the subsystem,
\(J/\psi[-1] \to \bar{p}[-\frac{1}{2}]\,N^*\) for all resonances
\(N^* \to K^0_S[0] \varSigma^+[-\frac{1}{2}]\). To save space, \(N^*\)
and {\(\varSigma^*\)~resonances} are marked with an index rather than
their full name. The model is formulated in the canonical basis using
the transformation
Equation~\eqref{eq-transformation-canonical-helicity}. AmpForm takes the
{\(LS\)~couplings} generated by QRules, but it can also formulate in the
helicity basis. The structure of each amplitude is always the same: a
complex-valued coefficient (scaling factor with phase), two form factors
\(\mathcal{F}_{\!L}, \mathcal{F}_{\!\ell}\) for angular {momentum~\(L\)}
in the production vertex {and~\(\ell\)} in the decay vertex, two
Clebsch--Gordan coefficients and one {Wigner~\(D\)}-function per vertex,
and a Breit--Wigner function with energy-dependent width for the
intermediate edge (resonance) in each graph.

The amplitudes contain symbols that can be interpreted as either a
\textbf{parameter} (such as resonance {mass~\(m_{N^*_1}\)} and
{width~\(\Gamma_{N^*_1}\))} and \textbf{kinematic variables} (such as
the invariant mass \(m_{12}\) and helicity angle \(\theta_1^{12}\) of
{particle~\(1\)} in the rest frame of {particle~\(1\)} {and~\(2\)).}
AmpForm provides suggested default values for the parameters by
extracting them from the particle database that the user provides in
Listing~\ref{lst-qrules-problem-definition}. It also defines symbolic
expressions for computing the kinematic variables from the three
four-momenta of the final state. For example, \(\phi_1^{12}\) is defined
as the azimuthal angle of the four-momentum of {particle~\(1\)} boosted
into the rest frame of the sum of the four-momenta of {particle~\(1\)}
{and~\(2\)} and with the {\(z\)~axis} rotated into the direction of
movement (see
Equation~\eqref{eq-boost-helicity-with-parallel-momentum}).

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{phi }\OperatorTok{=}\NormalTok{ sp.Symbol(}\StringTok{"phi\_1\^{}12"}\NormalTok{, real}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{model.kinematic\_variables[phi]}
\end{Highlighting}
\end{Shaded}

$\displaystyle \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)$

\vspace{0.75\baselineskip} Together, all attributes of an amplitude
model object generated by AmpForm contain the information to evaluate
the intensity for a random point in phase space. For this, the
amplitudes of Listing~\ref{lst-ampform-amplitudes} are symbolically
substituted into the main intensity definition of
Listing~\ref{lst-ampform-intensity}. The resulting expression, as well
as the definitions in
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.helicity.html\#ampform.helicity.HelicityModel.kinematic_variables}{\texttt{model.kinematic\_variables}},
can be used as template for generating numerical code for
high-performance computations.

\subsubsection{Nested expression
definitions}\label{nested-expression-definitions}

In principle, amplitude models can be fully implemented with SymPy
directly. However, amplitude models contain so many mathematical
operations, that it is hard to render them concisely. For this reason,
AmpForm provides a few tools that help to define amplitude model
expressions in a nested form that is understandable, making it more
suitable for a self-documenting workflow
(Section~\ref{sec-self-documenting}). The expression
\(\mathcal{F}_2\left(m_{12}^2,m_1,m_2\right)\) in
Listing~\ref{lst-ampform-amplitudes} is an example of this and is built
up of other expression classes, like the Blatt--Weisskopf function and a
squared breakup momentum function.

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ ampform.dynamics }\ImportTok{import}\NormalTok{ FormFactor}

\NormalTok{m\_12, m\_1, m\_2 }\OperatorTok{=}\NormalTok{ sp.symbols(}\StringTok{"m\_12 m\_1 m\_2"}\NormalTok{, nonnegative}\OperatorTok{=}\VariableTok{True}\NormalTok{)}
\NormalTok{expr }\OperatorTok{=}\NormalTok{ FormFactor(m\_12}\OperatorTok{**}\DecValTok{2}\NormalTok{, m\_1, m\_2, angular\_momentum}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

$\displaystyle \begin{aligned}
  \mathcal{F}_{2}\left(m_{12}^{2}, m_{1}, m_{2}\right) \;&=\; \sqrt{B_{2}^2\left(q^2_{12}\left(m_{12}^{2}\right)\right)} \\
  B_{2}^2\left(q^2_{12}\left(m_{12}^{2}\right)\right) \;&=\; \frac{13 q^2_{12}\left(m_{12}^{2}\right)^{2}}{q^2_{12}\left(m_{12}^{2}\right)^{2} + 3 q^2_{12}\left(m_{12}^{2}\right) + 9} \\
  q^2_{12}\left(m_{12}^{2}\right) \;&=\; \frac{\left(m_{12}^{2} - \left(m_{1} - m_{2}\right)^{2}\right) \left(m_{12}^{2} - \left(m_{1} + m_{2}\right)^{2}\right)}{4 m_{12}^{2}} \\
\end{aligned}$

\vspace{0.75\baselineskip} Nested expression classes like these can be
easily extended using the decorator function,
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.html\#ampform.sympy.unevaluated}{\texttt{@unevaluated}},
provided by AmpForm. This allows for extending amplitude builders with
large mathematical definitions. A simplified example is shown in
Listing~\ref{lst-unevaluated-expr}. The expression class is `unfolded'
to its full form using SymPy's
\href{https://docs.sympy.org/latest/modules/core.html\#sympy.core.basic.Basic.doit}{\texttt{doit()}}
method.

\begin{codelisting}

\caption{\label{lst-unevaluated-expr}Example of a custom expression
class that uses the
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.html\#ampform.sympy.unevaluated}{\texttt{@unevaluated}}
decorator to postpone evaluation of the expression until it is
explicitly requested. The class is used to define a custom expression
for \(f(x,y) = x^2 + y^2\). The second snippet uses AmpForm's
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.io.html\#ampform.io.aslatex}{\texttt{aslatex()}}
helper function to render \(f\) and its
\href{https://docs.sympy.org/latest/modules/core.html\#sympy.core.basic.Basic.doit}{\texttt{doit()}}
definition.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ ampform.sympy }\ImportTok{import}\NormalTok{ unevaluated}

\AttributeTok{@unevaluated}
\KeywordTok{class}\NormalTok{ MyExpr(sp.Expr):}
\NormalTok{    x: sp.Symbol}
\NormalTok{    y: sp.Symbol}
\NormalTok{    \_latex\_repr\_ }\OperatorTok{=} \StringTok{"f(}\SpecialCharTok{\{x\}}\StringTok{, }\SpecialCharTok{\{y\}}\StringTok{)"}

    \KeywordTok{def}\NormalTok{ evaluate(}\VariableTok{self}\NormalTok{) }\OperatorTok{{-}\textgreater{}}\NormalTok{ sp.Expr:}
\NormalTok{        x, y }\OperatorTok{=} \VariableTok{self}\NormalTok{.args}
        \ControlFlowTok{return}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ y}\OperatorTok{**}\DecValTok{2}

\NormalTok{a, b }\OperatorTok{=}\NormalTok{ sp.symbols(}\StringTok{"a b"}\NormalTok{)}
\NormalTok{expr }\OperatorTok{=}\NormalTok{ MyExpr(a, b}\OperatorTok{**}\DecValTok{2}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ ampform.io }\ImportTok{import}\NormalTok{ aslatex}
\NormalTok{Math(aslatex(\{expr: expr.doit()\}))}
\end{Highlighting}
\end{Shaded}

$\displaystyle \begin{aligned}
  f(a, b^{2}) \;&=\; a^{2} + b^{4} \\
\end{aligned}$

}

\end{codelisting}%

\subsubsection{Cached expression
unfolding}\label{cached-expression-unfolding}

Combining all the definitions into one large expression template can be
slow when using SymPy. AmpForm therefore provides ways to automatically
cache the result of this ``expression unfolding'' to disk. All of these
functions are available through the
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.cached.html}{\texttt{ampform.sympy.cached}}
module, which caches expensive CAS operations to disk.
Listing~\ref{lst-ampform-cached-module} shows two equivalent ways of
fully unfolding the amplitude model expression that was generated with
Listing~\ref{lst-ampform-intensity}.

\begin{codelisting}

\caption{\label{lst-ampform-cached-module}Examples of AmpForm's
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.cached.html}{\texttt{cached}}
that caches expensive CAS operations to disk. The first example shows
how the full intensity expression is constructed from an amplitude model
object and the second example shows how the
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.cached.html\#ampform.sympy.cached.unfold}{\texttt{cached.unfold()}}
convenience function simplifies that procedure.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ ampform.sympy }\ImportTok{import}\NormalTok{ cached}

\NormalTok{intensity\_expr }\OperatorTok{=}\NormalTok{ cached.doit(model.intensity)}
\NormalTok{expr\_with\_amplitudes }\OperatorTok{=}\NormalTok{ cached.xreplace(intensity\_expr, model.amplitudes)}
\NormalTok{full\_expression }\OperatorTok{=}\NormalTok{ cached.doit(expr\_with\_amplitudes)}
\end{Highlighting}
\end{Shaded}

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{full\_expression }\OperatorTok{=}\NormalTok{ cached.unfold(model)}
\end{Highlighting}
\end{Shaded}

}

\end{codelisting}%

These are two examples of additional functionality that AmpForm provides
to facilitate working with large symbolic expressions for amplitude
analysis. It contains more functionality, such as an
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.html\#ampform.sympy.UnevaluatableIntegral}{\texttt{UnevaluatableIntegral}}
class that postpones evaluation of integrals that cannot be solved
analytically, which is essential when parametrising decay dynamics with
lineshapes that are analytically continuous.

\subsection{AmpForm-DPD}\label{sec-ampform-dpd}

The central physics contribution of this thesis is the implementation of
spin-aligned amplitude models for three-body decays using Dalitz-plot
decomposition. \hyperref[sec-ampform]{AmpForm} can handle arbitrary
multi-body decays, and works well as long as the decay does not involve
chains with differing topologies that include final-state particles with
spin. In such cases it becomes difficult to formulate spin-aligned
models symbolically, since the Wigner rotation angles must be computed
numerically (Equation~\eqref{eq-spin-alignment-factor}). To address
this, a specialised package was developed alongside AmpForm:
\textbf{AmpForm-DPD} (PyPI:
\href{https://pypi.org/project/ampform-dpd}{\texttt{ampform‑dpd}}). This
package builds amplitude models with SymPy using the DPD
method~{[}\citeproc{ref-JPAC:2019ufm}{157}{]}, in particular the
unpolarised intensity of
Equation~\eqref{eq-differential-cross-section-multi-body-unpolarised}
with the Dalitz-plot function of
Equation~\eqref{eq-dpd-aligned-amplitude-ampform}. In the long term, the
goal is to merge AmpForm-DPD back into AmpForm and extend spin alignment
to arbitrary multi-body
decays~{[}\citeproc{ref-Habermann:2024sxs}{156}{]}.

Listing~\ref{lst-ampform-dpd-intensity} shows how an amplitude model is
formulated with AmpForm-DPD. The procedure is similar as in
Listing~\ref{lst-ampform-intensity}, but the main difference is that the
amplitude model is built up from a custom class structure that
represents decay chains for three-body decays. The rendered intensity
expression is the implementation of the unpolarised differential cross
section of
Equation~\eqref{eq-differential-cross-section-multi-body-unpolarised}.
As opposed to Listing~\ref{lst-ampform-intensity}, AmpForm-DPD correctly
sums over all {\(J/\psi\)~helicities} to get the unpolarised intensity.
The trivial {helicity~\(\lambda_1=0\)} for \(K^0_S\) has been omitted
from the amplitude indices.

Note that the {Wigner~\(d\)}-functions for the Wigner rotations
appearing in the Dalitz-plot function of
Equation~\eqref{eq-dpd-aligned-amplitude-ampform} appear in this
top-level intensity expression rather than in the
{amplitudes~\(A^k_{\lambda_0\lambda_2\lambda_3}\).} These individual
amplitudes are shown in Listing~\ref{lst-ampform-dpd-amplitudes}. The
amplitude rendering is clearer than that of
Listing~\ref{lst-ampform-amplitudes}, because it uses AmpForm's
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.sympy.html\#ampform.sympy.unevaluated}{\texttt{@unevaluated}}
expression classes of Listing~\ref{lst-unevaluated-expr} to denote the
vertex functions {with~\(\mathcal{F}\)} and Breit--Wigner functions
{with~\(\mathcal{R}\)}. AmpForm-DPD also formulates the model with one
complex-valued \emph{coupling} per decay node rather than with one
coefficient per \emph{chain}. The angles are formulated using
Equation~\eqref{eq-dpd-angles} and are shown in
Listing~\ref{lst-ampform-dpd-angles}.

\begin{landscape}

\begin{codelisting}

\caption{\label{lst-ampform-dpd-intensity}Example of building an
amplitude model for the decay \(J/\psi \to K^0_S \varSigma^+ \bar{p}\)
using Dalitz-plot decomposition with AmpForm-DPD. As opposed to
Listing~\ref{lst-ampform-intensity}, the resulting intensity expression
correctly aligns the two subsystems.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ ampform\_dpd }\ImportTok{import}\NormalTok{ DalitzPlotDecompositionBuilder}
\ImportTok{from}\NormalTok{ ampform\_dpd.adapter.qrules }\ImportTok{import}\NormalTok{ to\_three\_body\_decay}
\ImportTok{from}\NormalTok{ ampform\_dpd.dynamics.builder }\ImportTok{import}\NormalTok{ (}
\NormalTok{    formulate\_breit\_wigner\_with\_form\_factor}
\NormalTok{)}

\NormalTok{decay }\OperatorTok{=}\NormalTok{ to\_three\_body\_decay(reaction.transitions)}
\NormalTok{model\_builder }\OperatorTok{=}\NormalTok{ DalitzPlotDecompositionBuilder(decay)}
\ControlFlowTok{for}\NormalTok{ chain }\KeywordTok{in}\NormalTok{ model\_builder.decay.chains:}
\NormalTok{    model\_builder.dynamics\_choices.register\_builder(}
\NormalTok{        chain, formulate\_breit\_wigner\_with\_form\_factor}
\NormalTok{    )}
\NormalTok{dpd\_model }\OperatorTok{=}\NormalTok{ model\_builder.formulate(reference\_subsystem}\OperatorTok{=}\DecValTok{2}\NormalTok{)}
\NormalTok{dpd\_model.intensity}
\end{Highlighting}
\end{Shaded}

$\displaystyle \small \sum_{\lambda_{0}=-1}^{1} \sum_{\lambda_{2}=-1/2}^{1/2} \sum_{\lambda_{3}=-1/2}^{1/2}{\left|{\sum_{\lambda_0'=-1}^{1} \sum_{\lambda_2'=-1/2}^{1/2} \sum_{\lambda_3'=-1/2}^{1/2}{A^{2}_{\lambda_0' \lambda_2' \lambda_3'} d^{\frac{1}{2}}_{\lambda_2' \lambda_{2}}\!\!\left(\zeta^2_{2(2)}\right) d^{\frac{1}{2}}_{\lambda_3' \lambda_{3}}\!\!\left(\zeta^3_{2(2)}\right) d^{1}_{\lambda_{0} \lambda_0'}\!\!\left(\zeta^0_{2(2)}\right) + A^{3}_{\lambda_0' \lambda_2' \lambda_3'} d^{\frac{1}{2}}_{\lambda_2' \lambda_{2}}\!\!\left(\zeta^2_{3(2)}\right) d^{\frac{1}{2}}_{\lambda_3' \lambda_{3}}\!\!\left(\zeta^3_{3(2)}\right) d^{1}_{\lambda_{0} \lambda_0'}\!\!\left(\zeta^0_{3(2)}\right)}}\right|^{2}}$

}

\end{codelisting}%

\begin{codelisting}

\caption{\label{lst-ampform-dpd-amplitudes}Definition of the DPD
amplitudes in the intensity expression of
Listing~\ref{lst-ampform-dpd-intensity}. The listing also uses AmpForm's
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.io.html\#ampform.io.aslatex}{\texttt{aslatex()}}
helper function, which renders mappings of expressions as a single
{{\(\text{\LaTeX}\)}~block.}}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ IPython.display }\ImportTok{import}\NormalTok{ Math}
\ImportTok{from}\NormalTok{ ampform.io }\ImportTok{import}\NormalTok{ aslatex}
\NormalTok{Math(aslatex(dpd\_model.amplitudes))}
\end{Highlighting}
\end{Shaded}

$\displaystyle \begin{aligned}
A^{2}_{-1, 0, - \frac{1}{2}, - \frac{1}{2}}
  \;&=\; \textstyle 2 \sum_{\lambda_{R}=-3/2}^{3/2}{- \delta_{-1, \lambda_{R} + \frac{1}{2}} \mathcal{F}_{1}\left(m_{0}^{2}, m_{\varSigma^*_{0}}, m_{2}\right) \mathcal{F}_{2}\left(\sigma_{2}^{2}, m_{1}, m_{3}\right) \mathcal{H}^\mathrm{decay}_{\varSigma^*_{0}, - \frac{1}{2}, 0} \mathcal{H}^\mathrm{production}_{\varSigma^*_{0}, \lambda_{R}, - \frac{1}{2}} \mathcal{R}_{2}\left(\sigma_{2}, m_{\varSigma^*_{0}}, \Gamma_{\varSigma^*_{0}}\right) d^{\frac{3}{2}}_{\lambda_{R},- \frac{1}{2}}\left(\theta_{31}\right)} \\
  \;&+\; \textstyle \cdots \\
  \;&+\; \textstyle \sum_{\lambda_{R}=-5/2}^{5/2}{- \delta_{-1, \lambda_{R} + \frac{1}{2}} \mathcal{F}_{1}\left(m_{0}^{2}, m_{\varSigma^*_{2}}, m_{2}\right) \mathcal{F}_{2}\left(\sigma_{2}^{2}, m_{1}, m_{3}\right) \mathcal{H}^\mathrm{decay}_{\varSigma^*_{2}, - \frac{1}{2}, 0} \mathcal{H}^\mathrm{production}_{\varSigma^*_{2}, \lambda_{R}, - \frac{1}{2}} \mathcal{R}_{2}\left(\sigma_{2}, m_{\varSigma^*_{2}}, \Gamma_{\varSigma^*_{2}}\right) d^{\frac{5}{2}}_{\lambda_{R},- \frac{1}{2}}\left(\theta_{31}\right)} \\
A^{3}_{-1, 0, - \frac{1}{2}, - \frac{1}{2}}
  \;&=\; \textstyle 2 \sum_{\lambda_{R}=-3/2}^{3/2}{\delta_{-1, \lambda_{R} + \frac{1}{2}} \mathcal{F}_{1}\left(m_{0}^{2}, m_{N^*_{2}}, m_{3}\right) \mathcal{F}_{2}\left(\sigma_{3}^{2}, m_{1}, m_{2}\right) \mathcal{H}^\mathrm{decay}_{N^*_{2}, 0, - \frac{1}{2}} \mathcal{H}^\mathrm{production}_{N^*_{2}, \lambda_{R}, - \frac{1}{2}} \mathcal{R}_{2}\left(\sigma_{3}, m_{N^*_{2}}, \Gamma_{N^*_{2}}\right) d^{\frac{3}{2}}_{\lambda_{R},\frac{1}{2}}\left(\theta_{12}\right)} \\
  \;&+\; \textstyle \cdots \\
  \;&+\; \textstyle \sum_{\lambda_{R}=-3/2}^{3/2}{\delta_{-1, \lambda_{R} + \frac{1}{2}} \mathcal{F}_{0}\left(m_{0}^{2}, m_{N^*_{3}}, m_{3}\right) \mathcal{F}_{1}\left(\sigma_{3}^{2}, m_{1}, m_{2}\right) \mathcal{H}^\mathrm{decay}_{N^*_{3}, 0, - \frac{1}{2}} \mathcal{H}^\mathrm{production}_{N^*_{3}, \lambda_{R}, - \frac{1}{2}} \mathcal{R}_{1}\left(\sigma_{3}, m_{N^*_{3}}, \Gamma_{N^*_{3}}\right) d^{\frac{3}{2}}_{\lambda_{R},\frac{1}{2}}\left(\theta_{12}\right)} \\\vdots \qquad \\
A^{3}_{1, 0, \frac{1}{2}, \frac{1}{2}}
  \;&=\; \textstyle 2 \sum_{\lambda_{R}=-3/2}^{3/2}{\delta_{1, \lambda_{R} - \frac{1}{2}} \mathcal{F}_{1}\left(m_{0}^{2}, m_{N^*_{2}}, m_{3}\right) \mathcal{F}_{2}\left(\sigma_{3}^{2}, m_{1}, m_{2}\right) \mathcal{H}^\mathrm{decay}_{N^*_{2}, 0, \frac{1}{2}} \mathcal{H}^\mathrm{production}_{N^*_{2}, \lambda_{R}, \frac{1}{2}} \mathcal{R}_{2}\left(\sigma_{3}, m_{N^*_{2}}, \Gamma_{N^*_{2}}\right) d^{\frac{3}{2}}_{\lambda_{R},- \frac{1}{2}}\left(\theta_{12}\right)} \\
  \;&+\; \textstyle \cdots \\
  \;&+\; \textstyle \sum_{\lambda_{R}=-3/2}^{3/2}{\delta_{1, \lambda_{R} - \frac{1}{2}} \mathcal{F}_{0}\left(m_{0}^{2}, m_{N^*_{3}}, m_{3}\right) \mathcal{F}_{1}\left(\sigma_{3}^{2}, m_{1}, m_{2}\right) \mathcal{H}^\mathrm{decay}_{N^*_{3}, 0, \frac{1}{2}} \mathcal{H}^\mathrm{production}_{N^*_{3}, \lambda_{R}, \frac{1}{2}} \mathcal{R}_{1}\left(\sigma_{3}, m_{N^*_{3}}, \Gamma_{N^*_{3}}\right) d^{\frac{3}{2}}_{\lambda_{R},- \frac{1}{2}}\left(\theta_{12}\right)} \\
\end{aligned}$

}

\end{codelisting}%

\begin{codelisting}

\caption{\label{lst-ampform-dpd-angles}Definitions of the DPD angles
(kinematic variables) appearing in
Listing~\ref{lst-ampform-dpd-intensity} and
Listing~\ref{lst-ampform-dpd-amplitudes}.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{Math(aslatex(dpd\_model.variables))}
\end{Highlighting}
\end{Shaded}

$\displaystyle \begin{aligned}
  \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)} \\
  \zeta^0_{2(2)} \;&=\; 0 \\
  \zeta^2_{2(2)} \;&=\; 0 \\
  \zeta^3_{2(2)} \;&=\; 0 \\
  \zeta^0_{3(2)} \;&=\; - \operatorname{acos}{\left(\frac{- 2 m_{0}^{2} \left(- m_{2}^{2} - m_{3}^{2} + \sigma_{1}\right) + \left(m_{0}^{2} + m_{2}^{2} - \sigma_{2}\right) \left(m_{0}^{2} + m_{3}^{2} - \sigma_{3}\right)}{\sqrt{\lambda\left(m_{0}^{2}, m_{3}^{2}, \sigma_{3}\right)} \sqrt{\lambda\left(m_{0}^{2}, \sigma_{2}, m_{2}^{2}\right)}} \right)} \\
  \zeta^2_{3(2)} \;&=\; \operatorname{acos}{\left(\frac{2 m_{2}^{2} \left(- m_{0}^{2} - m_{1}^{2} + \sigma_{1}\right) + \left(m_{0}^{2} + m_{2}^{2} - \sigma_{2}\right) \left(- m_{1}^{2} - m_{2}^{2} + \sigma_{3}\right)}{\sqrt{\lambda\left(m_{0}^{2}, m_{2}^{2}, \sigma_{2}\right)} \sqrt{\lambda\left(\sigma_{3}, m_{2}^{2}, m_{1}^{2}\right)}} \right)} \\
  \zeta^3_{3(2)} \;&=\; \operatorname{acos}{\left(\frac{2 m_{3}^{2} \left(- m_{0}^{2} - m_{1}^{2} + \sigma_{1}\right) + \left(m_{0}^{2} + m_{3}^{2} - \sigma_{3}\right) \left(- m_{1}^{2} - m_{3}^{2} + \sigma_{2}\right)}{\sqrt{\lambda\left(m_{0}^{2}, m_{3}^{2}, \sigma_{3}\right)} \sqrt{\lambda\left(\sigma_{2}, m_{3}^{2}, m_{1}^{2}\right)}} \right)} \\
\end{aligned}$

}

\end{codelisting}%

\end{landscape}

\subsection{TensorWaves}\label{sec-tensorwaves}

The last package in the toolchain is TensorWaves (PyPI name
\href{https://pypi.org/project/tensorwaves}{\texttt{tensorwaves}})~{[}\citeproc{ref-ComPWA-TensorWaves-v0.4.13}{230}{]}.
At core, it is a wrapper around SymPy's code generation capabilities
that makes it easier to work with large symbolic expressions and fit
them to large data samples. As discussed, TensorWaves started as a
reimplementation of the ComPWA framework in TensorFlow and inherits many
of the interfaces from the original design. Importantly, the interfaces
are kept as simple as possible, so that it is easy to insert custom
implementations into the workflow (open-closed principle).

The central interface of TensorWaves is the
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Function}{\texttt{Function}}
class. It is the most generic class for defining mathematical functions
that take input and return output. More specific interfaces are derived
from this generic class. Two examples relevant for amplitude analysis
are a
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.ParametrizedFunction}{\texttt{ParametrizedFunction}}
and an
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Estimator}{\texttt{Estimator}}.
A
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.ParametrizedFunction}{\texttt{ParametrizedFunction}}
can be used to separate the parameters from the kinematic variables in
an amplitude model. It takes a
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.DataSample}{\texttt{DataSample}},
which is a mapping of string keys to data arrays (like pre-computed
helicity angles), and carries around scalar parameter values that can be
tweaked separately. The
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Estimator}{\texttt{Estimator}}
represents a function that takes a set of scalar parameters and returns
a single estimator value, such as a likelihood or a chi-square value.
Both functions take mappings of kinematic variables (data columns) and
parameters as input rather than a list of positional arguments. This
allows for a large number of arguments to be handled without being
constrained to valid Python variable names.

For performing a fit, TensorWaves provides an
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Optimizer}{\texttt{Optimizer}}
interface. It takes an
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Estimator}{\texttt{Estimator}}
along with a mapping with parameter values that serve as an initial
starting point in parameter space. At the time of writing, TensorWaves
comes with two implementations for the
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Optimizer}{\texttt{Optimizer}}
interface:
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.optimizer.minuit/\#tensorwaves.optimizer.minuit.Minuit2}{\texttt{Minuit2}}~{[}\citeproc{ref-Hatlo:2005cj}{231};
\citeproc{ref-Dembinski:2025-iminuit}{232}{]} and
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.optimizer.scipy/\#tensorwaves.optimizer.scipy.ScipyMinimizer}{\texttt{ScipyMinimizer}}~{[}\citeproc{ref-Virtanen:2019joe}{233}{]}.
Other optimisers such as \href{https://nlopt.readthedocs.io}{NLopt}
could easily be implemented without redesigning the interfaces. In the
analyses presented in this thesis, we found that the
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.optimizer.minuit/\#tensorwaves.optimizer.minuit.Minuit2}{\texttt{Minuit2}}
implementation was the most robust and fastest and we therefore did not
invest in implementing other optimisers. In addition, benchmarks using
TensorWaves indicate that array-oriented libraries are much more
performant when the computation is parallelised in parameter space as
well. This suggests that it may be more efficient to perform fits using
optimisers that are parallelisable in parameter space, rather than using
optimisers that use gradient-descent methods, which is inherently
sequential in parameter space.

Behind these main interfaces, TensorWaves uses SymPy's code generation
capabilities to generate code for the mathematical functions. This makes
it possible to switch between different computational backends, such as
TensorFlow, JAX, and NumPy. The generated code is optionally
JIT-compiled and wrapped in classes that follow interfaces such as
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.ParametrizedFunction}{\texttt{ParametrizedFunction}}
and
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.Estimator}{\texttt{Estimator}}.
These interface classes are designed so that a large number of
implementations can be used without having to rewrite the workflow.
Listing~\ref{lst-tensorwaves-example} shows how the unfolded intensity
expression for the DPD model in Listing~\ref{lst-ampform-dpd-intensity}
is used to generate a
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.ParametrizedFunction}{\texttt{ParametrizedFunction}}
that can be used for fitting.

\begin{codelisting}

\caption{\label{lst-tensorwaves-example}Example of using TensorWaves to
generate a parametrised function with JAX as backend for the intensity
expression of the amplitude model in
Listing~\ref{lst-ampform-dpd-intensity}. Symbols in the expression that
are listed under
\href{https://ampform.readthedocs.io/0.15.9/api/ampform.helicity.html\#ampform.helicity.HelicityModel.parameter_defaults}{\texttt{parameter\_defaults}}
are marked as parameters in the generated
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.ParametrizedFunction}{\texttt{ParametrizedFunction}}.
Any remaining free symbols become arguments to the function call through
an input
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.DataSample}{\texttt{DataSample}}.}

\centering{

\begin{Shaded}
\begin{Highlighting}[]
\ImportTok{from}\NormalTok{ tensorwaves.function.sympy }\ImportTok{import}\NormalTok{ create\_parametrized\_function}

\NormalTok{intensity\_func }\OperatorTok{=}\NormalTok{ create\_parametrized\_function(}
\NormalTok{    expression}\OperatorTok{=}\NormalTok{cached.unfold(dpd\_model),}
\NormalTok{    parameters}\OperatorTok{=}\NormalTok{dpd\_model.parameter\_defaults,}
\NormalTok{    backend}\OperatorTok{=}\StringTok{"jax"}\NormalTok{,}
\NormalTok{)}
\end{Highlighting}
\end{Shaded}

}

\end{codelisting}%

Internally, the created function is a JAX function of a lambdified form
that is shown in {Section~\ref{sec-code-generation-pdf}}, but with
dozens of arguments. The
\href{https://tensorwaves.readthedocs.io/0.4.13/api/tensorwaves.interface/\#tensorwaves.interface.ParametrizedFunction}{\texttt{ParametrizedFunction}}
wraps this function, so that the input data columns and current
parameter values are mapped to the correct argument.

\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}

\noindent Ultimately, the goal of these packages is to translate the
description of scattering problems into computational code that can
efficiently evaluate amplitude models on large experimental data
samples. Each package addresses a specific task within the workflow, and
their combination provides a coherent toolchain for translating
theoretical models into practical, high-performance analyses.

\section{Developer Experience}\label{sec-compwa-dx}

As discussed in Section~\ref{sec-compwa-python}, the move to Python
eliminated much of the burden of maintaining a high-performance
computational backend in C++. This section highlights several ways in
which Python also improves the developer experience within ComPWA and
how this strengthens the prospects for academic continuity. Beyond
enabling amplitude analyses, the workflow and tools are designed to
lower the entry barrier for new contributors, while ensuring that the
code remains thoroughly tested and well documented. This is especially
important in a small scientific community like hadron physics, where the
roles of user and developer often overlap.

\subsubsection{Source control}\label{source-control}

All projects of the ComPWA project are hosted as Git repositories on
GitHub under \href{https://github.com/ComPWA}{github.com/ComPWA}. The
repositories enforce a linear commit history through pull requests (PRs)
that are squash-merged into single commits. This ensures that changes to
the code base remain comprehensive and that code and documentation
quality is guaranteed before a PR is merged. All repositories that host
general-use packages are public and licensed under an
\href{https://www.apache.org/licenses/LICENSE-2.0}{Apache-2.0 license}.

Repositories that contain source code for Python packages deploy the
package through the \href{https://pypi.org}{Python Package Index}
(PyPI), as well as \href{https://conda-forge.org}{conda-forge}, and are
versioned according to \href{https://semver.org}{Semantic Versioning}.
These repositories are also automatically archived on
\href{https://zenodo.org}{Zenodo} with a DOI, so that users can cite the
code in their publications.

\subsubsection{Pinned developer
environment}\label{pinned-developer-environment}

All ComPWA repositories come with a
\href{https://packaging.python.org/en/latest/guides/writing-pyproject-toml}{\texttt{pyproject.toml}}
file that specifies the dependencies of the project, organised in terms
of dependency groups. In repositories where stability is preferred, lock
files are provided that pin all dependencies to specific versions,
ensuring that the environment is consistent both on the operating system
where the developer works as well as the continuous integration (CI)
environment where the code is tested. Over time, we employed different
strategies for generating lock files, but recently settled for
\href{https://github.com/astral-sh/uv}{\texttt{uv}} for Python-only
projects and \href{https://pixi.sh}{Pixi} for projects that require
other languages, such as Julia. Both tools are able to generate and
update cross-platform lock files with high speed. Cloning the repository
and activating the environment with these tools is all the user has to
do to start developing.

\subsubsection{Code quality assurance}\label{code-quality-assurance}

All packages include \textbf{unit tests} that are automatically executed
whenever a pull request (PR) is submitted. Test coverage is tracked with
the Codecov service to ensure the code remains well-tested. In addition,
the repositories provide tutorials in the form of Jupyter notebooks.
These notebooks also act as \textbf{integration tests}, since they are
executed during the documentation build triggered by each PR. The GitHub
repositories are configured so that code can only be merged into the
production branch via a PR that has passed these checks. AmpForm and
TensorWaves further include continuous benchmarks that track the runtime
of selected tests and issue warnings if changes to the codebase result
in performance regressions.

ComPWA enforces its style guidelines automatically rather than
describing them in a document, so that the style can be continuously
updated and developers can stay in the workflow without having to
consult a guide. This is done through autoformatters such as
{\href{https://prettier.io}{Prettier}} and linters such as
{\href{https://docs.astral.sh/ruff}{Ruff}}. These tools are enforced
through {\href{https://pre-commit.com}{Pre-commit}}, which performs a
set of checks locally on every commit as well as on PRs, applying
autofixes where possible. In projects with much documentation, spelling
is checked through Pre-commit as well with a
{\href{https://cspell.org}{CSpell}} hook. Other developer tools that the
ComPWA project uses, can be found under
\href{https://compwa.github.io/develop}{compwa.github.io/develop}~{[}\citeproc{ref-Fritsch:2022compwa}{234}{]}.

\subsubsection{Consistent and interlinked
documentation}\label{consistent-and-interlinked-documentation}

All ComPWA packages come with documentation of the API (function and
class descriptions) as well as tutorials in the form of Jupyter
notebooks. The text is kept minimal by linking to relevant resources as
well as to other parts of the documentation. An example are automatic
links in code examples to the function description in the API, so that
the main text does not have to explain the code example in detail. The
interlinking of the documentation is continuously tested as well to
ensure that links are not broken. On each release of a package, a
separate, versioned website is hosted through the
\href{https://about.readthedocs.com}{Read the Docs} documentation
hosting service. In addition, links to the APIs of external dependencies
point to the specific version of the dependency at the time the
documentation was built, so that links in older versions of the
documentation remain valid. All of these techniques ensure that the
documentation is consistent and up-to-date, even when the code changes,
and reduce the maintenance load of the documentation.

\subsubsection{Rapid prototyping}\label{rapid-prototyping}

Python is a high-level language that allows for rapid prototyping of new
features. This is especially important in a research environment, where
new ideas and concepts need to be tested quickly. The ability to write
code in a more human-readable way allows for faster iteration and
experimentation. We test and document ideas in the form of Jupyter
notebooks named ``Technical Reports'' hosted on
\href{https://compwa.github.io/report}{compwa.github.io/report}. The
notebooks are automatically run, tested, and deployed as webpages for
preservation.

\bookmarksetup{startatroot}

\chapter{Experimental set-ups}\label{sec-experiment}

\setcounter{tocdepth}{1}
\addtocontents{toc}{\protect\setcounter{tocdepth}{1}}

For this work, we carried out two studies using data from two collider
experiments: the \textbf{LHCb experiment} at the Large Hadron Collider
at CERN, and the \textbf{BESIII experiment} at the Beijing
Electron--Positron Collider~II (BEPCII) at IHEP in Beijing. The
following sections describe both experimental setups.

\section{LHCb experiment}\label{sec-lhcb}

The Large Hadron Collider (LHC) at CERN is the world's largest and most
powerful particle accelerator. It collides beams of protons or heavy
ions at center-of-mass energies of up {to~\(13.6\text{ TeV}\)} at
several interaction points around its 27-km ring (see
Figure~\ref{fig-lhc}). Dedicated experiments at these points pursue
different physics programs: ATLAS and CMS conduct general-purpose
searches, ALICE focuses on heavy-ion physics, and LHCb is optimised for
precision studies of heavy-flavour hadrons and spectroscopy.

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter6/lhc.pdf}}

}

\caption{\label{fig-lhc}Schematic view of the Large Hadron Collider and
its four main experiments located underground near
Geneva~{[}\citeproc{ref-Stark:2018jbe}{235}{]}. The position of the LHCb
experiment is highlighted in yellow.}

\end{figure}%

The LHCb experiment is dedicated to the study of heavy-flavour hadrons.
Its primary aim is to test the Standard Model through precision
measurements of {\(CP\)~violation,} rare decays, and other processes
that are sensitive to potential new physics. An important part of its
program is devoted to the spectroscopy of hadrons containing charm and
bottom quarks, where LHCb has provided some of the most precise results
worldwide, including the discovery and characterisation of exotic states
such as tetraquarks and pentaquarks. In addition, the experiment
contributes to electroweak measurements, QCD~studies, and heavy-ion
collisions.

The LHCb detector is a single-arm forward spectrometer covering the
pseudorapidity {range~\(2 < \eta < 5\),} which corresponds to particles
produced at small angles with respect to the beam. Its geometry is
optimised for the study of heavy-flavour hadrons, which are
predominantly produced in this forward region. The detector combines
precise tracking and vertex reconstruction with efficient photon and
particle identification, complemented by a fast trigger system. The
following sections provide a more detailed description of its
subsystems, grouped by their main functions: tracking, photon
reconstruction, particle identification, and event triggering.
Figure~\ref{fig-lhcb-detector} shows a side view of the detector and its
subsystems at the time of the LHC Run~2 period (2015--2018), after its
trigger system was upgraded to accommodate the increased luminosity of
the LHC~{[}\citeproc{ref-LHCb:2018zdd}{236};
\citeproc{ref-Belyaev:2021cyr}{237}{]}.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter6/lhcb-detector.pdf}}}

}

\caption{\label{fig-lhcb-detector}Side view of the LHCb detector.
Adapted {from~{[}\citeproc{ref-LHCb:2008vvz}{238};
\citeproc{ref-LHCb:2014set}{239}{]}.}}

\end{figure}%

\subsection{Tracking}\label{tracking}

Among all sub-detectors of the LHCb experiment, the \textbf{Vertex
Locator~(VELO)} is located most closely to the interaction point. It is
designed to measure particle trajectories extremely close to the
interaction region (in the order of a few millimetres), which makes it
possible to accurately determine the primary (collision) and secondary
(decay) vertices. The module consists of several disks of radial and
azimuthal silicon sensor strips that are arranged in parallel along the
beam pipe. The beam goes through the center of the disks. As such, each
disk is split into two halves that are moved towards each other around
the beam once it is in operation and
stable~{[}\citeproc{ref-LHCb:2008vvz}{238, Fig.~5.1} and 5.6{]}.

Prior to Upgrade~1 (LHC Run~2 and before) of the LHCb experiment (2018),
two \textbf{Silicon Tracker~(ST)} systems were located right after the
VELO detector to further improve tracking efficiency. The
\textbf{Tracker Turicensis (TT)} is located upstream of the dipole
magnet and covers LHCb's full acceptance range. The TT is therefore used
to measure the trajectory and momentum before they enter the magnetic
field. Three planar tracking stations (T1, T2, T3) are located
downstream of the magnet. They consist of silicon microstrips near the
beam pipe (Inner Tracker, IT) and straw-tubes further away from the beam
pipe (Outer Tracker, OT). While the IT is well-adapted at detecting
high-energy, high-density particles, the OT has a better angular
resolution for lower-energy particles that are further away from the
beam pipe.

\subsection{Photon reconstruction}\label{photon-reconstruction}

Photons are reconstructed primarily with the \textbf{electromagnetic
calorimeter (ECAL)}, which measures their energy deposition and impact
position with fine granularity. Since photons leave no track in the
upstream tracking detectors, the absence of a matching track is used to
confirm their neutral nature. To further suppress background signals,
the \textbf{Scintillating Pad Detector (SPD)} and \textbf{Pre-shower
Detector (PS)}, placed directly in front of the ECAL, distinguish
photons from electrons and reject background signals from charged and
neutral pions. This system enables efficient photon reconstruction and
the identification of neutral mesons such as \(\pi^0 \to \gamma\gamma\).

\subsection{Particle identification}\label{particle-identification}

Charged-particle identification is achieved with a combination of
Cherenkov, calorimeter, and muon detectors. Two \textbf{Ring Imaging
Cherenkov (RICH)} detectors measure the velocity of charged particles
over a wide momentum range. \textbf{RICH 1}, located between the VELO
and TT, covers low-momentum tracks~(\(1\)--\(60\text{ GeV}/c\)) over the
full angular acceptance using aerogel and
{\(\mathrm{C}_4\mathrm{F}_{10}\)~radiators.} \textbf{RICH 2}, located
downstream after T3, identifies higher-momentum particles
{(\(15\)--\(100\text{ GeV}/c\)} and beyond) with a
{\(\mathrm{CF}_4\)~radiator} and a reduced angular acceptance
{(\(15\)--\(120\text{ mrad}\)).}

For electrons, the ECAL response is used in combination with the SPD and
PS to provide a clean separation from hadrons, while hadrons deposit
most of their energy in the downstream \textbf{hadronic calorimeter
(HCAL)}, which is segmented into two zones with larger cell sizes to
match their broader showers.

Finally, muons are identified in five dedicated stations
(\textbf{M1--M5}) consisting of 1,380 muon chambers that are placed
downstream of the calorimeters and interleaved with iron absorbers. Only
penetrating particles with momenta above {about \(6\text{ GeV}/c\)}
reach these chambers. Station M1, located upstream of the calorimeters,
improves the transverse-momentum resolution, while the downstream
stations provide both identification and track-direction measurements.

\subsection{Event triggering}\label{event-triggering}

The sub-detectors and trigger system of the LHCb experiment cannot
handle the maximum design luminosity of the LHC. To reduce the
luminosity, LHCb therefore crosses the beams at a larger angle. Prior to
Upgrade~1, this resulted in an average luminosity of
\(2\times10^{32}\text{ cm}^{-2}\mathrm{s}^{-1}\). At the time, the LHCb
experiment had a two-level trigger system. A fast, hardware-only
\textbf{Level~0 (L0)} trigger system was used to reduce the event rate
from \(40\text{ MHz}\) to \(1\text{ MHz}\), which is the rate at which
all sub-detectors could read out events. Next, the \textbf{High-Level
Trigger (HLT)} asynchronously processed the data from the sub-detectors
to reduce the event rate to \(2\text{ kHz}\) and store the selected
events to disk. At L0, a Decision Unit processed data from the
calorimeter system and muon system to identify clusters of
{high‑\(p_T\)} photons and charged particles. In addition, pile-up in
the VELO was used to estimate the number of primary proton--proton
interactions. The VELO and other tracking detectors were too slow for L0
and were processed at HLT. Since Run~3, the hardware L0~trigger has been
removed and the experiment operates at a higher luminosity
{(\(2\times10^{33}\text{ cm}^{-2}\mathrm{s}^{-1}\))} with a fully
software-based trigger.

\subsection{Data sets and software
stack}\label{data-sets-and-software-stack}

The analyses presented in this work use data collected by the LHCb
experiment during \textbf{Run~2} of the LHC, corresponding to
proton--proton collisions at a center-of-mass energy of
\(13\text{ TeV}\). The full Run~2 data set amounts to about
\(6\text{ fb}^{-1}\), recorded between 2015 and 2018, with subsets
selected according to the trigger requirements and detector conditions
relevant for the studied channel. Over the years, LHCb has collected
several other data sets. During \textbf{Run~1} (2010--2012),
proton--proton collisions were recorded at center-of-mass energies of
\(7\) and \(8\text{ TeV}\), corresponding to an integrated luminosity of
{about~\(3\text{ fb}^{-1}\).} More recently, \textbf{Run~3} started in
2022 at a nominal energy of \(13.6\text{ TeV}\), with the upgraded
detector and trigger system designed to record datasets that will
eventually exceed \(20\text{ fb}^{-1}\). Heavy-ion data from
proton--lead and lead--lead collisions are also available, with smaller
integrated luminosities.

Event simulation and reconstruction are performed with the LHCb software
stack, built on the Gaudi
framework~{[}\citeproc{ref-Muller:2019ogi}{240}{]}. The detector
simulation application (\href{https://lhcb-gauss.docs.cern.ch}{Gauss})
integrates \href{https://pythia.org}{Pythia} for {\(pp\)~collisions,}
\href{https://evtgen.hepforge.org}{EvtGen} for hadron decays, and
\href{https://geant4.web.cern.ch}{Geant4} for the detector simulation.
In a typical analysis, reconstructed tracks are combined into particle
candidates, particle-identification information is used to assign their
species, and a kinematic fit with vertex and mass constraints improves
the resolution of the reconstructed variables. Based on these
candidates, selection criteria are applied to suppress combinatorial and
physics background channels, while aiming to retain high signal
efficiency. To support this workflow, large inclusive Monte Carlo (MC)
productions of heavy-flavour events, such as \(b\bar{b}\) and
\(c\bar{c}\) production, are routinely generated; these contain all
hadronisation and decay modes and allow any final state to be filtered.
In addition, smaller exclusive signal MC samples are produced for
specific decay topologies to optimise the selection criteria.

\section{BESIII experiment}\label{sec-besiii}

The Beijing Electron--Positron Collider~II (BEPCII) is a double-ring
electron--positron collider that operates at center-of-mass (CM)
energies between \(2\) and \(4.95\text{ GeV}\). Originally, the BEPCII
collider was designed with a maximum energy of \(4.6\text{ GeV}\). To
investigate more {\(XYZ\)~states,} such as \(Z_{cs}(3985)^+\),
\(Y(4630)\), and \(Y(4660)\), BEPCII was upgraded to have a maximum
energy of \(4.95\text{ GeV}\)~{[}\citeproc{ref-BESIII:2022ulv}{241}{]}.

The \textbf{Beijing Electron Spectrometer (BES)} experiment is located
at the Beijing campus of the Institute of High Energy Physics (IHEP) in
China and is part of the BEPC facility (Figure~\ref{fig-bepcii}). BES
has gone through three generations since 1988, with the current
detector, \textbf{BESIII}, beginning operation in 2008 alongside the
BEPCII upgrade.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter6/BEPCII.pdf}}}

}

\caption{\label{fig-bepcii}The Beijing Electron--Positron Collider~II
with the BESIII experiment located at the storage ring. Adapted from
{[}\citeproc{ref-BESIII:2009-LayoutBEPC}{242};
\citeproc{ref-Kussner:2022dft}{243, Fig.~4.1}{]}. }

\end{figure}%

The BESIII experiment explores the physics of the charm--tau sector in
the energy range accessible at
BEPCII~{[}\citeproc{ref-Briere:2016puj}{244}{]}. A large part of its
program is devoted to hadron spectroscopy, as it offers high-statistics
samples of charmonium, open-charm states, and light hadrons. BESIII has
also become a key source of precise cross-section data for processes
such as \(e^+e^- \to \text{hadrons}\). These serve as inputs to Standard
Model calculations, including the hadronic contribution to the muon
anomalous magnetic moment. Alongside spectroscopy and cross-section
measurements, the experiment investigates charm decays and mixing,
{\(\tau\)~lepton} properties, rare and forbidden processes, and a
variety of tests of discrete symmetries.

To carry out this physics program, the BESIII detector is built as a
general-purpose magnetic spectrometer arranged cylindrically around the
BEPCII interaction point (Figure~\ref{fig-bes3-detector-geometry}), so
that it has wide angular coverage. From the inside outward, the detector
consists of a Multilayer Drift Chamber (MDC), a Time-of-Flight (TOF)
system, an Electromagnetic Calorimeter (EMC), a superconducting solenoid
magnet that provides {a~\(1\text{ T}\)~axial} field, and outer Muon
Chambers (MUC). Most subsystems are divided into a cylindrical
``barrel'' around the beam pipe and two ``endcaps'' covering the forward
and backward regions. The following sections describe these detector
subsystems in more detail, grouped by their main functions: tracking,
photon reconstruction, particle identification, and event triggering.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter6/bes3-sub-detectors.pdf}}}

}

\caption{\label{fig-bes3-detector-geometry}BESIII detector geometry,
adapted from {[}\citeproc{ref-BESIII:2009fln}{245}{]}.}

\end{figure}%

The storage ring of BEPCII consists of two separate beam pipes, with
positrons stored in one and electrons in the other. At the interaction
point, the two beams cross at an angle of \(11\text{ mrad}\), which
results in a small transverse momentum to the CM~system of the colliding
electron--positron pair. The beam axis defines the {\(z\)~axis} of the
lab frame coordinate system, while the crossing plane sets the
{\(x\)~direction} along the net CM~momentum; the {\(y\)~axis} is taken
perpendicular to the {\(xz\)~plane}. In particular, for a beam energy
tuned to the {\(J/\psi\)~mass,} so that
\(E_\mathrm{beam} = m_{_{J/\psi}}\), the four-momentum of the CM system
in the laboratory frame is

\begin{equation}\phantomsection\label{eq-lab-frame-momentum}{
p^\mathrm{lab}_\mathrm{beam} = \left(\sqrt{m_{_{J/\psi}}^2 + p_x^2},\, p_x,\, 0,\, 0\right), \quad \text{with } p_x \approx 34\text{ MeV}/c \,.
}\end{equation}

\noindent This small asymmetry is important for amplitude analyses,
since reconstructed four-momenta must be boosted from the laboratory to
the CM frame, where the beam system is at rest, such that
\(p_\mathrm{beam} = \left(m_{_J/\psi}, 0, 0, 0\right)\).

\subsection{Tracking}\label{tracking-1}

Charged-particle tracking at BESIII is provided by the
\textbf{Multilayer Drift Chamber (MDC)}, which forms the inner core of
the detector. With an inner radius of \(59\text{ mm}\) and an outer
radius of \(810\text{ mm}\), it is closest to the interaction point and
therefore well suited for reconstructing low-momentum tracks and
determining their ionisation energy loss {(\(dE/dx\))} for particle
identification. The MDC consists of 43 layers of small drift cells
filled with a \(\mathrm{He\!:\!C_3H_8\;60\!:\!40}\) gas mixture, chosen
to minimise multiple scattering and optimise momentum and \(dE/dx\)
resolution. Each cell contains a \(25\,\mu\mathrm{m}\) gold-plated
tungsten sense wire surrounded by eight \(110\,\mu\mathrm{m}\) aluminium
field wires. As charged particles traverse the chamber, they ionise the
gas, and the resulting signals on the sense wires provide position
measurements with a resolution of about \(130\,\mu\mathrm{m}\) in the
radial direction and \(2\text{ mm}\) along the wires. The conical shape
at the endcaps accommodates the final focusing quadrupoles and results
in a solid-angle coverage of about \(93\%\) {of~\(4\pi\).}

Momentum measurement is enabled by the \textbf{Superconducting Solenoid
Magnet (SSM)}, which surrounds the MDC, TOF, and
EMC~{[}\citeproc{ref-Zhu:2005-BESIIIDetectorMagnet}{246}{]}. It provides
a uniform axial magnetic field {of~\(1.0\text{ T}\),} bending the
trajectories of charged particles in the MDC to determine their momenta.
The magnet is enclosed by an iron yoke, which both enhances the magnetic
field and acts as an absorber for separating muons from hadrons in the
outer muon system.

\subsection{Photon reconstruction}\label{photon-reconstruction-1}

Photons at BESIII are reconstructed in the \textbf{Electromagnetic
Calorimeter (EMC)}, which surrounds the TOF system at a radius of about
\(94\text{ cm}\). The EMC consists of 6,240~cesium iodide crystals doped
with thallium {(\(\mathrm{CsI(Tl)}\))} crystals arranged in 56~disks
pointing toward the interaction point, with a total mass of about
{\(25.6\)~tons.} When photons or electrons enter the crystals, they
initiate electromagnetic showers through bremsstrahlung and pair
production. The secondary particles deposit their energy in the
crystals, from which the position and energy of the incident particle
are reconstructed. The large numbers of dense crystal disks allows for a
spatial resolution of \(\sigma=0.6\text{ cm}/\sqrt{E}\).

Given the relatively low CM energies at BEPCII (at most
{\(4.95\text{ GeV}\)),} photons and electrons can carry only a few
\(\text{MeV}\) of energy. In addition, common processes like
\(\pi^0\to\gamma\gamma\) result in a large opening angle between the two
photons, which requires a good position resolution to make it possible
to perform cuts on the opening angle. The EMC therefore also plays an
important role in the identification of neutral mesons.

\subsection{Particle identification}\label{particle-identification-1}

Particle identification at BESIII relies on a combination of energy loss
measurement, timing, and muon detection. The {\(dE/dx\)~profile}
measured in the MDC provides separation of particle species at low
momenta. This information is complemented by the \textbf{Time-of-Flight
(TOF)} system, which surrounds the MDC. The TOF barrel consists of two
layers of 88~plastic scintillator bars located at radii of \(81\)
{and~\(86\text{ cm}\),} while each endcap contains a single layer of
48~bars at \(1.4\text{ m}\) from the interaction point. With a time
resolution of {about~\(100\text{ ps}\),} the TOF achieves
{a~\(3\sigma\)} separation between pions and kaons up to momenta of
{roughly~\(770\text{ MeV}/c\),} and, in combination {with~\(dE/dx\),}
enables identification of electrons, muons, pions, kaons, and protons
across a wide momentum range.

The \textbf{Muon Chambers (MUC)} form the outermost subsystem of BESIII.
They consist of resistive plate counters (RPCs) embedded in the iron
return yoke of the superconducting magnet, at radii between \(170\)
{and~\(262\text{ cm}\).} The RPCs detect ionisation signals left by
penetrating charged particles, which are matched to tracks reconstructed
in the MDC. Since muons interact only weakly in the calorimeter and
magnet yoke, while charged pions are largely absorbed, the MUC provides
reliable muon identification above a momentum threshold of
{about~\(0.4\text{ GeV}/c\).}

\subsection{Event triggering}\label{event-triggering-1}

The BESIII trigger operates in two stages: a \textbf{Level-1 (L1)
hardware trigger} and a \textbf{Level-3 (L3) software trigger}. At~L1,
fast signals from the MDC, TOF, and EMC are processed by a global
trigger logic implemented in FPGA-based electronics, running
synchronously with the \(41.65\text{ MHz}\) bunch crossing frequency of
BEPCII. This reduces the event rate to about \(4\text{ kHz}\) at the
{\(J/\psi\)~resonance.} The surviving events are then passed to the
L3~software trigger, which applies more refined selections before
writing events to permanent storage.

\subsection{Data sets and software
stack}\label{data-sets-and-software-stack-1}

The BESIII experiment has accumulated large data sets at many
center-of-mass energies between \(2\) and \(4.95\,\mathrm{GeV}\),
corresponding to an integrated luminosity of more than
\(10\,\mathrm{fb}^{-1}\) since 2009. Dedicated runs have been taken at
narrow resonances such as the \(J/\psi\), \(\psi(2S)\), and
\(\psi(3770)\), as well as at higher energies in the charmonium-like
\(XYZ\) region. These samples provide the basis for amplitude analyses
and spectroscopy studies of charmonium, open-charm, and light hadron
final states.

Event reconstruction and simulation are performed with the
\href{https://english.ihep.cas.cn/bes/re/os}{BOSS} (BESIII Offline
Software System) framework, which provides event generation, detector
simulation, and reconstruction. The initial {\(e^+e^-\)~collision} is
generated with \href{https://arxiv.org/abs/hep-ph/9912214}{KKMC} to
include effects from initial-state radiation. Subsequent hadron decays
are modelled with \href{https://evtgen.hepforge.org}{EvtGen}, while the
interaction of particles with the detector material is simulated using
\href{https://geant4.web.cern.ch}{Geant4}. Reconstructed tracks are
combined into particle candidates, whose identities are assigned using
particle-identification information from the MDC, TOF, and EMC. A
kinematic fit imposing vertex and energy--momentum constraints is then
applied to improve resolution and ensure consistency with the known
collision energy. Event selection is performed using a set of kinematic
and particle-identification criteria designed to suppress background
channels while retaining high efficiency for the targeted decay mode.

Large inclusive MC samples are regularly generated for specific beam
energies in which the {\(e^+e^-\)~annihilation} and subsequent decays of
the relevant resonances {(\(J/\psi\),} {\(\psi(2S)\),} open-charm
states, etc.) are simulated according to the world-average branching
fractions. These serve as the main tool for estimating background
channels and efficiencies. In addition, exclusive MC samples are
produced for specific decay topologies to optimise selections and
validate the analysis chain. Finally, phase-space samples are generated
for multi-body decays without detailed dynamical input, which are needed
as efficiency-corrected domain sample for amplitude analysis models.

\addtocontents{toc}{\protect\setcounter{tocdepth}{2}}

\bookmarksetup{startatroot}

\chapter{Application to data}\label{sec-application-to-data}

\[
\definecolor{C0}{RGB}{31, 119, 180}
\definecolor{C1}{RGB}{255, 127, 14}
\definecolor{MyBlue}{RGB}{0, 68, 136}
\definecolor{MyYellow}{RGB}{221, 170, 51}
\definecolor{MyRed}{RGB}{187, 85, 102}
\]

\noindent This chapter demonstrates the application of the formalisms
and computational techniques developed in the preceding chapters. The
aim is to show that the tools and workflows can be applied in different
contexts and are accurate and performant. First, by comparing against an
existing amplitude analysis by LHCb, we validated the implementation of
the Dalitz-plot decomposition (DPD) method of Section~\ref{sec-dpd}. The
new symbolic implementation enabled the computation of a polarimeter
vector field for the decay \(\varLambda_c^+ \to p K^- \pi^+\), the
results of which were published
in~{[}\citeproc{ref-LHCb:2023crj}{247}{]}. We then illustrate how
CAS-assisted model building the DPD method is employed to fit an
amplitude model to \(J/\psi \to \bar{p} K^0_S \varSigma^+\) data from
the BESIII experiment. Finally, we assess the performance of symbolic
amplitude models on different hardware configurations when using Minuit2
for fitting.

\section{Polarimeter vector field of\texorpdfstring{~$\varLambda_c$}{ 𝛬𝑐}} \label{sec-polarimeter-vector-field}

So far, we have considered spin projections to be a kinematic degree of
freedom that we factor out in amplitude models through the helicity
formalism, because it is not relativistically invariant. However,
particles can exhibit a preferred spin orientation that is
\emph{characteristic} for how it is produced. This phenomenon is known
as \textbf{polarisation}.

Particle polarisation can appear as a forward--backward asymmetry in the
angular distributions of decay products. As such, it is an observable
that is widely used in hadron spectroscopy studies. For hadrons,
polarisation provides insights into the hadronisation process by which
quarks and gluons combine to form the hadron. Although hadronisation is
a non-perturbative phenomenon, the polarisation of the produced hadron
preserves information about the quarks' spin orientation during this
process. This retention of spin information therefore offers a window
into how spin is transferred or altered during hadron
formation~{[}\citeproc{ref-Brambilla:2010cs}{248}--\citeproc{ref-Butenschoen:2012px}{250}{]}.

In semileptonic decays, the polarisation of the produced hadrons can be
used to study the handedness of weak interactions. Since the weak force
couples only to left-handed particles (and right-handed antiparticles),
the angular asymmetry of the produced hadrons can reveal details about
the chiral structure of the interaction. This sensitivity makes hadron
polarisation a probe for testing the Standard Model and searching for
possible signs of new physics. For example, deviations from the expected
polarisation patterns could indicate contributions from right-handed
currents or non-standard couplings, which are predicted in various
beyond-the-Standard Model
scenarios~{[}\citeproc{ref-Konig:1993wz}{251}--\citeproc{ref-Ferrillo:2019owd}{259}{]}.

\subsection{Asymmetry parameter}\label{asymmetry-parameter}

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/asymmetry-lab-frame.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/asymmetry-cm.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-asymmetry}Definition of the forward--backward
asymmetry for a {\(\varLambda \to p\pi\)~decay}, starting from the lab
frame (left) and boosting into the center-of-mass frame (right) to get
the {angle~\(\theta\)} between the decay product and the parent
particle.}

\end{figure}%

In two-body decays, the forward--backward asymmetry appears in the
(normalised) differential decay {rate~\(\mathrm{d}\Gamma\)} when
expressed as a function of the scattering {angle~\(\theta\)},

\begin{equation}\phantomsection\label{eq-two-body-asymmetry}{
\frac{2}{\Gamma}\,\frac{\mathrm{d}\Gamma}{\mathrm{d}\cos\theta} \;=\; 1 + P\,\alpha\,\cos\theta
\,,
}\end{equation}

\noindent where \(P\) denotes the polarisation of the decaying particle
and \(\alpha\) is an \textbf{asymmetry parameter} characteristic of the
decay. The definition of the scattering {angle~\(\theta\)} is shown in
Figure~\ref{fig-asymmetry}, for the decay \(\varLambda \to p\pi\) as an
example.

For a spin-half or spin-1 parent decaying into a spin-half baryon and a
pseudoscalar meson, the decay amplitude contains only two independent
partial waves: an S‑wave {(\(L=0\))} and a P‑wave {(\(L=1\)).} These
correspond to the parity-violating and parity-conserving contributions,
usually denoted \(H_S\) and \(H_P\). The asymmetry parameter is
determined by their interference:

\begin{equation}\phantomsection\label{eq-asymmetry-parameter-from-couplings}{
\alpha
\;=\; \frac{2\,\mathrm{Re}(H_S^* H_P)}{|H_S|^2+|H_P|^2}
\,.
}\end{equation}

\noindent The decay therefore only has an angular asymmetry if both
parity-conserving and parity-violating amplitudes are present.

\subsection{Polarimetry}\label{polarimetry}

Since the asymmetry {parameter~\(\alpha\)} is an intrinsic decay
property that does not depend on the production mechanism, it can be
used to combine polarisation information between different analyses.
Once an asymmetry parameter is determined, it can be used to determine
the polarisation of the decaying particle in other analyses. For
example, in \(\varXi_b^0 \to J/\psi p \varLambda\), the asymmetry
parameter of \(\varLambda \to p\pi^-\) provides sensitivity to the spin
of the pentaquark candidate
{\(P_{cs}\to J/\psi\,\varLambda\)~{[}\citeproc{ref-LHCb:2019aci}{260}{]}.}

However, heavy baryons often do not predominantly decay to two-body
final states, which makes it difficult to measure the asymmetry
parameter with high precision. For example, in
\(\varLambda^0_b \to \varLambda_c^+ \bar{D}^0 K^-\) decays, pentaquarks
are expected in the \(\varLambda_c^+ \bar{D}^0\) final state, but the
\(\varLambda_c^+\) is reconstructed through the
\href{https://pdglive.lbl.gov/Particle.action?init=0&node=S033&home=BXXX040}{predominant}
three-body decay \(\varLambda_c^+ \to p K^- \pi^+\). The lack of
polarisation information makes it harder to identify pentaquarks in the
angular distributions.

Lepton studies in the 1990s introduced the concept of a
\textbf{polarimeter vector} \(\vec{h}\) in order to characterise the
asymmetry in {\(\tau\)~lepton}
decays~{[}\citeproc{ref-Davier:1992nw}{261}{]}. Just like the asymmetry
parameter in Equation~\eqref{eq-two-body-asymmetry}, the polarimeter
vector allows formulating the angular asymmetry as a function of the
\textbf{polarisation {vector~\(\vec{P}\)}} of the decaying
{\(\tau\)~lepton} as

\begin{equation}\phantomsection\label{eq-polarimeter-vector}{
\frac{1}{\Gamma}\,\frac{\mathrm{d}\Gamma}{\mathrm{d}\Phi}
\;\propto\;
1 + \vec{P} \cdot \vec{h}
\,,
}\end{equation}

\noindent with \(\mathrm{d}\Phi\) describing all remaining kinematic
degrees of freedom and \(\Gamma\) the total decay width of the
{\(\tau\)~lepton.} This simple relation only works in the case of a
decaying {\(\tau\)~lepton,} because its spin is transferred to the
neutrino in the final state, leaving the other decay products
unpolarised. In the case of decaying hadrons, the decay products are
polarised, which complicates the interpretation of the angular
asymmetry. The polarimeter vector is then not a constant, but a function
of the kinematic variables of the decay.

It turns out that the concept of the polarimeter vector can be extended
to three-body decays of spin-half hadrons by introducing an
\textbf{aligned polarimeter vector}
{\(\vec{\alpha}\)~{[}\citeproc{ref-LHCb:2023crj}{247}{]}.} By aligning
the polarimeter to the decay plane by a rotation
\(\mathbfit{R}(\phi,\theta,\chi)\) (see
Figure~\ref{fig-rotation-angles}), we get a vector that, like the
asymmetry parameter, is intrinsic to the decay. The polarimeter vector
of equation Equation~\eqref{eq-polarimeter-vector} is then given by

\begin{equation}\phantomsection\label{eq-polarimeter-vector-aligned}{
\vec{h} \;=\; \mathbfit{R}(\phi,\theta,\chi) \, \vec{\alpha}
\,,
}\end{equation}

\noindent which results in a more general expression for
Equation~\eqref{eq-two-body-asymmetry},

\begin{equation}\phantomsection\label{eq-decay-rate-from-polarimeter-vector}{
\frac{1}{\Gamma}\,\frac{\mathrm{d}\Gamma}{\mathrm{d}\Phi}
\; \propto \;
1+\vec{P} \, \mathbfit{R}(\phi,\theta,\chi) \, \vec{\alpha}(\tau)
\,.
}\end{equation}

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-decay-plane.pdf}}

}

\caption{\label{fig-rotation-angles}Definition of the Euler angles
\({\color{red}\phi}, {\color{red}\theta}, {\color{red}\chi}\) that align
the polarimeter vector \(\vec{\alpha}\) to the decay plane. Adapted from
{[}\citeproc{ref-LHCb:2023crj}{247}{]}.}

\end{figure}%

Just like in Equation~\eqref{eq-asymmetry-parameter-from-couplings}, the
aligned polarimeter vector can be determined from the helicity
amplitudes, but these amplitudes need to be aligned consistently with
regard to the final state. For this, we employ the methods described in
Section~\ref{sec-spin-alignment}, which enable us to relate the rotation
of the aligned polarimeter vector in
Equation~\eqref{eq-polarimeter-vector-aligned} to that of the rotation
of the aligned transition amplitudes.

As discussed in Section~\ref{sec-differential-decay-rate}, the polarised
intensity function for any {\(n\)‑body} decay can be expressed in terms
of amplitudes \(\widetilde{A}_{m_0,\{\lambda\}}\)
(Equation~\eqref{eq-production-aligned-amplitude}) that are aligned with
regard to the production quantisation axis over Euler angles
\(\Omega=(\phi,\theta,\chi)\), giving

\begin{equation}\phantomsection\label{eq-unpolarised-in-terms-of-amplitudes}{
I(\Omega,\tau) \;=\;
  \sum_{\{\lambda\}}
  \sum_{m_0,m_0'}
  \widetilde{A}^*_{m_0',\{\lambda\}}(\Omega,\tau) \,
  \rho_{m_0' m_0} \,
  \widetilde{A}_{m_0,\{\lambda\}}(\Omega,\tau) \,,
}\end{equation}

\noindent with \(m_0^{(\prime)}\) the allowed spin projections of the
decaying hadron along that quantisation axis determined by the
production process and \(\{\lambda\}\) the set of allowed
helicities~\(\lambda_1,\lambda_2,\dots,\lambda_n\) of the decay
products. If decaying particle~\(0\) is a spin-half fermion, the
spin-density matrix~\(\mathbfit{\rho}\) depends on its polarisation
vector~\(\vec{P}\) via

\begin{equation}\phantomsection\label{eq-spin-density-in-terms-of-pauli}{\rho_{m_0' m_0} \;=\; 1+\vec P \cdot \vec{\sigma}_{m_0' m_0}
\,,
}\end{equation}

\noindent where \(\vec{\mathbfit{\sigma}}\) denotes the three Pauli
matrices~\(\mathbfit{\sigma_x}, \mathbfit{\sigma_y}, \mathbfit{\sigma_z}\).
By inserting Equation~\eqref{eq-production-aligned-amplitude} into
Equation~\eqref{eq-unpolarised-in-terms-of-amplitudes}, we get

\begin{equation}\phantomsection\label{eq-polarised-intensity-unfolded}{
\begin{aligned}
I(\Omega,\tau) \;&=\;
  \sum_{m_0,m_0'}
  \sum_{\lambda_0,\lambda_0'}
  \rho_{m_0' m_0} \;
  D^{1/2}_{m_0' \lambda_0'}(\phi,\theta,\chi) \;
  D^{1/2\,*}_{m_0 \lambda_0}(\phi,\theta,\chi) \;
  \mathfrak{X}_{\lambda_0' \lambda_0}(\tau) \,, \\
&
  \mathfrak{X}_{\lambda_0' \lambda_0}(\tau)
    \; \equiv \; \sum_{\{\lambda\}}
    A_{\lambda_0',\{\lambda\}}^*(\tau) \,
    A_{\lambda_0,\{\lambda\}}(\tau)
\,.
\end{aligned}
}\end{equation}

By defining the vector field

\begin{equation}\phantomsection\label{eq-aligned-polarimeter-vector}{
\begin{aligned}
\vec\alpha(\tau) \;&=\;
  \left.
    \sum_{\lambda_0',\lambda_0,\{\lambda\}}
      A^*_{\lambda_0',\{\lambda\}}(\tau) \,
      \vec{\sigma}_{\lambda_0',\lambda_0} \,
      A_{\lambda_0,\{\lambda\}}(\tau)
  \middle/
    I_0(\tau)
  \right. \,, \\
&
  I_0(\tau) \; \equiv \; \sum_{\lambda_0,\{\lambda\}} \left|A_{\lambda_0,\{\lambda\}}(\tau)\right|^2
\,,
\end{aligned}
}\end{equation}

\noindent we can rewrite
Equation~\eqref{eq-polarised-intensity-unfolded} as

\begin{equation}\phantomsection\label{eq-polarised-intensity-from-aligned-polarimeter-vector}{
I(\Omega,\tau) \;=\;
  I_0(\tau)\, \left(1 + \sum_{i,j} P_i \, R_{ij}(\phi, \theta, \chi) \, \alpha_j(\tau)\right)
\,.
}\end{equation}

\noindent This transformation is enabled by a
homomorphism~{[}\citeproc{ref-Cornwell:1997ke}{262}{]},

\[
\frac{1}{2} \mathrm{Tr}\left[
  \mathbfit{D^{1/2\,*}}(\phi, \theta, \chi) \,
  \vec{\mathbfit{\sigma}_i} \,
  \mathbfit{D^{1/2}}(\phi, \theta, \chi)
\right]
\;=\; R_{ij}(\phi,\theta,\chi)
\,,
\]

\noindent which can be used to relate the \(\mathrm{SU}(2)\) spin
rotation matrices in Equation~\eqref{eq-polarised-intensity-unfolded} to
the \(\mathrm{SO}(3)\) rotation matrix in
Equation~\eqref{eq-polarimeter-vector-aligned} using the Pauli matrices
that come from Equation~\eqref{eq-spin-density-in-terms-of-pauli}. We
have
\href{https://lc2pkpi-polarimetry.docs.cern.ch/appendix/homomorphism.html}{verified
this relation algebraically} with a
CAS~{[}\citeproc{ref-LHCb:2023crj-Zotero}{263}{]}.

We can derive a similar relation as found in
Equation~\eqref{eq-decay-rate-from-polarimeter-vector} by integrating
Equation~\eqref{eq-polarised-intensity-from-aligned-polarimeter-vector}
over the remaining kinematic {variables~\(\tau\).} This gives us

\begin{equation}\phantomsection\label{eq-polarised-intensity-from-averaged-polarimeter-vector}{
\frac{8\pi^2}{\Gamma}\frac{\mathrm{d}^3 \Gamma}{\mathrm{d}\phi\,\mathrm{d}\!\cos\theta\,\mathrm{d}\chi}
\;=\; 1+\sum_{i,j}P_i \, R_{ij}(\phi, \theta, \chi) \, \overline{\alpha}_j
\,,
}\end{equation}

\noindent where we have defined an \textbf{averaged polarimeter vector}
\(\overline{\alpha}\) as

\begin{equation}\phantomsection\label{eq-averaged-polarimeter-vector}{
\overline{\alpha}_j \;=\;
  \left.
    \int I_0(\tau) \, \alpha_j(\tau) \,\mathrm{d}^n \tau \,
  \middle/
    \int I_0(\tau) \,\mathrm{d}^n \tau
  \right.
\,.
}\end{equation}

Naturally, the use of the averaged polarimeter vector rather than a
field simplifies reuse in other analyses. However, using this averaged
polarimeter vector results in an increase of statistical uncertainty.

Both the polarimeter vector field~\(\vec{\alpha}(\tau)\) of decaying
fermion~\(0\), as well as its averaged polarimeter
vector~\(\overline{\alpha}\), can be used to extend amplitude models
that involve this fermion in their decay chains. Rewriting
\(\mathfrak{X}_{\lambda_0' \lambda_0}(\tau)\) from
Equation~\eqref{eq-polarised-intensity-unfolded} in terms of
\(\vec{\alpha}\) and the unpolarised intensity \(I_0\) as

\begin{equation}\phantomsection\label{eq-mathfrak-x-from-polarimeter-field}{
\begin{aligned}
\mathfrak{X}_{\lambda_0' \lambda_0}(\tau)
\;&=\;
  \frac{I_0(\tau)}{2} \left(1+\vec{\alpha}(\tau) \cdot \vec{\mathbfit{\sigma}}\right)_{\lambda_0' \lambda_0}
\,,
\end{aligned}
}\end{equation}

\noindent it can be directly inserted into another amplitude model. In
our case, with \(\vec{\alpha}\) computed for \(\varLambda_c^+\), the
field can for instance be used to construct an amplitude for the decay
\(B^+ \to \varLambda_c^+ \bar{\varLambda}_c^- K^+\). This gives

\begin{equation}\phantomsection\label{eq-b-to-lambda-c-lambda-c-k}{
\begin{aligned} &
I(\sigma_{\varLambda_c K^+}, \sigma_{\bar{\varLambda}_c K^+};
  {\color{RoyalBlue}\phi,\theta,\chi,\sigma_{pK^-},\sigma_{K^-\pi^+}};
  {\color{RoyalBlue}\bar{\phi},\bar{\theta},\bar{\chi},\sigma_{\bar{p}K^+},\sigma_{K^+\pi^-}}
) \;= \\ &
  \qquad
  \sum_{m_0,\bar{m}_0}
  \sum_{m_0',\bar{m}_0'}
    A_{m_0',\bar{m}_0'}^{B^+*}(\sigma_{\varLambda_c K^+}, \sigma_{\bar{\varLambda}_c K^+}) \,
    A_{m_0,\bar{m}_0}^{B^+}(\sigma_{\varLambda_c K^+}, \sigma_{\bar{\varLambda}_c K^+}) \\ &
  \qquad\qquad \times \;
    \sum_{\lambda_0,\lambda_0'}
    D^{1/2\,*}_{m_0 \lambda_0}(\phi, \theta, \chi) \,
    D^{1/2}_{m_0' \lambda_0'}(\phi, \theta, \chi) \,
    {\color{RoyalBlue}\mathfrak{X}_{\lambda_0' \lambda_0}^{\varLambda_c} (\sigma_{pK^-},\sigma_{K^-\pi^+})} \\ &
  \qquad\qquad \times \;
    \sum_{\bar{\lambda}_0,\bar{\lambda}_0'}
    D^{1/2\,*}_{\bar{m}_0 \bar{\lambda}_0}(\bar{\phi},\bar{\theta},\bar{\chi}) \,
    D^{1/2}_{\bar{m}_0' \bar{\lambda}_0'}(\bar{\phi},\bar{\theta},\bar{\chi}) \,
    {\color{RoyalBlue}\mathfrak{X}_{\bar{\lambda}_0' \bar{\lambda}_0}^{\bar{\varLambda}_c}(\sigma_{\bar{p}K^+},\sigma_{K^+\pi^-})}
\,.
\end{aligned}
}\end{equation}

The insertion of the {\(\mathfrak{X}\)~matrices} adds 10 more degrees of
freedom to the \(B^+ \to \varLambda_c^+ \bar{\varLambda}_c^- K^+\)
amplitude model, indicated in blue. However, by evaluating
\(\mathfrak{X}\) using
Equation~\eqref{eq-mathfrak-x-from-polarimeter-field} with the
{\(\vec{\alpha}\)~field} that we provide in this study (with
interpolation from a sampled grid), the degrees of freedom are fixed,
which removes a large number of fit parameters, but does propagate spin
information from the \(\varLambda_c^+\) decay to the \(B^+\) decay and
increases the sensitivity of the model to the polarisation of the
\(\varLambda_c^+\).

\subsection{Application to \texorpdfstring{$\varLambda_c^+ \to p K^- \pi^+$}{𝛬𝑐⁺ → 𝑝𝐾⁻𝜋⁺}} \label{sec-computed-polarimeter}

The key point is that we now have an way to compute the polarimeter
vector field \(\vec{\alpha}\) from transition amplitudes
\(A_{\lambda^0,\{\lambda\}}\) that we can determine in a partial-wave
analysis. We applied this technique to compute the aligned polarimeter
vector field for the decay \(\varLambda_c^+ \to p K^- \pi^+\). Using the
fit parameters of 18~amplitude
models~{[}\citeproc{ref-LHCb:2022sck}{264}{]}, we computed the
polarimeter vector {field~\(\alpha\)} by reformulating those amplitude
models with the DPD method. The amplitude model with the best fit to the
data is named the ``default'' model and was used to compute the reported
mean values. Systematic and statistical uncertainties were propagated to
the polarimeter vector field by evaluating the polarimeter vector field
over the different models and over the uncertainties of the fit
parameters of the nominal model, respectively.

The amplitude analysis from which the fit parameters were extracted, was
performed using data from Run~2 of the Large Hadron Collider (LHC). The
sample consists of proton--proton collisions at a center-of-mass energy
{of~\(13\text{ TeV}\),} recorded in 2016 with an integrated luminosity
{of~\(1.7\text{ fb}^{-1}\).}

\subsubsection{Intensity distributions and decay-rate
matrices}\label{intensity-distributions-and-decay-rate-matrices}

Figure~\ref{fig-lambda-c-intensity-comparison} shows a comparison
between the data distribution over the Dalitz plane and our
reimplementation of the original default amplitude model in terms of
DPD. \href{https://lc2pkpi-polarimetry.docs.cern.ch/cross-check.html}{We
verified} that the intensity distribution of all 18~amplitude models
formulated symbolically with the DPD method is the same, up to
floating-point precision~{[}\citeproc{ref-LHCb:2023crj-Zotero}{263}{]}.
A second cross-check was performed with a DPD implementation in Julia
for the default model~{[}\citeproc{ref-Mikhasenko:2022xyz}{265}{]}.

\begin{figure}

\begin{minipage}{0.50\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-original-intensity.pdf}}}\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-model-intensity.pdf}}}\end{minipage}%

\caption{\label{fig-lambda-c-intensity-comparison}Comparison between a
rendering of the data distribution of \(\varLambda_c \to p K^- \pi^+\)
in the Dalitz plane measured by LHCb (left) and the intensity
distribution of the ``default'' DPD amplitude model, evaluated over a
{\(1000\!\times\!1000\)~grid} (right). Adapted from
{[}\citeproc{ref-LHCb:2022sck}{264};
\citeproc{ref-LHCb:2023crj}{247}{]}.}

\end{figure}%

The \(\varLambda_c^+ \to p K^- \pi^+\) decay has three subsystems. We
indicate the set of resonances in each subsystem with \({}^{**}\),
giving us the subsystems \(K^{**} \to K^-\pi^+\),
\(\varLambda^{**} \to p K^-\), and \(\varDelta^{**} \to p\pi^-\). The
resonance contributions of each of these subsystems are clearly visible
(see Figure~\ref{fig-lambda-c-intensity-projections}).

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-model-intensity-1d.pdf}}}

}

\caption{\label{fig-lambda-c-intensity-projections}Projections of the
intensity distribution for the ``default'' DPD amplitude model of
\(\varLambda_c^+ \to p K^- \pi^+\) to the invariant mass of the
subsystems {\(K^-\pi^+\)~(left),} {\(pK^-\)~(middle),} and
{\(p\pi^+\)~(right).}}

\end{figure}%

As a validation step, we computed the fit fractions of the default model
with full uncertainty propagation and compared them with the results
reported in~{[}\citeproc{ref-LHCb:2022sck}{264}, Table X{]}. The values
in Table~\ref{tbl-fit-fraction-uncertainties} show that the fit
fractions obtained in this polarimetry study are consistent within
uncertainties with those from the original LHCb amplitude analysis.
Further details of the uncertainty propagation are discussed later.

\begin{longtable}[]{@{}
  >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1692}}
  >{\raggedleft\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4154}}
  >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4154}}@{}}
\caption{Comparison of the fit fractions of the resonances in the decay
\(\varLambda_c^+ \to p K^- \pi^+\) between this polarimetry study and
the original LHCb amplitude analysis
{[}\citeproc{ref-LHCb:2022sck}{264}{]}. The first quoted uncertainty
combines the statistical and systematic components in quadrature, the
second reflects the model dependence. In this work, the model
uncertainty is defined by the extrema of the deviations, rather than by
their standard
deviation.}\label{tbl-fit-fraction-uncertainties}\tabularnewline
\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
Resonance
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
Polarimetry study
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Original analysis
\end{minipage} \\
\midrule\noalign{}
\endfirsthead
\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
Resonance
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
Polarimetry study
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Original analysis
\end{minipage} \\
\midrule\noalign{}
\endhead
\bottomrule\noalign{}
\endlastfoot
\(\varLambda(1405)\) & \(7.78 \pm 0.43_{-2.53}^{+3.01}\) &
\(7.7 \pm 0.2 \pm 3.0\) \\
\(\varLambda(1520)\) & \(1.91 \pm 0.10_{-0.24}^{+0.04}\) &
\(1.86 \pm 0.09 \pm 0.23\) \\
\(\varLambda(1600)\) & \(5.16 \pm 0.28_{-1.93}^{+0.50}\) &
\(5.2 \pm 0.2 \pm 1.9\) \\
\(\varLambda(1670)\) & \(1.15 \pm 0.04_{-0.29}^{+0.06}\) &
\(1.18 \pm 0.06 \pm 0.32\) \\
\(\varLambda(1690)\) & \(1.16 \pm 0.01_{-0.33}^{+0.06}\) &
\(1.19 \pm 0.09 \pm 0.34\) \\
\(\varLambda(2000)\) & \(9.55 \pm 0.67_{-2.26}^{+0.83}\) &
\(9.58 \pm 0.27 \pm 0.93\) \\
\(\varDelta(1232)^{++}\) & \(28.73 \pm 1.34_{-0.79}^{+1.76}\) &
\(28.6 \pm 0.29 \pm 0.76\) \\
\(\varDelta(1600)^{++}\) & \(4.50 \pm 0.51_{-1.40}^{+0.93}\) &
\(4.5 \pm 0.3 \pm 1.5\) \\
\(\varDelta(1700)^{++}\) & \(3.89 \pm 0.07_{-0.48}^{+0.94}\) &
\(3.9 \pm 0.2 \pm 0.94\) \\
\(K_0^*(700)\) & \(2.99 \pm 0.20_{-0.59}^{+0.91}\) &
\(3.02 \pm 0.16 \pm 0.92\) \\
\(K^*(892)\) & \(21.95 \pm 1.24_{-0.70}^{+0.59}\) &
\(22.14 \pm 0.23 \pm 0.64\) \\
\(K_0^*(1430)\) & \(14.70 \pm 0.80_{-2.67}^{+2.78}\) &
\(14.7 \pm 0.6 \pm 2.7\) \\
\end{longtable}

The decay rates of the amplitude models were also investigated. In
particular, the model using that uses LS couplings (canonical basis)
rather than helicity couplings allows one to distinguish partial waves
as either parity-violating or parity-conserving, which can be related to
Equation~\eqref{eq-asymmetry-parameter-from-couplings}.
{Figure~\ref{fig-pc-pv-currents}} shows the decay rates of all partial
waves in the canonical basis. Each matrix {element~\(i,j\)} is obtained
by setting all couplings to zero except those of the {\(i\)th} and
{\(j\)th} partial waves, and then normalising to the total
{intensity~\(I_\mathrm{tot}\)} of the full model. Diagonal elements
represent the decay {rate~\(I_i/I_\mathrm{tot}\)} (the ``fit fraction'')
of the {\(i\)th} partial wave, rather than the resonance fit fractions
listed in Table~\ref{tbl-fit-fraction-uncertainties}. Off-diagonal
elements quantify interference between the {\(i\)th} and {\(j\)th}
partial waves, given by \((I_{ij}-I_i-I_j)/I_\mathrm{tot}\).
Interference should vanish between different partial waves (different
{\(LS\)} combinations) and where it does not, this indicates
correlations between amplitudes induced by the production mechanism. By
construction, the sum of all elements in the lower triangle of the
matrix including the diagonal equals~100\%.

\begin{figure}

\begin{minipage}{0.45\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/decay-rates-default-canonical-pv.pdf}}}\end{minipage}%
%
\begin{minipage}{0.55\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/decay-rates-default-canonical-pc.pdf}}}\end{minipage}%

\caption{\label{fig-pc-pv-currents}Decay rates of all partial waves in
the model formulated in the canonical basis. A distinction is made
between parity-violating (left) and parity-conserving (right) currents.}

\end{figure}%

\subsubsection{Field visualisations}\label{field-visualisations}

Having reformulated and validated the amplitude models with DPD, we can
compute the polarimeter vector field from the aligned transition
amplitudes using Equation~\eqref{eq-aligned-polarimeter-vector}. The
alignment can be performed with respect to any of the three subsystems.
In Figure~\ref{fig-rotation-angles}, this corresponds to choosing a
different pair of decay products to define the red plane. As a result,
one obtains three distinct polarimeter vector {fields~\(\vec\alpha\),}
associated with the {\(K^{**}\),} {\(\varLambda^{**}\),} and
{\(\varDelta^{**}\)~subsystems.} However, the polarised intensity as
given in
Equation~\eqref{eq-polarised-intensity-from-aligned-polarimeter-vector},
remains invariant under this choice, owing to the
{rotation~\(\mathbfit{R}\)} into the decay plane.

Figure~\ref{fig-polarimeter-vector-fields} shows these three aligned
polarimeter vector fields over the Dalitz plane as computed from the
default amplitude model. The diagram in the upper right shows the decay
plane in the center-of-mass frame {of~\(\varLambda_c\)} and the red
arrow highlights subsystem to which the vector field has been aligned.
The {\(\alpha_x\)~component} of the field is projected onto the vertical
axis of the plot and the {\(\alpha_z\)~component} is projected onto the
horizontal axis. The {\(y\)~component} of the vector field is of less
interest, as the {\(y\)~axis} points out of the decay plane (see
Figure~\ref{fig-rotation-angles}). The colours of the vectors indicate
their length.

The shaded areas indicate where each of the subsystems contribute for
more than 70\% to the intensity (some regions overlap due to
interference). One would expect that the vector field points in the
{\(z\)~direction} in regions where the subsystem to which the vector
field has been aligned, dominates. However, it is difficult to determine
whether the vector field consistently points in a single direction, even
in those regions.

\begin{figure}

\begin{minipage}{\linewidth}
{\includegraphics[width=0.85\linewidth,height=\textheight,keepaspectratio]{index_files/mediabag/images/chapter7/polarimeter-vector-field-K.pdf}}\end{minipage}%
\newline
\begin{minipage}{0.50\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimeter-vector-field-L.pdf}}}\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimeter-vector-field-D.pdf}}}\end{minipage}%

\caption{\label{fig-polarimeter-vector-fields}Visualisation of the
aligned polarimeter vector {field~\(\vec{\alpha}\)} over the Dalitz
plane for three reference subsystems. The upper right corner of each
plot indicates the subsystem to which \(\vec{\alpha}\) has been aligned,
with \(\vec{\alpha}\) aligned to the {\(K^{**}\)~subsystem} (top), to
the {\(\varLambda^{**}\)~subsystem} (lower left), and to the
{\(\varDelta^{**}\)~subsystem} (lower right). The direction of the field
vectors indicates the projection of the \(\alpha_x\) and
{\(\alpha_z\)~component} {of~\(\vec{\alpha}\),} with the colour
indicating its magnitude. The shaded regions indicate where the
subsystem dominates, for instance, where
\(I_{\varLambda^{**}}(\tau) / I_0(\tau) > 70\%\).}

\end{figure}%

The polarimeter vector field does behave consistently when we evaluate
it for each of the resonances individually (by setting the couplings of
other amplitudes to zero).
Figure~\ref{fig-polarimeter-vector-field-per-resonance} shows the
polarimeter vector field for each resonance, using the corresponding
subsystem as reference for alignment. In almost each case, the vector
field aligns perfectly to the {\(z\)~axis} of the decay plane (that is,
in the direction of the resonance). For the \(\varLambda^{**}\) and
{\(\varDelta^{**}\)~subsystems,} this is because their recoil particle
is a spin-zero meson, so that all spin information is transferred to the
resonance. For the {\(K^{**}\)~subsystem,} the vector field only aligns
with the {\(z\)~axis} in the case of the scalar mesons
\href{https://pdglive.lbl.gov/Particle.action?init=0&node=M174&home=MXXX020}{\(K_0^*(700)\)}
and
\href{https://pdglive.lbl.gov/Particle.action?init=0&node=M019&home=MXXX020}{\(K_0^*(1430)\)}.
For the
{\href{https://pdglive.lbl.gov/Particle.action?init=0&node=M018&home=MXXX020}{\(K^*(892)\)}~resonance,}
the polarimeter field does not align, because it is a vector meson.

When the polarimeter vector field aligns consistently for a specific
resonance and its recoil, we essentially have the situation sketched in
Figure~\ref{fig-asymmetry}. The modulus of the averaged polarimeter
vector from Equation~\eqref{eq-averaged-polarimeter-vector} is indicated
in the top right of
Figure~\ref{fig-polarimeter-vector-field-per-resonance}. The value is
characteristic to that resonance and its recoil and indicates the
strength of the forward--backward asymmetry in the decay via
Equation~\eqref{eq-two-body-asymmetry}.

\begin{figure}

\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/sub-polarimeters-K.pdf}}}\end{minipage}%
\newline
\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/sub-polarimeters-L.pdf}}}\end{minipage}%
\newline
\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/sub-polarimeters-D.pdf}}}\end{minipage}%

\caption{\label{fig-polarimeter-vector-field-per-resonance}Polarimeter
vector field \(\vec{\alpha}\) for each resonance, aligned to the
corresponding subsystem. The modulus of the averaged polarimeter vector
is indicated on the top right.}

\end{figure}%

\subsubsection{Uncertainty
propagation}\label{sec-uncertainty-propagation}

Since the computed polarimeter vector field is intended to be used in
other analysis, we also propagated uncertainties over the Dalitz plane.
We investigated three types of uncertainties: statistical uncertainties
that are related to the size of the data sample of the original study,
systematic uncertainties that are related to detector effects, and model
uncertainties that come from the alternative model hypotheses in the
performed amplitude analysis.

We grouped the systematic and statistical uncertainties together by
evaluating the default model of over a Gaussian-distributed sample of
\textbf{100~parameter sets} generated from the published fit parameters
with their uncertainties taken as the standard deviation. The vector
field is computed over a {\(100\!\times\!100\)~\textbf{grid}} over the
Dalitz plane that encapsulates the kinematically allowed region. In each
point on the grid, the standard deviation over those 100~model
evaluations is then taken as the combined statistical and systematic
uncertainty of the polarimeter field. Similarly, to propagate the model
uncertainties, we evaluated the polarimeter vector field all the
\textbf{18~amplitude models} from~{[}\citeproc{ref-LHCb:2022sck}{264}{]}
but take the extrema of the deviations rather than their standard
deviation.

It is difficult to visualise the uncertainties of the polarimeter vector
field over the Dalitz plane. We found that the best representation is
given by the norm
\(\left|\vec{\alpha}^{(i)}-\vec{\alpha}^\text{default}\right|\) of the
discrepancy between the default {model~\(\vec{\alpha}^\text{default}\)}
and the alternative {models~\(\vec{\alpha}^{(i)}\),} as well as the
angle~\(\theta^{(i)}\) and solid {angle~\(\delta\Omega^{(i)}\)} between
the two vectors,

\[
\begin{aligned}
\delta\Omega^{(i)} \;&=\;
  \int_0^{2\pi}
  \int_0^\pi
  \mathrm{d}\phi\mathrm{d}\cos\theta
= 2\pi\left(1-\cos\theta^{(i)}\right)
\,, \\
\cos\theta^{(i)} \;&=\; \frac{
  \vec{\alpha}^{(i)} \cdot \vec{\alpha}^\text{default}
}{
  \left|\vec{\alpha}^{(i)}\right| \, \left|\vec{\alpha}^\text{default}\right|
}
\,.
\end{aligned}
\]

\begin{figure}[b!]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimeter-norm-angle-definitions.pdf}}

}

\caption{\label{fig-polarimeter-angle-norm-definition}Definition of the
solid {angle~\(\color{MyRed}\delta\Omega\),}
{angle~\(\color{MyRed}\theta^{(i)}\),} and norm of the discrepancy
between the polarimeter vector of the default
{model~\(\color{MyBlue}\vec{\alpha}^\text{default}\)} and the
alternative {models~\(\color{MyBlue}\vec{\alpha}^{(i)}\).}}

\end{figure}%

Figure~\ref{fig-polarimeter-angle-norm-definition} illustrates how the
discrepancy norm and \(\delta\Omega\) are defined. In the left panels of
Figure~\ref{fig-polarimeter-angle-norm-uncertainties}, the observable of
interest (e.g.~the solid {angle~\(\delta\Omega\))} is evaluated across
the Gaussian-distributed sample of 100~parameter sets, and the pointwise
standard deviation on the Dalitz plane is taken as the combined
uncertainty. The right panels apply the same procedure, but evaluate the
observable across all 18~amplitude models. In this case, the maximum
deviation at each point is taken as the model uncertainty. The plots
demonstrate that the direction of the vector fields is stable under all
sources of uncertainty (small deviations {in~\(\delta\Omega\)),} whereas
the magnitude can fluctuate substantially in regions where the intensity
is low (see Figure~\ref{fig-lambda-c-intensity-comparison}).

\begin{figure}[t!]

\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-field-norm-uncertainties.pdf}}}\end{minipage}%
\newline
\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-field-angle-uncertainties.pdf}}}\end{minipage}%

\caption{\label{fig-polarimeter-angle-norm-uncertainties}Systematic and
statistical uncertainties (left) and model uncertainties (right) of the
polarimeter vector field \(\vec{\alpha}\). Top row: norm of the
discrepancy between the default {model~\(\vec{\alpha}^\text{default}\)}
and the alternative {models~\(\vec{\alpha}^{(i)}\).} Lower row: the
solid {angle~\(\delta\Omega\)} between \(\vec{\alpha}^\text{default}\)
{and~\(\vec{\alpha}^{(i)}\).}}

\end{figure}%

\subsubsection{Averaged polarimeter
vector}\label{averaged-polarimeter-vector}

The uncertainties were also propagated for the averaged polarimeter
vector from Equation~\eqref{eq-averaged-polarimeter-vector}. In
cartesian coordinates, the polarimeter vector with its uncertainties
\href{https://lc2pkpi-polarimetry.docs.cern.ch/uncertainties.html}{are}

\begin{equation}\phantomsection\label{eq-averaged-polarimeter-vector-values}{
\begin{aligned}
\overline{\alpha_x}            \;&=\; \left( -62.6\pm  4.5_{-14.8}^{+8.4} \right) \times 10^{-3} \\
\overline{\alpha_y}            \;&=\; \left(  +8.9\pm  8.9_{-12.7}^{+9.1} \right) \times 10^{-3} \\
\overline{\alpha_z}            \;&=\; \left(-278.0\pm 23.7_{-40.4}^{+12.6}\right) \times 10^{-3} \\
\overline{\left|\alpha\right|} \;&=\; \left( 669.4\pm  9.3_{-10.4}^{+15.3}\right) \times 10^{-3}
\,.
\end{aligned}
}\end{equation}

The uncertainties in the averaged polarimeter vector also reflect that
the direction of the vector field is quite insensitive to the
uncertainties, while the magnitude of the vector field can vary
significantly in regions where the intensity is low. This can be clearly
seen in polar coordinates, the averaged polarimeter vector and its
uncertainties are

\[
\begin{aligned}
\left|\overline{\alpha}\right| \;&=\; \left(+285.1 \pm 24.0_{-13.8}^{+37.9}\right) \times 10^{-3} \\
\theta\left(\overline{\alpha}\right) \;&=\; +2.92 \pm 0.01_{-0.04}^{+0.05}\;\mathrm{rad} \\
\;&=\; \left(+0.929 \pm 0.002_{-0.011}^{+0.017}\right) \times \pi \\
\phi\left(\overline{\alpha}\right) \;&=\; +3.00 \pm 0.14_{-0.09}^{+0.21}\;\mathrm{rad} \\
\;&=\; \left(+0.955 \pm 0.045_{-0.028}^{+0.067}\right) \times \pi
\,,
\end{aligned}
\]

\noindent where we have used the general transformation for a
vector~\(\vec{v}\) to its polar-coordinate angles,

\[
\begin{aligned}
\theta(\vec{v}) \;&=\; \arccos\left(v_z \, \big/ \left|\vec{v}\right|\right) \\
\phi(\vec{v}) \;&=\; \pi - \mathrm{atan2}\left(v_y, {-}v_x\right)
\,.
\end{aligned}
\]

\noindent Note that \(\overline{\left|\alpha\right|}\) is the average of
the norm of the polarimeter vector field, while
\(\left|\overline{\alpha}\right|\) is the norm of the averaged
polarimeter vector field.

Figure~\ref{fig-polarimeter-averaged-vector-distribution} shows the
distribution of the averaged polarimeter vector
{field~\(\overline{\alpha}\)} over the
\hyperref[sec-uncertainty-propagation]{100~parameter samples and the
18~amplitude models}. The distribution shows that there is a certain
correlation, or at least an upper bound, to the statistical and
systematic uncertainties. This is related to the fact that the
individual contributions from the resonances to the vector field are
aligned, as can be seen in
Figure~\ref{fig-polarimeter-vector-field-per-resonance}, which results
in a slight correlation.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/polarimetry-correlations.pdf}}}

}

\caption{\label{fig-polarimeter-averaged-vector-distribution}Distribution
of the computed averaged polarimeter {vector~\(\overline{\alpha}\)} in
polar coordinates over the bootstrap sample of 100~parameter sets and
the 18~amplitude models.}

\end{figure}%

\subsection{Verification of CAS-assisted model
building}\label{verification-of-cas-assisted-model-building}

The formulation of \(\vec{\alpha}\) from the transition amplitudes was
powered by the fact that the amplitude models were formulated
symbolically for each reference subsystem, which allowed to easily
reorder the terms using the CAS. The symbolic amplitude models were
\href{https://lc2pkpi-polarimetry.docs.cern.ch/amplitude-model.html}{directly
rendered} along with the code using the self-documenting workflow
described in Section~\ref{sec-self-documenting}. In addition, the
symbolic vector fields could directly be expressed as array-oriented
code that could efficiently handle the evaluation of the
three-dimensional vector fields, showing that the approach can be used
for more than intensity evaluation in an amplitude analysis.

We found that JAX was the fastest computational backend, enabling us to
propagate both systematic and statistical uncertainties for the entire
analysis within an hour. All documentation and results on
{\href{https://lc2pkpi-polarimetry.docs.cern.ch}{lc2pkpi-polarimetry.docs.cern.ch}}
were produced through continuous-integration (CI) pipelines, which
demonstrates that the self-documenting workflow was both robust and fast
enough for high-performance computations, even on low-performance CI
machines. The use of an array-oriented computational library further
simplified the evaluation of statistical uncertainties, since the models
could be applied directly to the sample of 100~parameter sets and
computed over the Monte Carlo-generated phase space in a single
broadcasted operation (Section~\ref{sec-code-conciseness}).

Finally, since the amplitude models were formulated using packages from
the ComPWA project described in Chapter~\ref{sec-compwa}, the
cross-check described in Section~\ref{sec-computed-polarimeter} verified
that the amplitude models formulated with these packages were consistent
with the amplitude models used in {[}\citeproc{ref-LHCb:2022sck}{264}{]}
and the Julia implementation of the default
model~{[}\citeproc{ref-Mikhasenko:2022xyz}{265}{]}.

\subsection{Polarisation
determination}\label{polarisation-determination}

For the \hyperref[sec-uncertainty-propagation]{uncertainty propagation},
the polarimeter vector fields were evaluated over a
{\(100\!\times\!100\)~grid} for each of the 18~models as well as the
100~parameter samples. The results are
\href{https://lc2pkpi-polarimetry.docs.cern.ch/uncertainties.html\#exported-distributions}{exported
as JSON files}, so that they can be reused in other analyses using for
instance
Equation~\eqref{eq-polarised-intensity-from-aligned-polarimeter-vector}
or Equation~\eqref{eq-b-to-lambda-c-lambda-c-k}. In this section, we use
the framework to determine the polarisation of the \(\varLambda_c^+\) in
a toy study using an interpolation over the exported grids.

At first, using
Equation~\eqref{eq-polarised-intensity-from-aligned-polarimeter-vector},
we generate a toy-data sample for the \(\varLambda_c^+ \to p K^- \pi^+\)
decay including polarisation of the {decaying \(\varLambda_c^+\),} and
take that as a measured {distribution~\(I\).} As a test value
{for~\(\vec{P}\),} we take the {polarisation~\(\vec{P}^0\)} that was
determined by LHCb~{[}\citeproc{ref-LHCb:2022sck}{264, p.~11}{]}. These
values are, with their reported model uncertainties,

\[
\begin{aligned}
P^0_x \;&=\; +21.65 \pm 0.36 \\
P^0_y \;&=\;  +1.08 \pm 0.09 \\
P^0_z \;&=\;  -66.5 \pm 1.1  \,,
\end{aligned}
\]

\noindent where the values are given in percentage (\(\%\)). Next, we
reuse the exported {\(100\!\times\!100\)~grids} to interpolate the
polarimeter vector field \(\vec{\alpha}\) as well as the unpolarised
intensity \(I_0\) over the generated phase space sample. A
gradient-descent algorithm with Minuit2 is then applied to find the most
optimal value for \(\vec{P}\) such that the computed distribution of
\(I\) in
Equation~\eqref{eq-polarised-intensity-from-aligned-polarimeter-vector}
matches the generated distribution best. As a starting guess value, we
take \(\vec{P} = (+0.3, -0.3, +0.4)\). The fit is repeated for each of
the 18~models in order to obtain model uncertainties. The resulting
value for the default model, along with the model uncertainties are (in
\(\%\))

\begin{equation}\phantomsection\label{eq-polarimeter-vector-field-fit-values}{
\begin{aligned}
P_x \;&=\; +21.65_{-0.62}^{+0.30} \\
P_y \;&=\;  +1.08_{-0.05}^{+0.02} \\
P_z \;&=\; -66.50_{-0.85}^{+1.66} \\
\end{aligned}
}\end{equation}

\noindent This is consistent with the model uncertainties reported for
\(\vec{P}^0\).

The same fit procedure was carried out using the \emph{averaged}
polarimeter vector values from
Equation~\eqref{eq-averaged-polarimeter-vector-values} in
Equation~\eqref{eq-polarised-intensity-from-averaged-polarimeter-vector}.
Again, the uncertainties were determined as extrema over the averaged
polarimeter vector field values of each model, resulting in

\begin{equation}\phantomsection\label{eq-averaged-polarimeter-vector-fit-values}{
\begin{aligned}
P_x \;&=\; +20.32_{-2.44}^{+1.04} \\
P_y \;&=\;  -0.26_{-0.08}^{+0.17} \\
P_z \;&=\; -66.14_{-3.32}^{+7.91}\,. \\
\end{aligned}
}\end{equation}

This fit is faster, because there is no need to interpolate values for a
vector field from the grid samples. However, the uncertainties are a
factor 3.5--4.8 larger than when using the polarimeter vector field
(Equation~\eqref{eq-polarimeter-vector-field-fit-values}). This is
consistent with the increase in uncertainty when working with scalar
polarisation sensitivity~{[}\citeproc{ref-Davier:1992nw}{261}{]}. By
defining

\[
\begin{aligned}
S_0^2 \;&=\;
  3 \left.
    \int I_0 \left|\vec{\alpha}\right|^2 \mathrm{d}^{(n)} \tau
    \,\middle/\,
    \int I_0\,\mathrm{d}^{(n)} \tau
  \right. \\
\overline{S}_0^2 \;&=\;
  3\left(\overline{\alpha}_x^2+\overline{\alpha}_y^2+\overline{\alpha}_z^2\right)
\,,
\end{aligned}
\]

\noindent it can be shown that the increase in uncertainty is in the
order of at least \(S_0 / \overline{S}_0 \approx 3\). Here, \(S_0\)
quantifies the effective polarisation sensitivity from the full
polarimeter vector field averaged over phase space, while
\(\overline{S}_0\) gives the corresponding sensitivity when this field
is replaced by its averaged vector.

\begin{figure}[b!]

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/lc2pkpi-ls-difference.pdf}}

}

\caption{\label{fig-lc2pkpi-ls-difference-pdf}Relative intensity
difference between the default model for
\(\varLambda_c^+ \to p K^- \pi^+\) in the helicity basis and the same
model in {\(LS\)~basis.} The intensities of the LS~model are normalised
by divided by the sum of the intensities of the default model. For each
point of the Dalitz plane, the difference between these normalised
intensities is computed and divided over the maximum intensity value of
the default model.}

\end{figure}%

\subsection{Relevance to ComPWA
project}\label{relevance-to-compwa-project}

The polarimetry study served as a test for the methodologies described
in Chapter~\ref{sec-computational-techniques}. Formulating the
amplitudes symbolically allowed us to rearrange terms with the CAS and
derive explicit expressions {for~\(\vec{\alpha}\).} From these, we
generated JAX code that could evaluate the vector field efficiently,
both on dense grids (e.g.~{\(1000\!\times\!1000\)~points} on the Dalitz
plane for visualisations) and across a large number of bootstrap
samples. The bootstraps were efficiently handled in parallel by
broadcasting parameter arrays with 100~elements against a Monte
Carlo-generated phase space sample with 100,000~events. Finally, both
numerical results as well as the mathematical formulations were directly
published on
{\href{https://lc2pkpi-polarimetry.docs.cern.ch}{lc2pkpi-polarimetry.docs.cern.ch}}
using the self-documenting workflow described in
Section~\ref{sec-self-documenting} as the analysis progressed. All the
results are fully reproducible and are further developed on
\href{https://github.com/ComPWA/polarimetry}{github.com/ComPWA/polarimetry}.

Importantly, the aligned amplitudes and intensities were formulated with
the \hyperref[sec-ampform-dpd]{AmpForm-DPD} package, so this analysis
also served as a validation of the implemented physics. A cross-check
against the results from LHCb~{[}\citeproc{ref-LHCb:2022sck}{264}{]} as
well as a comparison with the Julia implementation confirmed that the
numerical code is consistent to floating-point precision across all
amplitude models of the original LHCb analysis. Moreover, while the
default amplitude model was formulated in the helicity basis, one of the
alternative models employed the canonical {\(LS\)~basis}. As shown in
{Figure~\ref{fig-lc2pkpi-ls-difference-pdf}}, the two bases differ by at
most 3\% relative to the maximum intensity over the Dalitz plane. The
polarimetry analysis therefore proves that the symbolic implementation
of the DPD method works correctly in both bases and can be commonly used
in future analyses.

\section{Spin alignment tests with \texorpdfstring{$J/\psi \to \bar{p} K^0_S \varSigma^+$}{𝐽/𝜓 → p̄𝐾⁰𝛴⁺}} \label{sec-jpsi-to-pbar-k-sigma}

The BESIII collaboration has carried out an investigative amplitude
analysis of the decay \({J/\psi \to \bar{p} K^0_S \varSigma^+}\) using
the standard helicity
formalism~{[}\citeproc{ref-Richman:1984gh}{149}--\citeproc{ref-Kutschke:1996-AngularDistributionCookbook}{151}{]}.
This analysis, documented in the PhD thesis of
Wollenberg~{[}\citeproc{ref-Wollenberg:2024}{73}{]}, employed the
original AmpForm
implementation~{[}\citeproc{ref-ComPWA-AmpForm-v0.15.9}{229}{]}, which
did not account for interference between different subsystems. In the
present work, we reimplemented the same amplitude model with spin
alignment using the DPD method and performed new fits to assess its
impact on both fit quality and decay rates.

\subsection{Data and event selection}\label{sec-jpsi-data}

The same data set as in the investigative amplitude analysis was used
for this study. In total, \((10,087 \pm 44) \times 10^6\)
{\(e^+e^- \to J/\psi\) events} (about 10~billion) were collected with
the BESIII detector between 2009 and
2019~{[}\citeproc{ref-BESIII:2021cxx}{266}{]}. From this sample, the
decay channel \(J/\psi \to \bar{p} K^0_S \varSigma^+\) and its
charge-conjugate counterpart,
\(J/\psi \to p K^0_S \overline{\varSigma}^-\), were selected and
reconstructed~{[}\citeproc{ref-Wollenberg-BAM:2022}{267};
\citeproc{ref-BESIII:2023sus}{268};
\citeproc{ref-Wollenberg:2024}{73}{]}. Here, we summarise only the main
steps of the event selection.

In this decay, the {\(\varSigma^+\)~baryon} and {\(K^0_S\)~meson} are
unstable and have to be reconstructed from their decay products. In the
analysis, these particles were reconstructed using their dominant decay
channel, as shown in Figure~\ref{fig-jpsi-reconstruction-scheme}. The
\(K^0_S\) was reconstructed from its decay into two charged pions, while
the \(\varSigma^+\) was reconstructed from its decay into a
{proton~\(p\)} and neutral {pion~\(\pi^0\).} The neutral pion cannot be
detected directly and was reconstructed from its decay into two
{photons,~\(\gamma\gamma\).}

\begin{figure}

\centering{

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/jpsi-reconstruction-scheme.pdf}}

}

\caption{\label{fig-jpsi-reconstruction-scheme}Reconstruction of the
decay \(J/\psi \to \bar{p} \varSigma^+ K^0_S\). Detected particles are
shown in blue, while the unstable particles that have to be
reconstructed are shown in yellow.}

\end{figure}%

All in all, the final state of detected particles is
\(p \bar{p} \pi^+ \pi^- \gamma\gamma\). Apart from the photons, these
are all distinct, easily identifiable particles, which makes event
selection relatively easy. The first selection criteria are therefore
four charged tracks with net charge~\(0\) and at least two photons.
Other typical requirements that were applied, are motivated by the
BESIII detector geometry. {A~\(\left|\cos\theta\right|<0.93\)} cut is
applied on the polar {angle~\(\theta\),} to select tracks inside the
acceptance range of the MDC.

The reconstructed vertex of the prompt proton (or antiproton) is
required to be close to the interaction point, within a cylindrical
volume around the interaction point with radius
\(\left|V_{xy}\right|<1\text{ cm}\) and
\(\left|V_z\right|<10\text{ cm}\) along the direction of the beam. The
vertex of the secondary proton (antiproton) that originates from the
\(\varSigma^+\) (\(\overline{\varSigma}^-\)) may not be \(20\text{ cm}\)
away from the interaction point due to the short lifetime of the
\(\varSigma\) baryon, but no cuts are applied in the {\(xy\)~plane.}
Protons were distinguished from kaons and pions using information from
the TOF sub-detector and the energy loss profile from the MDC. Tracks
that have a higher probability of a kaon or pion hypothesis are rejected
(\(\mathcal{P}(p)>\mathcal{P}(K)\) and
\(\mathcal{P}(p)>\mathcal{P}(\pi)\)).

Photons candidates from the \(\pi^0\) decay are required to have an
energy of at least \(50\text{ MeV}\) if they are detected in the endcaps
of the EMC, at \(0.86<\left|\cos\theta\right|<0.92\), and at least
\(25\text{ MeV}\) if they are detected in the barrel part of the EMC, at
\(\left|\cos\theta\right|<0.8\). Photons are only selected if they are
recorded \(700\text{ ns}\) after the collision to suppress electronic
noise. Furthermore, photons that are at an angle of less than
\(20^\circ\) with respect to any charged track are rejected to suppress
split-offs from those charged tracks.

Since only four charged particles are selected with a net-zero charge,
and the proton and antiproton are already identified, no particle
identification is required for the remaining two charged tracks. The
remaining pions cannot be kaons, because that hardly leaves any phase
space and violates strangeness conservation. Both pions should originate
from short-lived {\(K^0_S\)~mesons,} so the pions are required to be
close to the interaction point, at \(\left|V_z\right|<20\text{ cm}\). A
secondary vertex fit is applied to the charged pion pair, which yields a
distance \(L(K^0_S)\) between the primary and secondary vertex (decay
length), with an uncertainty \(\sigma_L\). Only pion pairs with
\(\sigma_L<\tfrac{1}{2}L(K^0_S)\) are selected.

The four-momenta of the short-lived and neutral particles are
reconstructed by summing the four-momenta of their decay products, after
which additional selection cuts are applied to enhance the
signal-to-background ratio. For amplitude analyses, an important step is
to fit the measured four-momenta to a kinematic hypothesis. In this
decay channel, a \textbf{7C~kinematic fit} is performed, imposing seven
constraints: the total four-momentum of all selected particles must
equal that of the initial \(e^+e^- \to J/\psi\) system in the lab frame,
the invariant mass of the two photons must match the {\(\pi^0\)~mass,}
the invariant mass of the (anti)proton with the
{reconstructed~\(\pi^0\)} must match the {\(\varSigma^+\)~mass,} and the
invariant mass of the charged pion pair must match the {\(K^0_S\)~mass.}
If multiple combinations are possible, the candidate with the lowest
reduced chi-square value, {\(\chi^2/\mathrm{n.d.f.}\),} is chosen. Only
events with a {\(\chi^2/\mathrm{n.d.f.}\)~value} of less than~100 are
retained.

In parallel, three Monte Carlo~(MC) samples were generated:
a~\textbf{signal} sample containing only events with the decay topology
shown in Figure~\ref{fig-jpsi-reconstruction-scheme},
a~\textbf{background} sample including all known {\(J/\psi\)~decays,}
and a \textbf{phase-space} sample in which the three-body final state is
distributed uniformly over the available phase space. A~total of
{\(4\times10^6\)~events} were generated for the signal sample, and
{\(8.9\times10^9\)~events} for the background sample, which roughly
matches the size of the full data set. The initial
{\(e^+e^-\)~collision} was simulated with the KKMC event generator to
account for initial-state radiation, while the subsequent decays were
modelled with
\href{https://evtgen.hepforge.org}{\texttt{EvtGen}}~{[}\citeproc{ref-Ping:2008zz}{269}{]}
using the world-average branching fractions from the Review of Particle
Physics~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}.

The signal sample was used to determine the reconstruction efficiency of
the decay in the branching fraction measurements, in the case of the
background sample. The phase-space sample served to correct the data
sample for detector efficiency by reweighting the fit model from the
investigative amplitude analysis. The background sample provided
estimates of the background distributions. To suppress events with
\(\varLambda\) or \(\eta\) in the final states, two additional cuts were
applied. Stricter cuts did not significantly reduce the remaining
background contributions but did lower the overall event yield. By
comparing the number of selected events in the data set with those in
the background sample, it was estimated that about 94\% of the selected
events are genuine signal events and about 6\% are irreducible
background contributions~{[}\citeproc{ref-Wollenberg:2024}{73, §6.1}{]}.

After applying all selection criteria, a total of {\(122\,664\)
measured} BESIII events remained in the data sample, while the
detector-corrected phase-space sample consisted of
{\(609\,796\)~events.} Each event consists of three four-momenta that
sum to the four-momentum of the {\(J/\psi\)~system} in the lab frame, as
ensured by the final 7C kinematic fit. The phase-space sample is about
five times larger than the data sample, which provides sufficient
statistics for normalisation, since no narrow structures are present in
the distributions of its kinematic degrees of freedom.

\subsection{Original amplitude
model}\label{sec-original-amplitude-model}

As noted in the beginning of this section, no spin alignment was
considered in this investigative amplitude analysis, as it was used for
the determination of the reconstruction efficiency correction. The
intensity function is therefore taken to be a simple incoherent sum over
the amplitudes for each helicity in the initial and final state (barring
helicity~0 for the \(J/\psi\), as it is produced from
\(e^+e^-\)~collisions, through a virtual photon). Notating the subsystem
\(N^*\to K^0_S\varSigma^+\) as \((2)\) and
\(\varSigma^*\to \bar{p}K^0_S\) as \((3)\) as in
Figure~\ref{fig-jpsi-subsystem-definition}, the fitted intensity
function is

\begin{equation}\phantomsection\label{eq-ampform-intensity}{
\begin{aligned} &
I\left(\sigma_{(2)},\sigma_{(3)}; \Omega_{(2)},\Omega^{(2)}_{\varSigma^+},\dots\right) \;= \\ &
  \qquad
  \sum_{\lambda_{J/\psi}\in\{-1,+1\}}
  \sum_{\lambda_{\bar{p}}=-1/2}^{+1/2}
  \sum_{\lambda_{\varSigma^+}=-1/2}^{+1/2}
  \left|
    A^{(2)}_{\lambda_{J/\psi}\lambda_{\bar{p}}\lambda_{\varSigma^+}} +
    A^{(3)}_{\lambda_{J/\psi}\lambda_{\bar{p}}\lambda_{\varSigma^+}}
  \right|^2 \,,
\end{aligned}
}\end{equation}

\noindent with amplitudes of the form (taking {subsystem~\((3)\)} as an
example),

\begin{equation}\phantomsection\label{eq-ampform-amplitudes}{
\begin{aligned} &
  A^{(3)}_{\lambda_{J/\psi}\lambda_{\bar{p}}\lambda_{\varSigma^+}}
  \!\left(
    {\color{RoyalBlue}\sigma_{(3)}},
    {\color{RoyalBlue}\Omega_{(3)}},
    {\color{RoyalBlue}\Omega^{(3)}_{K^0_S}}
  \right) \;=
\\ & \qquad
  \sum_{\rho\in\left\{\varSigma^*\right\}}
  \sum_{\lambda_r=-J_r}^{+J_r}
    D^{J_{J/\psi}}_{\lambda_{J/\psi},\lambda_r-\lambda_{\varSigma^+}}\!\left({\color{RoyalBlue}\Omega_{(3)}}\right) \;
    D^{J_r}_{\lambda_r,\lambda_{K^0_S}-\lambda_{\bar{p}}}\!\left({\color{RoyalBlue}\Omega^{(3)}_{K^0_S}}\right)
\\ & \qquad\quad\times\,
  \sum_{L,S}
    C^{J_{J/\psi},\lambda_r-\lambda_{\varSigma^+}}_{L,0,S,\lambda_r-\lambda_{\varSigma^+}} \;
    C^{S,\lambda_r-\lambda_{\varSigma^+}}_{J_r,\lambda_r,J_{\varSigma^+},\,\text{-}\lambda_{\varSigma^+}}
\\ & \qquad\quad\times\,
  \sum_{\ell,s}
    C^{J_{\varSigma^*},\lambda_{K^0_S}-\lambda_{\bar{p}}}_{\ell,0,s,\lambda_{K^0_S}-\lambda_{\bar{p}}} \;
    C^{s,\lambda_{K^0_S}-\lambda_{\bar{p}}}_{J_{K^0_S},\lambda_{K^0_S},J_{\bar{p}},\,\text{-}\lambda_{\bar{p}}}
\\ & \qquad\qquad\quad\times\;
  {\color{DarkOrange}c^r_{L,S;\ell,s}} \;
  X^r_{L,S;\ell,s}\!\left(
    {\color{RoyalBlue}\sigma_{(3)}},
    {\color{DarkOrange}m_r},
    {\color{DarkOrange}\Gamma_r}
  \right)\,.
\end{aligned}
}\end{equation}

Here, \(\sigma_{(i)}\) denotes the squared invariant mass of
{subsystem~\((i)\)}, \(\Omega^{(i)}\) denotes the helicity angles for
that subsystem in the rest frame of \(J/\psi\), \(\Omega^{(i)}\) are the
helicity angle of final-state {particle~\(k\)} in the rest frame
{of~\((i)\),} and \(\lambda_k\) is the helicity of particle~\(k\). The
helicity of the spinless {\(K_0^S\)~meson} is {always~\(0\)} and is not
listed in the indices of the amplitudes. This equation is an
implementation of
Equation~\eqref{eq-sequential-decay-amplitude-helicity-formalism}, using
Equation~\eqref{eq-transformation-canonical-helicity} to transform it to
the canonical basis. Scalar factors have been absorbed into a single
complex-valued scalar factor~\(c^r_{L,S;\ell,s}\) for each partial wave
with angular momentum and coupled spin~\(L, S\) for the production
vertex of the intermediate state and \(\ell,s\) for the decay vertex of
the intermediate state (see Figure~\ref{fig-jpsi-subsystem-definition}).
The function~\(X^r_{L,S;\ell,s}\) parametrises the dynamics of the
entire decay chain for {resonance~\(r\)} with {mass~\(m_r\)} and
{width~\(\Gamma_r\).} Optimisable parameters are indicated in orange,
while kinematic variables computed for each event in the data are
indicated in blue.

\begin{figure}

\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/amplitude-subsystem2.pdf}}

\subcaption{\label{}Subsystem \((2)\)}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}

\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/amplitude-subsystem3.pdf}}

\subcaption{\label{}Subsystem \((3)\)}
\end{minipage}%

\caption{\label{fig-jpsi-subsystem-definition}The two subsystems that
the amplitude model in Equation~\eqref{eq-ampform-intensity} defines.
The \(J^{P(C)}\) values of the initial state and final state are shown
in gray.}

\end{figure}%

Several versions of the model were optimised to the data by minimising
an unbinned negative log-likelihood function using gradient descent with
Minuit2 and JAX as the computational backend. The models differed in the
number of included resonances but shared a common parametrisation for
the dynamics {function~\(X\),} formulated in the canonical basis with
angular momentum truncated {at~4.} Each resonance was described by a
Breit--Wigner {function~\(\mathcal{R}_\ell(s)\)} with an
energy-dependent {width~\(\Gamma_\ell(\sigma)\)} over Mandelstam
variable~\(\sigma\), multiplied by two form factors: \(\mathcal{F}_L\)
for the production vertex and \(\mathcal{F}_\ell\) for the decay vertex.
For example, a decay chain
\(A\xrightarrow{L}(r\xrightarrow{\ell}i\,j)\,k\) would be parametrised
as

\[X^r_{L,S;\ell,s}(\sigma_k,m_r,\Gamma_r) \;=\;
  \mathcal{F}_L(\mu_{J/\psi}^2,\sigma_k,\mu_k^2) \;
  \mathcal{R}_\ell\left(\sigma_k,m_r,\Gamma_r\right) \;
  \mathcal{F}_\ell(\sigma_k,\mu_i^2,\mu_j^2) \,,
\]

\noindent with {\(\mu_i\)~the} rest mass of {particle~\(i\).} Each of
the functions is defined as

\[
\begin{aligned}
  \mathcal{R}_\ell\left(\sigma,m_r,\Gamma_r\right) \;&=\;
    \frac{\Gamma_r m_r}{m_r^2 - i m_r \Gamma_\ell\left(\sigma\right) - \sigma} \\
  \Gamma_\ell\left(\sigma\right) \;&=\;
    \frac{\Gamma_r
  \mathcal{F}_\ell\left(\sigma, \mu_i^2, \mu_j^2\right)^2 \rho\left(\sigma\right)}{\mathcal{F}_\ell\left(m_r^2,\mu_i^2,\mu_j^2\right)^2 \rho\left(m_r^2\right)} \\
  \rho\left(\sigma\right) \;&=\;
    \frac{2 \sqrt{q^2\left(\sigma\right)}}{\sqrt{\sigma}} \\
  q^2\left(\sigma\right) \;&=\;
    \frac{\left(\sigma - \left(\mu_i - \mu_j\right)^2\right) \left(\sigma - \left(\mu_i+\mu_j\right)^2\right)}{4\sigma} \,.
\end{aligned}
\]

\noindent Some models contained ``non-resonant'' contributions that were
parametrised without a Breit--Wigner, but with two form factors only.

The final resonance set was determined by iteratively including
resonances and selecting the model with the lowest Akaike information
criterion (AIC) to penalise overfitting. The optimal model (referred to
as the \textbf{non-DPD model} in the following) includes five
{\(\varSigma^*\)~resonances,} one {\(N^*\)~resonance,} and a
non-resonant contribution in the {\(\bar{p}K^0_S\)~subsystem.} In the
reported fit result, the resonance masses were fixed to the mean values
listed in the 2022 Review of Particle Physics of
2022~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}, while the
widths were left free. Production and decay couplings were combined into
a single complex coefficient per amplitude, also treated as a free
parameter, with one coefficient fixed {to~\(1\)} to remove the overall
phase and scaling ambiguity.

The measured data sample is shown in Figure~\ref{fig-jpsi-dalitz-data}
(left) and the optimised non-DPD model is shown in
Figure~\ref{fig-jpsi-dalitz-models}. The right pane in
Figure~\ref{fig-jpsi-dalitz-data} shows the MC-generated,
acceptance-corrected phase space that is used for plotting the intensity
model, which shows that part of the kinematically allowed region is not
covered by the detector. Even without a proper treatment of spin
alignment, the amplitude models describe the data distributions
decently. However, certain structures are not yet well accounted for. In
addition, the decay rates of this
model~{[}\citeproc{ref-Wollenberg:2024}{73, p.~76}{]} were remarkably
high, which might be caused by interference effects (see
Figure~\ref{fig-decay-rates-comparison}, left).

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/jpsi-dalitz-data.pdf}}}

}

\caption{\label{fig-jpsi-dalitz-data}Dalitz-plot visualisation of BESIII
data (left) and acceptance-corrected phase space (right) for the decay
\(J/\psi \to \bar{p} K^0_S \varSigma^+\). The bin values of the phase
space sample have been normalised with regard to the integral over the
data sample. Higher energies in the invariant
~\(K^0_S \varSigma^+\)~mass are limited by the detector acceptance.}

\end{figure}%

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/jpsi-dalitz-models.pdf}}}

}

\caption{\label{fig-jpsi-dalitz-models}Comparison between the non-DPD
model that did not use spin alignment (left) and the DPD model (right).}

\end{figure}%

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/jpsi-dalitz-differences.pdf}}}

}

\caption{\label{fig-jpsi-dalitz-differences}Bin-by-bin differences
between the BESIII data and the non-DPD model of the previous study
(left) and the DPD model (right), relative to each bin uncertainty.}

\end{figure}%

\subsection{Fit result with DPD}\label{fit-result-with-dpd}

For this work, we performed another investigative fit with the same
resonance content, but reformulated it with the DPD
method~{[}\citeproc{ref-JPAC:2019ufm}{157}{]}. The main intensity
function is an aligned version of Equation~\eqref{eq-ampform-intensity},
which contains a {Wigner~\(d\)}-function for each initial and final
state that has spin (three in this case: \(J/\psi\), \(\bar{p}\), and
\(\varSigma^+\)). Using DPD, the unpolarised intensity function of
Equation~\eqref{eq-differential-cross-section-multi-body-unpolarised}
for the decay in Figure~\ref{fig-jpsi-subsystem-definition} becomes

\begin{equation}\phantomsection\label{eq-ampform-dpd-intensity}{
\begin{aligned} &
I\left(\sigma_{(2)},\sigma_{(3)}; \theta_{(2)},\theta^{(2)}_{\varSigma^+},\dots,\zeta^3_{3(3)}\right) \;=\;
  \sum_{\lambda^{\prime}_{J/\psi}=-1}^{+1}
  \sum_{\lambda^{\prime}_{\bar{p}}=-1/2}^{+1/2}
  \sum_{\lambda^{\prime}_{\varSigma^+}=-1/2}^{+1/2}
\\ & \qquad\;
  \left| \,
    \sum_{\lambda_{J/\psi}=-1}^{+1}
    \sum_{\lambda_{\bar{p}}=-1/2}^{+1/2}
    \sum_{\lambda_{\varSigma^+}=-1/2}^{+1/2}
  \right.
\\ & \qquad\qquad\;
  \left.
    A^{(2)}_{\lambda_{J/\psi}\lambda_{\bar{p}}\lambda_{\varSigma^+}}
    \; d^{J_{J/\psi}}_{\lambda^{\prime}_{J/\psi} \lambda_{J/\psi}}\left(\zeta^0_{2(3)}\right)
    \; d^{J_{\bar{p}}}_{\lambda_{\bar{p}} \lambda^{\prime}_{\bar{p}}}\left(\zeta^2_{2(3)}\right)
    \; d^{J_{\varSigma^+}}_{\lambda_{\varSigma^+} \lambda^{\prime}_{\varSigma^+}}\left(\zeta^3_{2(3)}\right)
  \right.
\\ & \qquad\quad +\;
  \left.
    A^{(3)}_{\lambda_{J/\psi}\lambda_{\bar{p}}\lambda_{\varSigma^+}}
    {\color{Gray}
    \; d^{J_{J/\psi}}_{\lambda^{\prime}_{J/\psi} \lambda_{J/\psi}}\left(\zeta^0_{3(3)}\right)
    \; d^{J_{\bar{p}}}_{\lambda_{\bar{p}} \lambda^{\prime}_{\bar{p}}}\left(\zeta^2_{3(3)}\right)
    \; d^{J_{\varSigma^+}}_{\lambda_{\varSigma^+} \lambda^{\prime}_{\varSigma^+}}\left(\zeta^3_{3(3)}\right)
    }
  \vphantom{
    \sum_{\lambda_{J/\psi}=-1}^{+1}
    \sum_{\lambda_{\bar{p}}=-1/2}^{+1/2}
    \sum_{\lambda_{\varSigma^+}=-1/2}^{+1/2}
  }
  \, \right|^2 \,,
\end{aligned}
}\end{equation}

\noindent where \(\zeta^i_{j(k)}\) are additional rotation angles that
can be computed from Mandelstam variables using
Equation~\eqref{eq-dpd-angles}. The Wigner rotations for
{subsystem~\((3)\)} are marked gray, because their corresponding
rotation {angles~\(\zeta^i_{k(k)}\)} are zero. As opposed to
Equation~\eqref{eq-ampform-intensity}, the longitudinal polarisation of
\(J/\psi\) is also summed over, consistently with the derivation in
Equation~\eqref{eq-differential-cross-section-multi-body-unpolarised}.
As an example of one of the amplitudes, the amplitude for
{subsystem~\((3)\)} in Figure~\ref{fig-jpsi-subsystem-definition} is

\begin{equation}\phantomsection\label{eq-ampform-dpd-amplitudes}{
\begin{aligned} &
A^{(3)}_{\lambda_{J/\psi}\lambda_{\bar{p}}\lambda_{\varSigma^+}}
  \left(
    {\color{RoyalBlue}\sigma_{(3)}},
    {\color{RoyalBlue}\theta^{(3)}_{K^0_S}}
  \right) \;=\;
  (-1)^{J_{\varSigma^+}-\lambda_{\varSigma^+}} \;
  (-1)^{J_{\bar{p}}-\lambda_{\bar{p}}}
\\ & \qquad
  \sum_{r\in\left\{\varSigma^*\right\}}
  \sum_{\lambda_r=-J_r}^{+J_r}
  \delta_{\lambda_{J/\psi},\lambda_r-\lambda_{\varSigma^+}} \;
  d^{J_r}_{\lambda_r,\lambda_{K^0_S}-\lambda_{\bar{p}}}\left(
    {\color{RoyalBlue}\theta^{(3)}_{K^0_S}}
  \right)
\\ & \qquad\quad\times\,
  \sum_{L,S}
    C^{J_{J/\psi},\lambda_r-\lambda_{\varSigma^+}}_{L,0,S,\lambda_r-\lambda_{\varSigma^+}} \;
    C^{S,\lambda_r-\lambda_{\varSigma^+}}_{J_r,\lambda_r,J_{\varSigma^+},\,\text{-}\lambda_{\varSigma^+}}
\\ & \qquad\quad\times\,
  \sum_{\ell,s}
    C^{J_{\varSigma^*},\lambda_{K^0_S}-\lambda_{\bar{p}}}_{\ell,0,s,\lambda_{K^0_S}-\lambda_{\bar{p}}} \;
    C^{s,\lambda_{K^0_S}-\lambda_{\bar{p}}}_{J_{K^0_S},\lambda_{K^0_S},J_{\bar{p}},\,\text{-}\lambda_{\bar{p}}}
\\ & \qquad\qquad\quad\times\;
  {\color{DarkOrange}\mathcal{H}^r_{L,S}} \;
  {\color{DarkOrange}\mathcal{H}^r_{\ell,s}} \;
  X^r_{L,S;\ell,s}\left(
    {\color{RoyalBlue}\sigma_{(3)}};
    {\color{DarkOrange}m_r},
    {\color{DarkOrange}\Gamma_r}
  \right)\,.
\end{aligned}
}\end{equation}

There are small differences with the amplitude in
Equation~\eqref{eq-ampform-amplitudes}. There is only one
{Wigner~\(d\)}-function rather than two {Wigner~\(D\)}-functions (the
{Wigner~\(d\)}-function for the production node simplifies to a
Kronecker delta). The single scaling factor \(c^r_{L,S;\ell,s}\) is
replaced by two couplings \(\mathcal{H}^r_{L,S}\) and
\(\mathcal{H}^r_{\ell,s}\), for the production node and the decay node,
respectively.

The same set of resonances and the non-resonant term were retained, but
their masses and widths were fixed to the values reported by the Review
of Particle Physics~{[}\citeproc{ref-ParticleDataGroup:2024cfk}{66}{]}.
We refer to this as a \textbf{coupling-only fit}, which is
computationally efficient because the free parameters enter only as
linear coefficients. In the non-DPD model, production and decay
couplings were combined into a single complex coefficient per partial
wave. In the coupling-only fit, however, only the production couplings
\(\mathcal{H}^r_{L,S}\) were treated as free parameters, with one fixed
to~1 to remove phase and magnitude ambiguities. All decay couplings
\(\mathcal{H}^r_{\ell,s}\) were set to~1. Although this simplification
is not strictly physical, since it removes certain degrees of freedom in
some partial waves, it reduces the parameter space considerably. To
ensure convergence to the global minimum, the fit was repeated 600~times
with randomised initial parameter values, and the solution with the best
likelihood value was selected.

The fitted non-DPD and DPD models across the Dalitz plane are shown in
Figure~\ref{fig-jpsi-dalitz-models}, with the invariant mass of the
\(K^0_S \bar{p}\) {(\(\varSigma^*\))~subsystem} on the vertical axis and
the invariant mass of the \(K^0_S \varSigma^+\) {(\(N^*\))~subsystem} on
the horizontal axis. The two models exhibit no substantial differences
across these kinematic degrees of freedom. A more detailed comparison is
provided in Figure~\ref{fig-jpsi-dalitz-differences}, which shows the
normalised bin-by-bin deviations between each model and the data. These
distributions demonstrate that both models reproduce the data well
within statistical uncertainties across the Dalitz plane.

More pronounced differences appear in one-dimensional projections onto
specific kinematic variables. Figure~\ref{fig-jpsi-dpd-1d} compares the
BESIII data with the fitted DPD model and the original non-DPD model.
The data distributions are shown as transparent blue histograms, while
the acceptance-corrected phase-space distributions are indicated in gray
to highlight where observed structures must arise from dynamics rather
than kinematics. The green and orange histogram outlines represent the
DPD and non-DPD models, respectively, evaluated over the phase-space
sample and normalised to the number of data events. For invariant-mass
and helicity-angle distributions, the resonance contributions of the DPD
model are overlaid as coloured lines in the relevant subsystem. The
upper panels display the bin-by-bin residuals (pulls) between the models
and the data, normalised to the statistical uncertainty of each bin. The
sum of squared pulls, divided by the number of degrees of freedom (bins
minus fitted parameters), defines the reduced
{chi-square~\(\chi^2_\mathrm{red}\)} shown in each plot. Despite having
fewer degrees of freedom, the DPD model consistently achieves a lower
\(\chi^2_\mathrm{red}\) across all projections compared to the non-DPD
model. The {\(\phi\)~distributions} are included for completeness,
although neither model contains explicit \(\phi\)-dependent terms.

\begin{figure}

\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-masses.pdf}}}\end{minipage}%
\newline
\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-theta.pdf}}}\end{minipage}%
\newline
\begin{minipage}{\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-phi.pdf}}}\end{minipage}%

\caption{\label{fig-jpsi-dpd-1d}Comparison between the BESIII data
(blue) for \(J/\psi \to \bar{p} K^0_S \varSigma^+\), the fit of the DPD
model (green), and the original non-DPD model (orange) across nine
kinematic variables. The acceptance-corrected phase-space distribution
is shown in gray. Each panel quotes the reduced chi-square
\(\chi^2_\mathrm{red}\) for both models, computed from the sum of
squared differences between data and model in each bin, normalised to
the statistical uncertainty of the bin. The corresponding residuals
(``pulls'') are shown above each histogram. Thin coloured lines indicate
the resonance contributions of the DPD model in the relevant subsystems
(\(\varSigma^*\) in \(K^0_S\bar{p}\) and \(N^*\)
{in~\(K^0_S\varSigma^+\)).}}

\end{figure}%

An explanation for the fact that the DPD model performs much better can
be found when we investigate the decay-rate matrix of both models.
Figure~\ref{fig-decay-rates-comparison} displays the decay rates per
resonance, obtained by setting all couplings except those of the
resonance under consideration to zero. In the non-DPD model, the decay
rates show large contributions from individual resonances that interfere
destructively to reproduce the data. Despite this cancellation, the
total sum of decay rates still far exceeds~100\%, leading to large
off-diagonal terms in the matrix,
\((I_{ij} - I_i - I_j)/I_\mathrm{tot}\). By contrast, the DPD model does
not rely on strong destructive interference: its decay-rate matrix has a
lower triangle and diagonal that add up consistently to~100\%.

\begin{figure}

\begin{minipage}{0.50\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-resonance-rates-wollenberg.pdf}}}\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-resonance-rates-dpd.pdf}}}\end{minipage}%

\caption{\label{fig-decay-rates-comparison}Decay-rate matrix for non-DPD
model (left) and the correct DPD model (right).}

\end{figure}%

Figure~\ref{fig-sub-intensities-dalitz-wollenberg} shows the model in
the Dalitz plane for each element of the decay-rate matrix in the
non-DPD model (Figure~\ref{fig-decay-rates-comparison}, left). The mass
positions of the relevant resonances are indicated to aid the
interpretation of the interference patterns. Many of the \(\varSigma^*\)
resonances lie above the upper limit of the phase space and contribute
only through their low-mass tails. Interestingly, resonance structures
appear inverted in some of the off-diagonal elements, with the resonance
peak showing a reduced intensity compared to other regions of the Dalitz
plane (most notably for \(\varSigma(1750)\) {and~\(\varSigma(1900)\)).}
This behaviour arises from fully destructive interference between the
corresponding partial waves, which may explain the unusually large fit
fractions obtained in the non-DPD model.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-dalitz-wollenberg.pdf}}}

}

\caption{\label{fig-sub-intensities-dalitz-wollenberg}Sub-intensity
distributions across the Dalitz plane for each element of the decay-rate
matrix in Figure~\ref{fig-decay-rates-comparison} for the non-DPD model.
Axis labels are given in Figure~\ref{fig-jpsi-dalitz-data}. Resonance
mass positions are marked by dashed lines: blue for resonances
associated with the vertical axis and red for those associated with the
horizontal axis. The non-resonant term has no defined mass position.}

\end{figure}%

The DPD model in Figure~\ref{fig-sub-intensities-dalitz-dpd}, on the
other hand, produces interference patterns where resonances from
different subsystems meet, with some intersections showing constructive
and others destructive interference. Moreover, the off-diagonal elements
no longer display the inverted peaks observed in the non-DPD
distributions of Figure~\ref{fig-sub-intensities-dalitz-wollenberg}.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/fit-comparison-dalitz-dpd.pdf}}}

}

\caption{\label{fig-sub-intensities-dalitz-dpd}Sub-intensity
distributions across the Dalitz plane for each element of the decay-rate
matrix in Figure~\ref{fig-decay-rates-comparison} for the DPD model.
Axis labels are given in Figure~\ref{fig-jpsi-dalitz-data}. Resonance
mass positions are marked by dashed lines: blue for resonances
associated with the vertical axis and red for those associated with the
horizontal axis. The non-resonant term has no defined mass position.}

\end{figure}%

For reference, Figure~\ref{fig-decay-rates-per-wave} presents the decay
rates per partial wave for the selected DPD model. Within a given
subsystem, partial waves do not interfere (as indicated by the absence
of non-zero off-diagonal elements in each sub-matrix), whereas
interference is present between subsystems. Strong interference within
the same subsystem is observed only between resonances with identical
quantum numbers, such as \(\varSigma(1750)\), \(\varSigma(1900)\), and
the non-resonant term. This suggests that a more sophisticated
parametrisation of the dynamics is needed to disentangle their
contributions and to properly describe threshold openings.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/decay-rates-wollenberg-dpd.pdf}}}

}

\caption{\label{fig-decay-rates-per-wave}Decay-rate matrix for each
partial wave in the DPD model. The decay rate is similar to that of
Figure~\ref{fig-decay-rates-comparison}, but the sub-intensities are now
computed for each coupling separately.}

\end{figure}%

Further analyses are required to determine whether the selected
resonances in the DPD model have physical significance. As mentioned,
the focus in {[}\citeproc{ref-Wollenberg:2024}{73}{]} was the
determination of the branching fraction of
\(J/\psi \to \bar{p} K^0_S \varSigma^+\), along with a test whether the
infrastructure can converge amplitude models efficiently to the data
sample. The reimplementation with DPD is a first step towards a more
complex amplitude model that includes spin alignment, but a systematic
analysis of the resonance and individual partial-wave contributions,
interference effects, and correlations between the parameters for each
of the different models needs to be performed before any conclusions can
be drawn about the \(N^*\) and {\(\varSigma^*\)~spectrum.}

As a final thought, although the amplitude in
Equation~\eqref{eq-ampform-dpd-amplitudes} carries three helicity
indices, it can be used to construct three polarimeter vector fields
(one for each \(\lambda_{J/\psi}\) in the rest frame) using
Equation~\eqref{eq-aligned-polarimeter-vector}. These polarimeter vector
fields encode the spin correlations of the final-state baryons and thus
carry information about the underlying dynamics. This makes it possible
to relate the study of these three-body decays to the spin-transfer
observables and moment expansions commonly extracted in scattering
experiments (Section~\ref{sec-nucleon-excitations}), in addition to
matching dynamical modelling through pole positions
(Section~\ref{sec-pole-residue-extraction}). Conceptually, the idea is
to reinterpret the recoiling \(\bar{p}\) as being crossed to the initial
state and the \(J/\psi\) as an effective virtual photon via vector meson
dominance, yielding a photo-production process
\(p \gamma^* \to K^0_S \varSigma^+\) (see
Figure~\ref{fig-jpsi-to-scattering}). Furthermore, the decay
\(\varSigma^+\to p\pi^0\) can be used to increase sensitivity to the
polarisation of \(\varSigma^+\). These ideas can be developed further
once the modelling of the dynamics becomes more advanced.

\begin{figure}

\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/jpsi-to-pbar-sigma-k.pdf}}
\end{center}
\end{minipage}%
%
\begin{minipage}{0.50\linewidth}
\begin{center}
\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/p-gamma-to-sigma-k.pdf}}
\end{center}
\end{minipage}%

\caption{\label{fig-jpsi-to-scattering}The three-body decay
\(J/\psi \to \bar{p} K \varSigma\) produced by \(e^+e^-\) (left) and
scattering process \(p \gamma \to K \varSigma\) (right) that are related
through crossing and vector meson dominance. The charges of \(K^0_S\)
and \(\varSigma^+\) are omitted to highlight that the same idea can be
applied to other final states with a \(\bar{p}\), a baryon, and a
meson.}

\end{figure}%

\section{Performance benchmarks}\label{sec-performance-benchmarks}

The analyses described in this section were performed on standard
desktop PCs and laptops. Running on this environment, we found that JAX
is fast enough as a computational backend for the evaluation of the
uncertainties over the polarimeter vector field {of~\(\varLambda_c\)}
(Section~\ref{sec-polarimeter-vector-field}) and the fit of the
amplitude model in the \(J/\psi\) study
(Section~\ref{sec-jpsi-to-pbar-k-sigma}). All notebooks of the
polarimetry study, including appendices, can be run in less than one
hour on a 8-Core AMD Ryzen~7 5800X Processor. The fits for the BESIII
analysis typically take around an hour to converge using Minuit2, while
coupling-only fits over the same data take around 5~minutes.

\subsection{Hardware accelerator
comparison}\label{hardware-accelerator-comparison}

To have an indication of computational performance across different
hardware accelerators, we carried out several fits for the decay channel
\(J/\psi \to \bar{p} K^0_S \varSigma^+\) using the amplitude models of
Equation~\eqref{eq-ampform-dpd-intensity}, which JAX as numerical
backend. The fits were performed on a hit-and-miss--generated data
sample of the same size as that described in
Section~\ref{sec-jpsi-data}, together with a Monte Carlo--generated
phase space sample of equal size to that used in the actual analysis.
Both datasets assumed an ideal detector without efficiency losses. The
data were generated with the same DPD model and parameter values as
reported in Section~\ref{sec-jpsi-to-pbar-k-sigma}. To maximise model
complexity, all parameters were left free except for one coupling, which
was fixed to avoid phase ambiguities.

\begin{itemize}
\tightlist
\item
  Data size: \textbf{180,296}~events
\item
  Phase space: \textbf{609,796}~events
\item
  Model complexity:

  \begin{itemize}
  \tightlist
  \item
    \textbf{82} free parameters: 18~real-valued masses, 32~complex
  \item
    \textbf{2} subsystems: {\(N^*\) and \(\varSigma^*\)}
  \item
    \textbf{9} resonances: {3~\(N^*\)}, {6~\(\varSigma^*\)}
  \item
    \textbf{248} amplitudes: {96~\(N^*\)}, {152~\(\varSigma^*\)}
  \item
    \textbf{405,342} operations in the symbolic expression tree (via
    \href{https://docs.sympy.org/latest/modules/core.html\#sympy.core.basic.Basic.count_ops}{\texttt{sympy.count\_ops()}})
  \end{itemize}
\end{itemize}

Table~\ref{tbl-performance} shows the performance on different hardware
accelerators. Of importance to the comparison is the number of
iterations (function evaluations) per second that Minuit2 performs,
because the fit does not converge to the global minimum. Minuit2
finishes the fit after exactly 34,241~iterations on all devices, even if
the resulting likelihood differs slightly due to floating-point
precision differences. The speed-up is computed with respect to the AMD
Ryzen~7 5800X, which was used to perform the analyses reported in this
chapter.

\begin{longtable}[]{@{}
  >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2818}}
  >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2909}}
  >{\centering\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1455}}
  >{\raggedleft\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1091}}
  >{\centering\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1727}}@{}}
\caption{Performance comparison of the Minuit2 fit of the DPD model for
\(J/\psi \to \bar{p} K^0_S \varSigma^+\) on three types of GPU devices
and two CPU devices. The fit duration includes callbacks that write
current parameter values to disk and the frequency is given by the
number of iterations per second. The standard deviations are determined
by rerunning the entire analysis two to three
times.}\label{tbl-performance}\tabularnewline
\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
Device
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Specifications
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Duration~(s)
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
Speed‑up
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Frequency~(Hz)
\end{minipage} \\
\midrule\noalign{}
\endfirsthead
\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
Device
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Specifications
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Duration~(s)
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
Speed‑up
\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
Frequency~(Hz)
\end{minipage} \\
\midrule\noalign{}
\endhead
\bottomrule\noalign{}
\endlastfoot
A100‑SXM4‑40GB & 19.5~TFLOPS, 400~W & \(280 \pm   3\) & 20x &
\(122 \pm 1\) \\
NVIDIA~L4 & 30.3~TFLOPS, 72~W & \(1\,352 \pm   4\) & 4.2x &
\(25.3 \pm 0.1\) \\
Tesla~T4 & 8.1~TFLOPS, 70~W & \(2\,484 \pm  13\) & 2.2x &
\(13.8 \pm 0.1\) \\
AMD Ryzen~7 5800X & 3.8~GHz, 8‑Core & \(5\,675 \pm 124\) & 1x &
\(6.04 \pm 0.01\) \\
13th Gen Intel i7‑1355U & 2.6~GHz, 6‑Core & \(9\,916 \pm  43\) & 0.6x &
\(3.45 \pm 0.01\) \\
\end{longtable}

Clearly, GPUs have an advantage over CPUs, even with large amplitude
models that have non-linear parametrisations. As described in
Section~\ref{sec-hardware-accelerators}, the reason is that GPUs are
designed to perform many operations in parallel, as long as the
operations are independent and do not contain branching logic. It should
be noted that the analysis could simply be performed on each of these
devices by simply installing
\href{https://docs.jax.dev/en/latest/quickstart.html\#installation}{\texttt{jax{[}cuda12{]}}}.
On the NVIDIA devices we tested, JAX automatically detected the GPU and
could run the analysis without any changes to the codebase.

\subsection{Parallelisation of parameter
space}\label{parallelisation-of-parameter-space}

In each iteration during a gradient-descent optimisation, the likelihood
is evaluated for one set of parameter values. Here, parallelisation on
the hardware devices is achieved by parallelising the evaluation of the
intensity function over the data sample and the phase space sample
(which is used for normalising the intensity function to a
probability-density function). From the simple benchmark presented in
the previous section, fit performance depends on how well hardware
devices parallelise the computation.

A bottleneck in the gradient-descent process is the copy operation to
the optimiser and the decision step that determines the parameter update
for the next iteration. Figure~\ref{fig-evaluation-frequency} shows the
distribution of evaluation frequencies of the likelihood function during
the fits reported in Table~\ref{tbl-performance} for the three GPUs. The
\textbf{frequency} is defined as the inverse of the time required to
complete one iteration. Each iteration consists of one evaluation of the
likelihood function on the hardware accelerator, in addition to the copy
operation and any optimisation logic executed by the optimiser. The
figure reveals two types of iterations: fast iterations, in which the
backend only evaluates and returns the likelihood for a given parameter
set, and slow iterations, in which the optimiser performs additional
optimisation logic. The more performant the GPU, the larger the
frequency gap between these two types of iterations, and the larger the
computational bottleneck, with the NVIDIA A100 showing the largest gap
between the evaluation band (high frequency) and optimisation band
(lower frequency).

\begin{figure}[t!]

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/frequency-distribution.pdf}}}

}

\caption{\label{fig-evaluation-frequency}Distribution of the evaluation
frequency of the likelihood function during the fits performed for
Table~\ref{tbl-performance} on the three GPUs. Indicated in blue is the
duration (frequency in~Hz) of each function call, with each histogram on
the left showing the distribution of the frequencies during the entire
optimisation process. The negative log-likelihood value returned by each
function call is shown in red.}

\end{figure}%

Because of \hyperref[sec-memory-locality]{memory locality}, hardware
accelerators are most efficient when as many operations as possible are
executed on the same device. A gradient-descent optimiser such as
Minuit2 cannot fully exploit this, as it is inherently sequential and
runs in a separate process from the likelihood evaluation. To test how
well parallelism can be used instead, we remove the minimiser and
evaluate the likelihood for fully randomised parameter values directly
on the accelerator. This setup is similar to the uncertainty evaluations
in the polarimetry study and allows many likelihoods to be computed
simultaneously through broadcasting
(Section~\ref{sec-code-conciseness}), keeping the computation entirely
on the device and avoiding copy operations to the CPU until all results
are available.

Figure~\ref{fig-parameter-parallelisation} shows the evaluation time of
the likelihood function in Equation~\eqref{eq-ampform-dpd-intensity} for
100,000 randomly generated production couplings on an AMD Ryzen~7 5800X.
Since it is impossible to process all couplings simultaneously, the
sample was divided into smaller chunks that were passed sequentially to
CPU memory. Different chunk sizes, ranging from~1 to~6,000, were tested
to assess how the total evaluation time depends on the array size that
can be accommodated within the accelerator memory. As shown, filling the
memory with batches of 6,000~couplings yields a speed-up of up to a
factor of~10. The top panel displays the number of likelihood
evaluations (iterations) per second as a function of chunk size; the
middle panel shows the total evaluation time for all 100,000~couplings;
and the bottom panel illustrates the corresponding memory consumption
during the evaluation process. The result suggests that even higher
performance could be achieved with devices offering larger memory
capacity or with more highly parallelised hardware such as GPUs.

\begin{figure}

\centering{

{\pandocbounded{\includegraphics[keepaspectratio]{index_files/mediabag/images/chapter7/parallelisation-parameter-space.pdf}}}

}

\caption{\label{fig-parameter-parallelisation}Performance of the
doubly-parallelised likelihood evaluation of the DPD model in
Equation~\eqref{eq-ampform-dpd-intensity} for \(100\,000\) randomly
generated production couplings on an AMD Ryzen~7 5800X, using JAX
broadcasting over the phase-space and data sample with varying array
sizes (``chunks''). Top: number of coupling combinations (iterations)
evaluated per second. Middle: total time to evaluate the full coupling
sample. Bottom: average memory usage during evaluation, with the red
line marking the 32~GB RAM limit.}

\end{figure}%

This ``doubly-parallelised'' likelihood evaluation keeps all
computations on the hardware accelerator and within its memory. In the
analyses described in this chapter, we used such parallelisation
techniques primarily for fast uncertainty propagation, but it is equally
applicable to likelihood scans. Moreover, whereas traditional
gradient-descent methods such as Minuit2 act as local fitters that
explore the parameter space sequentially around a minimum, this approach
enables the use of inherently parallel global algorithms, such as
particle swarm optimisation or stochastic gradient descent, which
evaluate many parameter configurations simultaneously. In this way, both
local and global strategies can benefit from accelerator memory
locality, which makes amplitude-analysis fits with highly dimensional
parameter spaces more performant.

\bookmarksetup{startatroot}

\chapter{Summary and outlook}\label{summary-and-outlook}

\rehead{\bfseries Chapter~\leftmark}
\lohead{\bfseries Chapter~\leftmark}
\setcounter{tocdepth}{0}
\addtocontents{toc}{\protect\setcounter{tocdepth}{0}}

\newcommand{\paragraphbreak}{\par\bigskip\noindent}

Hadron physics occupies a distinctive place in the study of nature: it
addresses the strongly interacting particles and resonances that make up
the vast majority of the visible universe. Within it, hadron
spectroscopy is concerned with mapping the spectrum of hadronic states
and interpreting their excitations to uncover the principles of the
strong interaction. This pursuit relies on a broad set of methods~--
from lattice QCD, which can make first-principles predictions, to
amplitude analyses, which apply the principles of scattering theory to
disentangle complex experimental data. The latter approach is
particularly challenging and inherently interdisciplinary, as it
requires combining theoretical constraints, precise measurements, and
advanced computational tools. In this context, the present thesis has
focused on baryon spectroscopy~-- particularly the spectrum of nucleon
excitations~-- and has used this domain as a testbed for a new analysis
workflow.

\paragraphbreak For this work, we transferred the original Common
Partial-Wave Analysis (ComPWA) {C++~framework} to the Python programming
language. This opened the door to outsourcing the computations over
amplitude models to modern, array-based libraries such as NumPy, JAX,
and TensorFlow, removing the workload of maintaining low-level code for
numerical evaluation. In addition, these array computing libraries
provide many additional advantages out-of-the-box, including automatic
parallelisation, GPU acceleration, JIT-compilation, and automatic
differentiation.

As a follow-up, we realised that the concept of a function tree around
which the ComPWA framework was built, could be generalised with the use
of a Computer Algebra System (CAS). This led us to completely formulate
amplitude models in terms of symbolic expressions, which the CAS
represents as trees of mathematical operations in the back. These trees
in turn can be used to generate numerical code~-- array-based code in
particular~-- for evaluating the model efficiently over large data
samples.

The switch to a dynamical programming language also enabled more
flexible workflows in the form of Jupyter notebooks and other convenient
development tools. While these tools are ideal for quick prototyping
when exploring specific challenges in an analysis, they naturally evolve
into more general code libraries that can be reused in other analysis
pipelines. In addition, with the combination of CAS-assisted model
building, the mathematical expressions of the implemented amplitude
models can directly visualised in the analysis notebook. Combined with
the latest advancements in data science~-- to render collections of
analysis notebooks themselves in the form of a website or as static
documents~-- this turns the formulation and evaluation of amplitude
models through notebooks into a transparent and self-documenting
workflow.

The transformation of the ComPWA framework has resulted in three main
open-source Python libraries that can be used independently. QRules
encodes quantum number conservation rules, which can be used to quickly
check decay hypotheses and build trees of decay topologies. AmpForm and
its extension Ampform-DPD offer a collection of functions for
formulating amplitude models as symbolic expressions with SymPy, the
most commonly used CAS in the Python ecosystem. And TensorWaves
streamlines the conversion of symbolic models to multiple array-oriented
libraries for fitting the models to large data samples with high
performance. Not only are these Python libraries easily be extended
externally in scripts or extension modules, but the generated symbolic
expressions can be modified algebraically to fit the needs of an
analysis.

\paragraphbreak On the physics level, we focused on a correct
formulation of amplitude models for three-body decays that have a
spinful final state. As discussed, when using the helicity formalism,
transition amplitudes of decay chains with different topological
structures have phase differences that originate from different Lorentz
boost sequences. This work has outlined some of the techniques to deal
with these phase differences. The Dalitz-plot decomposition method has
been implemented in the AmpForm-DPD library.

The new approach has been validated to floating-point precision by
modelling the decay \({\varLambda_c \to p K^- \pi^+}\) and evaluating it
over data from the LHCb experiment. The symbolic workflow with
array-based computations turned out to have another advantage: it
allowed for the computation of a vector field over the Dalitz plane
rather than a conventional intensity model.

Using the same library, we performed the next step in the ongoing
analysis of the decay \({J/\psi \to \bar{p} \varSigma^+ K^0_S}\). The
previous study formulated the amplitude model with the helicity
formalism, but without taking account of spin alignment. A new model
formulated with AmpForm-DPD was fit to the same data sample and resulted
in an improved description of the data distributions. The spin-aligned
model also greatly improved the description of interference between the
different subsystems, resulting in decay rates that better agree with
expectations.

\subsection{Future directions}\label{future-directions}

In the course of this study, we encountered many promising opportunities
to either broaden the application of the devised workflow or enhance its
performance, but these lay beyond the scope of the present thesis. They
can be grouped into two broad categories: advances in computation and
refinements in physics modelling.

\paragraphbreak The use of a Computer Algebra System aligns well with a
field that relies heavily on theoretical modelling. So far, its
immediate benefit has been that implemented amplitude models can be
directly inspected as explicit mathematical expressions and manipulated
symbolically. Beyond this, a CAS may be leveraged to derive parts of the
amplitude models from first principles, rather than constructing them
methodologically. AmpForm already provides a small example: the
Blatt--Weisskopf form factors are derived from Hankel functions instead
of being hard-coded as polynomials. Further possibilities include the
use of SymPy's bra--ket classes to obtain specific linear
representations of states, or symbolic integration and differentiation
to generate parametrisations of the dynamics. A potential drawback is
SymPy's speed, which is typically slower than CAS libraries in other
languages such as Mathematica. This limitation, however, may be
mitigated by serialising and importing pre-derived expressions.

The algebraic features of a CAS may also translate into computational
benefits. For instance, we found that symbolic substitution of fixed
parameters yields modest performance gains by simplifying the expression
trees. Another unexplored avenue would be to algebraically substitute
the DPD angles directly into the {Wigner~\(d\)}-functions, thereby
eliminating many trigonometric functions from the expression tree of the
full amplitude model.

\paragraphbreak In preliminary testing, we found that automatic
differentiation does not apply efficiently to large amplitude models.
Gradient-descent fits with Minuit showed no overall improvement in speed
or stability, and the strong non-linearity of the models leads to very
large function trees that consume substantial memory. This limitation
may stem from the current code-generation strategy: our implementation
relies on SymPy to produce a single numerical function for the entire
model. While numerical frameworks such as JAX or NumPy appear to handle
this well in direct model evaluation, it remains to be investigated
whether such large, single-function representations hinder
differentiation algorithms. If this is the case, code generation would
have to be improved by partitioning the generated function into smaller
definitions that can be differentiated or JIT-compiled separately.

Another challenge is the parallelisation of computations across multiple
devices, such as in a cluster environment. Thus far, we have not
explored this avenue, since all computations and fits could be performed
on a single device~-- a preferable setup due to memory locality. In the
long term, however, growing data volumes may exceed the capacity of
individual devices. Most computational frameworks already provide
mechanisms for distributed computing, as they are designed to train
large neural networks that demand larger amounts of memory. In the case
of JAX, community-maintained extensions such as
\href{https://github.com/mpi4jax/mpi4jax}{\texttt{mpi4jax}} specifically
address this issue.

In the short term, a promising opportunity is to parallelise the
evaluation of amplitude models across parameter space. Traditionally,
amplitude-analysis frameworks reduced fit times by parallelising only
the likelihood evaluation. With array-oriented code, however,
parallelism can be applied just as easily along a second axis: the
parameter space itself. First tests of this ``doubly-parallelised''
model evaluation performed for this work already indicate a twenty-fold
speed-up on simple multithreaded CPU devices. However, to exploit this
technique fully, non-sequential fit algorithms would be required. This
points toward global fitting strategies rather than the commonly used
local gradient-descent Minuit optimiser, and could in turn facilitate
more systematic scans of the likelihood landscape, as well as the
exploration of alternative hypotheses associated with different local
minima of an amplitude model.

\paragraphbreak The High-Energy Physics community offers a growing
ecosystem of Python libraries for data analysis in particle physics.
QRules already makes use of one of these~-- the Scikit-HEP
\href{https://github.com/scikit-hep/particle}{\texttt{particle}}
package~-- but the ComPWA project could benefit from deeper integration
with other tools in this ecosystem. Most notably, the
\href{https://zfit.readthedocs.io}{\texttt{zfit}} optimisation library,
which offers a valuable alternative to the optimisation functionality
currently provided by TensorWaves.

Another direction for improvement is to broaden the range of numerical
backends supported in SymPy's code generation, for example by targeting
PyTorch or the upcoming \href{https://docs.modular.com/mojo}{Mojo}
language. Much of this is already being explored within the SymPy
project itself, but it remains to be investigated whether these backends
are suitable for the specific requirements of amplitude analysis.

Finally, code generation could be extended to serialise amplitude models
into human-readable formats. Conversely, the ComPWA libraries would need
to provide methods for importing such
\href{https://github.com/RUB-EP1/amplitude-serialization}{serialised
amplitude models}. This would enable interoperability between different
amplitude-analysis frameworks, which would be a large step forwards in
the cross-verification of analysis results.

\paragraphbreak As demonstrated in this thesis, the DPD method yields an
improved description of the data distributions, though certain regions
of the fit remain imperfect. As outlined, a key requirement for
amplitude models is that they respect fundamental constraints such as
unitarity and analyticity. Only by employing coupled-channel techniques
can channel-specific structures in the spectrum, such as
threshold-induced drops and kinks, be described correctly. This in turn
enables the reliable extraction of deeper properties like pole positions
and residues. The {\(\mathbfit{K}\)‑matrix} framework provides the
necessary tools for such analyses. This is particularly relevant to the
nucleon excitation spectrum in {\(J/\psi\)~decays,} where threshold
effects can only be captured by simultaneously modelling related
channels such as \(J/\psi \to \bar{p}p\eta\),
\(J/\psi \to \bar{p}\varLambda K^+\), and \(J/\psi \to \bar{p}p\eta'\).

CAS-assisted model building appears well suited to this task, especially
within the {\(\mathbfit{K}\)‑matrix} framework. While AmpForm already
provides helper functionality for constructing coupled-channel dynamics
parametrisations, its model-building framework does not yet support
amplitude models with multiple channels. The main challenge is the
pre-computation of the Chew--Mandelstam function for higher angular
momenta, which must be evaluated through numerical integration before a
fit can begin. Although such analytic continuations
\href{https://compwa.github.io/report/003}{have been demonstrated}
within the symbolic workflow, the class structure for amplitude models
needs to be reorganised so that the pre-computed values can be inserted
at the appropriate stage of the analysis workflow.

Finally, the techniques developed for evaluating the polarimeter vector
field could be applied to the {\(J/\psi\)~analyses.} These fields encode
information about the spin correlations of the final state, which may
help in inspecting and comparing different models. Up to now, model
comparisons have relied mainly on conventional information criteria,
such as AIC, BIC, or \(\chi^2\), and on fit fractions, while a
systematic study of interference between subsystems and partial waves
has not yet been undertaken. In addition, it may be possible to relate
the polarimeter vector field of three-body decay analyses to
spin-transfer observables and moment expansions that have been reported
for corresponding channels in scattering experiments.

\boldPDFchaptersfalse
\italicPDFchapterstrue
\addtocontents{toc}{\protect\setcounter{tocdepth}{2}}

\bookmarksetup{startatroot}

\chapter*{References}\label{references}
\addcontentsline{toc}{chapter}{References}

\markboth{References}{References}

\rehead{\headmark}
\lohead{\headmark}

\phantomsection\label{refs}
\begin{CSLReferences}{0}{0}
\bibitem[\citeproctext]{ref-Castellani:2000bk}
\CSLLeftMargin{{[}1{]} }%
\CSLRightInline{E. Castellani, {``Reductionism, emergence, and effective
field theories,''} \emph{Stud. Hist. Philos. Sci. B}, vol.~33, no.~2,
pp.~251--267, Jun.
2002,~\href{https://doi.org/10.1016/S1355-2198(02)00003-5}{10.1016/S1355-2198(02)00003-5}.}

\bibitem[\citeproctext]{ref-Harlander:2023kak}
\CSLLeftMargin{{[}2{]} }%
\CSLRightInline{R. Harlander, J.-P. Martinez, and G. Schiemann, {``The
end of the particle era?''} \emph{Eur. Phys. J. H}, vol.~48, no.~1,
p.~6, Dec.
2023,~\href{https://doi.org/10.1140/epjh/s13129-023-00053-4}{10.1140/epjh/s13129-023-00053-4}.}

\bibitem[\citeproctext]{ref-Capstick:2000dk}
\CSLLeftMargin{{[}3{]} }%
\CSLRightInline{S. Capstick, S. Dytman, R. Holt, X. Ji, J. Negele, and
E. Swanson, {``Key {Issues} in {Hadronic Physics},''} Dec. 2000,
\url{http://arxiv.org/abs/hep-ph/0012238}}

\bibitem[\citeproctext]{ref-Neeman:1986ixa}
\CSLLeftMargin{{[}4{]} }%
\CSLRightInline{Y. Ne'eman, \emph{The particle hunters}, 2nd ed. New
York: Cambridge University Press, 1986. ISBN:~978-0-521-47107-7}

\bibitem[\citeproctext]{ref-Pickering:1984tk}
\CSLLeftMargin{{[}5{]} }%
\CSLRightInline{A. Pickering, \emph{Constructing {Quarks}: {A
Sociological History} of {Particle Physics}}. University of Chicago
Press, 1984. ISBN:~978-0-85224-458-6}

\bibitem[\citeproctext]{ref-Schweber:1997hk}
\CSLLeftMargin{{[}6{]} }%
\CSLRightInline{S. Schweber, {``A {Historical Perspective} on the {Rise}
of the {Standard Model},''} in \emph{The {Rise} of the {Standard
Model}}, L. Hoddeson, L. Brown, M. Riordan, and M. Dresden, Eds., New
York: Cambridge University Press, 1997,
pp.~645--684.~\href{https://doi.org/10.1017/CBO9780511471094.040}{10.1017/CBO9780511471094.040}.}

\bibitem[\citeproctext]{ref-Rutherford:1911zz}
\CSLLeftMargin{{[}7{]} }%
\CSLRightInline{E. Rutherford, {``The scattering of alpha and beta
particles by matter and the structure of the atom,''} \emph{Philos.
Mag.}, vol.~21, no.~125, pp.~669--688, May
1911,~\href{https://doi.org/10.1080/14786440508637080}{10.1080/14786440508637080}.}

\bibitem[\citeproctext]{ref-FRS:1919nrm}
\CSLLeftMargin{{[}8{]} }%
\CSLRightInline{E. Rutherford, {``Collision of \(\alpha\) particles with
light atoms. IV. An anomalous effect in nitrogen,''} \emph{Philos.
Mag.}, vol.~37, no.~222, pp.~581--587, Jun.
1919,~\href{https://doi.org/10.1080/14786431003659230}{10.1080/14786431003659230}.}

\bibitem[\citeproctext]{ref-Rutherford:1920-BakerianLectureNuclear}
\CSLLeftMargin{{[}9{]} }%
\CSLRightInline{E. Rutherford, {``Bakerian {Lecture}: {Nuclear}
constitution of atoms,''} \emph{Proc. R. Soc. Lond. A}, vol.~97,
no.~686, pp.~374--400, Jun.
1920,~\href{https://doi.org/10.1098/rspa.1920.0040}{10.1098/rspa.1920.0040}.}

\bibitem[\citeproctext]{ref-Chadwick:1932ma}
\CSLLeftMargin{{[}10{]} }%
\CSLRightInline{J. Chadwick, {``Possible {Existence} of a {Neutron},''}
\emph{Nature}, vol.~129, no.~3252, pp.~312--312, Feb.
1932,~\href{https://doi.org/10.1038/129312a0}{10.1038/129312a0}.}

\bibitem[\citeproctext]{ref-Uhlenbeck:1925pqz}
\CSLLeftMargin{{[}11{]} }%
\CSLRightInline{G. Uhlenbeck and S. Goudsmit, {``Ersetzung der
{Hypothese} vom unmechanischen {Zwang} durch eine {Forderung} bezüglich
des inneren {Verhaltens} jedes einzelnen {Elektrons},''}
\emph{Naturwiss.}, vol.~13, no.~47, pp.~953--954, Nov.
1925,~\href{https://doi.org/10.1007/bf01558878}{10.1007/bf01558878}.}

\bibitem[\citeproctext]{ref-Pauli:1925nmn}
\CSLLeftMargin{{[}12{]} }%
\CSLRightInline{W. Pauli, {``{Über den Zusammenhang des Abschlusses der
Elektronengruppen im Atom mit der Komplexstruktur der Spektren},''}
\emph{Z. Phys.}, vol.~31, no.~1, pp.~765--783, Feb.
1925,~\href{https://doi.org/10.1007/BF02980631}{10.1007/BF02980631}.}

\bibitem[\citeproctext]{ref-Fermi:1926-Quantelung}
\CSLLeftMargin{{[}13{]} }%
\CSLRightInline{E. Fermi, {``{Zur Quantelung des idealen einatomigen
Gases},''} \emph{Z. Phys.}, vol.~36, no.~11--12, pp.~902--912, Nov.
1926,~\href{https://doi.org/10.1007/BF01400221}{10.1007/BF01400221}.}

\bibitem[\citeproctext]{ref-Dirac:1926jz}
\CSLLeftMargin{{[}14{]} }%
\CSLRightInline{P. A. M. Dirac, {``On the {Theory} of quantum
mechanics,''} \emph{Proc. R. Soc. Lond. A}, vol.~112, no.~762,
pp.~661--677, Oct.
1926,~\href{https://doi.org/10.1098/rspa.1926.0133}{10.1098/rspa.1926.0133}.}

\bibitem[\citeproctext]{ref-Bose:1924mk}
\CSLLeftMargin{{[}15{]} }%
\CSLRightInline{Bose, {``{Plancks Gesetz und Lichtquantenhypothese},''}
\emph{Z. Phys.}, vol.~26, no.~1, pp.~178--181, Dec.
1924,~\href{https://doi.org/10.1007/BF01327326}{10.1007/BF01327326}.}

\bibitem[\citeproctext]{ref-Yukawa:1935xg}
\CSLLeftMargin{{[}16{]} }%
\CSLRightInline{H. Yukawa, {``On the {Interaction} of {Elementary
Particles}. {I},''} \emph{Prog. Theor. Phys. Suppl.}, vol.~17,
no.~PRINT--92--144, pp.~1--10, Feb.
1935,~\href{https://doi.org/10.1143/PTPS.1.1}{10.1143/PTPS.1.1}.}

\bibitem[\citeproctext]{ref-Neddermeyer:1937md}
\CSLLeftMargin{{[}17{]} }%
\CSLRightInline{S. H. Neddermeyer and C. D. Anderson, {``Note on the
{Nature} of {Cosmic-Ray Particles},''} \emph{Phys. Rev.}, vol.~51,
no.~10, pp.~884--886, May
1937,~\href{https://doi.org/10.1103/PhysRev.51.884}{10.1103/PhysRev.51.884}.}

\bibitem[\citeproctext]{ref-Street:1937me}
\CSLLeftMargin{{[}18{]} }%
\CSLRightInline{J. Street and E. Stevenson, {``New {Evidence} for the
{Existence} of a {Particle} of {Mass Intermediate Between} the {Proton}
and {Electron},''} \emph{Phys. Rev.}, vol.~52, no.~9, pp.~1003--1004,
Nov.
1937,~\href{https://doi.org/10.1103/PhysRev.52.1003}{10.1103/PhysRev.52.1003}.}

\bibitem[\citeproctext]{ref-Anderson:1938-Mesotron}
\CSLLeftMargin{{[}19{]} }%
\CSLRightInline{C. D. Anderson and S. H. Neddermeyer, {``Mesotron
({Intermediate Particle}) as a {Name} for the {New Particles} of
{Intermediate Mass},''} \emph{Nature}, vol.~142, no.~3602, pp.~878--878,
Nov. 1938,~\href{https://doi.org/10.1038/142878c0}{10.1038/142878c0}.}

\bibitem[\citeproctext]{ref-Fermi:1947zza}
\CSLLeftMargin{{[}20{]} }%
\CSLRightInline{E. Fermi, E. Teller, and V. Weisskopf, {``The {Decay} of
{Negative Mesotrons} in {Matter},''} \emph{Phys. Rev.}, vol.~71, no.~5,
pp.~314--315, Mar.
1947,~\href{https://doi.org/10.1103/PhysRev.71.314}{10.1103/PhysRev.71.314}.}

\bibitem[\citeproctext]{ref-Lattes:1947mw}
\CSLLeftMargin{{[}21{]} }%
\CSLRightInline{C. M. G. Lattes, H. Muirhead, G. P. S. Occhialini, and
C. F. Powell, {``Processes involving charged mesons,''} \emph{Nature},
vol.~159, no.~4047, pp.~694--697, May
1947,~\href{https://doi.org/10.1038/159694a0}{10.1038/159694a0}.}

\bibitem[\citeproctext]{ref-Lattes:1947mx}
\CSLLeftMargin{{[}22{]} }%
\CSLRightInline{C. M. G. Lattes, G. P. S. Occhialini, and C. F. Powell,
{``Observations on the {Tracks} of {Slow Mesons} in {Photographic
Emulsions} -- {Part} 1,''} \emph{Nature}, vol.~160, no.~4066,
pp.~453--456, Oct.
1947,~\href{https://doi.org/10.1038/160453a0}{10.1038/160453a0}.}

\bibitem[\citeproctext]{ref-Rosenfeld:1948-NuclearForces}
\CSLLeftMargin{{[}23{]} }%
\CSLRightInline{L. Rosenfeld, \emph{Nuclear {Forces}}. Amsterdam: North
Holland Publishing Company, 1948.
\url{https://archive.org/details/in.ernet.dli.2015.169077}}

\bibitem[\citeproctext]{ref-Heisenberg:1932-uxdcberAtomkerne1}
\CSLLeftMargin{{[}24{]} }%
\CSLRightInline{W. Heisenberg, {``{Über den Bau der Atomkerne. I},''}
\emph{Z. Phys.}, vol.~77, no.~1--2, pp.~1--11, Jun.
1932,~\href{https://doi.org/10.1007/BF01342433}{10.1007/BF01342433}.}

\bibitem[\citeproctext]{ref-Wigner:1936dx}
\CSLLeftMargin{{[}25{]} }%
\CSLRightInline{E. P. Wigner, {``On the {Consequences} of the {Symmetry}
of the {Nuclear Hamiltonian} on the {Spectroscopy} of {Nuclei},''}
\emph{Phys. Rev.}, vol.~51, no.~2, pp.~106--119, Jan.
1937,~\href{https://doi.org/10.1103/PhysRev.51.106}{10.1103/PhysRev.51.106}.}

\bibitem[\citeproctext]{ref-Rasche:1971-Isospin}
\CSLLeftMargin{{[}26{]} }%
\CSLRightInline{G. Rasche, {``{Zur Geschichte des Begriffes
„Isospin``},''} \emph{Arch. Rational Mech.}, vol.~7, no.~4,
pp.~257--276,
1971,~\href{https://doi.org/10.1007/BF00328045}{10.1007/BF00328045}.}

\bibitem[\citeproctext]{ref-Kemmer:1938tur}
\CSLLeftMargin{{[}27{]} }%
\CSLRightInline{N. Kemmer, {``Quantum theory of {Einstein}--{Bose}
particles and nuclear interaction,''} \emph{Proc. R. Soc. Lond. A},
vol.~166, no.~924, pp.~127--153, May
1938,~\href{https://doi.org/10.1098/rspa.1938.0084}{10.1098/rspa.1938.0084}.}

\bibitem[\citeproctext]{ref-Frohlich:1938-NuclearForces}
\CSLLeftMargin{{[}28{]} }%
\CSLRightInline{H. Fröhlich, W. Heitler, and N. Kemmer, {``On the
nuclear forces and the magnetic moments of the neutron and the
proton,''} \emph{Proc. R. Soc. Lond. A}, vol.~166, no.~924,
pp.~154--177, May
1938,~\href{https://doi.org/10.1098/rspa.1938.0085}{10.1098/rspa.1938.0085}.}

\bibitem[\citeproctext]{ref-Bjorklund:1950zz}
\CSLLeftMargin{{[}29{]} }%
\CSLRightInline{R. Bjorklund, W. E. Crandall, B. J. Moyer, and H. F.
York, {``High {Energy Photons} from {Proton}--{Nucleon Collisions},''}
\emph{Phys. Rev.}, vol.~77, no.~2, pp.~213--218, Jan.
1950,~\href{https://doi.org/10.1103/PhysRev.77.213}{10.1103/PhysRev.77.213}.}

\bibitem[\citeproctext]{ref-Pais:1953jsv}
\CSLLeftMargin{{[}30{]} }%
\CSLRightInline{A. Pais, {``Ω-{Space Theory},''} in \emph{Proceedings,
{International Conference} on {Theoretical Physics}: {Kyoto} \& {Tokyo},
{September} 14-24, 1953}, I. Imai, A. Harasima, M. Kotani, R. Kubo, R.
Nozawa, T. Toyoda, and T. Yamanouchi, Eds., Kyoto \& Tokyo: Science
Council of Japan, Sep.~1953, pp.~156--163.}

\bibitem[\citeproctext]{ref-Cronin:2011zz}
\CSLLeftMargin{{[}31{]} }%
\CSLRightInline{J. W. Cronin, {``The 1953 {Cosmic Ray Conference} at
{Bagnères} de {Bigorre}: The {Birth} of {Sub Atomic Physics},''}
\emph{Eur. Phys. J. H}, vol.~36, no.~2, pp.~183--201, Sep.
2011,~\href{https://doi.org/10.1140/epjh/e2011-20014-4}{10.1140/epjh/e2011-20014-4}.}

\bibitem[\citeproctext]{ref-Thomson:1897cm}
\CSLLeftMargin{{[}32{]} }%
\CSLRightInline{J. J. Thomson, {``Cathode {Rays},''} \emph{Philos.
Mag.}, vol.~44, no.~269, pp.~293--316, Oct.
1897,~\href{https://doi.org/10.1080/14786449708621070}{10.1080/14786449708621070}.}

\bibitem[\citeproctext]{ref-Anderson:1933mb}
\CSLLeftMargin{{[}33{]} }%
\CSLRightInline{C. D. Anderson, {``The {Positive Electron},''}
\emph{Phys. Rev.}, vol.~43, no.~6, pp.~491--494, Mar.
1933,~\href{https://doi.org/10.1103/PhysRev.43.491}{10.1103/PhysRev.43.491}.}

\bibitem[\citeproctext]{ref-Dirac:1931kp}
\CSLLeftMargin{{[}34{]} }%
\CSLRightInline{P. A. M. Dirac, {``Quantised {Singularities} in the
{Electromagnetic Field},''} \emph{Proc. R. Soc. Lond. A}, vol.~133,
no.~821, pp.~60--72, Sep.
1931,~\href{https://doi.org/10.1098/rspa.1931.0130}{10.1098/rspa.1931.0130}.}

\bibitem[\citeproctext]{ref-Anderson:1936zz}
\CSLLeftMargin{{[}35{]} }%
\CSLRightInline{C. D. Anderson and S. H. Neddermeyer, {``Cloud {Chamber
Observations} of {Cosmic Rays} at 4300 {Meters Elevation} and {Near
Sea-Level},''} \emph{Phys. Rev.}, vol.~50, no.~4, pp.~263--271, Aug.
1936,~\href{https://doi.org/10.1103/PhysRev.50.263}{10.1103/PhysRev.50.263}.}

\bibitem[\citeproctext]{ref-Rochester:1947mi}
\CSLLeftMargin{{[}36{]} }%
\CSLRightInline{G. D. Rochester and C. C. Butler, {``Evidence for the
{Existence} of {New Unstable Elementary Particles},''} \emph{Nature},
vol.~160, no.~4077, pp.~855--857, Dec.
1947,~\href{https://doi.org/10.1038/160855a0}{10.1038/160855a0}.}

\bibitem[\citeproctext]{ref-Brown:1949mj}
\CSLLeftMargin{{[}37{]} }%
\CSLRightInline{R. Brown, U. Camerini, P. H. Fowler, H. Muirhead, C. F.
Powell, and D. M. Ritson, {``{Observations} with {Electron-Sensitive
Plates Exposed} to {Cosmic Radiation}. {Part 2: Further Evidence} for
the {Existence} of {Unstable Charged Particles} of {Mass}
\(\sim 1,000\,m_e\), and observations on their mode of decay,''}
\emph{Nature}, vol.~163, no.~4133, pp.~82--87, Jan.
1949,~\href{https://doi.org/10.1038/163082a0}{10.1038/163082a0}.}

\bibitem[\citeproctext]{ref-Fowler:1953qpk}
\CSLLeftMargin{{[}38{]} }%
\CSLRightInline{W. B. Fowler, R. P. Shutt, A. M. Thorndike, and W. L.
Whittemore, {``Production of {\(V_1^0\)} {Particles} by {Negative Pions}
in {Hydrogen},''} \emph{Phys. Rev.}, vol.~91, no.~5, p.~1287, Sep.
1953,~\href{https://doi.org/10.1103/PhysRev.91.1287}{10.1103/PhysRev.91.1287}.}

\bibitem[\citeproctext]{ref-Armenteros:1952-XiMinus}
\CSLLeftMargin{{[}39{]} }%
\CSLRightInline{R. Armenteros, K. H. Barker, C. C. Butler, A. Cachon,
and C. M. York, {``The properties of charged \(V\)-particles,''}
\emph{Philos. Mag.}, vol.~43, no.~341, pp.~597--611, Jun.
1952,~\href{https://doi.org/10.1080/14786440608520216}{10.1080/14786440608520216}.}

\bibitem[\citeproctext]{ref-Cowan:1954zz}
\CSLLeftMargin{{[}40{]} }%
\CSLRightInline{E. W. Cowan, {``A {\(V\)-Decay Event} with a {Heavy
Negative Secondary}, and {Identification} of the {Secondary \(V\)-Decay
Event} in a {Cascade},''} \emph{Phys. Rev.}, vol.~94, no.~1,
pp.~161--166, Apr.
1954,~\href{https://doi.org/10.1103/PhysRev.94.161}{10.1103/PhysRev.94.161}.}

\bibitem[\citeproctext]{ref-Bonetti:1953-SigmaHyperon}
\CSLLeftMargin{{[}41{]} }%
\CSLRightInline{A. Bonetti, R. L. Setti, M. Panetti, and G. Tomasini,
{``On the existence of unstable charged particles of hyperprotonic
mass,''} \emph{Nuovo Cimento}, vol.~10, no.~12, pp.~1736--1743, Dec.
1953,~\href{https://doi.org/10.1007/BF02781667}{10.1007/BF02781667}.}

\bibitem[\citeproctext]{ref-Pevsner:1961pa}
\CSLLeftMargin{{[}42{]} }%
\CSLRightInline{A. Pevsner \emph{et al.}, {``Evidence for a {Three-Pion
Resonance Near} 550 {Mev},''} \emph{Phys. Rev. Lett.}, vol.~7, no.~11,
pp.~421--423, Dec.
1961,~\href{https://doi.org/10.1103/PhysRevLett.7.421}{10.1103/PhysRevLett.7.421}.}

\bibitem[\citeproctext]{ref-Ikeda:1959zz}
\CSLLeftMargin{{[}43{]} }%
\CSLRightInline{M. Ikeda, S. Ogawa, and Y. Ohnuki, {``A {Possibile
Symmetry} in {Sakata}'s {Model} for {Bosons-Baryons System},''}
\emph{Prog. Theor. Phys.}, vol.~22, no.~5, pp.~715--724, Nov.
1959,~\href{https://doi.org/10.1143/PTP.22.715}{10.1143/PTP.22.715}.}

\bibitem[\citeproctext]{ref-Barnes:1964pd}
\CSLLeftMargin{{[}44{]} }%
\CSLRightInline{V. E. Barnes \emph{et al.}, {``Observation of a
{Hyperon} with {Strangeness Minus Three},''} \emph{Phys. Rev. Lett.},
vol.~12, no.~8, pp.~204--206, Feb.
1964,~\href{https://doi.org/10.1103/PhysRevLett.12.204}{10.1103/PhysRevLett.12.204}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1961omu}
\CSLLeftMargin{{[}45{]} }%
\CSLRightInline{M. Gell-Mann, {``The {Eightfold Way}: {A Theory} of
{Strong Interaction Symmetry},''} California Institute of Technology,
Pasadena, CTSL-20, Mar.
1961.~\href{https://doi.org/10.2172/4008239}{10.2172/4008239}.}

\bibitem[\citeproctext]{ref-Ezhela:1996xi}
\CSLLeftMargin{{[}46{]} }%
\CSLRightInline{V. V. Ezhela \emph{et al.}, Eds., \emph{Particle
{Physics}: {One Hundred Years} of {Discoveries}: An annotated
chronological bibliography}. Woodbury, NY: American Institute of
Physics, 1996. ISBN:~978-1-56396-642-2}

\bibitem[\citeproctext]{ref-Kragh:1999eb}
\CSLLeftMargin{{[}47{]} }%
\CSLRightInline{H. Kragh, \emph{Quantum {Generations}: {A History} of
{Physics} in the {Twentieth Century}}. Princeton University Press, 1999.
ISBN:~978-0-691-01206-3}

\bibitem[\citeproctext]{ref-Gell-Mann:1953hzm}
\CSLLeftMargin{{[}48{]} }%
\CSLRightInline{M. Gell-Mann, {``Isotopic {Spin} and {New Unstable
Particles},''} \emph{Phys. Rev.}, vol.~92, no.~3, pp.~833--834, Nov.
1953,~\href{https://doi.org/10.1103/PhysRev.92.833}{10.1103/PhysRev.92.833}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1956iqa}
\CSLLeftMargin{{[}49{]} }%
\CSLRightInline{M. Gell-Mann, {``The interpretation of the new particles
as displaced charge multiplets,''} \emph{Nuovo Cimento}, vol.~4, no.~S2,
pp.~848--866, Apr.
1956,~\href{https://doi.org/10.1007/BF02748000}{10.1007/BF02748000}.}

\bibitem[\citeproctext]{ref-Nishijima:1955gxk}
\CSLLeftMargin{{[}50{]} }%
\CSLRightInline{K. Nishijima, {``{Charge Independence Theory} of
{\(V\)~Particles},''} \emph{Prog. Theor. Phys.}, vol.~13, no.~3,
pp.~285--304, Mar.
1955,~\href{https://doi.org/10.1143/PTP.13.285}{10.1143/PTP.13.285}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1955ipe}
\CSLLeftMargin{{[}51{]} }%
\CSLRightInline{M. Gell-Mann and A. Pais, {``Behavior of {Neutral
Particles} under {Charge Conjugation},''} \emph{Phys. Rev.}, vol.~97,
no.~5, pp.~1387--1389, Mar.
1955,~\href{https://doi.org/10.1103/PhysRev.97.1387}{10.1103/PhysRev.97.1387}.}

\bibitem[\citeproctext]{ref-Lee:1956sw}
\CSLLeftMargin{{[}52{]} }%
\CSLRightInline{T. D. Lee and C. N. Yang, {``{Charge} conjugation, a new
quantum number {\(G\)}, and selection rules concerning a
nucleon-antinucleon system,''} \emph{Nuovo Cimento}, vol.~3, no.~4,
pp.~749--753, Apr.
1956,~\href{https://doi.org/10.1007/BF02744530}{10.1007/BF02744530}.}

\bibitem[\citeproctext]{ref-Okun:1962kca}
\CSLLeftMargin{{[}53{]} }%
\CSLRightInline{L. B. Okun, {``The {Theory} of {Weak Interaction},''} in
\emph{11th international conference on high-energy physics}, J. Prentki,
Ed., Geneva: CERN, ~1962, pp.~845--866.
\url{https://inspirehep.net/conferences/1187697}}

\bibitem[\citeproctext]{ref-Stueckelberg:1938zz}
\CSLLeftMargin{{[}54{]} }%
\CSLRightInline{E. C. G. Stückelberg, {``Die {Wechselwirkungskräfte} in
der {Elektrodynamik} und in der {Feldtheorie} der {Kernkräfte} ({Teil
II} und {III}),''} \emph{Helv. Phys. Acta}, vol.~11, pp.~299--328, 1938,
\url{http://link.springer.com/10.1007/978-3-7643-8878-2_17}}

\bibitem[\citeproctext]{ref-Neeman:1961jhl}
\CSLLeftMargin{{[}55{]} }%
\CSLRightInline{Y. Ne'eman, {``Derivation of strong interactions from a
gauge invariance,''} \emph{Nucl. Phys.}, vol.~26, no.~2, pp.~222--229,
Aug.
1961,~\href{https://doi.org/10.1016/0029-5582(61)90134-1}{10.1016/0029-5582(61)90134-1}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1962yej}
\CSLLeftMargin{{[}56{]} }%
\CSLRightInline{M. Gell-Mann, {``Symmetries of {Baryons} and
{Mesons},''} \emph{Phys. Rev.}, vol.~125, no.~3, pp.~1067--1084, Feb.
1962,~\href{https://doi.org/10.1103/PhysRev.125.1067}{10.1103/PhysRev.125.1067}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1964ewy}
\CSLLeftMargin{{[}57{]} }%
\CSLRightInline{M. Gell-Mann, {``A schematic model of baryons and
mesons,''} \emph{Phys. Lett.}, vol.~8, no.~3, pp.~214--215, Feb.
1964,~\href{https://doi.org/10.1016/S0031-9163(64)92001-3}{10.1016/S0031-9163(64)92001-3}.}

\bibitem[\citeproctext]{ref-Zweig:1964ruk}
\CSLLeftMargin{{[}58{]} }%
\CSLRightInline{G. Zweig, {``An \(\mathrm{SU}_3\) model for strong
interaction symmetry and its breaking. Version 1.''} CERN Document
Server, Jan.
1964.~\href{https://doi.org/10.17181/CERN-TH-401}{10.17181/CERN-TH-401}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1994aya}
\CSLLeftMargin{{[}59{]} }%
\CSLRightInline{M. Gell-Mann, \emph{The {Quark} and the {Jaguar}:
{Adventures} in the {Simple} and the {Complex}}, Repr. London: Abacus,
1994. ISBN:~978-0-8050-7253-2}

\bibitem[\citeproctext]{ref-Riordan:1987gw}
\CSLLeftMargin{{[}60{]} }%
\CSLRightInline{M. Riordan, \emph{The {Hunting} of the {Quark}: {A True
Story} of {Modern Physics}}. in A {Touchstone} book. New York: {Simon
and Schuster}, 1987. ISBN:~978-0-671-50466-3}

\bibitem[\citeproctext]{ref-Bjorken:1964gz}
\CSLLeftMargin{{[}61{]} }%
\CSLRightInline{J. D. Bjorken and S. L. Glashow, {``Elementary particles
and {\(\mathrm{SU}(4)\)},''} \emph{Phys. Lett.}, vol.~11, no.~3,
pp.~255--257, Aug.
1964,~\href{https://doi.org/10.1016/0031-9163(64)90433-0}{10.1016/0031-9163(64)90433-0}.}

\bibitem[\citeproctext]{ref-Glashow:1970gm}
\CSLLeftMargin{{[}62{]} }%
\CSLRightInline{S. L. Glashow, J. Iliopoulos, and L. Maiani, {``Weak
{Interactions} with {Lepton-Hadron Symmetry},''} \emph{Phys. Rev. D},
vol.~2, no.~7, pp.~1285--1292, Oct.
1970,~\href{https://doi.org/10.1103/PhysRevD.2.1285}{10.1103/PhysRevD.2.1285}.}

\bibitem[\citeproctext]{ref-Gell-Mann:1964hhf}
\CSLLeftMargin{{[}63{]} }%
\CSLRightInline{M. Gell-Mann, {``The symmetry group of vector and axial
vector currents,''} \emph{Phys. Phys. Fiz.}, vol.~1, no.~1, pp.~63--75,
Jul.
1964,~\href{https://doi.org/10.1103/PhysicsPhysiqueFizika.1.63}{10.1103/PhysicsPhysiqueFizika.1.63}.}

\bibitem[\citeproctext]{ref-Bloom:1969kc}
\CSLLeftMargin{{[}64{]} }%
\CSLRightInline{E. D. Bloom \emph{et al.}, {``High-{Energy Inelastic} e
− p {Scattering} at 6° and 10°,''} \emph{Phys. Rev. Lett.}, vol.~23,
no.~16, pp.~930--934, Oct.
1969,~\href{https://doi.org/10.1103/PhysRevLett.23.930}{10.1103/PhysRevLett.23.930}.}

\bibitem[\citeproctext]{ref-Breidenbach:1969kd}
\CSLLeftMargin{{[}65{]} }%
\CSLRightInline{M. Breidenbach \emph{et al.}, {``Observed {Behavior} of
{Highly Inelastic Electron}--{Proton Scattering},''} \emph{Phys. Rev.
Lett.}, vol.~23, no.~16, pp.~935--939, Oct.
1969,~\href{https://doi.org/10.1103/PhysRevLett.23.935}{10.1103/PhysRevLett.23.935}.}

\bibitem[\citeproctext]{ref-ParticleDataGroup:2024cfk}
\CSLLeftMargin{{[}66{]} }%
\CSLRightInline{Particle Data Group Collaboration \emph{et al.},
{``Review of {Particle Physics},''} \emph{Phys. Rev. D}, vol.~110,
no.~3, p.~030001, Aug.
2024,~\href{https://doi.org/10.1103/PhysRevD.110.030001}{10.1103/PhysRevD.110.030001}.}

\bibitem[\citeproctext]{ref-Fritzsch:1975sr}
\CSLLeftMargin{{[}67{]} }%
\CSLRightInline{H. Fritzsch, M. Gell-Mann, and P. Minkowski,
{``Vectorlike weak currents and new elementary fermions,''} \emph{Phys.
Lett. B}, vol.~59, no.~3, pp.~256--260, Nov.
1975,~\href{https://doi.org/10.1016/0370-2693(75)90040-4}{10.1016/0370-2693(75)90040-4}.}

\bibitem[\citeproctext]{ref-Greenberg:1964pe}
\CSLLeftMargin{{[}68{]} }%
\CSLRightInline{O. W. Greenberg, {``Spin and {Unitary-Spin Independence}
in a {Paraquark Model} of {Baryons} and {Mesons},''} \emph{Phys. Rev.
Lett.}, vol.~13, no.~20, pp.~598--602, Nov.
1964,~\href{https://doi.org/10.1103/PhysRevLett.13.598}{10.1103/PhysRevLett.13.598}.}

\bibitem[\citeproctext]{ref-Fritzsch:1972jv}
\CSLLeftMargin{{[}69{]} }%
\CSLRightInline{H. Fritzsch and M. Gell-Mann, {``Current algebra:
{Quarks} and what else?''} in \emph{Proceedings of the {XVI
International Conference} on {High Energy Physics}}, J. D. Jackson and
A. Roberts, Eds., Chicago, ~1972, pp.~135--165.
\url{https://inspirehep.net/literature/76232}}

\bibitem[\citeproctext]{ref-Fritzsch:1973pi}
\CSLLeftMargin{{[}70{]} }%
\CSLRightInline{H. Fritzsch, M. Gell-Mann, and H. Leutwyler,
{``Advantages of the color octet gluon picture,''} \emph{Phys. Lett. B},
vol.~47, no.~4, pp.~365--368, Nov.
1973,~\href{https://doi.org/10.1016/0370-2693(73)90625-4}{10.1016/0370-2693(73)90625-4}.}

\bibitem[\citeproctext]{ref-Politzer:1973fx}
\CSLLeftMargin{{[}71{]} }%
\CSLRightInline{H. D. Politzer, {``Reliable {Perturbative Results} for
{Strong Interactions}?''} \emph{Phys. Rev. Lett.}, vol.~30, no.~26,
pp.~1346--1349, Jun.
1973,~\href{https://doi.org/10.1103/PhysRevLett.30.1346}{10.1103/PhysRevLett.30.1346}.}

\bibitem[\citeproctext]{ref-Gross:1973id}
\CSLLeftMargin{{[}72{]} }%
\CSLRightInline{D. J. Gross and F. Wilczek, {``Ultraviolet {Behavior} of
{Non-Abelian Gauge Theories},''} \emph{Phys. Rev. Lett.}, vol.~30,
no.~26, pp.~1343--1346, Jun.
1973,~\href{https://doi.org/10.1103/PhysRevLett.30.1343}{10.1103/PhysRevLett.30.1343}.}

\bibitem[\citeproctext]{ref-Wollenberg:2024}
\CSLLeftMargin{{[}73{]} }%
\CSLRightInline{L. R. Wollenberg, {``Measurement of the {Branching
Fraction} of the {Decay Channel}
{\(J/\psi \to \bar{p}\varSigma^+ K^0_S + \mathrm{c.c.}\)},''} PhD
thesis, Ruhr University Bochum, 2024.}

\bibitem[\citeproctext]{ref-WikimediaCommons:2025-StandardModel}
\CSLLeftMargin{{[}74{]} }%
\CSLRightInline{Wikimedia Commons, {``Standard {Model} of {Elementary
Particles}.''} 2025. \url{https://w.wiki/EeMv}}

\bibitem[\citeproctext]{ref-Chew:1962eu}
\CSLLeftMargin{{[}75{]} }%
\CSLRightInline{G. F. Chew and S. C. Frautschi, {``Regge {Trajectories}
and the {Principle} of {Maximum Strength} for {Strong Interactions},''}
\emph{Phys. Rev. Lett.}, vol.~8, no.~1, pp.~41--44, Jan.
1962,~\href{https://doi.org/10.1103/PhysRevLett.8.41}{10.1103/PhysRevLett.8.41}.}

\bibitem[\citeproctext]{ref-Thiel:2022xtb}
\CSLLeftMargin{{[}76{]} }%
\CSLRightInline{A. Thiel, F. Afzal, and Y. Wunderlich, {``Light {Baryon
Spectroscopy},''} \emph{Prog. Part. Nucl. Phys.}, vol.~125, p.~103949,
Jul.
2022,~\href{https://doi.org/10.1016/j.ppnp.2022.103949}{10.1016/j.ppnp.2022.103949}.}

\bibitem[\citeproctext]{ref-Brodsky:2014yha}
\CSLLeftMargin{{[}77{]} }%
\CSLRightInline{S. J. Brodsky, G. F. De Téramond, H. G. Dosch, and J.
Erlich, {``Light-front holographic {QCD} and emerging confinement,''}
\emph{Physics Reports}, vol.~584, pp.~1--105, Jul.
2015,~\href{https://doi.org/10.1016/j.physrep.2015.05.001}{10.1016/j.physrep.2015.05.001}.}

\bibitem[\citeproctext]{ref-Isgur:1978xj}
\CSLLeftMargin{{[}78{]} }%
\CSLRightInline{N. Isgur and G. Karl, {``{\(P\)}-wave baryons in the
quark model,''} \emph{Phys. Rev. D}, vol.~18, no.~11, pp.~4187--4205,
Dec.
1978,~\href{https://doi.org/10.1103/PhysRevD.18.4187}{10.1103/PhysRevD.18.4187}.}

\bibitem[\citeproctext]{ref-Krehl:1999km}
\CSLLeftMargin{{[}79{]} }%
\CSLRightInline{O. Krehl, C. Hanhart, S. Krewald, and J. Speth, {``What
is the structure of the {Roper} resonance?''} \emph{Phys. Rev. C},
vol.~62, no.~2, p.~025207, Jul.
2000,~\href{https://doi.org/10.1103/PhysRevC.62.025207}{10.1103/PhysRevC.62.025207}.}

\bibitem[\citeproctext]{ref-Burkert:2025coj}
\CSLLeftMargin{{[}80{]} }%
\CSLRightInline{V. Burkert, G. Eichmann, and E. Klempt, {``The impact of
{\(\gamma N\)} and {\(\gamma^* N\)} interactions on our understanding of
nucleon excitations.''} arXiv, Jun.
2025.~\href{https://doi.org/10.48550/arxiv.2506.16482}{10.48550/arxiv.2506.16482}.}

\bibitem[\citeproctext]{ref-Loring:2001kx}
\CSLLeftMargin{{[}81{]} }%
\CSLRightInline{U. Löring, B. Ch. Metsch, and H. R. Petry, {``The
light-baryon spectrum in a relativistic quark model with
instanton-induced quark forces: {The} non-strange-baryon spectrum and
ground states,''} \emph{Eur. Phys. J. A}, vol.~10, no.~4, pp.~395--446,
Jun.
2001,~\href{https://doi.org/10.1007/s100500170105}{10.1007/s100500170105}.}

\bibitem[\citeproctext]{ref-Ronniger:2011td}
\CSLLeftMargin{{[}82{]} }%
\CSLRightInline{M. Ronniger and B. Ch. Metsch, {``Effects of a
spin-flavour-dependent interaction on the baryon mass spectrum,''}
\emph{Eur. Phys. J. A}, vol.~47, no.~12, p.~162, Dec.
2011,~\href{https://doi.org/10.1140/epja/i2011-11162-8}{10.1140/epja/i2011-11162-8}.}

\bibitem[\citeproctext]{ref-Isgur:2000ad}
\CSLLeftMargin{{[}83{]} }%
\CSLRightInline{N. Isgur, {``Why {N}*'s are important,''} Newport News,
VA: Thomas Jefferson National Accelerator Facility,
Jul.~2000.~\href{https://doi.org/10.48550/arxiv.nucl-th/0007008}{10.48550/arxiv.nucl-th/0007008}.}

\bibitem[\citeproctext]{ref-Tiator:2018heh}
\CSLLeftMargin{{[}84{]} }%
\CSLRightInline{L. Tiator \emph{et al.}, {``Eta and etaprime
photoproduction on the nucleon with the isobar model {EtaMAID2018},''}
\emph{Eur. Phys. J. A}, vol.~54, no.~12, p.~210, Dec.
2018,~\href{https://doi.org/10.1140/epja/i2018-12643-x}{10.1140/epja/i2018-12643-x}.}

\bibitem[\citeproctext]{ref-Arndt:1985-SAID}
\CSLLeftMargin{{[}85{]} }%
\CSLRightInline{R. A. Arndt, {``Partial wave analyses of elastic
meson--nucleon scattering,''} in \emph{Advanced {Methods} in the
{Evaluation} of {Nuclear Scattering Data}}, vol.~236, H. J. Krappe and
R. Lipperheide, Eds., Berlin ; Heidelberg: Springer, 1985,
pp.~166--178.~\href{https://doi.org/10.1007/3-540-15990-8_11}{10.1007/3-540-15990-8\_11}.}

\bibitem[\citeproctext]{ref-Arndt:1989ww}
\CSLLeftMargin{{[}86{]} }%
\CSLRightInline{R. A. Arndt, R. L. Workman, Z. Li, and L. D. Roper,
{``Partial-wave analysis of pion photoproduction,''} \emph{Phys. Rev.
C}, vol.~42, no.~5, pp.~1853--1863, Nov.
1990,~\href{https://doi.org/10.1103/PhysRevC.42.1853}{10.1103/PhysRevC.42.1853}.}

\bibitem[\citeproctext]{ref-Manley:1984zs}
\CSLLeftMargin{{[}87{]} }%
\CSLRightInline{D. M. Manley, {``Isospin analysis of low-energy
{\(\pi N\to\pi\pi N\)} data and chiral-symmetry breaking,''} \emph{Phys.
Rev. D}, vol.~30, no.~3, pp.~536--540, Aug.
1984,~\href{https://doi.org/10.1103/PhysRevD.30.536}{10.1103/PhysRevD.30.536}.}

\bibitem[\citeproctext]{ref-Drechsel:1998hk}
\CSLLeftMargin{{[}88{]} }%
\CSLRightInline{D. Drechsel, O. Hanstein, S. S. Kamalov, and L. Tiator,
{``A unitary isobar model for pion photo- and electroproduction on the
proton up to 1 {GeV},''} \emph{Nucl. Phys. A}, vol.~645, no.~1,
pp.~145--174, Jan.
1999,~\href{https://doi.org/10.1016/S0375-9474(98)00572-7}{10.1016/S0375-9474(98)00572-7}.}

\bibitem[\citeproctext]{ref-Anisovich:2004zz}
\CSLLeftMargin{{[}89{]} }%
\CSLRightInline{A. V. Anisovich, E. Klempt, A. V. Sarantsev, and U.
Thoma, {``Partial-wave decomposition of pion and photoproduction
amplitudes,''} \emph{Eur. Phys. J. A}, vol.~24, no.~1, pp.~111--128,
Feb.
2005,~\href{https://doi.org/10.1140/epja/i2004-10125-6}{10.1140/epja/i2004-10125-6}.}

\bibitem[\citeproctext]{ref-Doring:2009yv}
\CSLLeftMargin{{[}90{]} }%
\CSLRightInline{M. Döring, C. Hanhart, F. Huang, S. Krewald, and U.-G.
Meißner, {``Analytic properties of the scattering amplitude and
resonances parameters in a meson exchange model,''} \emph{Nucl. Phys.
A}, vol.~829, no.~3--4, pp.~170--209, Oct.
2009,~\href{https://doi.org/10.1016/j.nuclphysa.2009.08.010}{10.1016/j.nuclphysa.2009.08.010}.}

\bibitem[\citeproctext]{ref-Mai:2021vsw}
\CSLLeftMargin{{[}91{]} }%
\CSLRightInline{M. Mai \emph{et al.}, {``Jülich--{Bonn}--{Washington}
model for pion electroproduction multipoles,''} \emph{Phys. Rev. C},
vol.~103, no.~6, p.~065204, Jun.
2021,~\href{https://doi.org/10.1103/PhysRevC.103.065204}{10.1103/PhysRevC.103.065204}.}

\bibitem[\citeproctext]{ref-Svarc:2013laa}
\CSLLeftMargin{{[}92{]} }%
\CSLRightInline{A. Švarc, M. Hadžimehmedović, H. Osmanović, J. Stahov,
L. Tiator, and R. L. Workman, {``Introducing the {Pietarinen} expansion
method into the single-channel pole extraction problem,''} \emph{Phys.
Rev. C}, vol.~88, no.~3, p.~035206, Sep.
2013,~\href{https://doi.org/10.1103/PhysRevC.88.035206}{10.1103/PhysRevC.88.035206}.}

\bibitem[\citeproctext]{ref-BESIII:2012ssm}
\CSLLeftMargin{{[}93{]} }%
\CSLRightInline{BESIII Collaboration \emph{et al.}, {``Observation of
{Two New \(N^*\) Resonances} in the {Decay}
\(\psi(3686) \to p\bar{p}\pi^0\),''} \emph{Phys. Rev. Lett.}, vol.~110,
no.~2, p.~022001, Jan.
2013,~\href{https://doi.org/10.1103/PhysRevLett.110.022001}{10.1103/PhysRevLett.110.022001}.}

\bibitem[\citeproctext]{ref-Hunt:2018wqz}
\CSLLeftMargin{{[}94{]} }%
\CSLRightInline{B. C. Hunt and D. M. Manley, {``{Updated} determination
of {\(N^*\)} resonance parameters using a unitary, multichannel
formalism,''} \emph{Phys. Rev. C}, vol.~99, no.~5, p.~055205, May
2019,~\href{https://doi.org/10.1103/PhysRevC.99.055205}{10.1103/PhysRevC.99.055205}.}

\bibitem[\citeproctext]{ref-Taylor:1972pty}
\CSLLeftMargin{{[}95{]} }%
\CSLRightInline{J. R. Taylor, \emph{Scattering {Theory}: {The Quantum
Theory} on {Nonrelativistic Collisions}}. New York: Wiley, 1972.
ISBN:~978-0-471-84900-1}

\bibitem[\citeproctext]{ref-Wheeler:1937zz}
\CSLLeftMargin{{[}96{]} }%
\CSLRightInline{J. A. Wheeler, {``On the {Mathematical Description} of
{Light Nuclei} by the {Method} of {Resonating Group Structure},''}
\emph{Phys. Rev.}, vol.~52, no.~11, pp.~1107--1122, Dec.
1937,~\href{https://doi.org/10.1103/PhysRev.52.1107}{10.1103/PhysRev.52.1107}.}

\bibitem[\citeproctext]{ref-Heisenberg:1943zz}
\CSLLeftMargin{{[}97{]} }%
\CSLRightInline{W. Heisenberg, {``{Die „beobachtbaren Größen`` in der
Theorie der Elementarteilchen},''} \emph{Z. Phys.}, vol.~120, no.~7--10,
pp.~513--538, Jul.
1943,~\href{https://doi.org/10.1007/BF01329800}{10.1007/BF01329800}.}

\bibitem[\citeproctext]{ref-Cushing:1990dt}
\CSLLeftMargin{{[}98{]} }%
\CSLRightInline{J. T. Cushing, \emph{Theory {Construction} and
{Selection} in {Modern Physics}: {The S Matrix}}. Cambridge University
Press,
1990.~\href{https://doi.org/10.1017/CBO9781139170123}{10.1017/CBO9781139170123}.}

\bibitem[\citeproctext]{ref-Blum:2017diy}
\CSLLeftMargin{{[}99{]} }%
\CSLRightInline{A. S. Blum, {``The state is not abolished, it withers
away: {How} quantum field theory became a theory of scattering,''}
\emph{Stud. Hist. Philos. Sci. B}, vol.~60, pp.~46--80, Nov.
2017,~\href{https://doi.org/10.1016/j.shpsb.2017.01.004}{10.1016/j.shpsb.2017.01.004}.}

\bibitem[\citeproctext]{ref-Weinberg:1995mt}
\CSLLeftMargin{{[}100{]} }%
\CSLRightInline{S. Weinberg, \emph{The {Quantum Theory} of {Fields},
{Volume} 1: {Foundations}}. New York: Cambridge University Press, 1995.
ISBN:~978-0-521-55001-7}

\bibitem[\citeproctext]{ref-Goldberger:2004-CollisionTheory}
\CSLLeftMargin{{[}101{]} }%
\CSLRightInline{M. L. Goldberger and K. M. Watson, \emph{Collision
theory}. New York: John Wiley \& Sons, Inc., 2004.
ISBN:~978-0-486-43507-7}

\bibitem[\citeproctext]{ref-Martin:1970hmp}
\CSLLeftMargin{{[}102{]} }%
\CSLRightInline{A. D. Martin and T. D. Spearman, \emph{Elementary
{Particle Theory}}. Amsterdam: North Holland Publishing Company, 1970.
ISBN:~978-0-7204-0157-8}

\bibitem[\citeproctext]{ref-Briceno:2017max}
\CSLLeftMargin{{[}103{]} }%
\CSLRightInline{R. A. Briceño, J. J. Dudek, and R. D. Young,
{``Scattering processes and resonances from lattice {QCD},''} \emph{Rev.
Mod. Phys.}, vol.~90, no.~2, p.~025001, Apr.
2018,~\href{https://doi.org/10.1103/RevModPhys.90.025001}{10.1103/RevModPhys.90.025001}.}

\bibitem[\citeproctext]{ref-Mizera:2023tfe}
\CSLLeftMargin{{[}104{]} }%
\CSLRightInline{S. Mizera, {``Physics of the analytic {S-matrix},''}
\emph{Physics Reports}, vol.~1047, pp.~1--92, Jan.
2024,~\href{https://doi.org/10.1016/j.physrep.2023.10.006}{10.1016/j.physrep.2023.10.006}.}

\bibitem[\citeproctext]{ref-Nussenzveig:1972tcd}
\CSLLeftMargin{{[}105{]} }%
\CSLRightInline{H. M. Nussenzveig, \emph{Causality and dispersion
relations}. in Mathematics in science and engineering, no.~v. 95. New
York: Academic Press, 1972. ISBN:~978-0-12-523050-6}

\bibitem[\citeproctext]{ref-Newton:1982qc}
\CSLLeftMargin{{[}106{]} }%
\CSLRightInline{R. G. Newton, \emph{Scattering {Theory} of {Waves} and
{Particles}}, 2nd ed. New York: Springer, 1982. ISBN:~978-3-540-10950-1}

\bibitem[\citeproctext]{ref-Eden:1966dnq}
\CSLLeftMargin{{[}107{]} }%
\CSLRightInline{R. J. Eden, P. V. Landshoff, D. I. Olive, and J. C.
Polkinghorne, \emph{The {Analytic S-Matrix}}. Cambridge University
Press, 1966. ISBN:~978-0-521-52336-3}

\bibitem[\citeproctext]{ref-Chew:1966-AnalyticSMatrix}
\CSLLeftMargin{{[}108{]} }%
\CSLRightInline{G. F. Chew, \emph{The {Analytic S Matrix}: {A Basis For
Nuclear Democracy}}. New York: W.A. Benjamin, 1966.}

\bibitem[\citeproctext]{ref-Mandelstam:1958xc}
\CSLLeftMargin{{[}109{]} }%
\CSLRightInline{S. Mandelstam, {``Determination of the {Pion-Nucleon
Scattering Amplitude} from {Dispersion Relations} and {Unitarity}.
{General Theory},''} \emph{Phys. Rev.}, vol.~112, no.~4, pp.~1344--1360,
Nov.
1958,~\href{https://doi.org/10.1103/PhysRev.112.1344}{10.1103/PhysRev.112.1344}.}

\bibitem[\citeproctext]{ref-Kibble:1960zz}
\CSLLeftMargin{{[}110{]} }%
\CSLRightInline{T. W. B. Kibble, {``Kinematics of {General Scattering
Processes} and the {Mandelstam Representation},''} \emph{Phys. Rev.},
vol.~117, no.~4, pp.~1159--1162, Feb.
1960,~\href{https://doi.org/10.1103/PhysRev.117.1159}{10.1103/PhysRev.117.1159}.}

\bibitem[\citeproctext]{ref-Kallen:1964lxa}
\CSLLeftMargin{{[}111{]} }%
\CSLRightInline{G. Källén, \emph{Elementary {Particle Physics}}.
Reading, MA: Addison-Wesley, 1964. ISBN:~978-0-201-03575-9}

\bibitem[\citeproctext]{ref-Omnes:1963-MandelstamTheoryRegge}
\CSLLeftMargin{{[}112{]} }%
\CSLRightInline{R. Omnès and M. Froissart, \emph{Mandelstam {Theory} and
{Regge Poles}: {An Introduction} for {Experimentalists}}. New York: W.A.
Benjamin, 1963. ISBN:~978-1-258-40714-8}

\bibitem[\citeproctext]{ref-Chew:1960iv}
\CSLLeftMargin{{[}113{]} }%
\CSLRightInline{G. F. Chew and S. Mandelstam, {``Theory of the
{Low-Energy Pion-Pion Interaction},''} \emph{Phys. Rev.}, vol.~119,
no.~1, pp.~467--477, Jul.
1960,~\href{https://doi.org/10.1103/PhysRev.119.467}{10.1103/PhysRev.119.467}.}

\bibitem[\citeproctext]{ref-Anisovich:2013gha}
\CSLLeftMargin{{[}114{]} }%
\CSLRightInline{A. V. Anisovich, V. V. Anisovich, M. A. Matveev, V. A.
Nikonov, J. Nyiri, and A. V. Sarantsev, \emph{Three-{Particle Physics}
and {Dispersion Relation Theory}}. Singapore: World Scientific,
2013.~\href{https://doi.org/10.1142/8779}{10.1142/8779}.}

\bibitem[\citeproctext]{ref-Khuri:1960zz}
\CSLLeftMargin{{[}115{]} }%
\CSLRightInline{N. N. Khuri and S. B. Treiman, {``Pion--pion scattering
and \(K^\pm \to 3\pi\) decay,''} \emph{Phys. Rev.}, vol.~119, no.~3,
pp.~1115--1121, Aug.
1960,~\href{https://doi.org/10.1103/PhysRev.119.1115}{10.1103/PhysRev.119.1115}.}

\bibitem[\citeproctext]{ref-Regge:1959mz}
\CSLLeftMargin{{[}116{]} }%
\CSLRightInline{T. Regge, {``Introduction to complex orbital momenta,''}
\emph{Nuovo Cimento}, vol.~14, no.~5, pp.~951--976, Dec.
1959,~\href{https://doi.org/10.1007/BF02728177}{10.1007/BF02728177}.}

\bibitem[\citeproctext]{ref-Jacob:1959at}
\CSLLeftMargin{{[}117{]} }%
\CSLRightInline{M. Jacob and G. C. Wick, {``On the general theory of
collisions for particles with spin,''} \emph{Ann. Phys.}, vol.~7, no.~4,
pp.~404--428, Aug.
1959,~\href{https://doi.org/10.1016/0003-4916(59)90051-X}{10.1016/0003-4916(59)90051-X}.}

\bibitem[\citeproctext]{ref-Landau:2007-QuantumMechanics}
\CSLLeftMargin{{[}118{]} }%
\CSLRightInline{L. D. Landau and E. M. Lifšic, \emph{Quantum
{Mechanics}: {Non-Relativistic Theory}}, 3rd ed. in Course of
{Theoretical Physics}, no.~Vol. 3. Singapore: Elsevier, 2007.
ISBN:~978-0-7506-3539-4}

\bibitem[\citeproctext]{ref-Cutkosky:1979zv}
\CSLLeftMargin{{[}119{]} }%
\CSLRightInline{R. E. Cutkosky \emph{et al.}, {``Pion--nucleon
partial-wave analysis,''} \emph{Phys. Rev. D}, vol.~20, no.~11,
pp.~2804--2838, Dec.
1979,~\href{https://doi.org/10.1103/PhysRevD.20.2804}{10.1103/PhysRevD.20.2804}.}

\bibitem[\citeproctext]{ref-Cutkosky:1980rh}
\CSLLeftMargin{{[}120{]} }%
\CSLRightInline{R. E. Cutkosky, C. P. Forsyth, J. B. Babcock, R. L.
Kelly, and R. E. Hendrick, {``Pion--{Nucleon Partial Wave Analysis},''}
in \emph{4th international conference on baryon resonances}, Jul.~1980,
p.~19. \url{https://inspirehep.net/literature/154488}}

\bibitem[\citeproctext]{ref-Breit:1936zzb}
\CSLLeftMargin{{[}121{]} }%
\CSLRightInline{G. Breit and E. P. Wigner, {``Capture of {Slow
Neutrons},''} \emph{Phys. Rev.}, vol.~49, no.~7, pp.~519--531, Apr.
1936,~\href{https://doi.org/10.1103/PhysRev.49.519}{10.1103/PhysRev.49.519}.}

\bibitem[\citeproctext]{ref-Perl:1974-HadronPhysics}
\CSLLeftMargin{{[}122{]} }%
\CSLRightInline{M. L. Perl, \emph{High {Energy Hadron Physics}}. New
York: Wiley, 1974. ISBN:~978-0-471-68049-9}

\bibitem[\citeproctext]{ref-VonHippel:1972fg}
\CSLLeftMargin{{[}123{]} }%
\CSLRightInline{F. von Hippel and C. Quigg, {``Centrifugal-{Barrier
Effects} in {Resonance Partial Decay Widths}, {Shapes}, and {Production
Amplitudes},''} \emph{Phys. Rev. D}, vol.~5, no.~3, pp.~624--638, Feb.
1972,~\href{https://doi.org/10.1103/PhysRevD.5.624}{10.1103/PhysRevD.5.624}.}

\bibitem[\citeproctext]{ref-Briceno:2017qmb}
\CSLLeftMargin{{[}124{]} }%
\CSLRightInline{R. A. Briceño, J. J. Dudek, R. G. Edwards, D. J. Wilson,
and Hadron Spectrum Collaboration, {``Isoscalar
\(\pi\pi, K\bar{K}, \eta\eta\) scattering and the \(\sigma, f_0, f_2\)
mesons from QCD,''} \emph{Phys. Rev. D}, vol.~97,
no.~JLAB--THY--17--2534, p.~054513, Mar.
2018,~\href{https://doi.org/10.1103/PhysRevD.97.054513}{10.1103/PhysRevD.97.054513}.}

\bibitem[\citeproctext]{ref-Blatt:1952ije}
\CSLLeftMargin{{[}125{]} }%
\CSLRightInline{J. M. Blatt and V. F. Weisskopf, \emph{Theoretical
{Nuclear Physics}}. New York: Springer,
1952.~\href{https://doi.org/10.1007/978-1-4612-9959-2}{10.1007/978-1-4612-9959-2}.}

\bibitem[\citeproctext]{ref-Dalitz:1961dx}
\CSLLeftMargin{{[}126{]} }%
\CSLRightInline{R. H. Dalitz, {``On the {Strong Interactions} of the
{Strange Particles},''} \emph{Rev. Mod. Phys.}, vol.~33, no.~3,
pp.~471--492, Jul.
1961,~\href{https://doi.org/10.1103/RevModPhys.33.471}{10.1103/RevModPhys.33.471}.}

\bibitem[\citeproctext]{ref-Chung:1995dx}
\CSLLeftMargin{{[}127{]} }%
\CSLRightInline{S.-U. Chung, J. Brose, R. Hackmann, E. Klempt, S.
Spanier, and C. Strassburger, {``Partial wave analysis in \(K\)-matrix
formalism,''} \emph{Ann. Phys.}, vol.~507, no.~5, pp.~404--430, May
1995,~\href{https://doi.org/10.1002/andp.19955070504}{10.1002/andp.19955070504}.}

\bibitem[\citeproctext]{ref-Aitchison:1972ay}
\CSLLeftMargin{{[}128{]} }%
\CSLRightInline{I. J. R. Aitchison, {``The \(K\)-matrix formalism for
overlapping resonances,''} \emph{Nucl. Phys. A}, vol.~189, no.~2,
pp.~417--423, Jul.
1972,~\href{https://doi.org/10.1016/0375-9474(72)90305-3}{10.1016/0375-9474(72)90305-3}.}

\bibitem[\citeproctext]{ref-JPAC:2021rxu}
\CSLLeftMargin{{[}129{]} }%
\CSLRightInline{JPAC Collaboration \emph{et al.}, {``Novel approaches in
{Hadron Spectroscopy},''} \emph{Prog. Part. Nucl. Phys.}, vol.~127,
p.~103981, Nov.
2022,~\href{https://doi.org/10.1016/j.ppnp.2022.103981}{10.1016/j.ppnp.2022.103981}.}

\bibitem[\citeproctext]{ref-Mai:2022eur}
\CSLLeftMargin{{[}130{]} }%
\CSLRightInline{M. Mai, U.-G. Meißner, and C. Urbach, {``Towards a
theory of hadron resonances,''} \emph{Physics Reports}, vol.~1001,
pp.~1--66, Feb.
2023,~\href{https://doi.org/10.1016/j.physrep.2022.11.005}{10.1016/j.physrep.2022.11.005}.}

\bibitem[\citeproctext]{ref-Roper:1964zza}
\CSLLeftMargin{{[}131{]} }%
\CSLRightInline{L. D. Roper, {``Evidence for a \(P_{11}\) {Pion-Nucleon}
resonance at 556 MeV,''} \emph{Phys. Rev. Lett.}, vol.~12, no.~12,
pp.~340--342, Mar.
1964,~\href{https://doi.org/10.1103/PhysRevLett.12.340}{10.1103/PhysRevLett.12.340}.}

\bibitem[\citeproctext]{ref-Gribov:2009cfk}
\CSLLeftMargin{{[}132{]} }%
\CSLRightInline{V. N. Gribov, Y. Dokshitzer, and J. Nyiri, \emph{Strong
{Interactions} of {Hadrons} at {High Energies}: {Gribov Lectures} on
{Theoretical Physics}}. in Cambridge {Monographs} on {Particle Physics},
{Nuclear Physics} and {Cosmology}, no.~27. New York: Cambridge
University Press,
2009.~\href{https://doi.org/10.1017/CBO9780511534942}{10.1017/CBO9780511534942}.}

\bibitem[\citeproctext]{ref-Ahlfors:1966-ComplexAnalysis}
\CSLLeftMargin{{[}133{]} }%
\CSLRightInline{L. V. Ahlfors, \emph{Complex {Analysis}: {An
Introduction} to the {Theory} of {Analytic Functions} of one {Complex
Variable}}, 2nd ed. in International {Series} in {Pure} and {Applied
Mathematics}. New York: MacGraw-Hill, 1966. ISBN:~978-0-07-000656-0}

\bibitem[\citeproctext]{ref-Deineka:2023dcu}
\CSLLeftMargin{{[}134{]} }%
\CSLRightInline{O. Deineka, {``Coupled-channel dynamics in hadronic
systems,''} PhD thesis, Johannes Gutenberg University, Mainz,
2023.~\href{https://doi.org/10.25358/openscience-8981}{10.25358/openscience-8981}.}

\bibitem[\citeproctext]{ref-Sugawara:1961zz}
\CSLLeftMargin{{[}135{]} }%
\CSLRightInline{M. Sugawara and A. Kanazawa, {``Subtractions in
{Dispersion Relations},''} \emph{Phys. Rev.}, vol.~123, no.~5,
pp.~1895--1902, Sep.
1961,~\href{https://doi.org/10.1103/PhysRev.123.1895}{10.1103/PhysRev.123.1895}.}

\bibitem[\citeproctext]{ref-Edwards:1980sa}
\CSLLeftMargin{{[}136{]} }%
\CSLRightInline{B. J. Edwards and G. H. Thomas, {``Inelastic thresholds
and dibaryon resonances,''} \emph{Phys. Rev. D}, vol.~22, no.~11,
pp.~2772--2783, Dec.
1980,~\href{https://doi.org/10.1103/PhysRevD.22.2772}{10.1103/PhysRevD.22.2772}.}

\bibitem[\citeproctext]{ref-Reid:1982wt}
\CSLLeftMargin{{[}137{]} }%
\CSLRightInline{J. H. Reid and N. N. Trofimenkoff, {``A generating
function for {Chew}--{Mandelstam} functions,''} \emph{J. Math. Phys.},
vol.~25, no.~12, pp.~3540--3544, Dec.
1984,~\href{https://doi.org/10.1063/1.526093}{10.1063/1.526093}.}

\bibitem[\citeproctext]{ref-Ketzer:2019wmd}
\CSLLeftMargin{{[}138{]} }%
\CSLRightInline{B. Ketzer, B. Grube, and D. Ryabchikov, {``Light-meson
spectroscopy with {COMPASS},''} \emph{Prog. Part. Nucl. Phys.},
vol.~113, p.~103755, Jul.
2020,~\href{https://doi.org/10.1016/j.ppnp.2020.103755}{10.1016/j.ppnp.2020.103755}.}

\bibitem[\citeproctext]{ref-Asokan:2022usm}
\CSLLeftMargin{{[}139{]} }%
\CSLRightInline{A. Asokan, M.-N. Tang, F.-K. Guo, C. Hanhart, Y. Kamiya,
and U.-G. Meißner, {``Can the two-pole structure of the \(D_0^*(2300)\)
be understood from recent lattice data?''} \emph{Eur. Phys. J. C},
vol.~83, no.~9, p.~850, Sep.
2023,~\href{https://doi.org/10.1140/epjc/s10052-023-11953-6}{10.1140/epjc/s10052-023-11953-6}.}

\bibitem[\citeproctext]{ref-Basdevant:1977ya}
\CSLLeftMargin{{[}140{]} }%
\CSLRightInline{J. L. Basdevant and E. L. Berger, {``Unitary
coupled-channel analysis of diffractive production of the \(A_1\)
resonance,''} \emph{Phys. Rev. D}, vol.~16, no.~3, pp.~657--678, Aug.
1977,~\href{https://doi.org/10.1103/PhysRevD.16.657}{10.1103/PhysRevD.16.657}.}

\bibitem[\citeproctext]{ref-Fisher:1922saa}
\CSLLeftMargin{{[}141{]} }%
\CSLRightInline{R. A. Fisher, {``On the mathematical foundations of
theoretical statistics,''} \emph{Phil. Trans. Roy. Soc. Lond. A},
vol.~222, no.~594--604, pp.~309--368, Jan.
1922,~\href{https://doi.org/10.1098/rsta.1922.0009}{10.1098/rsta.1922.0009}.}

\bibitem[\citeproctext]{ref-Lyons:1986em}
\CSLLeftMargin{{[}142{]} }%
\CSLRightInline{L. Lyons, \emph{Statistics for nuclear and particle
physicists}. Cambridge University Press,
1986.~\href{https://doi.org/10.1017/cbo9781139167710}{10.1017/cbo9781139167710}.}

\bibitem[\citeproctext]{ref-James:1975dr}
\CSLLeftMargin{{[}143{]} }%
\CSLRightInline{F. James and M. Roos, {``Minuit -- {A System} for
{Function Minimization} and {Analysis} of the {Parameter Errors} and
{Correlations},''} \emph{Comput. Phys. Commun.}, vol.~10, no.~6,
pp.~343--367, Dec.
1975,~\href{https://doi.org/10.1016/0010-4655(75)90039-9}{10.1016/0010-4655(75)90039-9}.}

\bibitem[\citeproctext]{ref-Rarita:1941mf}
\CSLLeftMargin{{[}144{]} }%
\CSLRightInline{W. Rarita and J. Schwinger, {``On a {Theory} of
{Particles} with {Half-Integral Spin},''} \emph{Phys. Rev.}, vol.~60,
no.~1, pp.~61--61, Jul.
1941,~\href{https://doi.org/10.1103/PhysRev.60.61}{10.1103/PhysRev.60.61}.}

\bibitem[\citeproctext]{ref-Chung:1993da}
\CSLLeftMargin{{[}145{]} }%
\CSLRightInline{S. U. Chung, {``Helicity-coupling amplitudes in tensor
formalism,''} \emph{Phys. Rev. D}, vol.~48, no.~3, pp.~1225--1239, Aug.
1993,~\href{https://doi.org/10.1103/PhysRevD.48.1225}{10.1103/PhysRevD.48.1225}.}

\bibitem[\citeproctext]{ref-Filippini:1995yc}
\CSLLeftMargin{{[}146{]} }%
\CSLRightInline{V. Filippini, A. Fontana, and A. Rotondi, {``Covariant
spin tensors in meson spectroscopy,''} \emph{Phys. Rev. D}, vol.~51,
no.~5, pp.~2247--2261, Mar.
1995,~\href{https://doi.org/10.1103/PhysRevD.51.2247}{10.1103/PhysRevD.51.2247}.}

\bibitem[\citeproctext]{ref-Anisovich:2006bc}
\CSLLeftMargin{{[}147{]} }%
\CSLRightInline{A. V. Anisovich and A. V. Sarantsev, {``Partial decay
widths of baryons in the spin-momentum operator expansion method,''}
\emph{Eur. Phys. J. A}, vol.~30, no.~2, pp.~427--441, Nov.
2006,~\href{https://doi.org/10.1140/epja/i2006-10102-1}{10.1140/epja/i2006-10102-1}.}

\bibitem[\citeproctext]{ref-Chung:2007nn}
\CSLLeftMargin{{[}148{]} }%
\CSLRightInline{S.-U. Chung and J. M. Friedrich, {``Covariant
helicity-coupling amplitudes: {A} new formulation,''} \emph{Phys. Rev.
D}, vol.~78, no.~7, Oct.
2008,~\href{https://doi.org/10.1103/PhysRevD.78.074027}{10.1103/PhysRevD.78.074027}.}

\bibitem[\citeproctext]{ref-Richman:1984gh}
\CSLLeftMargin{{[}149{]} }%
\CSLRightInline{J. D. Richman, {``An {Experimenter}'s {Guide} to the
{Helicity Formalism}.''} Jun. 1984.
\url{https://cds.cern.ch/record/153636}}

\bibitem[\citeproctext]{ref-Chung:2014-SpinFormalismsUpdated}
\CSLLeftMargin{{[}150{]} }%
\CSLRightInline{S.-U. Chung, {``Spin {Formalisms} ({Updated
Version}),''} Brookhaven National Laboratory, BNL--76975-2006-IR,
890945, Jul. 2014. \url{https://suchung.web.cern.ch/spinfm1.pdf}}

\bibitem[\citeproctext]{ref-Kutschke:1996-AngularDistributionCookbook}
\CSLLeftMargin{{[}151{]} }%
\CSLRightInline{R. Kutschke, {``An {Angular Distribution Cookbook}.''}
Jan. 1996. \url{https://home.fnal.gov/~kutschke/Angdist/angdist.ps}}

\bibitem[\citeproctext]{ref-Leader:2011vwq}
\CSLLeftMargin{{[}152{]} }%
\CSLRightInline{E. Leader, \emph{Spin in {Particle Physics}}. Cambridge
University Press,
2023.~\href{https://doi.org/10.1017/9781009402040}{10.1017/9781009402040}.}

\bibitem[\citeproctext]{ref-Wigner:1931-Gruppentheorie}
\CSLLeftMargin{{[}153{]} }%
\CSLRightInline{E. P. Wigner, \emph{{Gruppentheorie und Ihre Anwendung
Auf Die Quantenmechanik der Atomspektren}}, Unveränderter Nachdruck
1977. Wiesbaden: Springer,
1931.~\href{https://doi.org/10.1007/978-3-663-02555-9}{10.1007/978-3-663-02555-9}.}

\bibitem[\citeproctext]{ref-Chung:1971ri}
\CSLLeftMargin{{[}154{]} }%
\CSLRightInline{S. U. Chung, {``Spin formalisms,''} \emph{CDS}, Mar.
1971,~\href{https://doi.org/10.5170/CERN-1971-008}{10.5170/CERN-1971-008}.}

\bibitem[\citeproctext]{ref-Chen:2017gtx}
\CSLLeftMargin{{[}155{]} }%
\CSLRightInline{H. Chen and R.-G. Ping, {``Coherent helicity amplitude
for sequential decays,''} \emph{Phys. Rev. D}, vol.~95, no.~7,
p.~076010, Apr.
2017,~\href{https://doi.org/10.1103/PhysRevD.95.076010}{10.1103/PhysRevD.95.076010}.}

\bibitem[\citeproctext]{ref-Habermann:2024sxs}
\CSLLeftMargin{{[}156{]} }%
\CSLRightInline{K. S. Habermann and M. Mikhasenko, {``Wigner rotations
for cascade reactions,''} \emph{Phys. Rev. D}, vol.~111, no.~5,
p.~056015, Mar.
2025,~\href{https://doi.org/10.1103/PhysRevD.111.056015}{10.1103/PhysRevD.111.056015}.}

\bibitem[\citeproctext]{ref-JPAC:2019ufm}
\CSLLeftMargin{{[}157{]} }%
\CSLRightInline{M. Mikhasenko \emph{et al.}, {``Dalitz-plot
decomposition for three-body decays,''} \emph{Phys. Rev. D}, vol.~101,
no.~3, p.~034033, Feb.
2020,~\href{https://doi.org/10.1103/PhysRevD.101.034033}{10.1103/PhysRevD.101.034033}.}

\bibitem[\citeproctext]{ref-Brun:1997pa}
\CSLLeftMargin{{[}158{]} }%
\CSLRightInline{R. Brun and F. Rademakers, {``{ROOT} --- {An} object
oriented data analysis framework,''} \emph{Nucl. Instrum. Methods Phys.
Res. A}, vol.~389, no.~1--2, pp.~81--86, Apr.
1997,~\href{https://doi.org/10.1016/S0168-9002(97)00048-X}{10.1016/S0168-9002(97)00048-X}.}

\bibitem[\citeproctext]{ref-Antcheva:2009zz}
\CSLLeftMargin{{[}159{]} }%
\CSLRightInline{I. Antcheva \emph{et al.}, {``{ROOT} --- {A C}++
framework for petabyte data storage, statistical analysis and
visualization,''} \emph{Comput. Phys. Commun.}, vol.~180, no.~12,
pp.~2499--2512, Dec.
2009,~\href{https://doi.org/10.1016/j.cpc.2009.08.005}{10.1016/j.cpc.2009.08.005}.}

\bibitem[\citeproctext]{ref-Stroustrup:2007-EvolvingLanguage}
\CSLLeftMargin{{[}160{]} }%
\CSLRightInline{B. Stroustrup, {``Evolving a language in and for the
real world: {C}++ 1991--2006,''} in \emph{Proceedings of the third {ACM
SIGPLAN} conference on {History} of programming languages}, San Diego
California: ACM,
Jun.~2007.~\href{https://doi.org/10.1145/1238844.1238848}{10.1145/1238844.1238848}.}

\bibitem[\citeproctext]{ref-TIOBE:2025-TIOBEIndex}
\CSLLeftMargin{{[}161{]} }%
\CSLRightInline{TIOBE, {``{TIOBE Index},''} \emph{TIOBE}. Aug. 2025.
\url{https://web.archive.org/web/20250826100003/https://www.tiobe.com/tiobe-index}}

\bibitem[\citeproctext]{ref-Press:1992-NumericalRecipesC}
\CSLLeftMargin{{[}162{]} }%
\CSLRightInline{W. H. Press, S. A. Teukolsky, W. T. Vetterling, and B.
P. Flannery, \emph{Numerical {Recipes} in {C}: {The Art} of {Scientific
Computing}}, 2nd ed. New York: Cambridge University Press, 1992.
ISBN:~978-0-521-43108-8}

\bibitem[\citeproctext]{ref-Iglberger:2012-ExpressionTemplatesRevisited}
\CSLLeftMargin{{[}163{]} }%
\CSLRightInline{K. Iglberger, G. Hager, J. Treibig, and U. Rüde,
{``Expression {Templates Revisited}: {A Performance Analysis} of
{Current Methodologies},''} \emph{SIAM J. Sci. Comput.}, vol.~34, no.~2,
pp.~C42--C69, Jan.
2012,~\href{https://doi.org/10.1137/110830125}{10.1137/110830125}.}

\bibitem[\citeproctext]{ref-Herlihy:2012-ArtMultiprocessorProgramming}
\CSLLeftMargin{{[}164{]} }%
\CSLRightInline{M. Herlihy, \emph{The {Art} of {Multiprocessor
Programming}}, Rev. 1st ed. Waltham, MA: Morgan Kaufmann, 2012.
ISBN:~978-0-12-397337-5}

\bibitem[\citeproctext]{ref-vanderWalt:2011bqk}
\CSLLeftMargin{{[}165{]} }%
\CSLRightInline{S. Van Der Walt, S. C. Colbert, and G. Varoquaux, {``The
{NumPy Array}: {A Structure} for {Efficient Numerical Computation},''}
\emph{Comput. Sci. Eng.}, vol.~13, no.~2, pp.~22--30, Mar.
2011,~\href{https://doi.org/10.1109/MCSE.2011.37}{10.1109/MCSE.2011.37}.}

\bibitem[\citeproctext]{ref-Harris:2020xlr}
\CSLLeftMargin{{[}166{]} }%
\CSLRightInline{C. R. Harris \emph{et al.}, {``Array programming with
{NumPy},''} \emph{Nature}, vol.~585, no.~7825, pp.~357--362, Sep.
2020,~\href{https://doi.org/10.1038/s41586-020-2649-2}{10.1038/s41586-020-2649-2}.}

\bibitem[\citeproctext]{ref-Wolf:1991-DataLocalityOptimizing}
\CSLLeftMargin{{[}167{]} }%
\CSLRightInline{M. E. Wolf and M. S. Lam, {``A {Data Locality Optimizing
Algorithm},''} \emph{SIGPLAN Not.}, vol.~26, no.~6, pp.~30--44, Jun.
1991,~\href{https://doi.org/10.1145/113446.113449}{10.1145/113446.113449}.}

\bibitem[\citeproctext]{ref-Iverson:1980-NotationToolThought}
\CSLLeftMargin{{[}168{]} }%
\CSLRightInline{K. E. Iverson, {``Notation as a tool of thought,''}
\emph{Commun. ACM}, vol.~23, no.~8, pp.~444--465, Aug.
1980,~\href{https://doi.org/10.1145/358896.358899}{10.1145/358896.358899}.}

\bibitem[\citeproctext]{ref-Flynn:1972-ComputerOrganizations}
\CSLLeftMargin{{[}169{]} }%
\CSLRightInline{M. J. Flynn, {``Some {Computer Organizations} and {Their
Effectiveness},''} \emph{IEEE Trans. Comput.}, vol.~C--21, no.~9,
pp.~948--960, Sep.
1972,~\href{https://doi.org/10.1109/TC.1972.5009071}{10.1109/TC.1972.5009071}.}

\bibitem[\citeproctext]{ref-Lawson:1979-BLAS}
\CSLLeftMargin{{[}170{]} }%
\CSLRightInline{C. L. Lawson, R. J. Hanson, D. R. Kincaid, and F. T.
Krogh, {``Basic {Linear Algebra Subprograms} for {Fortran Usage},''}
\emph{ACM Trans. Math. Softw.}, vol.~5, no.~3, pp.~308--323, Sep.
1979,~\href{https://doi.org/10.1145/355841.355847}{10.1145/355841.355847}.}

\bibitem[\citeproctext]{ref-Angerson:1990-LAPACK}
\CSLLeftMargin{{[}171{]} }%
\CSLRightInline{E. Angerson \emph{et al.}, {``{LAPACK}: {A} portable
linear algebra library for high-performance computers,''} in
\emph{Supercomputing '90: {Proceedings} of the 1990 {ACM}/{IEEE}
conference on {Supercomputing}}, New York: IEEE, ~1990,
pp.~2--11.~\href{https://doi.org/10.1109/SUPERC.1990.129995}{10.1109/SUPERC.1990.129995}.}

\bibitem[\citeproctext]{ref-Jouppi:2017-InDatacenterPerformanceAnalysis}
\CSLLeftMargin{{[}172{]} }%
\CSLRightInline{N. P. Jouppi \emph{et al.}, {``In-{Datacenter
Performance Analysis} of a {Tensor Processing Unit},''} in
\emph{Proceedings of the 44th {Annual International Symposium} on
{Computer Architecture}}, Toronto: ACM Press, Jun.~2017,
pp.~1--12.~\href{https://doi.org/10.1145/3079856.3080246}{10.1145/3079856.3080246}.}

\bibitem[\citeproctext]{ref-Sapunov:2024-DeepLearningJAX}
\CSLLeftMargin{{[}173{]} }%
\CSLRightInline{G. Sapunov, \emph{Deep {Learning} with {JAX}}, 1st ed.
New York: Manning Publications Co. LLC, 2024. ISBN:~978-1-63343-888-0}

\bibitem[\citeproctext]{ref-Griewank:2008-EvaluatingDerivatives}
\CSLLeftMargin{{[}174{]} }%
\CSLRightInline{A. Griewank and A. Walther, \emph{Evaluating
{Derivatives}: {Principles} and {Techniques} of {Algorithmic
Differentiation}}, 2nd ed. Philadelphia: SIAM,
2008.~\href{https://doi.org/10.1137/1.9780898717761}{10.1137/1.9780898717761}.}

\bibitem[\citeproctext]{ref-Moses:2012-Macsyma}
\CSLLeftMargin{{[}175{]} }%
\CSLRightInline{J. Moses, {``Macsyma: {A} personal history,''} \emph{J.
Symb. Comput.}, vol.~47, no.~2, pp.~123--130, Feb.
2012,~\href{https://doi.org/10.1016/j.jsc.2010.08.018}{10.1016/j.jsc.2010.08.018}.}

\bibitem[\citeproctext]{ref-Martin:1971-MACSYMA}
\CSLLeftMargin{{[}176{]} }%
\CSLRightInline{W. A. Martin and R. J. Fateman, {``The {MACSYMA}
system,''} in \emph{Proceedings of the second {ACM Symposium} on
{Symbolic} and {Algebraic} manipulation - {SYMSAC} '71}, Los Angeles:
ACM Press, ~1971,
pp.~59--75.~\href{https://doi.org/10.1145/800204.806267}{10.1145/800204.806267}.}

\bibitem[\citeproctext]{ref-Wolfram:1988-Mathematica}
\CSLLeftMargin{{[}177{]} }%
\CSLRightInline{S. Wolfram, \emph{Mathematica: {A System} for {Doing
Mathematics} by {Computer}}. Redwood City, CA: Addison-Wesley, 1988.
ISBN:~978-0-201-19330-5}

\bibitem[\citeproctext]{ref-Meurer:2017yhf}
\CSLLeftMargin{{[}178{]} }%
\CSLRightInline{A. Meurer \emph{et al.}, {``{SymPy}: {Symbolic}
computing in {Python},''} \emph{PeerJ Comput. Sci.}, vol.~3, p.~e103,
Jan.
2017,~\href{https://doi.org/10.7717/peerj-cs.103}{10.7717/peerj-cs.103}.}

\bibitem[\citeproctext]{ref-mpmath:2023}
\CSLLeftMargin{{[}179{]} }%
\CSLRightInline{The mpmath development team, {``Mpmath: A {Python}
library for arbitrary-precision floating-point arithmetic (version
1.3.0).''} 2023. \url{https://mpmath.org}}

\bibitem[\citeproctext]{ref-Poepping:2024-MScThesis}
\CSLLeftMargin{{[}180{]} }%
\CSLRightInline{L. Z. Pöpping, {``High-performance computations with
symbolic {\(K\)~matrix} expressions tested on {\(N^∗\)} resonances in
{\(J/\psi\)} decays with data provided by {BESIII},''} MSc thesis, Ruhr
University Bochum, 2024.}

\bibitem[\citeproctext]{ref-Schmitt:2022-sympy2c}
\CSLLeftMargin{{[}181{]} }%
\CSLRightInline{U. Schmitt, B. Moser, C. S. Lorenz, and A. Refregier,
{``\texttt{sympy2c}: From symbolic expressions to fast {C/C++} functions
and {ODE} solvers in {Python}.''} arXiv, Mar.
2022.~\href{https://doi.org/10.48550/arxiv.2203.11945}{10.48550/arxiv.2203.11945}.}

\bibitem[\citeproctext]{ref-Martiros:2022-SymForceSymbolicComputation}
\CSLLeftMargin{{[}182{]} }%
\CSLRightInline{H. Martiros \emph{et al.}, {``{SymForce}: {Symbolic
Computation} and {Code Generation} for {Robotics},''} in \emph{Robotics:
{Science} and {Systems XVIII}}, New York: RSS Foundation,
Jun.~2022.~\href{https://doi.org/10.15607/RSS.2022.XVIII.041}{10.15607/RSS.2022.XVIII.041}.}

\bibitem[\citeproctext]{ref-Gowda:2024-SymbolicnumericProgrammingScientific}
\CSLLeftMargin{{[}183{]} }%
\CSLRightInline{S. Gowda, {``Symbolic-numeric programming in scientific
computing,''} PhD thesis, Massachusetts Institute of Technology,
Cambridge, MA, 2024. \url{https://dspace.mit.edu/handle/1721.1/155320}}

\bibitem[\citeproctext]{ref-Barthels:2021-LinneaAutomaticGeneration}
\CSLLeftMargin{{[}184{]} }%
\CSLRightInline{H. Barthels, C. Psarras, and P. Bientinesi, {``Linnea:
{Automatic Generation} of {Efficient Linear Algebra Programs},''}
\emph{ACM Trans. Math. Softw.}, vol.~47, no.~3, pp.~1--26, Sep.
2021,~\href{https://doi.org/10.1145/3446632}{10.1145/3446632}.}

\bibitem[\citeproctext]{ref-Ioannidis:2005-WhyMostPublished}
\CSLLeftMargin{{[}185{]} }%
\CSLRightInline{J. P. A. Ioannidis, {``Why {Most Published Research
Findings Are False},''} \emph{PLoS Med.}, vol.~2, no.~8, p.~e124, Aug.
2005,~\href{https://doi.org/10.1371/journal.pmed.0020124}{10.1371/journal.pmed.0020124}.}

\bibitem[\citeproctext]{ref-Baker:2016-1500ScientistsLift}
\CSLLeftMargin{{[}186{]} }%
\CSLRightInline{M. Baker, {``1,500 scientists lift the lid on
reproducibility,''} \emph{Nature}, vol.~533, no.~7604, pp.~452--454, May
2016,~\href{https://doi.org/10.1038/533452a}{10.1038/533452a}.}

\bibitem[\citeproctext]{ref-Antunes:2024-Reproducibility}
\CSLLeftMargin{{[}187{]} }%
\CSLRightInline{B. Antunes and D. R. C. Hill, {``Reproducibility,
{Replicability} and {Repeatability}: {A} survey of reproducible research
with a focus on high performance computing,''} \emph{Comput. Sci. Rev.},
vol.~53, p.~100655, Aug.
2024,~\href{https://doi.org/10.1016/j.cosrev.2024.100655}{10.1016/j.cosrev.2024.100655}.}

\bibitem[\citeproctext]{ref-Wilson:2017-GoodEnoughPractices}
\CSLLeftMargin{{[}188{]} }%
\CSLRightInline{G. Wilson, J. Bryan, K. Cranston, J. Kitzes, L.
Nederbragt, and T. K. Teal, {``Good enough practices in scientific
computing,''} \emph{PLoS Comput. Biol.}, vol.~13, no.~6, p.~e1005510,
Jun.
2017,~\href{https://doi.org/10.1371/journal.pcbi.1005510}{10.1371/journal.pcbi.1005510}.}

\bibitem[\citeproctext]{ref-Kitzes:2018-PracticeReproducibleResearch}
\CSLLeftMargin{{[}189{]} }%
\CSLRightInline{J. Kitzes, D. Turek, and F. Deniz, Eds., \emph{The
{Practice} of {Reproducible Research}: {Case Studies} and {Lessons} from
the {Data-Intensive Sciences}}. Oakland, CA: University of California
Press,
2018.~\href{https://doi.org/10.1525/9780520967779}{10.1525/9780520967779}.}

\bibitem[\citeproctext]{ref-Stodden:2013-ReproducibleComputationalResearch}
\CSLLeftMargin{{[}190{]} }%
\CSLRightInline{V. Stodden, P. Guo, and Z. Ma, {``Toward {Reproducible
Computational Research}: {An Empirical Analysis} of {Data} and {Code
Policy Adoption} by {Journals},''} \emph{PLoS ONE}, vol.~8, no.~6,
p.~e67111, Jun.
2013,~\href{https://doi.org/10.1371/journal.pone.0067111}{10.1371/journal.pone.0067111}.}

\bibitem[\citeproctext]{ref-Khoo:2022pja}
\CSLLeftMargin{{[}191{]} }%
\CSLRightInline{T. J. Khoo \emph{et al.}, {``Constraints on {Future
Analysis Metadata Systems} in {High Energy Physics},''} \emph{Comput.
Softw. Big Sci.}, vol.~6, no.~1, p.~13, Dec.
2022,~\href{https://doi.org/10.1007/s41781-022-00086-2}{10.1007/s41781-022-00086-2}.}

\bibitem[\citeproctext]{ref-Bierlich:2019rhm}
\CSLLeftMargin{{[}192{]} }%
\CSLRightInline{C. Bierlich \emph{et al.}, {``Robust {Independent
Validation} of {Experiment} and {Theory}: {Rivet} version 3,''}
\emph{SciPost Phys.}, vol.~8, no.~2, p.~026, Feb.
2020,~\href{https://doi.org/10.21468/SciPostPhys.8.2.026}{10.21468/SciPostPhys.8.2.026}.}

\bibitem[\citeproctext]{ref-Stodden:2014-BestPracticesComputational}
\CSLLeftMargin{{[}193{]} }%
\CSLRightInline{V. Stodden and S. Miguez, {``Best {Practices} for
{Computational Science}: {Software Infrastructure} and {Environments}
for {Reproducible} and {Extensible Research},''} \emph{J. Open Res.
Softw.}, vol.~2, no.~1, Jul.
2014,~\href{https://doi.org/10.5334/jors.ay}{10.5334/jors.ay}.}

\bibitem[\citeproctext]{ref-Gamage:2025-LockFiles}
\CSLLeftMargin{{[}194{]} }%
\CSLRightInline{Y. Gamage, D. Tiwari, M. Monperrus, and B. Baudry,
{``The {Design Space} of {Lockfiles Across Package Managers}.''} arXiv,
Jul.
2025.~\href{https://doi.org/10.48550/arxiv.2505.04834}{10.48550/arxiv.2505.04834}.}

\bibitem[\citeproctext]{ref-Procko:2024-SemanticScience}
\CSLLeftMargin{{[}195{]} }%
\CSLRightInline{T. T. Procko and O. Ochoa, {``Semantic {Science}:
{Publication Beyond} the {PDF},''} in \emph{{SoutheastCon} 2024},
Atlanta, GA: IEEE, Mar.~2024,
pp.~207--215.~\href{https://doi.org/10.1109/SoutheastCon52093.2024.10500258}{10.1109/SoutheastCon52093.2024.10500258}.}

\bibitem[\citeproctext]{ref-Heer:2023-LivingPapers}
\CSLLeftMargin{{[}196{]} }%
\CSLRightInline{J. Heer, M. Conlen, V. Devireddy, T. Nguyen, and J.
Horowitz, {``Living {Papers}: {A Language Toolkit} for {Augmented
Scholarly Communication},''} in \emph{Proceedings of the 36th {Annual
ACM Symposium} on {User Interface Software} and {Technology}}, San
Francisco: ACM Press, Oct.~2023,
pp.~1--13.~\href{https://doi.org/10.1145/3586183.3606791}{10.1145/3586183.3606791}.}

\bibitem[\citeproctext]{ref-Knuth:1984-LiterateProgramming}
\CSLLeftMargin{{[}197{]} }%
\CSLRightInline{D. E. Knuth, {``Literate {Programming},''} \emph{Comput.
J.}, vol.~27, no.~2, pp.~97--111, Feb.
1984,~\href{https://doi.org/10.1093/comjnl/27.2.97}{10.1093/comjnl/27.2.97}.}

\bibitem[\citeproctext]{ref-Schulte:2012-OrgMode}
\CSLLeftMargin{{[}198{]} }%
\CSLRightInline{E. Schulte, D. Davison, T. Dye, and C. Dominik, {``A
{Multi-Language Computing Environment} for {Literate Programming} and
{Reproducible Research},''} \emph{J. Stat. Soft.}, vol.~46, no.~3, Jan.
2012,~\href{https://doi.org/10.18637/jss.v046.i03}{10.18637/jss.v046.i03}.}

\bibitem[\citeproctext]{ref-Perez:2007emg}
\CSLLeftMargin{{[}199{]} }%
\CSLRightInline{F. Perez and B. E. Granger, {``{IPython}: {A System} for
{Interactive Scientific Computing},''} \emph{Comput. Sci. Eng.}, vol.~9,
no.~3, pp.~21--29,
2007,~\href{https://doi.org/10.1109/MCSE.2007.53}{10.1109/MCSE.2007.53}.}

\bibitem[\citeproctext]{ref-Perkel:2022-CopyPasteTyranny}
\CSLLeftMargin{{[}200{]} }%
\CSLRightInline{J. M. Perkel, {``Cut the tyranny of copy-and-paste with
these coding tools,''} \emph{Nature}, vol.~603, no.~7899, pp.~191--192,
Mar.
2022,~\href{https://doi.org/10.1038/d41586-022-00563-z}{10.1038/d41586-022-00563-z}.}

\bibitem[\citeproctext]{ref-Kluyver:2016-JupyterNotebooks}
\CSLLeftMargin{{[}201{]} }%
\CSLRightInline{T. Kluyver \emph{et al.}, {``Jupyter {Notebooks} -- a
publishing format for reproducible computational workflows,''} in
\emph{Positioning and {Power} in {Academic Publishing}: {Players},
{Agents} and {Agendas}}, IOS Press, 2016,
pp.~87--90.~\href{https://doi.org/10.3233/978-1-61499-649-1-87}{10.3233/978-1-61499-649-1-87}.}

\bibitem[\citeproctext]{ref-Millman:2018-DevelopingOpenSourceScientific}
\CSLLeftMargin{{[}202{]} }%
\CSLRightInline{K. J. Millman and F. Pérez, {``Developing {Open-Source
Scientific Practice},''} in \emph{Implementing {Reproducible Research}},
V. Stodden, F. Leisch, and R. D. Peng, Eds., {Chapman and Hall/CRC},
2018.~\href{https://doi.org/10.1201/9781315373461}{10.1201/9781315373461}.}

\bibitem[\citeproctext]{ref-Perkel:2018-WhyJupyter}
\CSLLeftMargin{{[}203{]} }%
\CSLRightInline{J. M. Perkel, {``Why {Jupyter} is data scientists'
computational notebook of choice,''} \emph{Nature}, vol.~563, no.~7729,
pp.~145--146, Nov.
2018,~\href{https://doi.org/10.1038/d41586-018-07196-1}{10.1038/d41586-018-07196-1}.}

\bibitem[\citeproctext]{ref-Allaire_Quarto_2024}
\CSLLeftMargin{{[}204{]} }%
\CSLRightInline{J. J. Allaire, C. Teague, C. Scheidegger, Y. Xie, C.
Dervieux, and G. Woodhull, {``Quarto.''} Nov.
2024.~\href{https://doi.org/10.5281/zenodo.5960048}{10.5281/zenodo.5960048}.}

\bibitem[\citeproctext]{ref-Cockett:2024-ContinuousToolsScientific}
\CSLLeftMargin{{[}205{]} }%
\CSLRightInline{R. Cockett, S. Purves, F. Koch, and M. Morrison,
{``Continuous {Tools} for {Scientific Publishing}: {Using MyST Markdown}
and {Curvenote} to encourage continuous science practices,''} in
\emph{Python in {Science Conference}}, Tacoma, WA, Jul.~2024,
pp.~121--136.~\href{https://doi.org/10.25080/NKVC9349}{10.25080/NKVC9349}.}

\bibitem[\citeproctext]{ref-ComPWA:2012-RequirementSpecifications}
\CSLLeftMargin{{[}206{]} }%
\CSLRightInline{ComPWA, {``Requirement {Specifications}, {Status August}
20, 2012: {Next} generation {Partial Wave Analysis} software.''} Sep.
2012.}

\bibitem[\citeproctext]{ref-DEGENER199934}
\CSLLeftMargin{{[}207{]} }%
\CSLRightInline{T. F. Degener, {``{TARA} --- {An} object-oriented
program for a partial wave analysis of sequential two body decays,''}
\emph{Comput. Phys. Commun.}, vol.~118, no.~1, pp.~34--48, Apr.
1999,~\href{https://doi.org/10.1016/S0010-4655(98)00194-5}{10.1016/S0010-4655(98)00194-5}.}

\bibitem[\citeproctext]{ref-Cummings:2003-ObjectOrientedPWA}
\CSLLeftMargin{{[}208{]} }%
\CSLRightInline{J. P. Cummings and D. P. Weygand, {``An {Object-Oriented
Approach} to {Partial Wave Analysis}.''} arXiv,
2003.~\href{https://doi.org/10.48550/arXiv.physics/0309052}{10.48550/arXiv.physics/0309052}.}

\bibitem[\citeproctext]{ref-Berger:2011rx}
\CSLLeftMargin{{[}209{]} }%
\CSLRightInline{N. Berger, {``Partial wave analysis at {BES III}
harnessing the power of {GPUs},''} \emph{J. Phys. Conf. Ser.}, vol.~331,
no.~3, p.~032005, Dec.
2011,~\href{https://doi.org/10.1088/1742-6596/331/3/032005}{10.1088/1742-6596/331/3/032005}.}

\bibitem[\citeproctext]{ref-Back:2017zqt}
\CSLLeftMargin{{[}210{]} }%
\CSLRightInline{J. Back \emph{et al.}, {``Laura++: {A Dalitz} plot
fitter,''} \emph{Comput. Phys. Commun.}, vol.~231, pp.~198--242, May
2018,~\href{https://doi.org/10.1016/j.cpc.2018.04.017}{10.1016/j.cpc.2018.04.017}.}

\bibitem[\citeproctext]{ref-Michel:2014nza}
\CSLLeftMargin{{[}211{]} }%
\CSLRightInline{M. Michel \emph{et al.}, {``{ComPWA}: {A} common
amplitude analysis framework for {PANDA},''} \emph{J. Phys. Conf. Ser.},
vol.~513, no.~2, Jun.
2014,~\href{https://doi.org/10.1088/1742-6596/513/2/022025}{10.1088/1742-6596/513/2/022025}.}

\bibitem[\citeproctext]{ref-Michel:2016acw}
\CSLLeftMargin{{[}212{]} }%
\CSLRightInline{M. Michel, {``Extraction of the scalar wave in
\(J/\psi \to \gamma\pi^0\pi^0\) using the ComPWA framework,''} PhD
thesis, Johannes Gutenberg University, Mainz,
2016.~\href{https://doi.org/10.25358/openscience-4105}{10.25358/openscience-4105}.}

\bibitem[\citeproctext]{ref-Weidenkaff:2017cux}
\CSLLeftMargin{{[}213{]} }%
\CSLRightInline{P. Weidenkaff, {``Analysis of the decay
\(D^0 \to K^0_S K^+ K^-\) with the BESIII experiment,''} PhD thesis,
Johannes Gutenberg University, Mainz,
2017.~\href{https://doi.org/10.25358/openscience-2781}{10.25358/openscience-2781}.}

\bibitem[\citeproctext]{ref-Pfluger:2017ybr}
\CSLLeftMargin{{[}214{]} }%
\CSLRightInline{S. Pflüger, {``Precise determination of the luminosity
with the PANDA-luminosity detector and implementation of the helicity
formalism for the ComPWA framework for an extraction of the scalar wave
in the channel \(J/\psi \to \pi^0\pi^0\gamma\),''} PhD thesis, Ruhr
University Bochum, 2018.
\url{https://nbn-resolving.org/urn:nbn:de:hbz:294-56142}}

\bibitem[\citeproctext]{ref-Johnson:1988-DesigningReusableClasses}
\CSLLeftMargin{{[}215{]} }%
\CSLRightInline{R. E. Johnson and B. Foote, {``Designing {Reusable
Classes},''} \emph{J. Object Oriented Program.}, vol.~1, no.~2,
pp.~22--35, 1988.}

\bibitem[\citeproctext]{ref-ComPWA-pycompwa-2019}
\CSLLeftMargin{{[}216{]} }%
\CSLRightInline{M. Fritsch \emph{et al.}, {``(Py){ComPWA} - {The} common
{Partial Wave Analysis} framework.''} Zenodo, Oct.
2019.~\href{https://doi.org/10.5281/zenodo.3479482}{10.5281/zenodo.3479482}.}

\bibitem[\citeproctext]{ref-Pfluger:2021-PWAExpertSystem}
\CSLLeftMargin{{[}217{]} }%
\CSLRightInline{S. Pflüger \emph{et al.}, {``{PWA Expert System} --
{Rule-based} particle reaction problem solver on a quantum number
level.''} Common Partial Wave Analysis, Apr. 2021.
\url{https://github.com/ComPWA/expertsystem/releases/tag/0.7.3}}

\bibitem[\citeproctext]{ref-Lam:2015bfh}
\CSLLeftMargin{{[}218{]} }%
\CSLRightInline{S. K. Lam, A. Pitrou, and S. Seibert, {``Numba: A
{LLVM-based Python JIT} compiler,''} in \emph{Proceedings of the {Second
Workshop} on the {LLVM Compiler Infrastructure} in {HPC}}, Austin, TX:
ACM Press, Nov.~2015,
pp.~1--6.~\href{https://doi.org/10.1145/2833157.2833162}{10.1145/2833157.2833162}.}

\bibitem[\citeproctext]{ref-Abadi:2016kic}
\CSLLeftMargin{{[}219{]} }%
\CSLRightInline{M. Abadi \emph{et al.}, {``{TensorFlow}: {Large-Scale
Machine Learning} on {Heterogeneous Distributed Systems}.''} arXiv,
2016.~\href{https://doi.org/10.48550/arXiv.1603.04467}{10.48550/arXiv.1603.04467}.}

\bibitem[\citeproctext]{ref-Paszke:2019xhz}
\CSLLeftMargin{{[}220{]} }%
\CSLRightInline{A. Paszke \emph{et al.}, {``{PyTorch}: {An Imperative
Style}, {High-Performance Deep Learning Library}.''} arXiv,
2019.~\href{https://doi.org/10.48550/arXiv.1912.01703}{10.48550/arXiv.1912.01703}.}

\bibitem[\citeproctext]{ref-jax2018github}
\CSLLeftMargin{{[}221{]} }%
\CSLRightInline{J. Bradbury \emph{et al.}, {``{JAX}: Composable
transformations of {Python}+{NumPy} programs.''} 2018.
\url{http://github.com/google/jax}}

\bibitem[\citeproctext]{ref-Poluektov:2021-TFA}
\CSLLeftMargin{{[}222{]} }%
\CSLRightInline{A. Poluektov, A. Merli, A. Mathad, and A. Morris,
{``{TensorFlowAnalysis} -- {A} collection of useful functions and
example scripts for performing amplitude fits using {Google
TensorFlow}.''} Nov. 2021.
\url{https://gitlab.cern.ch/poluekt/TensorFlowAnalysis/-/tree/5fc1172}}

\bibitem[\citeproctext]{ref-Poluektov:2022-AmpliTF}
\CSLLeftMargin{{[}223{]} }%
\CSLRightInline{A. Poluektov, {``{AmpliTF} -- {Library} of primitives
for amplitude analyses in high-energy physics using {TensorFlow} V2.''}
Jul. 2022. \url{https://github.com/apoluekt/AmpliTF/tree/70c51cb}}

\bibitem[\citeproctext]{ref-Eschle:2019jmu}
\CSLLeftMargin{{[}224{]} }%
\CSLRightInline{J. Eschle, A. Puig Navarro, R. Silva Coutinho, and N.
Serra, {``\texttt{zfit}: Scalable pythonic fitting,''} \emph{SoftwareX},
vol.~11, p.~100508, Jan.
2020,~\href{https://doi.org/10.1016/j.softx.2020.100508}{10.1016/j.softx.2020.100508}.}

\bibitem[\citeproctext]{ref-ComPWA-ExpertSystem-ADR001}
\CSLLeftMargin{{[}225{]} }%
\CSLRightInline{R. E. de Boer and S. Pflüger, {``{[}{ADR-001}{]}
{Amplitude} model,''} \emph{PWA Expert System}. Jan. 2021.
\url{https://expertsystem.readthedocs.io/0.7.3/adr/001.html}}

\bibitem[\citeproctext]{ref-python-constraint-v1.4.0}
\CSLLeftMargin{{[}226{]} }%
\CSLRightInline{S. Celles, {``Python-constraint -- {Constraint Solving
Problem} resolver for {Python}.''} Nov. 2018.
\url{https://github.com/python-constraint/python-constraint/releases/tag/1.4.0}}

\bibitem[\citeproctext]{ref-ComPWA-QRules-v0.10.5}
\CSLLeftMargin{{[}227{]} }%
\CSLRightInline{M. Fritsch, S. Pflüger, R. E. de Boer, W. Gradl, and K.
Peters, {``{ComPWA}/qrules: {Rule-based} particle reaction problem
solver on a quantum number level.''} Zenodo, Jan.
2025.~\href{https://doi.org/10.5281/zenodo.14680290}{10.5281/zenodo.14680290}.}

\bibitem[\citeproctext]{ref-scikit-hepux2fparticle-v0.25.2}
\CSLLeftMargin{{[}228{]} }%
\CSLRightInline{E. Rodrigues and H. Schreiner, {``{scikit-hep/particle}
-- {Package} to deal with particles, the {PDG} particle data table,
{PDGIDs}, etc.''} Zenodo, Oct.
2024.~\href{https://doi.org/10.5281/zenodo.13897537}{10.5281/zenodo.13897537}.}

\bibitem[\citeproctext]{ref-ComPWA-AmpForm-v0.15.9}
\CSLLeftMargin{{[}229{]} }%
\CSLRightInline{M. Fritsch \emph{et al.}, {``{ComPWA}/ampform:
{Automatically} generate symbolic amplitude models for {Partial Wave
Analysis}.''} Zenodo, Mar.
2025.~\href{https://doi.org/10.5281/zenodo.16800099}{10.5281/zenodo.16800099}.}

\bibitem[\citeproctext]{ref-ComPWA-TensorWaves-v0.4.13}
\CSLLeftMargin{{[}230{]} }%
\CSLRightInline{M. Fritsch, S. Pflüger, R. E. de Boer, W. Gradl, and K.
Peters, {``{ComPWA}/tensorwaves: {Python} fitter package for multiple
computational back-ends.''} Zenodo, Jan.
2025.~\href{https://doi.org/10.5281/zenodo.14765376}{10.5281/zenodo.14765376}.}

\bibitem[\citeproctext]{ref-Hatlo:2005cj}
\CSLLeftMargin{{[}231{]} }%
\CSLRightInline{M. Hatlo, F. James, P. Mato, L. Moneta, M. Winkler, and
A. Zsenei, {``Developments of mathematical software libraries for the
{LHC} experiments,''} \emph{IEEE Trans. Nucl. Sci.}, vol.~52, no.~6,
pp.~2818--2822, Dec.
2005,~\href{https://doi.org/10.1109/TNS.2005.860152}{10.1109/TNS.2005.860152}.}

\bibitem[\citeproctext]{ref-Dembinski:2025-iminuit}
\CSLLeftMargin{{[}232{]} }%
\CSLRightInline{H. Dembinski \emph{et al.}, {``{scikit-hep/iminuit}.''}
Zenodo, Apr.
2025.~\href{https://doi.org/10.5281/zenodo.15157028}{10.5281/zenodo.15157028}.}

\bibitem[\citeproctext]{ref-Virtanen:2019joe}
\CSLLeftMargin{{[}233{]} }%
\CSLRightInline{P. Virtanen \emph{et al.}, {``{SciPy} 1.0: Fundamental
algorithms for scientific computing in {Python},''} \emph{Nat. Methods},
vol.~17, no.~3, pp.~261--272, Mar.
2020,~\href{https://doi.org/10.1038/s41592-019-0686-2}{10.1038/s41592-019-0686-2}.}

\bibitem[\citeproctext]{ref-Fritsch:2022compwa}
\CSLLeftMargin{{[}234{]} }%
\CSLRightInline{M. Fritsch \emph{et al.}, {``Common {Partial Wave
Analysis}: {A} collaboration-independent organisation for amplitude
analysis software.''} Zenodo, Jul.
2022.~\href{https://doi.org/10.5281/zenodo.6908149}{10.5281/zenodo.6908149}.}

\bibitem[\citeproctext]{ref-Stark:2018jbe}
\CSLLeftMargin{{[}235{]} }%
\CSLRightInline{G. H. Stark, {``The {Search} for {Supersymmetry} in
{Hadronic Final States Using Boosted Object Reconstruction},''} PhD
thesis, University of Chicago,
2018.~\href{https://doi.org/10.6082/2r2s-4590}{10.6082/2r2s-4590}.}

\bibitem[\citeproctext]{ref-LHCb:2018zdd}
\CSLLeftMargin{{[}236{]} }%
\CSLRightInline{LHCb Collaboration \emph{et al.}, {``Design and
performance of the {LHCb} trigger and full real-time reconstruction in
{Run} 2 of the {LHC},''} \emph{J. Instrum.}, vol.~14, no.~4,
pp.~P04013--P04013, Apr.
2019,~\href{https://doi.org/10.1088/1748-0221/14/04/P04013}{10.1088/1748-0221/14/04/P04013}.}

\bibitem[\citeproctext]{ref-Belyaev:2021cyr}
\CSLLeftMargin{{[}237{]} }%
\CSLRightInline{I. Belyaev, G. Carboni, N. Harnew, C. Matteuzzi, and F.
Teubert, {``The history of {LHCb},''} \emph{Eur. Phys. J. H}, vol.~46,
no.~1, p.~3, Dec.
2021,~\href{https://doi.org/10.1140/epjh/s13129-021-00002-z}{10.1140/epjh/s13129-021-00002-z}.}

\bibitem[\citeproctext]{ref-LHCb:2008vvz}
\CSLLeftMargin{{[}238{]} }%
\CSLRightInline{LHCb Collaboration \emph{et al.}, {``The {LHCb Detector}
at the {LHC},''} \emph{J. Instrum.}, vol.~3, no.~8, pp.~S08005--S08005,
Aug.
2008,~\href{https://doi.org/10.1088/1748-0221/3/08/S08005}{10.1088/1748-0221/3/08/S08005}.}

\bibitem[\citeproctext]{ref-LHCb:2014set}
\CSLLeftMargin{{[}239{]} }%
\CSLRightInline{LHCb Collaboration, {``{LHCb} detector performance,''}
\emph{Int. J. Mod. Phys. A}, vol.~30, no.~7, p.~1530022, Mar.
2015,~\href{https://doi.org/10.1142/S0217751X15300227}{10.1142/S0217751X15300227}.}

\bibitem[\citeproctext]{ref-Muller:2019ogi}
\CSLLeftMargin{{[}240{]} }%
\CSLRightInline{D. Müller, {``Adopting new technologies in the {LHCb
Gauss} simulation framework,''} \emph{EPJ Web Conf.}, vol.~214,
p.~02004,
2019,~\href{https://doi.org/10.1051/epjconf/201921402004}{10.1051/epjconf/201921402004}.}

\bibitem[\citeproctext]{ref-BESIII:2022ulv}
\CSLLeftMargin{{[}241{]} }%
\CSLRightInline{BESIII Collaboration \emph{et al.}, {``Luminosities and
energies of \(e^+e^-\) collision data taken between √s=4.61 {GeV} and
4.95 {GeV} at {BESIII},''} \emph{Chin. Phys. C}, vol.~46, no.~11,
p.~113003, Nov.
2022,~\href{https://doi.org/10.1088/1674-1137/ac84cc}{10.1088/1674-1137/ac84cc}.}

\bibitem[\citeproctext]{ref-BESIII:2009-LayoutBEPC}
\CSLLeftMargin{{[}242{]} }%
\CSLRightInline{BESIII Collaboration, {``The {Layout} of {BEPC},''}
\emph{Photo and Video Gallery -- Institute of High-Energy Physics}. Jun.
2009.
\url{https://web.archive.org/web/20250418140031/https://english.ihep.cas.cn/nw/pavg/index_3.html}}

\bibitem[\citeproctext]{ref-Kussner:2022dft}
\CSLLeftMargin{{[}243{]} }%
\CSLRightInline{M. Küßner, {``Coupled channel partial wave analysis of
two-photon reactions at {BESIII},''} PhD thesis, Ruhr University Bochum,
2022.~\href{https://doi.org/10.13154/294-8590}{10.13154/294-8590}.}

\bibitem[\citeproctext]{ref-Briere:2016puj}
\CSLLeftMargin{{[}244{]} }%
\CSLRightInline{R. A. Briere, F. A. Harris, and R. E. Mitchell,
{``Physics {Accomplishments} and {Future Prospects} of the {BES
Experiments} at the {Beijing Electron}--{Positron Collider},''}
\emph{Annu. Rev. Nucl. Part. Sci.}, vol.~66, no.~1, pp.~143--170, Oct.
2016,~\href{https://doi.org/10.1146/annurev-nucl-102115-044802}{10.1146/annurev-nucl-102115-044802}.}

\bibitem[\citeproctext]{ref-BESIII:2009fln}
\CSLLeftMargin{{[}245{]} }%
\CSLRightInline{BESIII Collaboration \emph{et al.}, {``Design and
construction of the {BESIII} detector,''} \emph{Nucl. Instrum. Methods
Phys. Res. A}, vol.~614, no.~3, pp.~345--399, Mar.
2010,~\href{https://doi.org/10.1016/j.nima.2009.12.050}{10.1016/j.nima.2009.12.050}.}

\bibitem[\citeproctext]{ref-Zhu:2005-BESIIIDetectorMagnet}
\CSLLeftMargin{{[}246{]} }%
\CSLRightInline{Z. Zhu \emph{et al.}, {``The {BESIII} detector
magnet,''} in \emph{Proceedings of the {Twentieth International
Cryogenic Engineering Conference} ({ICEC20})}, Beijing: Elsevier, ~2005,
pp.~593--596.~\href{https://doi.org/10.1016/B978-008044559-5/50140-X}{10.1016/B978-008044559-5/50140-X}.}

\bibitem[\citeproctext]{ref-LHCb:2023crj}
\CSLLeftMargin{{[}247{]} }%
\CSLRightInline{LHCb collaboration \emph{et al.}, {``\(\varLambda_c^+\)
polarimetry using the dominant hadronic mode,''} \emph{J. High Energy
Phys.}, vol.~2023, no.~7, p.~228, Jul.
2023,~\href{https://doi.org/10.1007/JHEP07(2023)228}{10.1007/JHEP07(2023)228}.}

\bibitem[\citeproctext]{ref-Brambilla:2010cs}
\CSLLeftMargin{{[}248{]} }%
\CSLRightInline{N. Brambilla \emph{et al.}, {``Heavy quarkonium:
Progress, puzzles, and opportunities,''} \emph{Eur. Phys. J. C},
vol.~71, no.~2, p.~1534, Feb.
2011,~\href{https://doi.org/10.1140/epjc/s10052-010-1534-9}{10.1140/epjc/s10052-010-1534-9}.}

\bibitem[\citeproctext]{ref-Faccioli:2010kd}
\CSLLeftMargin{{[}249{]} }%
\CSLRightInline{P. Faccioli, C. Lourenço, J. Seixas, and H. K. Wöhri,
{``Towards the experimental clarification of~quarkonium~polarization,''}
\emph{Eur. Phys. J. C}, vol.~69, no.~3, pp.~657--673, Oct.
2010,~\href{https://doi.org/10.1140/epjc/s10052-010-1420-5}{10.1140/epjc/s10052-010-1420-5}.}

\bibitem[\citeproctext]{ref-Butenschoen:2012px}
\CSLLeftMargin{{[}250{]} }%
\CSLRightInline{M. Butenschoen and B. A. Kniehl, {``{\(J/\psi\)}
polarization at the {Tevatron} and the {LHC}: {Nonrelativistic-QCD
Factorization} at the {Crossroads},''} \emph{Phys. Rev. Lett.},
vol.~108, no.~17, p.~172002, Apr.
2012,~\href{https://doi.org/10.1103/PhysRevLett.108.172002}{10.1103/PhysRevLett.108.172002}.}

\bibitem[\citeproctext]{ref-Konig:1993wz}
\CSLLeftMargin{{[}251{]} }%
\CSLRightInline{B. Konig, J. G. Korner, and M. Kramer, {``Determination
of the \(b \to c\) handedness using nonleptonic {\(\varLambda_c\)}
decays,''} \emph{Phys. Rev. D}, vol.~49, no.~5, pp.~2363--2368, Mar.
1994,~\href{https://doi.org/10.1103/PhysRevD.49.2363}{10.1103/PhysRevD.49.2363}.}

\bibitem[\citeproctext]{ref-Dutta:2015ueb}
\CSLLeftMargin{{[}252{]} }%
\CSLRightInline{R. Dutta,
{``{\(\varLambda_b \to (\varLambda_c, p) \tau \nu\)} decays within
standard model and beyond,''} \emph{Phys. Rev. D}, vol.~93, no.~5,
p.~054003, Mar.
2016,~\href{https://doi.org/10.1103/PhysRevD.93.054003}{10.1103/PhysRevD.93.054003}.}

\bibitem[\citeproctext]{ref-Shivashankara:2015cta}
\CSLLeftMargin{{[}253{]} }%
\CSLRightInline{S. Shivashankara, W. Wu, and A. Datta,
{``{\(\varLambda_b \to \varLambda_c \tau \bar{\nu}_\tau\)} decay in the
standard model and with new physics,''} \emph{Phys. Rev. D}, vol.~91,
no.~11, p.~115003, Jun.
2015,~\href{https://doi.org/10.1103/PhysRevD.91.115003}{10.1103/PhysRevD.91.115003}.}

\bibitem[\citeproctext]{ref-Li:2016pdv}
\CSLLeftMargin{{[}254{]} }%
\CSLRightInline{X.-Q. Li, Y.-D. Yang, and X. Zhang,
{``{\(\varLambda_c \to \varLambda_c \tau \bar{\nu}_\tau\)} decay in
scalar and vector leptoquark scenarios,''} \emph{J. High Energy Phys.},
vol.~2, p.~068, Feb.
2017,~\href{https://doi.org/10.1007/JHEP02(2017)068}{10.1007/JHEP02(2017)068}.}

\bibitem[\citeproctext]{ref-Datta:2017aue}
\CSLLeftMargin{{[}255{]} }%
\CSLRightInline{A. Datta, S. Kamali, S. Meinel, and A. Rashed,
{``Phenomenology of
{\(\varLambda_b \to \varLambda_c \tau \bar{\nu}_\tau\)} using lattice
{QCD} calculations,''} \emph{J. High Energy Phys.}, vol.~2017, no.~8,
p.~131, Aug.
2017,~\href{https://doi.org/10.1007/JHEP08(2017)131}{10.1007/JHEP08(2017)131}.}

\bibitem[\citeproctext]{ref-Ray:2018hrx}
\CSLLeftMargin{{[}256{]} }%
\CSLRightInline{A. Ray, S. Sahoo, and R. Mohanta, {``Probing new physics
in semileptonic {\(\varLambda_b\)} decays,''} \emph{Phys. Rev. D},
vol.~99, no.~1, p.~015015, Jan.
2019,~\href{https://doi.org/10.1103/PhysRevD.99.015015}{10.1103/PhysRevD.99.015015}.}

\bibitem[\citeproctext]{ref-DiSalvo:2018ngq}
\CSLLeftMargin{{[}257{]} }%
\CSLRightInline{E. Di Salvo, F. Fontanelli, and Z. J. Ajaltouni,
{``Detailed study of the
{\(\varLambda_b \to \varLambda_c \tau \bar{\nu}_\tau\)} decay,''}
\emph{Int. J. Mod. Phys. A}, vol.~33, no.~29, p.~1850169, Oct.
2018,~\href{https://doi.org/10.1142/S0217751X18501695}{10.1142/S0217751X18501695}.}

\bibitem[\citeproctext]{ref-Penalva:2019rgt}
\CSLLeftMargin{{[}258{]} }%
\CSLRightInline{N. Penalva, E. Hernández, and J. Nieves, {``Further
tests of lepton flavour universality from the charged lepton energy
distribution in \(b \to c\) semileptonic decays: {The} case of
{\(\varLambda_b \to \varLambda_c \ell \bar{\nu} \ell\)},''} \emph{Phys.
Rev. D}, vol.~100, no.~11, p.~113007, Dec.
2019,~\href{https://doi.org/10.1103/PhysRevD.100.113007}{10.1103/PhysRevD.100.113007}.}

\bibitem[\citeproctext]{ref-Ferrillo:2019owd}
\CSLLeftMargin{{[}259{]} }%
\CSLRightInline{M. Ferrillo, A. Mathad, P. Owen, and N. Serra,
{``Probing effects of new physics in
{\(\varLambda_b^0 \to \varLambda_c^+ \mu^- \bar{\nu}_\mu\)} decays,''}
\emph{J. High Energy Phys.}, vol.~2019, no.~12, p.~148, Dec.
2019,~\href{https://doi.org/10.1007/JHEP12(2019)148}{10.1007/JHEP12(2019)148}.}

\bibitem[\citeproctext]{ref-LHCb:2019aci}
\CSLLeftMargin{{[}260{]} }%
\CSLRightInline{LHCb Collaboration \emph{et al.}, {``Isospin
{Amplitudes} in {\(\varLambda_b^0 \to J/\psi \varLambda (\varSigma^0)\)}
and {\(\varSigma_b^0 \to J/\psi \varSigma^0 (\varLambda)\)} {Decays},''}
\emph{Phys. Rev. Lett.}, vol.~124, no.~11, p.~111802, Mar.
2020,~\href{https://doi.org/10.1103/PhysRevLett.124.111802}{10.1103/PhysRevLett.124.111802}.}

\bibitem[\citeproctext]{ref-Davier:1992nw}
\CSLLeftMargin{{[}261{]} }%
\CSLRightInline{M. Davier, L. Duflot, F. Le Diberder, and A. Rougé,
{``The optimal method for the measurement of tau polarization,''}
\emph{Phys. Lett. B}, vol.~306, no.~3--4, pp.~411--417, Jun.
1993,~\href{https://doi.org/10.1016/0370-2693(93)90101-M}{10.1016/0370-2693(93)90101-M}.}

\bibitem[\citeproctext]{ref-Cornwell:1997ke}
\CSLLeftMargin{{[}262{]} }%
\CSLRightInline{J. F. Cornwell, \emph{Group {Theory} in {Physics}: {An
Introduction}}. San Diego, CA: Academic Press,
1997.~\href{https://doi.org/10.1016/B978-0-12-189800-7.X5000-6}{10.1016/B978-0-12-189800-7.X5000-6}.}

\bibitem[\citeproctext]{ref-LHCb:2023crj-Zotero}
\CSLLeftMargin{{[}263{]} }%
\CSLRightInline{R. E. de Boer, M. Mikhasenko, and M. Fritsch,
{``\(\Lambda^+_\mathrm{c}\) polarimetry using the dominant hadronic
mode.''} Zenodo, Jan.
2023.~\href{https://doi.org/10.5281/zenodo.7549056}{10.5281/zenodo.7549056}.}

\bibitem[\citeproctext]{ref-LHCb:2022sck}
\CSLLeftMargin{{[}264{]} }%
\CSLRightInline{LHCb collaboration \emph{et al.}, {``Amplitude analysis
of the {\(\varLambda_c^+ \to p K^- \pi^+\)} decay and
{\(\varLambda_c^+\)} baryon polarization measurement in semileptonic
beauty hadron decays,''} \emph{Phys. Rev. D}, vol.~108, no.~1,
p.~012023, Jul.
2023,~\href{https://doi.org/10.1103/PhysRevD.108.012023}{10.1103/PhysRevD.108.012023}.}

\bibitem[\citeproctext]{ref-Mikhasenko:2022xyz}
\CSLLeftMargin{{[}265{]} }%
\CSLRightInline{M. Mikhasenko, {``\texttt{ThreeBodyDecay.jl} -- {Julia}
implementation of the {Dalitz-plot} decomposition.''} Zenodo, Oct.
2022.~\href{https://doi.org/10.5281/zenodo.7256812}{10.5281/zenodo.7256812}.}

\bibitem[\citeproctext]{ref-BESIII:2021cxx}
\CSLLeftMargin{{[}266{]} }%
\CSLRightInline{BESIII Collaboration \emph{et al.}, {``Number of
\(J/\psi\) events at BESIII,''} \emph{Chin. Phys. C}, vol.~46, no.~7,
p.~074001, Jul.
2022,~\href{https://doi.org/10.1088/1674-1137/ac5c2e}{10.1088/1674-1137/ac5c2e}.}

\bibitem[\citeproctext]{ref-Wollenberg-BAM:2022}
\CSLLeftMargin{{[}267{]} }%
\CSLRightInline{L. R. Wollenberg and M. Fritsch, {``{Measurement} of the
{Branching Fraction} for the decay
{\(J/\psi \to \bar{p}\varSigma^+ K^0_S + \mathrm{c.c.}\)},''} BESIII
Analysis Memo 484v1.7, Dec. 2022.
\url{https://docbes3.ihep.ac.cn/cgi-bin/DocDB/ShowDocument?docid=926&version=42}}

\bibitem[\citeproctext]{ref-BESIII:2023sus}
\CSLLeftMargin{{[}268{]} }%
\CSLRightInline{BESIII Collaboration \emph{et al.}, {``Observation and
branching fraction measurement of the decay
{\(J/\psi \to \bar{p} \varSigma^+ K^0_S + \mathrm{c.c.}\)},''}
\emph{Phys. Rev. D}, vol.~109, no.~1, p.~012006, Jan.
2024,~\href{https://doi.org/10.1103/PhysRevD.109.012006}{10.1103/PhysRevD.109.012006}.}

\bibitem[\citeproctext]{ref-Ping:2008zz}
\CSLLeftMargin{{[}269{]} }%
\CSLRightInline{R.-G. Ping, {``Event generators at {BESIII},''}
\emph{Chin. Phys. C}, vol.~32, no.~8, pp.~599--602, Aug.
2008,~\href{https://doi.org/10.1088/1674-1137/32/8/001}{10.1088/1674-1137/32/8/001}.}

\end{CSLReferences}




\end{document}
