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()