Source code for sofia_redux.instruments.exes.calibrate
# Licensed under a 3-clause BSD style license - see LICENSE.rst
from astropy import log
import numpy as np
from sofia_redux.instruments.exes import utils
__all__ = ['calibrate']
[docs]
def calibrate(data, header, flat, variance, flat_var=None):
"""
Calibrate spectral image to physical units.
Each frame in the input data cube is multiplied by the flat
frame, which has been normalized by the black-body function.
This has the effect of both correcting the science frame for
instrumental response and calibrating it to intensity units.
Parameters
----------
data : numpy.ndarray
Data cube of shape [nframe, nspec, nspat] or image [nspec, nspat].
header : fits.Header
Header associated with the input data.
flat : numpy.ndarray
Flat image of shape [nspec, nspat].
variance : numpy.ndarray
Variance array matching data shape.
flat_var : numpy.ndarray, optional
Flat variance array of shape (nspec, nspat). If provided, it
is propagated into the output variance.
Returns
-------
data, variance : numpy.ndarray, numpy.ndarray
The calibrated data and updated variance.
"""
nx = header['NSPAT']
ny = header['NSPEC']
try:
nz = utils.check_data_dimensions(data=data, nx=nx, ny=ny)
except RuntimeError:
log.error(f'Data has wrong dimensions {data.shape}. '
f'Not applying flat')
return data, variance
try:
utils.check_variance_dimensions(variance, nx, ny, nz)
except RuntimeError:
log.error(f'Variance has wrong dimensions {data.shape}. '
f'Not applying flat')
return data, variance
else:
try:
utils.check_variance_dimensions(flat_var, nx, ny, 1)
except RuntimeError:
log.warning(f'Flat variance has wrong dimensions '
f'{flat_var.shape}')
flat_var = np.zeros((ny, nx))
# Loop over frames
cal_data = data * flat
variance = variance * flat ** 2 + flat_var * data ** 2
return cal_data, variance