codexpast-exam-of-the-frontiers-of-observational-astrophysics-course-of-the-university-of-cambridge2016paper-1-square-cluster-visibility.py
past-exam-of-the-frontiers-of-observational-astrophysics-course-of-the-university-of-cambridge/2016/paper-1-square-cluster-visibility.py
"""Original explanatory figure. Python 3.14, NumPy and Matplotlib.
Write the PNG basename to the current working directory for the mirrored Make target.
"""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size":10,"figure.facecolor":"white","axes.facecolor":"white"})
nu=15e9;c=299792458.;lam=c/nu;Theta=6*np.pi/10800
fig,axs=plt.subplots(1,2,figsize=(10,4.1),layout='constrained');b=np.linspace(0,30,1200)
a=axs[0];a.plot(b,np.sinc(Theta*b/lam),color='#376b91',lw=2);a.axhline(0,color='.4',lw=.8);a.axvline(lam/Theta,color='#a85422',ls='--',label='First null: 11.45 m');a.axvline(20,color='.6',ls=':',label='20 m baseline');a.set(xlabel='Projected axial baseline (m)',ylabel=r'$V(u,0)/\Delta S_\nu$',title='Six-arcminute uniform square');a.legend(fontsize=9);a.grid(alpha=.15)
bs=np.linspace(-20,20,301);U,V=np.meshgrid(bs,bs);vis=np.sinc(Theta*U/lam)*np.sinc(Theta*V/lam);a=axs[1];im=a.imshow(vis,origin='lower',extent=[-20,20,-20,20],cmap='RdBu_r',norm=matplotlib.colors.TwoSlopeNorm(vmin=-.25,vcenter=0,vmax=1));a.set(xlabel='Projected x baseline (m)',ylabel='Projected y baseline (m)',title='Model, not actual baseline coverage');fig.colorbar(im,ax=a,label=r'$V/\Delta S_\nu$',shrink=.9)
fig.savefig('paper-1-square-cluster-visibility.png',dpi=150,facecolor='white');plt.close(fig)