codex/past-exam-of-the-particle-and-nuclear-physics-course-of-the-university-of-cambridge/2016/paper-1-decay-diagrams.py

past-exam-of-the-particle-and-nuclear-physics-course-of-the-university-of-cambridge/2016/paper-1-decay-diagrams.py
"""Original decay diagrams. Python 3.14, NumPy and Matplotlib; output to cwd."""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
plt.rcParams.update({"font.size":11,"savefig.facecolor":"white"})
fig,axs=plt.subplots(2,2,figsize=(11,7),layout="constrained")
def line(ax,a,b,label="",reverse=False,style="-",dy=.04):
 ax.plot([a[0],b[0]],[a[1],b[1]],style,color="#16334c",lw=1.8)
 if style=="-":
  p=np.array(a);q=np.array(b)
  if reverse:p,q=q,p
  ax.annotate("",xy=p+.64*(q-p),xytext=p+.45*(q-p),arrowprops={"arrowstyle":"-|>","color":"#16334c","lw":1.5})
 if label:
  mid=(np.array(a)+np.array(b))/2
  ax.text(mid[0],mid[1]+dy,label,ha="center",va="bottom")
def wavy(ax,a,b,label):
 a=np.array(a);b=np.array(b);v=b-a;t=np.linspace(0,1,450);normal=np.array([-v[1],v[0]])/np.linalg.norm(v)
 xy=a[:,None]+v[:,None]*t+.012*normal[:,None]*np.sin(16*np.pi*t)
 ax.plot(*xy,color="#a83826",lw=1.7)
 mid=(a+b)/2;ax.text(mid[0],mid[1]+.055,label,color="#8b2e1f",ha="center")
def dot(ax,p):ax.add_patch(Circle(p,.013,color="black",zorder=5))
for ax in axs.flat:ax.set(xlim=(0,1),ylim=(0,1));ax.axis("off")
ax=axs[0,0];v=(.38,.48);w=(.64,.48)
line(ax,(.10,.78),v,r"$c$");line(ax,(.10,.18),v,r"$\bar c$",True,dy=-.12)
wavy(ax,v,w,r"$\gamma^*$")
line(ax,w,(.92,.78),r"$\mu^-$");line(ax,w,(.92,.18),r"$\mu^+$",True,dy=-.12)
dot(ax,v);dot(ax,w);ax.set_title(r"(i) $J/\psi$: electromagnetic annihilation",fontsize=12)
ax.text(.12,.92,"Color-singlet bound state",fontsize=10)
ax=axs[0,1];v=(.48,.48)
wavy(ax,(.08,.48),v,r"$W^+$")
line(ax,v,(.90,.80),r"$\nu_e$");line(ax,v,(.90,.17),r"$e^+$",True,dy=-.12);dot(ax,v)
ax.set_title("(ii) Elementary charged-current vertex",fontsize=12)
ax=axs[1,0];v=(.48,.48)
line(ax,(.08,.48),v,r"$\Delta^{++}\ (uuu)$")
line(ax,v,(.91,.80),r"$p\ (uud)$")
line(ax,v,(.91,.17),r"$\pi^+\ (u\bar d)$",style="--",dy=-.12)
ax.add_patch(Circle(v,.036,facecolor="#a83826",edgecolor="black",zorder=5))
ax.text(.5,.01,r"Effective strong vertex: creation of $d\bar d$",ha="center",fontsize=10)
ax.set_title("(iii) Composite hadron decay",fontsize=12)
ax=axs[1,1];v=(.30,.48);w=(.58,.35)
line(ax,(.05,.48),v,r"$\tau^-$")
line(ax,v,(.80,.83),r"$\nu_\tau$")
wavy(ax,v,w,r"$W^{-*}$")
line(ax,w,(.92,.49),r"$d$");line(ax,w,(.92,.13),r"$\bar u$",True,dy=-.12)
ax.plot([.95,.97,.97,.95],[.08,.08,.55,.55],color="black")
ax.text(.88,.67,r"$d\bar u\to\pi^-$",ha="center",fontsize=10)
dot(ax,v);dot(ax,w);ax.set_title("(iv) Weak decay followed by pion formation",fontsize=12)
fig.savefig("paper-1-decay-diagrams.png",dpi=150)