mirror of
https://github.com/yosata/fourierOptics.git
synced 2026-10-29 20:51:10 +00:00
93 lines
3.2 KiB
Python
93 lines
3.2 KiB
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from numpy.polynomial import polynomial
|
|
import sys
|
|
sys.path.insert(0, '/Users/joost/Dropbox/Werk/PhD/Documents/Published/FourierOptics GitHub release/')
|
|
from fourierOptics import *
|
|
|
|
'''
|
|
Description: This script loads the already generated WFEs and performs a
|
|
linear fit on them. This is then used to find the average tilt
|
|
over the beam footprint.
|
|
Used for the discussion section of Ch. 3 in my PhD Dissertation.
|
|
'''
|
|
|
|
|
|
def polyfit2d(x, y, z, deg):
|
|
x = np.asarray(x)
|
|
y = np.asarray(y)
|
|
z = np.asarray(z)
|
|
deg = np.asarray(deg)
|
|
vander = polynomial.polyvander2d(x, y, deg)
|
|
vander = vander.reshape((-1,vander.shape[-1])) # Wat gebeurt hier? reshape(-1) lijkt niets te doen?
|
|
z = z.reshape((vander.shape[0],))
|
|
c = np.linalg.lstsq(vander, z, rcond=None)[0]
|
|
return c.reshape(deg+1)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
plt.rc('text', usetex=True)
|
|
plt.rc('font', family='serif')
|
|
|
|
# Initializing MICADO paraxial model
|
|
mcd = ParaxialMICADO(n=3001, m=3001, dpix=50)
|
|
wfe = WavefrontError(mcd.n, mcd.m)
|
|
|
|
# Setup
|
|
l = 1.49e-3
|
|
|
|
# Set field points
|
|
hxList = [0]
|
|
hyList = [0]
|
|
|
|
wfe_p1 = load_variable('../data/compressed items/ADC_tWFE_p1_zern_20nm_psd_15nm.pkl')
|
|
wfe_p2 = load_variable('../data/compressed items/ADC_tWFE_p2_zern_20nm_psd_15nm.pkl')
|
|
wfe_p3 = load_variable('../data/compressed items/ADC_tWFE_p3_zern_20nm_psd_15nm.pkl')
|
|
wfe_p4 = load_variable('../data/compressed items/ADC_tWFE_p4_zern_20nm_psd_15nm.pkl')
|
|
|
|
# wfe_p1 = load_variable('../data/compressed items/ADC_tWFE_p1_psd_25nm.pkl')
|
|
# wfe_p2 = load_variable('../data/compressed items/ADC_tWFE_p2_psd_25nm.pkl')
|
|
# wfe_p3 = load_variable('../data/compressed items/ADC_tWFE_p3_psd_25nm.pkl')
|
|
# wfe_p4 = load_variable('../data/compressed items/ADC_tWFE_p4_psd_25nm.pkl')
|
|
|
|
|
|
|
|
prop_surf = 4
|
|
E, x, y = mcd.propagate(l=l,surface=prop_surf, zoom=False, show=False,
|
|
print_progress=True, hx=0, hy=0)
|
|
# Save the resulting 'perfect' PSF for later
|
|
tx_combined = 0
|
|
ty_combined = 0
|
|
|
|
print(mcd.ELT_ADC.p1.CA)
|
|
|
|
for wfe_surf in [wfe_p1, wfe_p2, wfe_p3, wfe_p4]:
|
|
|
|
# Don't show anything outside the clear aperture.
|
|
mask = np.sqrt(x**2 + y**2) > 40#mcd.ELT_ADC.p1.CA/2
|
|
# Plot P1
|
|
phasescreenMasked = wfe_surf.copy()
|
|
wfe_p1[mask] = np.nan
|
|
phasescreenMasked[mask] = 0
|
|
|
|
# Bepaling van de gemiddelde tilt voor deze coordinaten, i.e. een lineaire fit.
|
|
pf1 = polyfit2d(x.real[~mask], y.real[~mask], phasescreenMasked[~mask], [1,1])
|
|
|
|
# Coefficienten van de fit vertaalt naar graden tilt
|
|
o1x = np.arctan(pf1[1,0])
|
|
o1y = np.arctan(pf1[0,1])
|
|
print(o1x, o1y)
|
|
o1x_deg = np.degrees(o1x)
|
|
|
|
o1y_deg = np.degrees(o1y)
|
|
tx_combined += o1x
|
|
ty_combined += o1y
|
|
print('tx: {} rad ({} deg = {:.2f} arcsec)'.format(o1x, o1x_deg, o1x_deg*3600))
|
|
print('ty: {} rad ({} deg = {:.2f} arcsec)'.format(o1y, o1y_deg, o1y_deg*3600))
|
|
|
|
print('Combined results:\n-----------------')
|
|
print('tx: {} rad --> distortion of {} μas'.format(tx_combined, 1601.688*tx_combined*0.267*1e6))
|
|
print('ty: {} rad --> distortion of {} μas'.format(ty_combined, 1601.688*ty_combined*0.267*1e6))
|
|
tr_combined = np.sqrt(tx_combined**2 + ty_combined**2)
|
|
print('tr: {} rad --> distortion of {} μas'.format(tr_combined, 1601.688*tr_combined*0.267*1e6)) |