Source code for caltest.test_caldetector1.test_saturation
from ..utils import extract_subarray, translate_dq, dq_summary
import os
import numpy as np
import pytest
from astropy.io import fits
from jwst.saturation import SaturationStep
from jwst import datamodels
[docs]@pytest.fixture(scope='module')
def fits_output(fits_input):
fname = fits_input[0].header['filename'].replace('.fits',
'_saturationstep.fits')
yield fits.open(fname)
os.remove(fname)
[docs]@pytest.fixture(scope='module')
def fits_saturation(fits_output):
ref_path = fits_output['PRIMARY'].header['R_SATURA']
ref_path = ref_path.replace('crds://', '/grp/crds/cache/references/jwst/')
return fits.open(ref_path)
[docs]def test_saturation_step(fits_input):
"""Make sure the DQInitStep runs without error."""
fname = fits_input[0].header['filename'].replace('.fits',
'_saturationstep.fits')
SaturationStep.call(datamodels.open(fits_input), output_file=fname,
save_results=True)
[docs]def test_groupdq_flagging(fits_output, fits_saturation):
satmask = extract_subarray(fits_saturation['SCI'].data, fits_output)
dqmask = translate_dq(fits_saturation)
dqmask = extract_subarray(dqmask, fits_output)
# flag pixels greater than saturation threshold
no_sat_check = (dqmask & (1 << 21)).astype(bool)
not_nan = ~np.isnan(satmask)
expected_groupdq = np.zeros_like(fits_output['GROUPDQ'].data)
flagged = (fits_output['SCI'].data >= satmask) & ~no_sat_check[np.newaxis, np.newaxis, :, :] & not_nan[np.newaxis, np.newaxis, :, :]
expected_groupdq[flagged] = 2
# make sure that pixels in groups after a flagged pixel are also flagged
flagged = np.cumsum(expected_groupdq == 2, axis=1) > 0
expected_groupdq[flagged] = 2
assert np.all(fits_output['GROUPDQ'].data == expected_groupdq)
[docs]def test_pixeldq_propagation(fits_input, fits_output, fits_saturation):
# translate dq flags to standard bits
pixeldq = translate_dq(fits_saturation)
# extract subarray
pixeldq = extract_subarray(pixeldq, fits_input)
print('For step input')
dq_summary(fits_input['PIXELDQ'].data)
print('For reference file')
dq_summary(pixeldq)
print('For step output')
dq_summary(fits_output['PIXELDQ'].data)
assert np.all(fits_output['PIXELDQ'].data == np.bitwise_or(fits_input['PIXELDQ'].data, pixeldq))