Feynman Diagrams Using GkAntonius' Libraries

This program needs only the feynman diagram libraries found here.

Standard setup:
git clone https://github.com/GkAntonius/feynman python setup.py install --user

These libraries use a very similar syntax to pyfeyn but give prettier plots since they use the more flexible matplotlib instead of Latex. The examples for pyfeyn are a little more interactive than Gk's so that's a good starting point and useful if you're in a hurry (Or really want dotted lines for Higgles).

The standard %matplotlib inline comand is required as usual.

the full matplotlib interface is included only in order to add the Latex style font and later to add pyplot figure and axes control.

In [1]:
import matplotlib
matplotlib.rcParams['mathtext.fontset'] = 'stix'
matplotlib.rcParams['font.family'] = 'STIXGeneral'

from feynman import Diagram
%matplotlib inline

Vector Boson Fusion

The base control is via a call to Diagram. This can be clear: diagram = Diagram() or with the axes as shown.

The setup is in 3 parts:

First: Vertices The line orrigins, destinations and interaction points are specified. Each is given in terms of x and y. (in this case we've defined the diagram as being from 1. x 1. All verticies are marked with a circle by default.

Second: Lines Lines are formed from one point to another, antiparticles have their directions reversed. They can be single, double, linear, circular, epliptical, straight, wiggly or loopy. Arrows are optional.

Third: Text Here I demponstrate that simple or latex can be assigned as labels to each object. fontsize and style can be passed. Displacement can be akward as often labels overlap with lines, but adding additional text is done by simply adding a label to the diagram at a specified set of coordinates.

In [2]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)
diagram = Diagram(ax)
diagram.text(.5,0.9,"Vector Boson Fusion (VBF)",fontsize=40)
in1 = diagram.verticle(xy=(.1,.8), marker='')
in2= diagram.verticle(xy=(.1,.2), marker='')
v1 = diagram.verticle(xy=(.4,.7))
v2 = diagram.verticle(xy=(.4,.3))
v3 = diagram.verticle(xy=(.6,.5))
out1 = diagram.verticle(xy=(.9,.8), marker='')
out2 = diagram.verticle(xy=(.9,.2), marker='')
higgsout = diagram.verticle(xy=(.9,.5))

q1 = diagram.line(in1, v1, arrow=False)
q2 = diagram.line(in2, v2, arrow=False)
wz1 = diagram.line(v1, v3, style='wiggly')
wz2 = diagram.line(v2, v3, style='wiggly')
higgs = diagram.line(v3, higgsout, style='double', arrow=False)
q3 = diagram.line(v1, out1, arrow=False)
q4 = diagram.line(v2, out2, arrow=False)

q1.text("$q_1$",fontsize=30)
q2.text("$q_2$",fontsize=30)
diagram.text(v3.xy[0], v3.xy[1]+0.11, "$Z/W^\pm$",fontsize=35)
wz2.text("$Z/W^\pm$",fontsize=35)
q3.text("$q_3$",fontsize=30)
q4.text("$q_4$",fontsize=30)
higgs.text("$H$",fontsize=30)

diagram.plot()
fig.savefig('FeynmanDiagrams/VBF-feyn.pdf',bbox_inches='tight')
In [3]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)
diagram = Diagram(ax)
in1 = diagram.verticle(xy=(.1,.8), marker='')
in2= diagram.verticle(xy=(.1,.2), marker='')
v1 = diagram.verticle(xy=(.5,.7))
v2 = diagram.verticle(xy=(.5,.3))
v3 = diagram.verticle(xy=(.5,.5))
out1 = diagram.verticle(xy=(.9,.8), marker='')
out2 = diagram.verticle(xy=(.9,.2), marker='')
higgsout = diagram.verticle(xy=(.9,.5))

q1 = diagram.line(in1, v1, arrow=False)
q2 = diagram.line(in2, v2, arrow=False)
wz1 = diagram.line(v1, v3, style='wiggly')
wz2 = diagram.line(v2, v3, style='wiggly')
higgs = diagram.line(v3, higgsout, style='double', arrow=False)
q3 = diagram.line(v1, out1, arrow=False)
q4 = diagram.line(v2, out2, arrow=False)

q1.text(r"$\bar{q}$",fontsize=30)
q2.text("$Q$",fontsize=30)
diagram.text(v3.xy[0]+0.12, v3.xy[1]+0.11, "$Z/W^\pm$",fontsize=30)
wz2.text("$Z/W^\pm$",fontsize=30)
q3.text(r"$\bar{q}$",fontsize=30)
q4.text("$Q$",fontsize=30)
higgsout.text("$H$",fontsize=30)

diagram.text(v1.xy[0], v1.xy[1]+0.05, r"$\mathrm{\mu}$",fontsize=35)
diagram.text(v2.xy[0], v2.xy[1]-0.05, r"$\mathrm{\nu}$",fontsize=35)
diagram.text(v3.xy[0]-0.07, v3.xy[1]+0.11, r"$q_1$",fontsize=35)
diagram.text(v3.xy[0]-0.07, v3.xy[1]-0.11, r"$q_2$",fontsize=35)

diagram.plot()
fig.savefig('FeynmanDiagrams/VBF-LO.pdf',bbox_inches='tight')

gluon-gluon Fusion

Here I demonstrate that each particle (wiggly or loopy) can have it's style defined by a dictionary.

These can also be given in the line definition. (I found nloops most useful.)

In [4]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)
diagram = Diagram(ax)
#diagram.text(.5,0.9,"Gluon-Gluon Fusion (ggF)",fontsize=40)
in1 = diagram.verticle(xy=(.1,.7), marker='')
in2= diagram.verticle(xy=(.1,.3), marker='')
v1 = diagram.verticle(xy=(.4,.7))
v2 = diagram.verticle(xy=(.4,.3))
v3 = diagram.verticle(xy=(.6,.5))
higgsout = diagram.verticle(xy=(.9,.5))

gluon_style = dict(style='linear loopy', xamp=.025, yamp=.035, nloops=7)

g1 = diagram.line(in1, v1, **gluon_style)
g2 = diagram.line(in2, v2, **gluon_style)
t1 = diagram.line(v1, v2)
t2 = diagram.line(v2, v3)
t3 = diagram.line(v3, v1)
higgs = diagram.line(v3, higgsout, arrow=False, style='double')

g1.text("g",fontsize=30)
g2.text("g",fontsize=30)
t1.text("t",fontsize=30)
t2.text("t",fontsize=30)
t3.text(r"$\bar{\mathrm{t}}$",fontsize=35)
higgs.text("H",fontsize=30)

diagram.plot()
fig.savefig('FeynmanDiagrams/ggF-SM.pdf',bbox_inches='tight')

Effective ggF coupling

In [5]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)
diagram = Diagram(ax)
in1 = diagram.verticle(xy=(.1,.6), marker='')
in2= diagram.verticle(xy=(.1,.4), marker='')
v1 = diagram.verticle(xy=(.4,.6))
v2 = diagram.verticle(xy=(.4,.4))
v3 = diagram.verticle(xy=(.6,.5))
v4 = diagram.verticle(xy=(.34,.5), marker='')
higgsout = diagram.verticle(xy=(.9,.5))
epsilon = diagram.operator([v4,v3], c=1.1)
epsilon.text("Effective \n coupling", fontsize=30)

gluon_up_style = dict(style='linear loopy', xamp=.025, yamp=.035, nloops=7)
gluon_down_style = dict(style='linear loopy', xamp=.025, yamp=-.035, nloops=7)

g1 = diagram.line(in1, v1, **gluon_up_style)
g2 = diagram.line(in2, v2, **gluon_down_style)

higgs = diagram.line(v3, higgsout, arrow=False, style='double')

g1.text("g",fontsize=30)
diagram.text(v4.xy[0]-.08, v4.xy[1]-.05, "g",fontsize=35)
higgs.text("H",fontsize=30)

diagram.plot()
fig.savefig('FeynmanDiagrams/ggF-EFT.pdf',bbox_inches='tight')

charged Lepton Flavour Violation (cLFV)

In [6]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)

diagram = Diagram(ax)
in1 = diagram.verticle(xy=(.1,.5))
in2= diagram.verticle(xy=(.4,.5))
v1 = diagram.verticle(xy=(.65,.65))
v2 = diagram.verticle(xy=(.65,.35))
out1 = diagram.verticle(xy=(.9,.65),marker='')
out2 = diagram.verticle(xy=(.9,.35),marker='')

higgs = diagram.line(in1, in2, arrow=False, style='double')
nu1 = diagram.line(v1, in2)
nu2 = diagram.line(in2, v2)
w = diagram.line(v1, v2, style='wiggly')
lep = diagram.line(out1, v1)
tau = diagram.line(v2, out2)


nu1.text(r"$\nu_\ell$",fontsize=40)
nu2.text(r"$\nu_\tau$",fontsize=40)
lep.text(r"$\ell^+$",fontsize=40)
tau.text(r"$\tau^-$",fontsize=40)
#w.text(r"W$^\pm$",fontsize=40)
diagram.text(0.72,0.5,"$W^\pm$",fontsize=40)
#diagram.text(0.69,0.35,"$Z/W^\pm$",fontsize=30)
higgs.text("H",fontsize=40)

diagram.plot()
fig.savefig('FeynmanDiagrams/LFV-feyn.pdf',bbox_inches='tight')

Associated Production

See also the regular tricks for ttH and VH

In [7]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)

diagram = Diagram(ax)
diagram.text(.5,0.9,"Associated Top Pair (ttH)", fontsize=40)
in1 = diagram.verticle(xy=(.1,.8), marker='')
in2= diagram.verticle(xy=(.1,.2), marker='')
v1 = diagram.verticle(xy=(.4,.7))
v2 = diagram.verticle(xy=(.4,.3))
v3 = diagram.verticle(xy=(.6,.5))
out1 = diagram.verticle(xy=(.9,.8), marker='')
out2 = diagram.verticle(xy=(.9,.2), marker='')
higgsout = diagram.verticle(xy=(.9,.5))

g1 = diagram.line(in1, v1, style='loopy',nloops=7,yamp=0.04)
g2 = diagram.line(in2, v2, style='loopy',nloops=7,yamp=0.04)
t1 = diagram.line(v3, v1, arrow = True)
t2 = diagram.line(v2, v3, arrow = True)
higgs = diagram.line(v3, higgsout, arrow=False, style='double')
t3 = diagram.line(v1, out1, arrow=True)
t4 = diagram.line(out2, v2, arrow=True)

g1.text("g",fontsize=30)
g2.text("g",fontsize=30)
diagram.text(v3.xy[0], v3.xy[1]+0.1, r"$\bar{\mathrm{t}}$",fontsize=35)
t2.text("t",fontsize=30)
t3.text("t",fontsize=30)
t4.text(r"$\bar{\mathrm{t}}$",fontsize=30)
higgs.text("H",fontsize=35)

diagram.plot()
fig.savefig('FeynmanDiagrams/ttH-feyn.pdf',bbox_inches='tight')
In [8]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)

diagram = Diagram(ax)
diagram.text(.4,0.9,"Associated Vector Boson", fontsize=40)
diagram.text(.6,0.83,"(VH or 'Higgs Strahlung')", fontsize=40)
in1 = diagram.verticle(xy=(.1,.75), marker='')
in2= diagram.verticle(xy=(.1,.25), marker='')
v1 = diagram.verticle(xy=(.35,.5))
v2 = diagram.verticle(xy=(.65,.5))
higgsout = diagram.verticle(xy=(.9,.75))
out1 = diagram.verticle(xy=(.9,.25),marker='')

q1 = diagram.line(in1, v1)
q2 = diagram.line(v1, in2)
wz1 = diagram.line(v1, v2, style='wiggly')
wz2 = diagram.line(v2, out1, style='wiggly')
higgs = diagram.line(v2, higgsout, arrow=False, style='double')

q1.text("q",fontsize=30)
q2.text(r"$\bar{\mathrm{q}}$",fontsize=30)
diagram.text(0.5,0.55,"$Z/W^\pm$",fontsize=30)
diagram.text(0.69,0.35,"$Z/W^\pm$",fontsize=30)
higgs.text("H",fontsize=30)

diagram.plot()
fig.savefig('FeynmanDiagrams/VH-feyn.pdf',bbox_inches='tight')
In [9]:
fig = matplotlib.pyplot.figure(figsize=(1.,1.))
ax = fig.add_axes([0,0,10,10], frameon=False)
diagram = Diagram(ax)
#diagram.text(.5,0.9,r"Vector Boson Fusion (VBF) Higgs $\rightarrow\tau\tau$",fontsize=40)
in1 = diagram.verticle(xy=(.1,.8), marker='')
in2= diagram.verticle(xy=(.1,.2), marker='')
v1 = diagram.verticle(xy=(.3,.7))
v2 = diagram.verticle(xy=(.3,.3))
v3 = diagram.verticle(xy=(.5,.5))
out1 = diagram.verticle(xy=(.9,.8), marker='')
out2 = diagram.verticle(xy=(.9,.2), marker='')
higgsf = diagram.verticle(xy=(.7,.5))
tau1 = diagram.verticle(xy=(.9,.7), marker='')
tau2 = diagram.verticle(xy=(.9,.3), marker='')

q1 = diagram.line(in1, v1, arrow=False)
q2 = diagram.line(in2, v2, arrow=False)
wz1 = diagram.line(v1, v3, style='wiggly')
wz2 = diagram.line(v2, v3, style='wiggly')
higgs = diagram.line(v3, higgsf, style='double', arrow=False)
q3 = diagram.line(v1, out1, arrow=False)
q4 = diagram.line(v2, out2, arrow=False)
t1 = diagram.line(higgsf, tau1)
t2 = diagram.line(tau2, higgsf)

q1.text("$q_1$",fontsize=30)
q2.text("$q_2$",fontsize=30)
diagram.text(v3.xy[0], v3.xy[1]+0.11, "$Z/W^\pm$",fontsize=30)
wz2.text("$Z/W^\pm$",fontsize=30)
q3.text("$q_3$",fontsize=30)
q4.text("$q_4$",fontsize=30)
higgs.text("$H$",fontsize=30)
t1.text(r"$\tau^-$",fontsize=35)
t2.text(r"$\tau^+$",fontsize=35)

diagram.plot()
fig.savefig('FeynmanDiagrams/VBF-tautau.pdf',bbox_inches='tight')
In [ ]: