summaryrefslogtreecommitdiff
path: root/stwcs/updatewcs/wfpc2_dgeo.py
diff options
context:
space:
mode:
authorNadia Dencheva <nadia.dencheva@gmail.com>2016-08-04 17:42:01 -0400
committerNadia Dencheva <nadia.dencheva@gmail.com>2016-08-04 17:42:01 -0400
commit4b65b226085ccb9e665a5866023d8114f7438188 (patch)
tree7183ed93c0624164930069bf5fedcd582dce84b6 /stwcs/updatewcs/wfpc2_dgeo.py
parent86d1bc5a77491770d45b86e5cf18b79ded68fb9b (diff)
downloadstwcs_hcf-4b65b226085ccb9e665a5866023d8114f7438188.tar.gz
restructure and add stwcs tests
Diffstat (limited to 'stwcs/updatewcs/wfpc2_dgeo.py')
-rw-r--r--stwcs/updatewcs/wfpc2_dgeo.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/stwcs/updatewcs/wfpc2_dgeo.py b/stwcs/updatewcs/wfpc2_dgeo.py
new file mode 100644
index 0000000..e57bb5c
--- /dev/null
+++ b/stwcs/updatewcs/wfpc2_dgeo.py
@@ -0,0 +1,123 @@
+""" wfpc2_dgeo - Functions to convert WFPC2 DGEOFILE into D2IMFILE
+
+"""
+import os
+import datetime
+
+import astropy
+from astropy.io import fits
+import numpy as np
+
+from stsci.tools import fileutil
+
+import logging
+logger = logging.getLogger("stwcs.updatewcs.apply_corrections")
+
+def update_wfpc2_d2geofile(filename, fhdu=None):
+ """
+ Creates a D2IMFILE from the DGEOFILE for a WFPC2 image (input), and
+ modifies the header to reflect the new usage.
+
+ Parameters
+ ----------
+ filename: string
+ Name of WFPC2 file to be processed. This file will be updated
+ to delete any reference to a DGEOFILE and add a D2IMFILE to replace
+ that correction when running updatewcs.
+ fhdu: object
+ FITS object for WFPC2 image. If user has already opened the WFPC2
+ file, they can simply pass that FITS object in for direct processing.
+
+ Returns
+ -------
+ d2imfile: string
+ Name of D2IMFILE created from DGEOFILE. The D2IMFILE keyword in the
+ image header will be updated/added to point to this newly created file.
+
+ """
+
+ close_fhdu = False
+ if fhdu is None:
+ fhdu = fileutil.openImage(filename, mode='update')
+ close_fhdu = True
+
+ dgeofile = fhdu['PRIMARY'].header.get('DGEOFILE', None)
+ already_converted = dgeofile not in [None, "N/A", "", " "]
+ if already_converted or 'ODGEOFIL' in fhdu['PRIMARY'].header:
+ if not already_converted:
+ dgeofile = fhdu['PRIMARY'].header.get('ODGEOFIL', None)
+ logger.info('Converting DGEOFILE %s into D2IMFILE...' % dgeofile)
+ rootname = filename[:filename.find('.fits')]
+ d2imfile = convert_dgeo_to_d2im(dgeofile,rootname)
+ fhdu['PRIMARY'].header['ODGEOFIL'] = dgeofile
+ fhdu['PRIMARY'].header['DGEOFILE'] = 'N/A'
+ fhdu['PRIMARY'].header['D2IMFILE'] = d2imfile
+ else:
+ d2imfile = None
+ fhdu['PRIMARY'].header['DGEOFILE'] = 'N/A'
+ if 'D2IMFILE' not in fhdu['PRIMARY'].header:
+ fhdu['PRIMARY'].header['D2IMFILE'] = 'N/A'
+
+ # Only close the file handle if opened in this function
+ if close_fhdu:
+ fhdu.close()
+
+ # return the d2imfile name so that calling routine can keep
+ # track of the new file created and delete it later if necessary
+ # (multidrizzle clean=True mode of operation)
+ return d2imfile
+
+def convert_dgeo_to_d2im(dgeofile,output,clobber=True):
+ """ Routine that converts the WFPC2 DGEOFILE into a D2IMFILE.
+ """
+ dgeo = fileutil.openImage(dgeofile)
+ outname = output+'_d2im.fits'
+
+ removeFileSafely(outname)
+ data = np.array([dgeo['dy',1].data[:,0]])
+ scihdu = fits.ImageHDU(data=data)
+ dgeo.close()
+ # add required keywords for D2IM header
+ scihdu.header['EXTNAME'] = ('DY', 'Extension name')
+ scihdu.header['EXTVER'] = (1, 'Extension version')
+ fits_str = 'PYFITS Version '+str(astropy.__version__)
+ scihdu.header['ORIGIN'] = (fits_str, 'FITS file originator')
+ scihdu.header['INHERIT'] = (False, 'Inherits global header')
+
+ dnow = datetime.datetime.now()
+ scihdu.header['DATE'] = (str(dnow).replace(' ','T'),
+ 'Date FITS file was generated')
+
+ scihdu.header['CRPIX1'] = (0, 'Distortion array reference pixel')
+ scihdu.header['CDELT1'] = (1, 'Grid step size in first coordinate')
+ scihdu.header['CRVAL1'] = (0, 'Image array pixel coordinate')
+ scihdu.header['CRPIX2'] = (0, 'Distortion array reference pixel')
+ scihdu.header['CDELT2'] = (1, 'Grid step size in second coordinate')
+ scihdu.header['CRVAL2'] = (0, 'Image array pixel coordinate')
+
+ phdu = fits.PrimaryHDU()
+ phdu.header['INSTRUME'] = 'WFPC2'
+ d2imhdu = fits.HDUList()
+ d2imhdu.append(phdu)
+ scihdu.header['DETECTOR'] = (1, 'CCD number of the detector: PC 1, WFC 2-4 ')
+ d2imhdu.append(scihdu.copy())
+ scihdu.header['EXTVER'] = (2, 'Extension version')
+ scihdu.header['DETECTOR'] = (2, 'CCD number of the detector: PC 1, WFC 2-4 ')
+ d2imhdu.append(scihdu.copy())
+ scihdu.header['EXTVER'] = (3, 'Extension version')
+ scihdu.header['DETECTOR'] = (3, 'CCD number of the detector: PC 1, WFC 2-4 ')
+ d2imhdu.append(scihdu.copy())
+ scihdu.header['EXTVER'] = (4, 'Extension version')
+ scihdu.header['DETECTOR'] = (4, 'CCD number of the detector: PC 1, WFC 2-4 ')
+ d2imhdu.append(scihdu.copy())
+ d2imhdu.writeto(outname)
+ d2imhdu.close()
+
+ return outname
+
+
+def removeFileSafely(filename,clobber=True):
+ """ Delete the file specified, but only if it exists and clobber is True.
+ """
+ if filename is not None and filename.strip() != '':
+ if os.path.exists(filename) and clobber: os.remove(filename)