codexpast-exam-of-the-chemistry-course-of-the-year-3-of-the-natural-sciences-course-of-the-university-of-cambridge2022paper-2a-active-orbitals.py
past-exam-of-the-chemistry-course-of-the-year-3-of-the-natural-sciences-course-of-the-university-of-cambridge/2022/paper-2a-active-orbitals.py
"""Original solution figure. Tested with Python 3.14, numpy and matplotlib.
The PNG basename is written to the current working directory for Make's _media target.
"""
from pathlib import Path
import sys
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
from tools.chemistry_diagram import bond, atom, flow, finish, save
from matplotlib.patches import Circle,Ellipse
# Basis vectors refer to globally oriented pz and py atomic functions.
react=[(r'$\pi_{O,z}$: A₁',[0,0,1,1,0,0]),(r'$\pi_{O,y}$: B₂',[0,0,0,0,1,1]),(r'$\pi_{O,z}^*$: B₁',[0,0,1,-1,0,0]),(r'$\pi_{O,y}^*$: A₂',[0,0,0,0,1,-1]),(r'$\pi_C$: A₁',[1,1,0,0,0,0]),(r'$\pi_C^*$: B₁',[1,-1,0,0,0,0])]
prod=[(r'$\sigma_+$: A₁',[1,1,-1,-1,0,0]),(r'$n_+$: B₂',[0,0,0,0,1,1]),(r'$\sigma_-$: B₁',[1,-1,-1,1,0,0]),(r'$n_-$: A₂',[0,0,0,0,1,-1]),(r'$\sigma_+^*$: A₁',[1,1,1,1,0,0]),(r'$\sigma_-^*$: B₁',[1,-1,1,-1,0,0])]
fig,axs=plt.subplots(6,2,figsize=(9,12))
pos=[np.array([-.9,0]),np.array([.9,0]),np.array([-.9,1.4]),np.array([.9,1.4])]
for col,data in enumerate([react,prod]):
for row,(title,vec) in enumerate(data):
a=axs[row,col];bond(a,pos[0],pos[1]);bond(a,pos[2],pos[3])
if col:
bond(a,pos[0],pos[2]);bond(a,pos[1],pos[3])
for i,p in enumerate(pos):
a.text(p[0],p[1],'C' if i<2 else 'O',ha='center',va='center',fontsize=9,zorder=8,bbox={'fc':'white','ec':'none','pad':.5})
for i,v in enumerate(vec[:4]):
if v:
for side in [-1,1]:
q=pos[i]+np.array([0,.24*side]);a.add_patch(Ellipse(q,.23,.4,fc='#245c9f' if side*v>0 else '#b45309',alpha=.8,zorder=3))
for i,v in enumerate(vec[4:]):
if v:
p=pos[i+2];a.add_patch(Circle(p+np.array([.19,.12]),.19,fc='#245c9f' if v>0 else '#b45309',alpha=.8,zorder=4));a.add_patch(Circle(p-np.array([.19,.12]),.19,fc='#b45309' if v>0 else '#245c9f',alpha=.5,zorder=3))
a.text(1.5,.65,title,ha='left',fontsize=12);a.set(xlim=(-1.45,3.8),ylim=(-.6,2));a.set_aspect('equal');a.axis('off')
axs[0,0].set_title('Separated-fragment active orbitals',fontsize=13);axs[0,1].set_title('Product symmetry combinations',fontsize=13)
fig.text(.5,.025,'Blue/orange indicate phase, not charge. In-plane lobes: global pz; oblique paired circles: global py.\nProduct C–O orbitals are phase cartoons, not computed orbital contours; common normalization is omitted.',ha='center',fontsize=9)
fig.subplots_adjust(hspace=.12,wspace=.2,left=.02,right=.97,top=.965,bottom=.06);save(fig,'paper-2a-active-orbitals.png')