from __future__ import absolute_import, division, print_function
from astropy.io import fits
try:
import stwcs
from stwcs import wcsutil
except:
stwcs = None
from stsci.tools import fileutil
OPUS_WCSKEYS = ['OCRVAL1', 'OCRVAL2', 'OCRPIX1', 'OCRPIX2',
'OCD1_1', 'OCD1_2', 'OCD2_1', 'OCD2_2',
'OCTYPE1', 'OCTYPE2']
[docs]def archive_prefix_OPUS_WCS(fobj, extname='SCI'):
""" Identifies WCS keywords which were generated by OPUS and archived
using a prefix of 'O' for all 'SCI' extensions in the file
Parameters
----------
fobj : str or `astropy.io.fits.HDUList`
Filename or fits object of a file
"""
if stwcs is None:
print('=====================')
print('The STWCS package is needed to convert an old-style OPUS WCS to an alternate WCS')
print('=====================')
raise ImportError
closefits = False
if isinstance(fobj, str):
# A filename was provided as input
fobj = fits.open(fobj, mode='update')
closefits = True
# Define the header
ext = ('sci', 1)
hdr = fobj[ext].header
numextn = fileutil.countExtn(fobj)
extlist = []
for e in range(1, numextn + 1):
extlist.append(('sci', e))
# Insure that the 'O' alternate WCS is present
if 'O' not in wcsutil.wcskeys(hdr):
# if not, archive the Primary WCS as the default OPUS WCS
wcsutil.archiveWCS(fobj, extlist, wcskey='O', wcsname='OPUS')
# find out how many SCI extensions are in the image
numextn = fileutil.countExtn(fobj, extname=extname)
if numextn == 0:
extname = 'PRIMARY'
# create HSTWCS object from PRIMARY WCS
wcsobj = wcsutil.HSTWCS(fobj, ext=ext, wcskey='O')
# get list of WCS keywords
wcskeys = list(wcsobj.wcs2header().keys())
# For each SCI extension...
for e in range(1, numextn + 1):
# Now, look for any WCS keywords with a prefix of 'O'
for key in wcskeys:
okey = 'O' + key[: 7]
hdr = fobj[(extname, e)].header
if okey in hdr:
# Update alternate WCS keyword with prefix-O OPUS keyword value
hdr[key] = hdr[okey]
if closefits:
fobj.close()
[docs]def create_prefix_OPUS_WCS(fobj, extname='SCI'):
""" Creates alternate WCS with a prefix of 'O' for OPUS generated WCS values
to work with old MultiDrizzle.
Parameters
----------
fobj : str or `astropy.io.fits.HDUList`
Filename or fits object of a file
Raises
------
IOError:
if input FITS object was not opened in 'update' mode
"""
# List of O-prefix keywords to create
owcskeys = OPUS_WCSKEYS
closefits = False
if isinstance(fobj, str):
# A filename was provided as input
fobj = fits.open(fobj, mode='update')
closefits = True
else:
# check to make sure this FITS obj has been opened in update mode
if fobj.fileinfo(0)['filemode'] != 'update':
print('File not opened with "mode=update". Quitting...')
raise IOError
# check for existance of O-prefix WCS
if owcskeys[0] not in fobj['sci', 1].header:
# find out how many SCI extensions are in the image
numextn = fileutil.countExtn(fobj, extname=extname)
if numextn == 0:
extname = ''
for extn in range(1, numextn + 1):
hdr = fobj[(extname, extn)].header
for okey in owcskeys:
hdr[okey] = hdr[okey[1: ] + 'O']
# Close FITS image if we had to open it...
if closefits:
fobj.close()