Source code for caltest.test_caldetector1.test_superbias

from ..utils import translate_dq, extract_subarray

import os
import numpy as np
import pytest
from astropy.io import fits
from jwst.superbias import SuperBiasStep
from jwst import datamodels
import numpy as np
from scipy.stats import normaltest
from astropy.stats import sigma_clipped_stats
import matplotlib.pyplot as plt

[docs]@pytest.fixture(scope='module') def fits_output(fits_input): fname = fits_input[0].header['filename'].replace('.fits', '_superbiasstep.fits') yield fits.open(fname) os.remove(fname)
[docs]@pytest.fixture(scope='module') def fits_superbias(fits_output): ref_path = fits_output['PRIMARY'].header['R_SUPERB'] ref_path = ref_path.replace('crds://', '/grp/crds/cache/references/jwst/') return fits.open(ref_path)
[docs]def test_superbias_step(fits_input): """Make sure the DQInitStep runs without error.""" fname = fits_input[0].header['filename'].replace('.fits', '_superbiasstep.fits') SuperBiasStep.call(datamodels.open(fits_input), output_file=fname, save_results=True)
[docs]def test_superbias_subtraction(fits_input, fits_output, fits_superbias): if fits_input[0].header['SUBARRAY'] == fits_superbias[0].header['SUBARRAY']: bias = fits_superbias['SCI'].data else: bias = extract_subarray(fits_superbias['SCI'].data, fits_input) bias_to_subtract = np.copy(bias) bias_to_subtract[np.isnan(bias_to_subtract)] = 0 assert np.allclose(fits_output['SCI'].data, (fits_input['SCI'].data - bias_to_subtract))
[docs]def test_superbias_residuals(fits_output, fits_input): mean, median, std = sigma_clipped_stats(fits_output['SCI'].data[0,0,:,:], fits_output['PIXELDQ'].data.astype(bool), iters=None) print("Sigma clipped stats") print("mean = {}".format(mean)) print("median = {}".format(median)) print("standard deviation = {}".format(std)) # normaltest(fits_output['SCI'].data) # make plot base = fits_input[0].header['FILENAME'].split('.')[0] plot_fname = 'test_superbias_residuals_'+base+'.png' plt.clf() plt.hist(fits_output['SCI'].data[0,0,:,:].flatten(), range=(median - 5 * std, median + 5 * std), bins=100) plt.xlabel('First Frame Counts') plt.ylabel('Number of Pixels') plt.savefig(plot_fname)
[docs]def test_pixeldq_propagation(fits_input, fits_output, fits_superbias): # translate dq flags to standard bits pixeldq = translate_dq(fits_superbias) # extract subarray if fits_superbias[0].header['SUBARRAY'] == 'GENERIC': pixeldq = extract_subarray(pixeldq, fits_input) assert np.all(fits_output['PIXELDQ'].data == np.bitwise_or(fits_input['PIXELDQ'].data, pixeldq))