codexpast-exam-of-the-chemistry-course-of-the-year-1-of-the-natural-sciences-course-of-the-university-of-cambridge2024paper-1-proton-couplings.py
past-exam-of-the-chemistry-course-of-the-year-1-of-the-natural-sciences-course-of-the-university-of-cambridge/2024/paper-1-proton-couplings.py
"""Original explicit-hydrogen and coupling map for NST IA Chemistry 2024 Q1."""
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch
fig,axs=plt.subplots(2,1,figsize=(10.4,5.7),facecolor='white')
def label(ax,x,y,s,fs=14):ax.text(x,y,s,ha='center',va='center',fontsize=fs,bbox={'facecolor':'white','edgecolor':'none','pad':1})
def bond(ax,a,b,n=1):
dx,dy=b[0]-a[0],b[1]-a[1]
length=(dx*dx+dy*dy)**.5
for offset in ([0] if n==1 else [-.055,.055]):
ox,oy=-dy*offset/length,dx*offset/length
ax.plot([a[0]+ox,b[0]+ox],[a[1]+oy,b[1]+oy],color='black',lw=1.2)
def arc(ax,a,b,t,rad,xy):
ax.add_patch(FancyArrowPatch(a,b,arrowstyle='<->',connectionstyle=f'arc3,rad={rad}',shrinkA=8,shrinkB=8,mutation_scale=12,color='#245f8a',lw=1.5));label(ax,*xy,t,11)
for ax in axs:ax.axis('off');ax.set(xlim=(-.4,10.5),ylim=(-2.1,1.9))
a=axs[0];xs=[1,2.8,4.6,6.4,7.7,9.2]
# Left crotonyl fragment with all methyl H shown separately.
for xx in xs[:4]:label(a,xx,0,r'$\mathrm{C}$')
for i in range(3):bond(a,(xs[i]+.15,0),(xs[i+1]-.15,0),2 if i==1 else 1)
label(a,6.4,1,r'$\mathrm{O}$');bond(a,(6.4,.18),(6.4,.82),2)
label(a,7.7,0,r'$\mathrm{O}$');bond(a,(6.6,0),(7.5,0));bond(a,(7.9,0),(9.0,0));label(a,9.2,0,'vinyl',12)
for pt in [(0,0),(1,1),(1,-1)]:label(a,*pt,r'$\mathrm{H}_a$');bond(a,(1,0),pt)
label(a,2.8,1,r'$\mathrm{H}_b$');bond(a,(2.8,.15),(2.8,.82))
label(a,4.6,-1,r'$\mathrm{H}_c$');bond(a,(4.6,-.15),(4.6,-.82))
arc(a,(2.8,.85),(4.6,-.9),'15.3',-.55,(4.1,.9))
arc(a,(1,-1.0),(2.8,1.0),'6.9',.65,(1.55,-1.45))
arc(a,(1,-1.0),(4.6,-1.0),'1.8',.28,(3.1,-1.65))
a.text(0,1.65,'Crotonyl end: a = 1.9215, b = 7.108, c = 5.8765 ppm',fontsize=11,weight='bold')
a=axs[1]
label(a,1.3,0,r'$\mathrm{R-C(=O)-O}$',13);bond(a,(2.6,0),(3.9,0));label(a,4.1,0,r'$\mathrm{C}$');label(a,6.8,0,r'$\mathrm{C}$');bond(a,(4.3,0),(6.6,0),2)
label(a,4.1,1,r'$\mathrm{H}_d$');bond(a,(4.1,.15),(4.1,.82))
label(a,7.7,-1,r'$\mathrm{H}_e$');bond(a,(6.95,-.12),(7.5,-.82))
label(a,7.7,1,r'$\mathrm{H}_f$');bond(a,(6.95,.12),(7.5,.82))
arc(a,(4.1,1.05),(7.7,-1.05),'14.1',.5,(5.4,-.9))
arc(a,(4.1,1.05),(7.7,1.05),'6.3',-.25,(6.1,1.6))
arc(a,(7.9,-1),(7.9,1),'1.5',.55,(8.6,0))
a.text(0,-1.6,'d = 7.343, e = 4.906, f = 4.576 ppm; blue arrows give J in Hz.',fontsize=10)
fig.tight_layout(h_pad=1.5)
fig.savefig('paper-1-proton-couplings.png',dpi=140,facecolor='white',bbox_inches='tight')
plt.close(fig)