Source code for kcwidrp.primitives.SubtractDark

from keckdrpframework.primitives.base_primitive import BasePrimitive
from kcwidrp.primitives.kcwi_file_primitives import kcwi_fits_reader, \
        get_master_name
import os


[docs]class SubtractDark(BasePrimitive): """ Subtract the master dark frame. Checks for existence of master dark frame and, if it exists, performs subtraction and records processing in the header. """ def __init__(self, action, context): BasePrimitive.__init__(self, action, context) self.logger = context.pipeline_logger def _perform(self): # Header keyword to update key = 'DARKSUB' keycom = 'master dark subtracted?' target_type = 'MDARK' self.logger.info("Subtracting master dark") tab = self.context.proctab.search_proctab( frame=self.action.args.ccddata, target_type=target_type, nearest=True) self.logger.info("%d master dark frames found" % len(tab)) if len(tab) > 0: mdname = get_master_name(tab, target_type) print("*************** READING IMAGE: %s" % mdname) mdark = kcwi_fits_reader( os.path.join(self.config.instrument.cwd, 'redux', mdname))[0] # scale by exposure time fac = 1.0 if 'TTIME' in mdark.header and \ 'TTIME' in self.action.args.ccddata.header: fac = float(self.action.args.ccddata.header['TTIME']) / \ float(mdark.header['TTIME']) self.logger.info("dark scaled by %.3f" % fac) else: self.logger.warn("unable to scale dark by exposure time") # do the subtraction self.action.args.ccddata.data -= mdark.data * fac self.action.args.ccddata.header[key] = (True, keycom) self.action.args.ccddata.header['MDFILE'] = (mdname, "Master dark filename") self.action.args.ccddata.header['DARKSCL'] = (fac, "dark scale factor") else: self.logger.info("No master dark frame available, skipping") self.action.args.ccddata.header[key] = (False, keycom) log_string = SubtractDark.__module__ self.action.args.ccddata.header['HISTORY'] = log_string self.logger.info(log_string) return self.action.args
# END: class SubtractDark()