codex/past-exam-of-the-mphil-in-micro-and-nanotechnology-enterprise-course-of-the-university-of-cambridge/2023/paper-1-additional-oxygen-mo.py

past-exam-of-the-mphil-in-micro-and-nanotechnology-enterprise-course-of-the-university-of-cambridge/2023/paper-1-additional-oxygen-mo.py
"""Original valence-only O2 MO diagram; Python 3.14 and matplotlib.

Energies are qualitative. The PNG is written to the working directory.
"""
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

fig,ax=plt.subplots(figsize=(10.2,6.4),layout='constrained')
fig.patch.set_facecolor('white')
ax.set(xlim=(-.2,12.2),ylim=(-6.5,4.7))
ax.axis('off')
ax.annotate('',xy=(.05,3.4),xytext=(.05,-6),arrowprops={'arrowstyle':'->','lw':1.3})
ax.text(-.1,-1.3,'Energy',rotation=90,ha='right',fontsize=11)

def level(x1,x2,y,occ='',label=None):
    ax.plot([x1,x2],[y,y],color='#2c465c',lw=1.6)
    ax.text((x1+x2)/2,y+.10,occ,ha='center',va='bottom',fontsize=15)
    if label:ax.text((x1+x2)/2,y-.27,label,ha='center',va='top',fontsize=10.5,
        bbox={'fc':'white','ec':'none','pad':.7})

for shift in [0,9.2]:
    level(.9+shift,2.0+shift,-4.3,'↑↓',r'$2s$')
    for i,(lab,occ) in enumerate([(r'$2p_x$','↑↓'),(r'$2p_y$','↑'),(r'$2p_z$','↑')]):
        level(.55+shift+.83*i,1.12+shift+.83*i,.6,occ,lab)
    ax.text(1.6+shift,4.1,'O: valence 2s²2p⁴',ha='center',fontsize=12)
levels=[(-5.6,'↑↓',r'$\sigma_g(2s)$'),(-3.4,'↑↓',r'$\sigma_u^*(2s)$'),
        (-1.6,'↑↓',r'$\sigma_g(2p_z)$'),(3.0,'',r'$\sigma_u^*(2p_z)$')]
for y,occ,lab in levels:level(4.85,7.15,y,occ,lab)
for y,occs,lab in [(-.1,['↑↓','↑↓'],r'$\pi_u(2p_x),\ \pi_u(2p_y)$'),
                   (1.45,['↑','↑'],r'$\pi_g^*(2p_x),\ \pi_g^*(2p_y)$')]:
    level(4.45,5.45,y,occs[0])
    level(6.55,7.55,y,occs[1])
    ax.text(6,y-.27,lab,ha='center',va='top',fontsize=10.5)
for xa,xb in [(2.1,4.7),(9.8,7.3)]:
    for a,b in [(-4.3,-5.6),(-4.3,-3.4),(.6,-1.6),(.6,3.0)]:
        ax.plot([xa,xb],[a,b],ls=':',color='#b0b5bb',lw=.8,zorder=0)
ax.text(6,4.1,'O₂: 12 valence electrons',ha='center',fontsize=13,weight='bold')
ax.text(6,-6.35,'1s core orbitals omitted; level spacings are not to scale',ha='center',fontsize=10,color='#555f68')
fig.savefig('paper-1-additional-oxygen-mo.png',dpi=160,facecolor='white')
plt.close(fig)