codexpast-exam-of-the-particle-physics-course-of-the-university-of-oxford2017-top-decay-flavour-channels.py
past-exam-of-the-particle-physics-course-of-the-university-of-oxford/2017-top-decay-flavour-channels.py
"""Original dominant charged-current and representative neutral-current top diagrams."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.rcParams.update({'font.size':12,'figure.facecolor':'white','axes.facecolor':'white'})
fig=plt.figure(figsize=(12,8.1),layout='constrained')
gs=fig.add_gridspec(2,2)
blue,red='#284f70','#b44b38'
def line(ax,a,b,reverse=False):
a,b=np.array(a,float),np.array(b,float)
ax.plot([a[0],b[0]],[a[1],b[1]],color=blue,lw=1.8)
if reverse:a,b=b,a
ax.annotate('',a+.65*(b-a),a+.38*(b-a),arrowprops={'arrowstyle':'->','color':blue,'lw':1.7})
def wave(ax,a,b):
a,b=np.array(a,float),np.array(b,float);t=np.linspace(0,1,301);normal=np.array([-(b-a)[1],(b-a)[0]])/np.linalg.norm(b-a)
p=a+t[:,None]*(b-a)+.04*np.sin(t*2*np.pi*8)[:,None]*normal
ax.plot(p[:,0],p[:,1],color=red,lw=1.6)
def warc(ax,halfwidth):
t=np.linspace(np.pi,0,501);x=halfwidth*np.cos(t);y=-.62*np.sin(t)
dx=np.gradient(x);dy=np.gradient(y);normal=np.column_stack([-dy,dx]);normal/=np.linalg.norm(normal,axis=1)[:,None]
p=np.column_stack([x,y])+.035*np.sin(np.linspace(0,20*np.pi,len(t)))[:,None]*normal
ax.plot(p[:,0],p[:,1],color=red,lw=1.6)
def triangle(ax,radiative=False):
a=(-.85,0);b=(0,.9);c=(.85,0)
line(ax,(-2.,0),a);line(ax,a,b);line(ax,b,c);warc(ax,.85);wave(ax,b,(.55,1.55))
ax.text(-2.1,.12,'t',fontsize=15);ax.text(-.48,.63,r'$d_i$',fontsize=14);ax.text(0,-.85,r'$W^+$',ha='center',color=red,fontsize=14);ax.text(.68,1.48,'Z',color=red,fontsize=14)
if radiative:
d=(1.60,0);line(ax,c,d);line(ax,d,(2.6,0));wave(ax,d,(2.15,.9));ax.plot(*d,'ko',ms=4)
ax.text(2.7,.1,'c',fontsize=15);ax.text(2.28,.94,r'$\gamma$',color=red,fontsize=15)
else:
line(ax,c,(1.9,0));ax.text(2.,.12,'c',fontsize=15)
for p in [a,b,c]:ax.plot(*p,'ko',ms=4)
ax=fig.add_subplot(gs[0,0]);ax.axis('off');ax.set(xlim=(-2.3,2.3),ylim=(-1.4,1.8),aspect='equal')
a=(-.7,.3);b=(.6,-.35)
line(ax,(-2,.3),a);line(ax,a,(1.85,1.1));wave(ax,a,b);line(ax,b,(1.9,-.1),True);line(ax,b,(1.9,-1.05))
for p in [a,b]:ax.plot(*p,'ko',ms=4)
for xy,text in [((-2.12,.5),'t'),((2.,1.18),'b'),((2.02,0),r'$\ell^+$'),((2.02,-1.03),r'$\nu_\ell$'),((-.25,-.35),r'$W^+$')]:ax.text(*xy,text,ha='center',fontsize=14)
ax.set_title(r'$t\to bW^+\to b\ell^+\nu_\ell$',weight='bold')
ax=fig.add_subplot(gs[0,1]);ax.axis('off');ax.set(xlim=(-2.3,2.4),ylim=(-1.4,1.8),aspect='equal');triangle(ax)
ax.set_title(r'Three vertices: $t\to cZ$',weight='bold')
ax=fig.add_subplot(gs[1,:]);ax.axis('off');ax.set(xlim=(-2.7,2.9),ylim=(-1.0,1.9),aspect='equal')
a=(-1.,-.25);b=(0,.65);c=(1.,-.25)
line(ax,(-2.3,-.25),a);line(ax,a,c);line(ax,c,(2.3,-.25))
wave(ax,a,b);wave(ax,b,c);wave(ax,b,(-.8,1.55));wave(ax,b,(.85,1.55))
for pos in [a,b,c]:ax.plot(*pos,'ko',ms=5)
for xy,label in [((-2.45,-.1),'t'),((2.45,-.1),'c'),((0,-.5),r'$d_i$'),((-.75,.40),r'$W^+$'),((.75,.40),r'$W^+$'),((-1.,1.63),'Z'),((1.05,1.63),r'$\gamma$')]:ax.text(*xy,label,ha='center',fontsize=14)
ax.set_title(r'Three vertices, including a quartic vertex: $t\to cZ\gamma$',weight='bold')
ax.text(0,-.86,r'Quartic $W^+W^-Z\gamma$: both neutral bosons at one vertex; loop flavour $d_i=d,s,b$',ha='center',fontsize=11)
fig.suptitle('Top-quark flavour flow; neutral-current panels show representative attachments\nThe physical loop amplitudes require the full gauge-consistent diagram sets',fontsize=13)
fig.savefig(Path.cwd()/Path(__file__).with_suffix('.png').name,dpi=110,facecolor='white',transparent=False)