summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/stwcs/wcsutil/headerlet.py105
1 files changed, 52 insertions, 53 deletions
diff --git a/lib/stwcs/wcsutil/headerlet.py b/lib/stwcs/wcsutil/headerlet.py
index a18d254..4c29234 100644
--- a/lib/stwcs/wcsutil/headerlet.py
+++ b/lib/stwcs/wcsutil/headerlet.py
@@ -33,15 +33,15 @@ def setLogger(logger, level, mode='w'):
def hdrnames(fobj):
"""
- Returns a list of HDRNAME keywords from all HeaderletHDU
- extensions in a science file.
-
+ Returns a list of HDRNAME keywords from all HeaderletHDU
+ extensions in a science file.
+
Parameters
----------
fobj: string, pyfits.HDUList
"""
-
-
+
+
def isWCSIdentical(scifile, file2, verbose=False):
"""
Compares the WCS solution of 2 files.
@@ -141,20 +141,20 @@ def isWCSIdentical(scifile, file2, verbose=False):
return result
-def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ", wcsname=None,
- sipname=None, npolfile=None, d2imfile=None,
+def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ", wcsname=None,
+ sipname=None, npolfile=None, d2imfile=None,
verbose=100, logmode='w'):
"""
- Create a headerlet from a WCS in a science file
- If both wcskey and wcsname are given they should match, if not
+ Create a headerlet from a WCS in a science file
+ If both wcskey and wcsname are given they should match, if not
raise an Exception
-
+
Parameters
----------
fname: string or HDUList
science file
sciext: string or python list
- Extension in which the science data is. The headerlet will be created
+ Extension in which the science data is. The headerlet will be created
from these extensions.
If string - a valid EXTNAME is expected
If list - a list of FITS extension numbers or extension tuples ('SCI', 1)
@@ -163,14 +163,14 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
hdrname: string
value of HDRNAME keyword
Takes the value from the HDRNAME<wcskey> keyword, if not available from WCSNAME<wcskey>
- It stops if neither is found in the science file and a value is not provided
+ It stops if neither is found in the science file and a value is not provided
destim: string or None
name of file this headerlet can be applied to
if None, use ROOTNAME keyword
wcskey: char (A...Z) or " " or None
a char representing an alternate WCS to be used for the headerlet
- if " ", use the primary (default)
- if None use wcsname
+ if " ", use the primary (default)
+ if None use wcsname
wcsname: string or None
if wcskey is None use wcsname specified here to choose an alternate WCS for the headerlet
sipname: string or None (default)
@@ -198,12 +198,12 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
python logging level
logmode: 'w' or 'a'
log file open mode
-
+
Returns
-------
Headerlet object
"""
-
+
if verbose:
setLogger(module_logger, verbose, mode=logmode)
@@ -220,7 +220,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
else:
fobj = fname
close_file = False
-
+
# get all required keywords
if destim is None:
try:
@@ -230,7 +230,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
module_logger.info('DESTIM not provided')
module_logger.info('Keyword "ROOTNAME" not found')
module_logger.info('Using file name as DESTIM')
-
+
if not hdrname:
# check if HDRNAME<wcskey> is in header
hdrname = "".join(["HDRNAME",wcskey.upper()])
@@ -243,7 +243,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
message = "Required keyword 'HDRNAME' not given"
module_logger.critical(message)
print message, detail
-
+
if not wcsname:
wname = "".join(["WCSNAME",wcskey.upper()])
try:
@@ -252,7 +252,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
message = "Missing required keyword 'WCSNAME'."
module_logger.critical(message)
print message, detail
-
+
if not sipname:
try:
sipname = fobj[0].header["SIPNAME"]
@@ -264,7 +264,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
sipname = 'UNKNOWN'
else:
sipname = 'NOMODEL'
-
+
if not npolfile:
try:
npolfile = fobj[0].header["NPOLFILE"]
@@ -273,7 +273,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
npolfile = 'UNKNOWN'
else:
npolfile = 'NOMODEL'
-
+
if not d2imfile:
try:
d2imfile = fobj[0].header["D2IMFILE"]
@@ -282,9 +282,9 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
npolfile = 'UNKNOWN'
else:
npolfile = 'NOMODEL'
-
+
distname = "_".join([sipname, npolfile, d2imfile])
-
+
# get the version of STWCS used to create the WCS of the science file.
try:
upwcsver = fobj[0].header.ascard['STWCSVER']
@@ -311,16 +311,16 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
message = "Warning: 'O' is a reserved key for the original WCS"
module_logger.info(message)
print message
-
+
module_logger.debug("Data extensions form which to create headerlet:\n\t %s"
% (str(sciext)))
hdul = pyfits.HDUList()
- phdu = _createPrimaryHDU(destim, hdrname, distname, wcsname,
+ phdu = _createPrimaryHDU(destim, hdrname, distname, wcsname,
sipname, npolfile, d2imfile, upwcsver, pywcsver)
hdul.append(phdu)
-
+
if fu.isFits(fobj)[1] is not 'simple':
-
+
for e in sciext:
hwcs = HSTWCS(fname, ext=e, wcskey=wcskey)
h = hwcs.wcs2header(sip2hdr=True).ascard
@@ -332,7 +332,7 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
else: val = e[1]
h.insert(1, pyfits.Card(key='EXTVER', value=val,
comment='Extension version'))
- h.append(pyfits.Card("SCIEXT", str(e),
+ h.append(pyfits.Card("SCIEXT", str(e),
"Target science data extension"))
fhdr = fobj[e].header.ascard
if npolfile is not 'NOMODEL':
@@ -341,36 +341,36 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
h.append(cpdis[c - 1])
dp = fhdr['DP%s.*...' % c]
h.extend(dp)
-
+
try:
h.append(fhdr['CPERROR%s' % c])
except KeyError:
pass
-
+
try:
h.append(fhdr['NPOLEXT'])
except KeyError:
pass
-
+
if d2imfile is not 'NOMODEL':
try:
h.append(fhdr['D2IMEXT'])
except KeyError:
pass
-
+
try:
h.append(fhdr['AXISCORR'])
except KeyError:
module_logger.exception("'D2IMFILE' kw exists but keyword 'AXISCORR' was not found in "
"%s['SCI',%d]" % (fname, e))
raise
-
+
try:
h.append(fhdr['D2IMERR'])
except KeyError:
h.append(pyfits.Card(key='DPERROR', value=0,
comment='Maximum error of D2IMARR'))
-
+
hdu = pyfits.ImageHDU(header=pyfits.Header(h))
hdul.append(hdu)
numwdvarr = countExtn(fname, 'WCSDVARR')
@@ -381,12 +381,12 @@ def create_headerlet(fname, sciext=None, hdrname=None, destim=None, wcskey=" ",
for d in range(1, numd2im + 1):
hdu = fobj[('D2IMARR', d)].copy()
hdul.append(hdu)
-
+
if close_file:
fobj.close()
return Headerlet(hdul,verbose=verbose, logmode='a')
-def _createPrimaryHDU(destim, hdrname, distname, wcsname,
+def _createPrimaryHDU(destim, hdrname, distname, wcsname,
sipname, npolfile, d2imfile, upwcsver, pywcsver):
phdu = pyfits.PrimaryHDU()
phdu.header.update('DESTIM', destim,
@@ -400,7 +400,7 @@ def _createPrimaryHDU(destim, hdrname, distname, wcsname,
phdu.header.update('SIPNAME', sipname, comment='origin of SIP polynomial distortion model')
phdu.header.update('NPOLFILE', npolfile, comment='origin of non-polynmial distortion model')
phdu.header.update('D2IMFILE', d2imfile, comment='origin of detector to image correction')
-
+
phdu.header.ascard.append(upwcsver)
phdu.header.ascard.append(pywcsver)
return phdu
@@ -511,10 +511,10 @@ class Headerlet(pyfits.HDUList):
instances, or an HDUList instance
mode: string, optional
Mode with which to open the given file object
- verbose: int
+ verbose: int
python logging level, higher numbers trigger more output
logmode: 'w' or 'a'
- for internal use only, indicates whether the log file
+ for internal use only, indicates whether the log file
should be open in attach or write mode
"""
self.verbose = verbose
@@ -545,26 +545,26 @@ class Headerlet(pyfits.HDUList):
def apply_as_primary(fobj, attach=True, archive=True, force=False):
"""
Copy this headerlet as a primary WCS to fobj
-
+
Parameters
----------
fobj: string, HDUList
science file to which the headerlet should be applied
attach: boolean
- flag indicating if the headerlet should be attached as a
- HeaderletHDU to fobj. If True checks that HDRNAME is unique
+ flag indicating if the headerlet should be attached as a
+ HeaderletHDU to fobj. If True checks that HDRNAME is unique
in the fobj and stops if not.
archive: boolean (default is True)
- When the distortion model in the headerlet is the same as the
- distortion model of the science file, this flag indicates if
- the primary WCS should be saved as an alternate and a headerlet
+ When the distortion model in the headerlet is the same as the
+ distortion model of the science file, this flag indicates if
+ the primary WCS should be saved as an alternate and a headerlet
extension.
- When the distortion models do not match this flag indicates if
- the current primary and alternate WCSs should be archived as
+ When the distortion models do not match this flag indicates if
+ the current primary and alternate WCSs should be archived as
headerlet extensions and alternate WCS.
force: boolean (default is False)
- When the distortion models of the headerlet and the primary do
- not match, and archive is False this flag forces an update
+ When the distortion models of the headerlet and the primary do
+ not match, and archive is False this flag forces an update
of the primary
"""
self.hverify()
@@ -861,9 +861,8 @@ class HeaderletHDU(pyfits.hdu.base.NonstandardExtHDU):
@pyfits.util.lazyproperty
def data(self):
- size = self.size()
self._file.seek(self._datLoc)
- return self._file.readarray(size)
+ return self._file.readarray(self.size)
@pyfits.util.lazyproperty
def headerlet(self):
@@ -873,7 +872,7 @@ class HeaderletHDU(pyfits.hdu.base.NonstandardExtHDU):
# won't work (at least for gzipped files) due to problems deep
# within the gzip module that make it difficult to read gzip files
# embedded in another file
- s.write(self._file.read(self.size()))
+ s.write(self._file.read(self.size))
s.seek(0)
if self._header['COMPRESS']:
mode = 'r:gz'