codex/past-exam-of-the-condensed-matter-physics-course-of-the-university-of-oxford/2017-zinc-blende-powder-contrast.py

past-exam-of-the-condensed-matter-physics-course-of-the-university-of-oxford/2017-zinc-blende-powder-contrast.py
"""Compare two binary-crystal powder patterns in the f=Z approximation. Python 3.14."""
from pathlib import Path
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams.update({'font.size':12,'figure.facecolor':'white'})
ns=np.array([3,4,8,11,12,16])
mult=np.array([8,6,12,24,8,6])
labels=['111','200','220','311','222','400']
h=6.62607015e-34
c=299792458.
wave=h*c/(8000*1.602176634e-19)
fig,axes=plt.subplots(2,1,figsize=(9.5,6.7),sharex=True,layout='constrained')
for ax,Z,a,title,color in zip(axes,[31,13],[5.653e-10,5.660e-10],['GaAs','AlAs'],['#245fa0','#ad4828']):
    angles=np.degrees(2*np.arcsin(wave*np.sqrt(ns)/(2*a)))
    squares=np.array([Z*Z+33**2,(Z-33)**2,(Z+33)**2,Z*Z+33**2,(Z-33)**2,(Z+33)**2])
    intensity=mult*squares
    intensity=100*intensity/intensity[0]
    ax.vlines(angles,.025,intensity,color=color,lw=2.5)
    ax.scatter(angles,intensity,color=color,s=25,zorder=3)
    for x,y,label in zip(angles,intensity,labels):
        ax.annotate(label,(x,y),xytext=(0,7),textcoords='offset points',ha='center',fontsize=11)
    ax.set_yscale('log');ax.set_ylim(.025,650)
    ax.set_ylabel('Relative intensity\n(111 = 100)')
    ax.set_title(title,loc='left',fontweight='bold',color=color)
    ax.grid(axis='y',alpha=.2)
axes[-1].set_xlabel(r'Scattering angle $2\theta$ (degrees)')
axes[-1].set_xlim(24,70)
fig.suptitle('Binary-sublattice contrast in six powder reflections',fontsize=16)
fig.savefig(Path.cwd() / Path(__file__).with_suffix('.png').name,dpi=120,facecolor='white')
plt.close(fig)