summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/stwcs/wcsutil/altwcs.py94
1 files changed, 69 insertions, 25 deletions
diff --git a/lib/stwcs/wcsutil/altwcs.py b/lib/stwcs/wcsutil/altwcs.py
index 282461a..05784a9 100644
--- a/lib/stwcs/wcsutil/altwcs.py
+++ b/lib/stwcs/wcsutil/altwcs.py
@@ -60,41 +60,56 @@ def archiveWCS(fname, ext=None, wcskey=" ", wcsname=" ", reusekey=False):
return
if not ext:
- ext = range(len(f))
+ simplefits = fu.isFits(f)[1] is 'simple'
+ if simplefits:
+ ext = range(len(f))
+ else:
+ # Pywcs will create a default WCS if one is not present
+ # this avoids archiving a default WCS in the primary header
+ # if the file is in MEF format
+ ext = range(1, len(f))
elif isinstance(ext, int) or isinstance(ext, tuple):
ext = [ext]
+ if not wcskey and not wcsname:
+ raise KeyError("Either wcskey or wcsname should be specified")
+
wcsext = ext[0]
- if wcskey == " ":
- # try getting the key from WCSNAME
- if not wcsname.strip():
- wkey = next_wcskey(f[wcsext].header)
- else:
- wkey = getKeyFromName(f[wcsext].header, wcsname)
- else:
- if wcskey not in available_wcskeys(f[wcsext].header):
- # reuse wcsname
- if not wcsname.strip():
- wcsname = f[wcsext].header["WCSNAME"+wcskey]
+ if wcskey in wcskeys(f[wcsext].header) and not reusekey:
+ raise KeyError("Wcskey %s is aready used. \
+ Run archiveWCS() with reusekey=True to overwrite this alternate WCS. \
+ Alternatively choose another wcskey with altwcs.available_wcskeys()." %wcskey)
+ elif wcskey == " ":
+ # wcsname exists, overwrite it if reuse is True or get the next key
+ if wcsname.strip() in wcsnames(f[wcsext].header).values():
+ if reusekey:
+ # try getting the key from an existing WCS with WCSNAME
+ wkey = getKeyFromName(f[wcsext].header, wcsname)
wname = wcsname
- wkey = wcskey
+ if not wkey:
+ raise KeyError("Could not get a valid wcskey from wcsname %s" %wcsname)
else:
- wkey = wcskey
- wname = wcsname
+ raise KeyError("Wcsname %s is aready used. \
+ Run archiveWCS() with reusekey=True to overwrite this alternate WCS. \
+ Alternatively choose another wcskey with altwcs.available_wcskeys() or\
+ choose another wcsname." %wcsname)
else:
- wkey = wcskey
+ wkey = next_wcskey(f[wcsext].header)
wname = wcsname
-
+ else:
+ wkey = wcskey
+ wname = wcsname
+
for e in ext:
try:
w = pywcs.WCS(f[e].header, fobj=f)
except:
- # this should be revisited, should catchspecific errors
+ # this should be revisited, should catch specific errors
# KeyError - not a valid key, ValueError - not a valid extension, etc
continue
hwcs = w.to_header()
wcsnamekey = 'WCSNAME' + wkey
- f[e].header.update(key=wcsnamekey, value=wcsname)
+ f[e].header.update(key=wcsnamekey, value=wname)
if w.wcs.has_cd():
pc2cd(hwcs)
for k in hwcs.keys():
@@ -158,8 +173,6 @@ def restoreWCS(f, ext=None, fromext=None, toext=None, wcskey=" ", wcsname=" ",
if isinstance(ext, int) or isinstance(ext, tuple):
ext = [ext]
- #if isinstance(fromext, str):
- # fromext = [fromext]
if isinstance(toext, str):
toext = [toext]
@@ -296,6 +309,20 @@ def deleteWCS(fname, ext=None, wcskey=" ", wcsname=" "):
closefobj(fname, fobj)
def _restore(fobj, ukey, fromextnum, toextnum=None, fromextnam=None, toextnam=None):
+ """
+ fobj: string of HDUList
+ ukey: string 'A'-'Z'
+ wcs key
+ fromextnum: int
+ extver of extension from which to copy WCS
+ fromextnam: string
+ extname of extension from which to copy WCS
+ toextnum: int
+ extver of extension to which to copy WCS
+ toextnam: string
+ extname of extension to which to copy WCS
+ """
+ # create an extension tuple, e.g. ('SCI', 2)
if fromextnam:
fromextension = (fromextnam, fromextnum)
else:
@@ -358,7 +385,11 @@ def wcskeys(fobj, ext=None):
Parameters
----------
- hdr: pyfits.Header
+ fobj: string, pyfits.HDUList or pyfits.Header
+ fits file name, pyfits file object or pyfits header
+ ext: int or None
+ extension number
+ if None, fobj must be a header
"""
_check_headerpars(fobj, ext)
hdr = _getheader(fobj, ext)
@@ -371,7 +402,12 @@ def wcsnames(fobj, ext=None):
Parameters
----------
- header: pyfits.Header
+ fobj: string, pyfits.HDUList or pyfits.Header
+ fits file name, pyfits file object or pyfits header
+ ext: int or None
+ extension number
+ if None, fobj must be a header
+
"""
_check_headerpars(fobj, ext)
hdr = _getheader(fobj, ext)
@@ -389,7 +425,11 @@ def available_wcskeys(fobj, ext=None):
Parameters
----------
- header: pyfits.Header
+ fobj: string, pyfits.HDUList or pyfits.Header
+ fits file name, pyfits file object or pyfits header
+ ext: int or None
+ extension number
+ if None, fobj must be a header
"""
_check_headerpars(fobj, ext)
hdr = _getheader(fobj, ext)
@@ -408,7 +448,11 @@ def next_wcskey(fobj, ext=None):
Parameters
----------
- header: pyfits.Header
+ fobj: string, pyfits.HDUList or pyfits.Header
+ fits file name, pyfits file object or pyfits header
+ ext: int or None
+ extension number
+ if None, fobj must be a header
"""
_check_headerpars(fobj, ext)
hdr = _getheader(fobj, ext)