Source code for wfc3tools.sub2full

"""
Given an image specified by the user which contains a subarray readout,
return the location of the corner of the subarray in a full frame reference
image (including the full physical extent of the chip), in 1-indexed
pixels. If the user supplies an X and Y coordinate, then the translated
location of that point will be returned.

.. code-block:: python

    >>> from wfc3tools import sub2full
    >>> sub2full('ibbso1fdq_flt.fits')
    [(3584.0, 1539)]

Specify a list of images:

    >>> im = ['ic5p02e0q_spt.fits',
              'ic5p02e1q_spt.fits',
              'ic5p02e2q_spt.fits',
              'ic5p02e3q_spt.fits',
              'ic5p02e4q_spt.fits']
    >>> sub2full(im)
    [(1062.0, 1363),
     (1062.0, 1363),
     (1410.0, 1243),
     (1410.0, 1243),
     (1402.0, 1539)]

Return the full extent of the subarray:

    >>> sub2full('ibbso1fdq_flt.fits',fullExtent=True)
    [(3584.0, 4096, 1539, 2050)]

"""

import os

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

__all__ = ["sub2full"]


[docs] def sub2full(filename, x=None, y=None, fullExtent=False): """ Given an image specified by the user which contains a subarray readout, return the location of the corner of the subarray in a full frame reference image (including the full physical extent of the chip), in 1-indexed pixels. Parameters ---------- filename : str or list Input image name or list of image names. The rootname will be used to find the SPT files in the same directory, the SPT file has all the necessary information for the transform. x : int, optional Specify an x coordinate in the subarray to translate. If an x and y are specified, the fullExtent option is turned off and only the translated x,y coords are returned. Default is `None`. y : int, optional Specify a y coordinate in the subarray to translate. If an x and y are specified, the fullExtent option is turned off and only the translated x,y coords are returned. Default is `None`. fullExtent : bool, optional If `True`, the returned values will include the full extent of the subarray in the reference image, for example: ``(x0,x1,y0,y1)``. Default is `False`. Returns ------- coords : list A list of tuples which specify the translated coordinates, either ``(x0,y0)`` for each image or the full extent sections. Examples -------- >>> from wfc3tools import sub2full >>> filename = 'ibbso1fdq_flt.fits' >>> coords = sub2full(filename, x=None, y=None, fullExtent=False) """ infiles, dummy_out = parseinput.parseinput(filename) if len(infiles) < 1: raise ValueError("Please input a valid HST filename") coords = list() for f in infiles: spt = os.path.join(os.path.dirname(f), os.path.basename(f)[0:9] + "_spt.fits") uvis_x_size = 2051 serial_over = 25.0 ir_overscan = 5.0 # open up our image files try: fd2 = fits.open(spt) except (ValueError, IOError) as e: raise ValueError("%s " % (e)) # check for required keywords and close the images try: detector = fd2[0].header["SS_DTCTR"] subarray = fd2[0].header["SS_SUBAR"] xcorner = int(fd2[1].header["XCORNER"]) ycorner = int(fd2[1].header["YCORNER"]) numrows = int(fd2[1].header["NUMROWS"]) numcols = int(fd2[1].header["NUMCOLS"]) fd2.close() except KeyError as e: raise KeyError(f"Required header keyword missing: {e}") if "NO" in subarray: raise ValueError(f"Image is not a subarray: {f}") sizaxis1 = numcols sizaxis2 = numrows if xcorner == 0 and ycorner == 0: cornera1 = 0 cornera2 = 0 cornera1a = cornera1 + 1 cornera1b = cornera1a + sizaxis1 - 1 cornera2a = cornera2 + 1 cornera2b = cornera2a + sizaxis2 - 1 else: if "UVIS" in detector: cornera1 = ycorner cornera2 = uvis_x_size - xcorner - sizaxis2 if xcorner >= uvis_x_size: cornera2 = cornera2 + uvis_x_size cornera1a = cornera1 + 1 - serial_over cornera1b = cornera1a + sizaxis1 - 1 cornera2a = cornera2 + 1 cornera2b = cornera2a + sizaxis2 - 1 if cornera1a < 1: cornera1a = 1 if cornera1b > 4096: cornera1b = 4096 else: cornera1 = ycorner - ir_overscan cornera2 = xcorner - ir_overscan cornera1a = cornera1 + 1 cornera1b = cornera1a + sizaxis1 - 11 cornera2a = cornera2 + 1 cornera2b = cornera2a + sizaxis2 - 11 if x or y: if not isinstance(x, int) or (not isinstance(y, int)): raise ValueError("Must input integer value for x and y ") else: cornera1a = cornera1a + x cornera2a = cornera2a + y fullExtent = False if fullExtent: coords.append((int(cornera1a), int(cornera1b), int(cornera2a), int(cornera2b))) else: coords.append((int(cornera1a), int(cornera2a))) # return the tuple list of coordinates return coords