Source code for kcwidrp.primitives.TrimOverscan

from keckdrpframework.primitives.base_primitive import BasePrimitive
from kcwidrp.primitives.kcwi_file_primitives import kcwi_fits_writer

import numpy as np


[docs]class TrimOverscan(BasePrimitive): """Trim off overscan region""" def __init__(self, action, context): BasePrimitive.__init__(self, action, context) self.logger = context.pipeline_logger def _perform(self): # parameters # image sections for each amp bsec, dsec, tsec, direc = self.action.args.map_ccd namps = len(bsec) # header keyword to update key = 'OSCANTRM' keycom = 'Overscan trimmed?' # get output image dimensions max_sec = max(tsec) # create new blank image new = np.zeros((max_sec[1]+1, max_sec[3]+1), dtype=np.float32) # loop over amps for ia in range(namps): # input range indices yi0 = dsec[ia][0] yi1 = dsec[ia][1] + 1 xi0 = dsec[ia][2] xi1 = dsec[ia][3] + 1 # output range indices yo0 = tsec[ia][0] yo1 = tsec[ia][1] + 1 xo0 = tsec[ia][2] xo1 = tsec[ia][3] + 1 # transfer to new image new[yo0:yo1, xo0:xo1] = self.action.args.ccddata.data[yi0:yi1, xi0:xi1] # update amp section sec = "[%d:" % (xo0+1) sec += "%d," % xo1 sec += "%d:" % (yo0+1) sec += "%d]" % yo1 self.action.args.ccddata.header['ATSEC%d' % (ia+1)] = sec # remove obsolete sections self.action.args.ccddata.header.pop('ASEC%d' % (ia + 1)) self.action.args.ccddata.header.pop('BSEC%d' % (ia + 1)) self.action.args.ccddata.header.pop('DSEC%d' % (ia + 1)) self.action.args.ccddata.header.pop('CSEC%d' % (ia + 1)) # update with new image self.action.args.ccddata.data = new self.action.args.ccddata.header['NAXIS1'] = max_sec[3] + 1 self.action.args.ccddata.header['NAXIS2'] = max_sec[1] + 1 self.action.args.ccddata.header[key] = (True, keycom) log_string = TrimOverscan.__module__ self.action.args.ccddata.header['HISTORY'] = log_string self.logger.info(log_string) if self.config.instrument.saveintims: kcwi_fits_writer( self.action.args.ccddata, table=self.action.args.table, output_file=self.action.args.name, output_dir=self.config.instrument.output_directory, suffix="trim") return self.action.args
# END: class TrimOverscan()