Source code for kai.reduce.lin_correction

from astropy.io import fits
import numpy as np
from kai import instruments
import copy

[docs] def lin_correction(file, instrument=instruments.default_inst): """ Perform linearity correction on input file, as defined below x = (FITS_orig) / (No. of coadds) Normalization is defined as a polynomial in the following way: norm = coeffs[0] + (coeffs[1] * x) + (coeffs[2] * x^2) + ... + (coeffs[n] * x^n) FITS_corrected = FITS_orig / norm Parameters ---------- file : str File path of FITS file to perform linearity correction instrument : instruments object, optional Instrument of data. Default is `instruments.default_inst` """ # Extract header and image data hdul = fits.open(file, mode='update', ignore_missing_end=True) im_header = hdul[0].header im_data = hdul[0].data # Perform correction num_coadds = im_header['COADDS'] x = im_data / num_coadds coeffs = instrument.get_linearity_correction_coeffs() # Determine order of polynomial correction norm_poly_order = len(coeffs) # Construct normalization from polynomial norm = coeffs[0] for cur_poly_order in range(1, norm_poly_order): norm = norm + (coeffs[cur_poly_order] * (x ** float(cur_poly_order))) # Perform correction # Only want to perform correction on positive pixel values negative_filter = np.where(im_data < 0) # Perform correction im_data_corrected = copy.deepcopy(im_data) im_data_corrected =\ im_data_corrected / norm # Set back values for negative pixels back to original value im_data_corrected[negative_filter] = im_data[negative_filter] # Write out corrected image data to file hdul[0].data = im_data_corrected hdul.flush(output_verify='ignore') hdul.close(output_verify='ignore') return