Source code for wfc3tools.embedsub

import numpy
from astropy.io import fits
from stsci.tools import parseinput

from .sub2full import sub2full

__taskname__ = "embedsub"
__all__ = ["embedsub"]


[docs] def embedsub(files): """Embed subarray in fullframe image. Given an image specified by the user which contains a subarray readout, return a full-frame image with the subarray implanted at the appropriate location. The output file will contain the subarray image placed inside the full frame extent of a regular image. Parameters ---------- files : str or list The name of the image file containing the subarray. This can be a single filename or a list of files. The ipppssoot will be used to construct the output filename. You should input an FLT image. Examples -------- This function calls :ref:`sub2full` to calculate the subarray position on the full frame image. .. code-block:: python >>> from wfc3tools import embedsub >>> embedsub('ic5p02eeq_flt.fits') Subarray image section [x1,x2,y1,y2] = [2828:3339,215:726] Image saved to: ic5p02eef_flt.fits """ uvis = False uvis_full_x = 2051 uvis_full_y = 4096 ir_full = 1014 infiles, dummy_out = parseinput.parseinput(files) if len(infiles) < 1: return ValueError("Please input a valid HST filename") # process all the input subarrays for filename in infiles: # Make sure the input name conforms to normal style if "_flt" not in filename: print("Warning: Can't properly parse '%s'; Skipping" % files) # Extract the root name and build SPT and output file names root = filename[0 : filename.find("_flt")] full = root[0 : len(root) - 1] + "f_flt.fits" try: # open input file read-only flt = fits.open(filename) except EnvironmentError: print("Problem opening fits file %s" % (filename)) detector = flt[0].header["DETECTOR"] if "UVIS" in detector: uvis = True # compute subarray corners assuming the raw image location x1, x2, y1, y2 = sub2full(filename, fullExtent=True)[0] print("Subarray image section [x1,x2,y1,y2] = [%d:%d,%d:%d]" % (x1, x2, y1, y2)) if uvis: xaxis = uvis_full_x yaxis = uvis_full_y else: xaxis = ir_full yaxis = ir_full # Now copy the subarray image data into full-chip data arrays; # The regions outside the subarray will be set to zero in the # SCI, ERR, SAMP, and TIME extensions, and to DQ=4. sci = numpy.zeros([xaxis, yaxis], dtype=numpy.float32) err = numpy.zeros([xaxis, yaxis], dtype=numpy.float32) dq = numpy.zeros([xaxis, yaxis], dtype=numpy.int16) + 4 sci[y1 - 1 : y2, x1 - 1 : x2] = flt[1].data err[y1 - 1 : y2, x1 - 1 : x2] = flt[2].data dq[y1 - 1 : y2, x1 - 1 : x2] = flt[3].data if not uvis: samp = numpy.zeros([xaxis, yaxis], dtype=numpy.int16) time = numpy.zeros([xaxis, yaxis], dtype=numpy.float32) samp[y1 - 1 : y2, x1 - 1 : x2] = flt[4].data time[y1 - 1 : y2, x1 - 1 : x2] = flt[5].data # Reset a few WCS values to make them appropriate for a # full-chip image crpix1 = flt[1].header["CRPIX1"] crpix2 = flt[1].header["CRPIX2"] flt[1].header["sizaxis1"] = yaxis flt[1].header["sizaxis2"] = xaxis for i in range(1, 4): if "CRPIX1" in flt[i].header: flt[i].header["crpix1"] = crpix1 + x1 - 1 flt[i].header["crpix2"] = crpix2 + y1 - 1 if "LTV1" in flt[i].header: flt[i].header["ltv1"] = 0.0 flt[i].header["ltv2"] = 0.0 # set the header value of SUBARRAY to False since it's now # regular size image flt[0].header["SUBARRAY"] = False # Now write out the SCI, ERR, DQ extensions to the full-chip file flt[1].data = sci flt[2].data = err flt[3].data = dq if not uvis: flt[4].data = samp flt[5].data = time flt.writeto(full, overwrite=False) # close the input files flt.close() print("Image saved to: %s" % (full))