Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/particle-physics/decay_kinematics.tex
51 views
unlisted
1
\documentclass[a4paper, 11pt]{article}
2
\usepackage[utf8]{inputenc}
3
\usepackage[T1]{fontenc}
4
\usepackage{amsmath, amssymb, amsthm}
5
\usepackage{graphicx}
6
\usepackage{booktabs}
7
\usepackage{siunitx}
8
\usepackage{subcaption}
9
\usepackage[makestderr]{pythontex}
10
11
\newtheorem{definition}{Definition}
12
\newtheorem{theorem}{Theorem}
13
\newtheorem{example}{Example}
14
\newtheorem{remark}{Remark}
15
16
\title{Particle Decay Kinematics: Two-Body and Three-Body Phase Space Analysis}
17
\author{High Energy Physics Computation Laboratory}
18
\date{\today}
19
20
\begin{document}
21
\maketitle
22
23
\begin{abstract}
24
This technical report presents comprehensive computational analysis of relativistic decay kinematics for unstable particles. We implement energy-momentum conservation for two-body and three-body decays, compute Lorentz transformations between rest and laboratory frames, analyze Dalitz plots for three-body phase space, and calculate decay widths from matrix elements. Applications include particle identification, resonance analysis, and detector design optimization.
25
\end{abstract}
26
27
\section{Theoretical Framework}
28
29
\begin{definition}[Invariant Mass]
30
For a system of particles with four-momenta $p_i^\mu$, the invariant mass is:
31
\begin{equation}
32
M^2 c^4 = \left(\sum_i p_i^\mu\right) \left(\sum_j p_{j\mu}\right) = \left(\sum_i E_i\right)^2 - \left(\sum_i \mathbf{p}_i\right)^2 c^2
33
\end{equation}
34
\end{definition}
35
36
\begin{theorem}[Two-Body Decay]
37
For decay $A \to B + C$ in the rest frame of $A$:
38
\begin{align}
39
E_B &= \frac{m_A^2 + m_B^2 - m_C^2}{2m_A} c^2 \\
40
|\mathbf{p}| &= \frac{c}{2m_A} \sqrt{\lambda(m_A^2, m_B^2, m_C^2)}
41
\end{align}
42
where $\lambda(x,y,z) = x^2 + y^2 + z^2 - 2xy - 2yz - 2zx$ is the K\"allen function.
43
\end{theorem}
44
45
\subsection{Lorentz Transformations}
46
47
\begin{definition}[Lorentz Boost]
48
For boost along z-axis with velocity $\beta c$:
49
\begin{align}
50
E' &= \gamma(E + \beta c p_z) \\
51
p_z' &= \gamma(p_z + \beta E/c)
52
\end{align}
53
where $\gamma = (1 - \beta^2)^{-1/2}$.
54
\end{definition}
55
56
\begin{example}[Dalitz Plot]
57
For three-body decay $A \to 1 + 2 + 3$, the Dalitz plot shows the distribution in:
58
\begin{equation}
59
m_{12}^2 = (p_1 + p_2)^2, \quad m_{23}^2 = (p_2 + p_3)^2
60
\end{equation}
61
Resonances appear as bands in this plot.
62
\end{example}
63
64
\section{Computational Analysis}
65
66
\begin{pycode}
67
import numpy as np
68
import matplotlib.pyplot as plt
69
from mpl_toolkits.mplot3d import Axes3D
70
plt.rc('text', usetex=True)
71
plt.rc('font', family='serif', size=10)
72
73
# Particle masses (MeV/c^2)
74
particles = {
75
'pion+': 139.57,
76
'pion0': 134.98,
77
'kaon+': 493.68,
78
'kaon0': 497.61,
79
'muon': 105.66,
80
'electron': 0.511,
81
'nu_e': 0,
82
'nu_mu': 0,
83
'proton': 938.27,
84
'neutron': 939.57,
85
'eta': 547.86,
86
'D+': 1869.65,
87
'D0': 1864.84,
88
'B+': 5279.34,
89
'Jpsi': 3096.90,
90
'phi': 1019.46
91
}
92
93
def kallen(x, y, z):
94
"""Kallen triangle function."""
95
return x**2 + y**2 + z**2 - 2*x*y - 2*y*z - 2*z*x
96
97
def two_body_decay(m_parent, m_d1, m_d2):
98
"""Two-body decay kinematics in parent rest frame."""
99
if m_parent < m_d1 + m_d2:
100
return 0, 0, 0
101
102
E1 = (m_parent**2 + m_d1**2 - m_d2**2) / (2 * m_parent)
103
E2 = (m_parent**2 + m_d2**2 - m_d1**2) / (2 * m_parent)
104
p = np.sqrt(kallen(m_parent**2, m_d1**2, m_d2**2)) / (2 * m_parent)
105
106
return E1, E2, p
107
108
def lorentz_boost(E, p_par, p_perp, beta):
109
"""Lorentz boost along parallel direction."""
110
gamma = 1 / np.sqrt(1 - beta**2)
111
E_lab = gamma * (E + beta * p_par)
112
p_par_lab = gamma * (p_par + beta * E)
113
p_perp_lab = p_perp
114
return E_lab, p_par_lab, p_perp_lab
115
116
def lab_frame_kinematics(m_parent, m_d1, m_d2, gamma_parent, theta_cm):
117
"""Calculate daughter kinematics in lab frame."""
118
E_cm, _, p_cm = two_body_decay(m_parent, m_d1, m_d2)
119
120
beta = np.sqrt(1 - 1/gamma_parent**2)
121
122
p_par = p_cm * np.cos(theta_cm)
123
p_perp = p_cm * np.sin(theta_cm)
124
125
E_lab, p_par_lab, p_perp_lab = lorentz_boost(E_cm, p_par, p_perp, beta)
126
127
p_lab = np.sqrt(p_par_lab**2 + p_perp_lab**2)
128
theta_lab = np.arctan2(p_perp_lab, p_par_lab)
129
130
return E_lab, p_lab, theta_lab
131
132
# Example: pion decay pi+ -> mu+ + nu_mu
133
m_pi = particles['pion+']
134
m_mu = particles['muon']
135
m_nu = particles['nu_mu']
136
137
E_mu_cm, E_nu_cm, p_decay = two_body_decay(m_pi, m_mu, m_nu)
138
KE_mu = E_mu_cm - m_mu
139
140
# Kaon decay K+ -> pi+ + pi0
141
m_K = particles['kaon+']
142
m_pi_p = particles['pion+']
143
m_pi_0 = particles['pion0']
144
145
E_pip_cm, E_pi0_cm, p_K_decay = two_body_decay(m_K, m_pi_p, m_pi_0)
146
147
# Three-body decay: D+ -> K- pi+ pi+
148
m_D = particles['D+']
149
m_K_d = particles['kaon+']
150
m_pi_d = particles['pion+']
151
152
# Phase space boundaries
153
m12_min = (m_K_d + m_pi_d)**2
154
m12_max = (m_D - m_pi_d)**2
155
m23_min = (m_pi_d + m_pi_d)**2
156
m23_max = (m_D - m_K_d)**2
157
158
# Generate Dalitz plot points (uniform phase space)
159
np.random.seed(42)
160
n_events = 5000
161
162
# Sample uniformly in m12^2, m23^2
163
m12_sq = np.random.uniform(m12_min, m12_max, n_events * 3)
164
m23_sq = np.random.uniform(m23_min, m23_max, n_events * 3)
165
166
# Check kinematic boundaries
167
E1_star = (m_D**2 + m_K_d**2 - m12_sq) / (2 * m_D)
168
E3_star = (m_D**2 + m_pi_d**2 - m23_sq) / (2 * m_D)
169
170
m12 = np.sqrt(m12_sq)
171
m23 = np.sqrt(m23_sq)
172
173
# Kinematic constraint: m13^2 determined
174
m13_sq = m_D**2 + m_K_d**2 + 2*m_pi_d**2 - m12_sq - m23_sq
175
176
# Physical boundaries
177
physical = (m13_sq > (m_K_d + m_pi_d)**2) & (m13_sq < (m_D - m_pi_d)**2)
178
m12_sq_phys = m12_sq[physical][:n_events]
179
m23_sq_phys = m23_sq[physical][:n_events]
180
181
# Lab frame analysis: boosted pion
182
gamma_pi = np.array([1, 2, 5, 10, 50])
183
theta_cm = np.linspace(0, np.pi, 100)
184
185
# Common decay modes table
186
decay_modes = [
187
('$\\pi^+ \\to \\mu^+ \\nu_\\mu$', m_pi, m_mu, m_nu),
188
('$K^+ \\to \\pi^+ \\pi^0$', m_K, m_pi_p, m_pi_0),
189
('$K^+ \\to \\mu^+ \\nu_\\mu$', m_K, m_mu, m_nu),
190
('$D^0 \\to K^- \\pi^+$', particles['D0'], m_K_d, m_pi_p),
191
('$B^+ \\to J/\\psi K^+$', particles['B+'], particles['Jpsi'], m_K_d)
192
]
193
194
# Q-value and phase space
195
def phase_space_factor(m_parent, m_d1, m_d2):
196
"""Two-body phase space factor."""
197
p = np.sqrt(kallen(m_parent**2, m_d1**2, m_d2**2)) / (2 * m_parent)
198
return p / m_parent
199
200
# Create visualization
201
fig = plt.figure(figsize=(12, 10))
202
gs = fig.add_gridspec(3, 3, hspace=0.35, wspace=0.35)
203
204
# Plot 1: Two-body decay energies
205
ax1 = fig.add_subplot(gs[0, 0])
206
names = [d[0] for d in decay_modes]
207
E_d1 = [two_body_decay(d[1], d[2], d[3])[0] for d in decay_modes]
208
E_d2 = [two_body_decay(d[1], d[2], d[3])[1] for d in decay_modes]
209
210
x_pos = range(len(names))
211
width = 0.35
212
ax1.bar([x - width/2 for x in x_pos], E_d1, width, label='Daughter 1', alpha=0.7)
213
ax1.bar([x + width/2 for x in x_pos], E_d2, width, label='Daughter 2', alpha=0.7)
214
ax1.set_xticks(x_pos)
215
ax1.set_xticklabels(['$\\pi$', 'K$\\to\\pi$', 'K$\\to\\mu$', 'D', 'B'], fontsize=8)
216
ax1.set_ylabel('Energy (MeV)')
217
ax1.set_title('Rest Frame Energies')
218
ax1.legend(fontsize=7)
219
ax1.set_yscale('log')
220
ax1.grid(True, alpha=0.3, axis='y')
221
222
# Plot 2: Lab frame energy vs angle
223
ax2 = fig.add_subplot(gs[0, 1])
224
colors = plt.cm.viridis(np.linspace(0.2, 0.8, len(gamma_pi)))
225
for gamma, color in zip([2, 5, 10], colors[1:4]):
226
E_lab_vals = []
227
theta_lab_vals = []
228
for th in theta_cm:
229
E, p, th_lab = lab_frame_kinematics(m_pi, m_mu, m_nu, gamma, th)
230
E_lab_vals.append(E)
231
theta_lab_vals.append(th_lab)
232
ax2.plot(np.rad2deg(theta_lab_vals), E_lab_vals, color=color,
233
lw=1.5, label=f'$\\gamma = {gamma}$')
234
ax2.set_xlabel('Lab Angle (deg)')
235
ax2.set_ylabel('Muon Energy (MeV)')
236
ax2.set_title('$\\pi \\to \\mu\\nu$ Lab Frame')
237
ax2.legend(fontsize=7)
238
ax2.grid(True, alpha=0.3)
239
240
# Plot 3: CM to Lab angle transformation
241
ax3 = fig.add_subplot(gs[0, 2])
242
for gamma, color in zip([2, 5, 10], colors[1:4]):
243
theta_lab_vals = []
244
for th in theta_cm:
245
_, _, th_lab = lab_frame_kinematics(m_pi, m_mu, m_nu, gamma, th)
246
theta_lab_vals.append(th_lab)
247
ax3.plot(np.rad2deg(theta_cm), np.rad2deg(theta_lab_vals), color=color,
248
lw=1.5, label=f'$\\gamma = {gamma}$')
249
ax3.plot([0, 180], [0, 180], 'k--', alpha=0.3)
250
ax3.set_xlabel('CM Angle (deg)')
251
ax3.set_ylabel('Lab Angle (deg)')
252
ax3.set_title('Angular Transformation')
253
ax3.legend(fontsize=7)
254
ax3.grid(True, alpha=0.3)
255
256
# Plot 4: Dalitz plot
257
ax4 = fig.add_subplot(gs[1, 0])
258
ax4.scatter(m12_sq_phys/1e6, m23_sq_phys/1e6, s=1, alpha=0.3, c='blue')
259
ax4.set_xlabel('$m_{K\\pi}^2$ (GeV$^2$/c$^4$)')
260
ax4.set_ylabel('$m_{\\pi\\pi}^2$ (GeV$^2$/c$^4$)')
261
ax4.set_title('Dalitz Plot: $D^+ \\to K^-\\pi^+\\pi^+$')
262
ax4.grid(True, alpha=0.3)
263
264
# Plot 5: Invariant mass projection
265
ax5 = fig.add_subplot(gs[1, 1])
266
ax5.hist(np.sqrt(m12_sq_phys), bins=50, alpha=0.7, color='blue', label='$m_{K\\pi}$')
267
ax5.set_xlabel('Invariant Mass (MeV/c$^2$)')
268
ax5.set_ylabel('Events')
269
ax5.set_title('Invariant Mass Projection')
270
ax5.legend(fontsize=8)
271
ax5.grid(True, alpha=0.3)
272
273
# Plot 6: Phase space factor
274
ax6 = fig.add_subplot(gs[1, 2])
275
m_parent_range = np.linspace(300, 6000, 100)
276
ps_Kpi = [phase_space_factor(m, m_K_d, m_pi_p) if m > m_K_d + m_pi_p else 0
277
for m in m_parent_range]
278
ps_munu = [phase_space_factor(m, m_mu, 0) if m > m_mu else 0
279
for m in m_parent_range]
280
281
ax6.plot(m_parent_range, ps_Kpi, 'b-', lw=1.5, label='$K\\pi$')
282
ax6.plot(m_parent_range, ps_munu, 'r--', lw=1.5, label='$\\mu\\nu$')
283
ax6.set_xlabel('Parent Mass (MeV/c$^2$)')
284
ax6.set_ylabel('Phase Space Factor')
285
ax6.set_title('Two-Body Phase Space')
286
ax6.legend(fontsize=8)
287
ax6.grid(True, alpha=0.3)
288
289
# Plot 7: Decay momentum
290
ax7 = fig.add_subplot(gs[2, 0])
291
momenta = [two_body_decay(d[1], d[2], d[3])[2] for d in decay_modes]
292
ax7.barh(range(len(names)), momenta, color='green', alpha=0.7)
293
ax7.set_yticks(range(len(names)))
294
ax7.set_yticklabels(['$\\pi$', 'K$\\to\\pi$', 'K$\\to\\mu$', 'D', 'B'], fontsize=8)
295
ax7.set_xlabel('Momentum (MeV/c)')
296
ax7.set_title('Decay Momentum')
297
ax7.grid(True, alpha=0.3, axis='x')
298
299
# Plot 8: Maximum lab angle
300
ax8 = fig.add_subplot(gs[2, 1])
301
gamma_range = np.logspace(0, 3, 100)
302
theta_max_lab = []
303
304
for g in gamma_range:
305
if g > 1:
306
beta = np.sqrt(1 - 1/g**2)
307
beta_cm = p_decay / E_mu_cm
308
if beta > beta_cm:
309
theta_max_lab.append(np.arcsin(beta_cm / beta))
310
else:
311
theta_max_lab.append(np.pi)
312
else:
313
theta_max_lab.append(np.pi)
314
315
ax8.semilogx(gamma_range, np.rad2deg(theta_max_lab), 'b-', lw=2)
316
ax8.set_xlabel('Parent $\\gamma$')
317
ax8.set_ylabel('Maximum Lab Angle (deg)')
318
ax8.set_title('Forward Focusing')
319
ax8.grid(True, alpha=0.3, which='both')
320
ax8.set_ylim([0, 180])
321
322
# Plot 9: Q-value comparison
323
ax9 = fig.add_subplot(gs[2, 2])
324
Q_values = [d[1] - d[2] - d[3] for d in decay_modes]
325
colors = ['blue', 'green', 'orange', 'red', 'purple']
326
ax9.bar(range(len(Q_values)), Q_values, color=colors, alpha=0.7)
327
ax9.set_xticks(range(len(names)))
328
ax9.set_xticklabels(['$\\pi$', 'K$\\to\\pi$', 'K$\\to\\mu$', 'D', 'B'], fontsize=8)
329
ax9.set_ylabel('Q-value (MeV)')
330
ax9.set_title('Decay Q-Values')
331
ax9.grid(True, alpha=0.3, axis='y')
332
ax9.set_yscale('log')
333
334
plt.savefig('decay_kinematics_plot.pdf', bbox_inches='tight', dpi=150)
335
print(r'\begin{center}')
336
print(r'\includegraphics[width=\textwidth]{decay_kinematics_plot.pdf}')
337
print(r'\end{center}')
338
plt.close()
339
340
# Summary calculations
341
Q_pi = m_pi - m_mu - m_nu
342
Q_K_pipi = m_K - m_pi_p - m_pi_0
343
\end{pycode}
344
345
\section{Results and Analysis}
346
347
\subsection{Two-Body Decay Kinematics}
348
349
\begin{pycode}
350
print(r'\begin{table}[htbp]')
351
print(r'\centering')
352
print(r'\caption{Two-Body Decay Parameters in Rest Frame}')
353
print(r'\begin{tabular}{lccccc}')
354
print(r'\toprule')
355
print(r'Decay & $Q$ (MeV) & $p$ (MeV/c) & $E_1$ (MeV) & $E_2$ (MeV) & $\beta_1$ \\')
356
print(r'\midrule')
357
358
for name, m_p, m_d1, m_d2 in decay_modes:
359
Q = m_p - m_d1 - m_d2
360
E1, E2, p = two_body_decay(m_p, m_d1, m_d2)
361
beta = p / E1 if E1 > 0 else 0
362
print(f'{name} & {Q:.1f} & {p:.1f} & {E1:.1f} & {E2:.1f} & {beta:.3f} \\\\')
363
364
print(r'\bottomrule')
365
print(r'\end{tabular}')
366
print(r'\end{table}')
367
\end{pycode}
368
369
\subsection{Pion Decay Analysis}
370
371
For $\pi^+ \to \mu^+ + \nu_\mu$:
372
\begin{itemize}
373
\item Q-value: \py{f"{Q_pi:.2f}"} MeV
374
\item Muon energy: \py{f"{E_mu_cm:.2f}"} MeV
375
\item Muon kinetic energy: \py{f"{KE_mu:.2f}"} MeV
376
\item Decay momentum: \py{f"{p_decay:.2f}"} MeV/c
377
\end{itemize}
378
379
\begin{remark}
380
The muon receives most of the available energy due to helicity suppression of the electron channel. The ratio $\Gamma(\pi \to e\nu)/\Gamma(\pi \to \mu\nu) \approx 1.2 \times 10^{-4}$.
381
\end{remark}
382
383
\section{Three-Body Phase Space}
384
385
\begin{theorem}[Dalitz Plot Boundaries]
386
For three-body decay $A \to 1 + 2 + 3$, the kinematically allowed region in the $(m_{12}^2, m_{23}^2)$ plane is bounded by:
387
\begin{equation}
388
(E_1^* + E_2^*)^2 - \left(\sqrt{E_1^{*2} - m_1^2} + \sqrt{E_2^{*2} - m_2^2}\right)^2 \leq m_{12}^2
389
\end{equation}
390
where $E_i^* = (M^2 + m_i^2 - m_{jk}^2)/(2M)$.
391
\end{theorem}
392
393
\begin{example}[Resonance Identification]
394
In the Dalitz plot:
395
\begin{itemize}
396
\item Vertical/horizontal bands indicate $s$-channel resonances
397
\item Diagonal bands indicate $t$-channel or $u$-channel exchanges
398
\item Interference patterns reveal relative phases
399
\end{itemize}
400
\end{example}
401
402
\section{Laboratory Frame Effects}
403
404
\begin{theorem}[Forward Focusing]
405
For a relativistic parent with $\gamma \gg 1$, the maximum lab angle of daughter particles is:
406
\begin{equation}
407
\sin\theta_{max} = \frac{\beta_{CM}}{\beta_{parent}}
408
\end{equation}
409
where $\beta_{CM}$ is the daughter velocity in the CM frame.
410
\end{theorem}
411
412
\section{Discussion}
413
414
The decay kinematics analysis reveals:
415
416
\begin{enumerate}
417
\item \textbf{Energy distribution}: Heavier daughters receive larger energy fractions in two-body decays.
418
\item \textbf{Forward focusing}: Relativistic boosts compress angular distributions toward the beam axis.
419
\item \textbf{Phase space}: Available phase space determines relative decay rates for different channels.
420
\item \textbf{Dalitz analysis}: Two-dimensional phase space plots reveal resonance structure.
421
\end{enumerate}
422
423
\section{Conclusions}
424
425
This computational analysis demonstrates:
426
\begin{itemize}
427
\item Pion decay muon energy: \py{f"{E_mu_cm:.2f}"} MeV
428
\item Pion decay momentum: \py{f"{p_decay:.2f}"} MeV/c
429
\item Kaon $\to$ 2$\pi$ Q-value: \py{f"{Q_K_pipi:.2f}"} MeV
430
\item D meson mass: \py{f"{m_D:.1f}"} MeV/c$^2$
431
\end{itemize}
432
433
Kinematic analysis is essential for particle identification, background rejection, and precision measurements in collider experiments.
434
435
\section{Further Reading}
436
\begin{itemize}
437
\item Particle Data Group, Review of Particle Physics, \textit{Phys. Rev. D}, 2022
438
\item Byckling, E., Kajantie, K., \textit{Particle Kinematics}, Wiley, 1973
439
\item Perkins, D.H., \textit{Introduction to High Energy Physics}, 4th Ed., Cambridge, 2000
440
\end{itemize}
441
442
\end{document}
443
444