In [1]:
# Import the usual libraries
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
#import matplotlib.patches as mpatches
# Enable inline plotting
%matplotlib inline
#from IPython.display import display, Latex, clear_output
In [26]:
import pynrc
pynrc.setup_logging('WARNING')
from astropy.io import fits
In [3]:
def save_psf(nrc, p, f, oversample=False, sp=None):
if sp is None:
sp = pynrc.stellar_spectrum('flat', 10, 'mJy', nrc.bandpass)
res = nrc.gen_psf(sp=sp, return_oversample=oversample)
if oversample:
hdu = fits.PrimaryHDU(res[1])
else:
hdu = fits.PrimaryHDU(res)
hdr = hdu.header
hdr['FILTER'] = (nrc.filter, 'Filter Value')
if nrc._pupil is None:
hdr['PUPIL'] = ('None', 'Pupil Setting')
else:
hdr['PUPIL'] = (nrc.pupil, 'Pupil Setting')
if nrc._mask is None:
hdr['MASK'] = ('None', 'Coronagraphic Mask Setting')
else:
hdr['MASK'] = (nrc.mask, 'Coronagraphic Mask Setting')
hdr['MODULE'] = (nrc.module, 'NIRCam Module A or B')
hdr['FOVPIX'] = (nrc.psf_info['fov_pix'], 'WebbPSF pixel FoV')
hdr['OSAMP'] = (nrc.psf_info['oversample'], 'WebbPSF pixel oversample')
opd = nrc.psf_info['opd']
hdr['PUPILOPD'] = (opd[0], 'Pupil wavefront OPD')
hdr['OPDSLICE'] = (opd[1], 'OPD slice index')
jitter = nrc.psf_info['jitter']
jitter_sigma = nrc.psf_info['jitter_sigma']
if jitter is None:
hdr['JITTER'] = ('None', 'Jitter type')
else:
hdr['JITTER'] = (jitter, 'Jitter type')
hdr['JITSIG'] = (jitter_sigma, 'Jitter sigma')
hdr['SIWFE'] = (nrc.psf_info['include_si_wfe'], 'Was SI WFE included?')
save_name = '{}_{}'.format(p, f)
if oversample:
save_name = save_name + '_oversampled'
hdu.writeto(save_name+'.fits', overwrite=True)
In [51]:
from pynrc.nrc_utils import S
flatsp = S.FlatSpectrum(10, fluxunits='flam')
# flatsp.convert('photlam')
In [52]:
flatsp.fluxunits
Out[52]:
In [53]:
plt.plot(flatsp.wave, flatsp.flux)
Out[53]:
In [66]:
# Flat in Flam
sp_flam = S.FlatSpectrum(1, fluxunits='flam')
# Convert to mJy and normalize 10 mJy at 2um
sp_flam.convert('mJy')
sp_flam = (10 / sp_flam.sample(2e4)) * sp_flam
sp_flam.convert('photlam')
# Flat in Fnu
sp_fnu = S.FlatSpectrum(10, fluxunits='mJy')
sp_fnu.convert('photlam')
In [71]:
pup = 'WLP8'
filt_arr = ['F070W', 'F150W', 'F200W', 'F182M', 'F210M', 'F187N', 'F212N']
pynrc_vals = []
print('Filter Flat Flam Flat Fnu')
for f in filt_arr:
nrc = pynrc.NIRCam(filter=f, pupil=pup, fov_pix=201, include_si_wfe=False)
res1 = nrc.gen_psf(sp=sp_flam, return_oversample=False)
res2 = nrc.gen_psf(sp=sp_fnu, return_oversample=False)
print('{} {:10.2f} {:10.2f}'.format(f, res1.sum(), res2.sum()))
pynrc_vals.append(res2.sum())
pup = 'WLP4'
nrc = pynrc.NIRCam(pupil=pup, fov_pix=201, include_si_wfe=False)
res1 = nrc.gen_psf(sp=sp_flam, return_oversample=False)
res2 = nrc.gen_psf(sp=sp_fnu, return_oversample=False)
print('{} {:10.2f} {:10.2f}'.format(pup, res1.sum(), res2.sum()))
pynrc_vals.append(res2.sum())
pynrc_vals = np.array(pynrc_vals)
In [73]:
pandeia_vals = np.array([117317, 307314, 417595, 230058, 175722, 21111, 23063, 47053.])
print(100* (1 - pynrc_vals / pandeia_vals))
In [12]:
pup = 'WLP8'
filt_arr = ['F070W', 'F150W', 'F200W', 'F182M', 'F210M', 'F187N', 'F212N']
for f in filt_arr:
nrc = pynrc.NIRCam(filter=f, pupil=pup, fov_pix=201, include_si_wfe=False)
save_psf(nrc, pup, f, sp=sp)
# save_psf(nrc, pup, f, oversample=True, sp=sp)
In [13]:
pup = 'WLP4'
nrc = pynrc.NIRCam(pupil=pup, fov_pix=201, include_si_wfe=False)
save_psf(nrc, pup, 'None')
save_psf(nrc, pup, f, oversample=True)
In [ ]: