codex/past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2008/iii/paper-54-processes.py

past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2008/iii/paper-54-processes.py
"""Electroweak processes; Python 3.14.4, NumPy 2.3.5, Matplotlib 3.10.7.
Output is an opaque basename PNG in caller CWD; honour caller MPLCONFIGDIR.
"""
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import numpy as np

def wave(ax,a,b):
    a,b=np.array(a),np.array(b);d=b-a;n=np.array([-d[1],d[0]])/np.linalg.norm(d)
    t=np.linspace(0,1,301);points=a[:,None]+d[:,None]*t+n[:,None]*.018*np.sin(12*np.pi*t)
    ax.plot(*points,color='#1565c0',lw=1.6)

def fermion(ax,a,b,reverse=False,lw=1.6):
    a,b=np.array(a),np.array(b)
    ax.plot([a[0],b[0]],[a[1],b[1]],color='#333333',lw=lw)
    u,v=(.60,.40) if reverse else (.40,.60)
    ax.annotate('',xy=a+v*(b-a),xytext=a+u*(b-a),arrowprops={'arrowstyle':'->','lw':1.4,'color':'#333333'})

fig,axs=plt.subplots(1,3,figsize=(13,4),layout='constrained')
ax=axs[0];a=(.4,.5);b=(.69,.5)
fermion(ax,(.1,.84),a);fermion(ax,(.1,.16),a,reverse=True);wave(ax,a,b)
wave(ax,b,(.94,.84));ax.plot([b[0],.94],[b[1],.16],'--',color='#333333',lw=1.6)
for x,y,t in [(.07,.88,r'$e^-$'),(.07,.09,r'$e^+$'),(.55,.58,r'$Z^*$'),(.95,.88,r'$Z$'),(.95,.09,r'$H$')]:ax.text(x,y,t,ha='center',fontsize=12)
ax.set_title('Higgsstrahlung',fontsize=13)
ax.text(.5,-.04,r'$e^+e^-\to Z^*\to ZH$',ha='center',fontsize=12)
ax.plot(*a,'o',color='black',ms=3);ax.plot(*b,'o',color='black',ms=3)
ax=axs[1];a=(.49,.5)
wave(ax,(.05,.5),a);fermion(ax,a,(.92,.85));fermion(ax,a,(.92,.15),reverse=True)
for x,y,t in [(.08,.60,r'$W^-(p)$'),(.85,.92,r'$e^-(q_1)$'),(.85,.05,r'$\bar\nu_e(q_2)$')]:ax.text(x,y,t,ha='center',fontsize=12)
ax.text(.5,-.11,r'$-ig\gamma^\mu(1-\gamma_5)/(2\sqrt{2})$',ha='center',fontsize=12)
ax.plot(*a,'o',color='black',ms=3);ax.set_title('Leptonic W decay',fontsize=13)
ax=axs[2];a=(.48,.8);b=(.48,.32)
fermion(ax,(.03,.98),a);fermion(ax,a,(.95,.98));wave(ax,a,b)
fermion(ax,(.03,.32),b,lw=2.3)
for end in [(.95,.09),(.97,.32),(.95,.53)]:ax.plot([b[0],end[0]],[b[1],end[1]],color='#555555',lw=1.5)
ax.add_patch(Circle(b,.065,facecolor='#e0e0e0',edgecolor='black',zorder=3))
ax.text(.01,1.03,r'$e^-(p)$',ha='left',fontsize=12);ax.text(.97,1.03,r"$e^-(p')$",ha='right',fontsize=12)
ax.text(.54,.59,r'$\gamma^*(q)$',fontsize=12);ax.text(.02,.40,r'$H(P)$',fontsize=12)
ax.text(.99,.31,r'$X$',ha='left',fontsize=12);ax.text(.5,-.06,'Inclusive hadronic final state',ha='center',fontsize=11)
ax.set_title('Deep inelastic scattering',fontsize=13);ax.plot(*a,'o',ms=3,color='black')
for ax in axs:ax.set(xlim=(-.02,1.06),ylim=(-.2,1.15));ax.axis('off')
fig.savefig('paper-54-processes.png',dpi=140,facecolor='white',transparent=False)
plt.close(fig)