codexpast-exam-of-the-mathematics-course-of-the-university-of-cambridge2025iiipaper-312-one-loop-matter-bispectrum.py
past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2025/iii/paper-312-one-loop-matter-bispectrum.py
#!/usr/bin/env python3
"""Generate paper-312-one-loop-matter-bispectrum.png."""
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
def vertex(ax, x, y, label=None):
ax.add_patch(Circle((x, y), 0.075, facecolor="black", edgecolor="none", zorder=4))
if label:
ax.text(x, y - 0.18, label, ha="center", va="top", fontsize=9)
def edge(ax, p, q, **kwargs):
ax.plot((p[0], q[0]), (p[1], q[1]), color=kwargs.pop("color", "#355f8a"), linewidth=kwargs.pop("lw", 2), **kwargs)
def external(ax, p, angle):
import numpy as np
q = (p[0] + 0.48 * np.cos(angle), p[1] + 0.48 * np.sin(angle))
edge(ax, p, q, color="black", lw=1.6)
fig, axes = plt.subplots(1, 5, figsize=(12.0, 4.4), layout="constrained")
# B211: one quadratic vertex connected to two linear external legs.
ax = axes[0]; p=(0,0.15); vertex(ax,*p,"$G_2$"); external(ax,p,2.5); external(ax,p,0.64); external(ax,p,-1.57)
# B222: triangle of three quadratic vertices.
ax = axes[1]; pts=((-0.35,-0.05),(0.35,-0.05),(0,0.55))
for p in pts: vertex(ax,*p,"$G_2$")
for p,q in zip(pts,(pts[1],pts[2],pts[0])): edge(ax,p,q)
for p,a in zip(pts,(-2.4,-0.75,1.57)): external(ax,p,a)
# B321 I: a bubble attached between cubic and quadratic vertices.
ax = axes[2]; a=(-0.28,0.12); b=(0.3,0.12); vertex(ax,*a,"$G_3$"); vertex(ax,*b,"$G_2$")
edge(ax,a,b); edge(ax,a,b, color="#d95f02", lw=2, linestyle="--")
external(ax,a,2.6); external(ax,a,-2.2); external(ax,b,0); external(ax,b,-1.25)
# B321 II: tadpole on a cubic vertex joined to a quadratic vertex.
ax = axes[3]; a=(-0.25,0.05); b=(0.28,0.05); vertex(ax,*a,"$G_3$"); vertex(ax,*b,"$G_2$"); edge(ax,a,b)
loop=Circle((a[0],a[1]+0.32),0.24,fill=False,color="#d95f02",linewidth=2); ax.add_patch(loop)
external(ax,a,-2.35); external(ax,b,0.55); external(ax,b,-0.65)
# B411: tadpole correction at a four-leg vertex.
ax = axes[4]; p=(0,0.02); vertex(ax,*p,"$G_4$"); ax.add_patch(Circle((0,0.38),0.24,fill=False,color="#d95f02",linewidth=2))
external(ax,p,2.7); external(ax,p,0.45); external(ax,p,-1.55)
for ax, title in zip(axes, ("$B_{211}$", "$B_{222}$", "$B_{321}^{I}$", "$B_{321}^{II}$", "$B_{411}$")):
ax.set(title=title, xlim=(-0.75,0.75), ylim=(-0.65,0.95), aspect="equal")
ax.axis("off")
fig.suptitle("Tree and one-loop matter-bispectrum topologies")
fig.savefig(Path(Path(__file__).stem + ".png"), dpi=100, facecolor="white")
plt.close(fig)