In [1]:
# Makes print and division act like Python 3
from __future__ import print_function, division
# Import the usual libraries
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# Enable inline plotting at lower left
%matplotlib inline
from IPython.display import display, Latex, clear_output
from matplotlib.backends.backend_pdf import PdfPages
In [2]:
import pynrc
from pynrc import nrc_utils
from pynrc.nrc_utils import S
from pynrc.obs_nircam import model_to_hdulist
pynrc.setup_logging('WARNING', verbose=False)
In [3]:
from pynrc.nrc_utils import *
In [4]:
fpix, osamp = (321, 2)
filt = 'F430M'
pupil='WEDGELYOT'
mask='MASKLWB'
In [5]:
bp_k = pynrc.bp_2mass('k')
sp_sci = pynrc.stellar_spectrum('A0V', 7, 'vegamag', bp_k)
sp_ref = pynrc.stellar_spectrum('A0V', 6, 'vegamag', bp_k)
In [9]:
obs = pynrc.obs_hci(sp_sci, sp_ref, 100, verbose=True,
filter=filt, pupil=pupil, mask=mask, fov_pix=fpix, oversample=osamp)
In [12]:
obs.psf_info_bg
Out[12]:
In [13]:
self = obs
In [30]:
xoff_arcsec_max = 10
xpix = self.det_info['xpix']
xpix_off_asec = np.ceil(xpix * self.pix_scale / 2)
xoff_asec = np.min([xpix_off_asec, xoff_arcsec_max])
# Offset values to create new PSF
del_off = 1
offset_vals = np.arange(-xoff_asec, xoff_asec+del_off, del_off)
In [31]:
offset_vals
Out[31]:
In [22]:
psf_list = []
for offset in offset_vals:
print(offset)
self.bar_offset = offset
_, psf = self.gen_psf(return_oversample=True, use_bg_psf=False)
psf_list.append(psf)
In [21]:
baroff_orig
Out[21]:
In [ ]:
In [ ]:
coeff = psf_coeff(filt, pupil, mask, fov_pix=fpix, oversample=osamp)
In [5]:
cf_resid = wedge_coeff(filt, pupil, mask, fov_pix=fpix, oversample=osamp)
In [6]:
# The narrow location (arcsec)
bar_offset = 0
cf_fit = cf_resid.reshape([cf_resid.shape[0], -1])
cf_mod = jl_poly(np.array([bar_offset]), cf_fit).reshape(coeff.shape)
cf_new = coeff + cf_mod
In [7]:
psf = gen_image_coeff(filt, pupil, mask, coeff=cf_new, fov_pix=fpix, oversample=osamp)
In [8]:
psf0 = gen_image_coeff(filt, pupil, mask, coeff=coeff, fov_pix=fpix, oversample=osamp)
In [9]:
diff = psf0-psf
In [10]:
ind = psf0>0
chi1 = np.sum((diff[ind])**2 / psf0[ind])
print(chi1, chi1 / psf0.sum())
In [29]:
ind = psf>0
chi1 = np.sum((diff[ind])**2 / psf[ind])
print(chi1, chi1 / psf.sum())
In [5]:
nrc = pynrc.NIRCam(filt, pupil, mask, fov_pix=fpix, oversample=osamp)
In [17]:
nrc.bar_offset=-8
In [25]:
nrc.wfe_drift = 0
In [19]:
psf0 = nrc.gen_psf()
In [27]:
psf5 = nrc.gen_psf()
In [28]:
np.max(np.abs(psf5-psf0)) / psf0.max()
Out[28]:
In [29]:
plt.imshow(psf5-psf0)
Out[29]:
In [7]:
plt.imshow(nrc.gen_psf())
Out[7]:
In [ ]:
In [28]:
ratio = abs(diff) / psf0
ind = ratio != np.inf
np.nanmax(ratio[ind])
Out[28]:
In [ ]:
In [50]:
force=False
save=True
save_name=None
kwargs = {}
kwargs['force'] = True
kwargs['save'] = False
kwargs['save_name'] = None
kwargs['pupil'] = pupil
kwargs['mask'] = mask
module = kwargs.get('module', 'A')
kwargs['module'] = module
kwargs['fov_pix'] = fpix
kwargs['oversample'] = osamp
# Get filter throughput and create bandpass
bp = read_filter(filter)
channel = 'SW' if bp.avgwave() < 24000 else 'LW'
# Final filename to save coeff
if save_name is None:
# Name to save array of oversampled coefficients
save_dir = conf.PYNRC_PATH + 'psf_coeffs/'
# Create directory if it doesn't already exist
if not os.path.isdir(save_dir):
os.makedirs(save_dir)
# Final filename to save coeff
save_name = psf_coeff(filter, return_save_name=True, **kwargs)
save_name = os.path.splitext(save_name)[0] + '_wedge.npy'
In [51]:
# Cycle through a list of bar offset locations
values = np.arange(-8,8,0.5)
nvals = len(values)
# First is default value
kwargs['include_si_wfe'] = True
cf0 = psf_coeff(filter, bar_offset=0, **kwargs)
cf_offset = []
for val in values:
print('Bar Offset: {:.1f} arcsec'.format(val))
kwargs['bar_offset'] = val
cf = psf_coeff(filter, **kwargs)
cf_offset.append(cf)
In [52]:
cf_offset = np.array(cf_offset)
# Get residuals
cf_offset -= cf0
# Fit each pixel with a polynomial and save the coefficient
cf_offset = cf_offset.reshape([nvals, -1])
In [59]:
wedge_cf = jl_poly_fit(values, cf_offset, 4)
wedge_cf = wedge_cf.reshape([-1, cf.shape[0], cf.shape[1], cf.shape[2]])
In [60]:
for i in range(len(cf_offset)):
cf_real = cf_offset[i].reshape(cf0.shape) + cf0
psf_real = gen_image_coeff('F430M', pupil, mask, coeff=cf_real, fov_pix=fpix, oversample=osamp)
bar_offset = values[i]
cf_fit = wedge_cf.reshape([wedge_cf.shape[0], -1])
cf_mod = jl_poly(np.array([bar_offset]), cf_fit).reshape(coeff.shape)
cf_new = cf_mod + cf0
psf_new = gen_image_coeff('F430M', pupil, mask, coeff=cf_new, fov_pix=fpix, oversample=osamp)
diff = psf_real - psf_new
ind = psf_real>0
chi1 = np.sum((diff[ind])**2 / psf_real[ind])
print(i, bar_offset, chi1, chi1 / psf_real.sum())
In [56]:
for i in range(len(cf_offset)):
cf_real = cf_offset[i].reshape(cf0.shape) + cf0
psf_real = gen_image_coeff('F430M', pupil, mask, coeff=cf_real, fov_pix=fpix, oversample=osamp)
bar_offset = values[i]
cf_fit = wedge_cf.reshape([wedge_cf.shape[0], -1])
cf_mod = jl_poly(np.array([bar_offset]), cf_fit).reshape(coeff.shape)
cf_new = cf_mod + cf0
psf_new = gen_image_coeff('F430M', pupil, mask, coeff=cf_new, fov_pix=fpix, oversample=osamp)
diff = psf_real - psf_new
ind = psf_real>0
chi1 = np.sum((diff[ind])**2 / psf_real[ind])
print(i, bar_offset, chi1, chi1 / psf_real.sum())
In [49]:
for i in range(len(cf_offset)):
cf_real = cf_offset[i].reshape(cf0.shape) + cf0
psf_real = gen_image_coeff('F430M', pupil, mask, coeff=cf_real, fov_pix=fpix, oversample=osamp)
bar_offset = values[i]
cf_fit = wedge_cf.reshape([wedge_cf.shape[0], -1])
cf_mod = jl_poly(np.array([bar_offset]), cf_fit).reshape(coeff.shape)
cf_new = cf_mod + cf0
psf_new = gen_image_coeff('F430M', pupil, mask, coeff=cf_new, fov_pix=fpix, oversample=osamp)
diff = psf_real - psf_new
ind = psf_real>0
chi1 = np.sum((diff[ind])**2 / psf_real[ind])
print(i, bar_offset, chi1, chi1 / psf_real.sum())
In [64]:
nrc_utils.offset_bar('F300M', 'MASKLWB')
Out[64]:
In [65]:
filts = ["F250M",
"F300M",
"F277W",
"F335M",
"F360M",
"F356W",
"F410M",
"F430M",
"F460M",
"F480M",
"F444W"]
for f in filts:
print(nrc_utils.offset_bar(f, 'MASKLWB'))
In [ ]:
In [ ]:
In [ ]: