codexpast-exam-of-the-mathematics-course-of-the-university-of-cambridge2018iiipaper-305-q4a.py
past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2018/iii/paper-305-q4a.py
"""Generate an original inclusive DIS diagram; Python 3.14, matplotlib 3.10.7."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch,Circle
def line(ax,a,b,arrow=True):
ax.plot([a[0],b[0]],[a[1],b[1]],color='black',lw=1.7)
if arrow:
a,b=np.array(a),np.array(b);m=(a+b)/2;d=(b-a)*.13
ax.add_patch(FancyArrowPatch(m-d,m+d,arrowstyle='-|>',mutation_scale=13,color='black',lw=1))
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);u=np.linspace(0,1,250)
xy=a+u[:,None]*d+.013*np.sin(12*np.pi*u)[:,None]*n
ax.plot(xy[:,0],xy[:,1],color='black',lw=1.5)
fig,ax=plt.subplots(figsize=(7.2,3.5),dpi=100,facecolor='white');ax.set(xlim=(0,1.1),ylim=(0,1));ax.axis('off')
vertex=(.46,.73);blob=(.53,.30)
line(ax,(.08,.88),vertex);line(ax,vertex,(.9,.88));wave(ax,vertex,(.52,.38));line(ax,(.08,.22),(.46,.29))
for end in [(.91,.49),(.95,.30),(.91,.11)]:line(ax,(.59,.30),end,False)
ax.add_patch(Circle(blob,.075,edgecolor='black',facecolor='#eeeeee',lw=1.5,zorder=5));ax.text(*blob,r'$J^\mu$',ha='center',va='center',fontsize=13,zorder=6);ax.plot(*vertex,'ko',ms=4)
for x,y,text in [(.16,.95,r'$e^-(p)$'),(.87,.95,r'$e^-(p^\prime)$'),(.38,.54,r'$\gamma^*(q)$'),(.17,.14,r'$H(P_H)$'),(1.0,.30,r'$X(P_X)$')]:ax.text(x,y,text,ha='center',va='center',fontsize=15)
fig.subplots_adjust(left=.02,right=.98,bottom=.02,top=.98)
fig.savefig(Path('paper-305-q4a.png'),facecolor='white',transparent=False);plt.close(fig)