diff options
Diffstat (limited to 'lib/stwcs/wcsutil')
| -rw-r--r-- | lib/stwcs/wcsutil/altwcs.py | 83 | ||||
| -rw-r--r-- | lib/stwcs/wcsutil/headerlet.py | 44 | 
2 files changed, 72 insertions, 55 deletions
| diff --git a/lib/stwcs/wcsutil/altwcs.py b/lib/stwcs/wcsutil/altwcs.py index 52a55c7..cde176c 100644 --- a/lib/stwcs/wcsutil/altwcs.py +++ b/lib/stwcs/wcsutil/altwcs.py @@ -12,7 +12,7 @@ altwcskw = ['WCSAXES', 'CRVAL', 'CRPIX', 'PC', 'CDELT', 'CD', 'CTYPE', 'CUNIT',  altwcskw_extra = ['LATPOLE','LONPOLE','RESTWAV','RESTFRQ']  # file operations -def archiveWCS(fname, ext=None, wcskey=" ", wcsname=" ", reusekey=False): +def archiveWCS(fname, ext, wcskey=" ", wcsname=" ", reusekey=False):      """      Copy the primary WCS to the header as an alternate WCS      with wcskey and name WCSNAME. It loops over all extensions in 'ext' @@ -21,9 +21,10 @@ def archiveWCS(fname, ext=None, wcskey=" ", wcsname=" ", reusekey=False):      ----------      fname:  string or pyfits.HDUList              a file name or a file object -    ext:    an int, a tuple, a python list of integers or a python list of tuples (e.g.('sci',1)) +    ext:    an int, a tuple, string, or list of integers or tuples (e.g.('sci',1))              fits extensions to work with -            if None, work with a list of all extensions +            If a string is provided, it should specify the EXTNAME of extensions +            with WCSs to be archived      wcskey: string "A"-"Z" or " "              if " ": get next available key if wcsname is also " " or try              to get a key from WCSNAME value @@ -60,18 +61,9 @@ def archiveWCS(fname, ext=None, wcskey=" ", wcsname=" ", reusekey=False):          closefobj(fname, f)          raise ValueError("Input parameters problem") -    if not ext: -        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] -     +    # Interpret input 'ext' value to get list of extensions to process +    ext = _buildExtlist(f, ext) +              if not wcskey and not wcsname:          raise KeyError("Either wcskey or wcsname should be specified") @@ -126,7 +118,7 @@ def archiveWCS(fname, ext=None, wcskey=" ", wcsname=" ", reusekey=False):              f[e].header.update(key=key, value=hwcs[k])      closefobj(fname, f) -def restoreWCS(f, ext=None, fromext=None, toext=None, wcskey=" ", wcsname=" "): +def restoreWCS(f, ext, fromext=None, toext=None, wcskey=" ", wcsname=" "):      """      Copy a WCS with key "WCSKEY" to the primary WCS @@ -144,9 +136,10 @@ def restoreWCS(f, ext=None, fromext=None, toext=None, wcskey=" ", wcsname=" "):      toext:   string or python list               extname or a list of extnames to which the WCS will be copied as                primary, for example ['SCI', 'ERR', 'DQ'] -    ext:     an int, a tuple, a python list of integers or a python list -             of tuples (e.g.('sci',1)) -             fits extensions to work with +    ext:    an int, a tuple, string, or list of integers or tuples (e.g.('sci',1)) +            fits extensions to work with +            If a string is provided, it should specify the EXTNAME of extensions +            with WCSs to be archived      wcskey:  a charater               "A"-"Z" - Used for one of 26 alternate WCS definitions.               or " " - find a key from WCSNAMe value @@ -167,8 +160,9 @@ def restoreWCS(f, ext=None, fromext=None, toext=None, wcskey=" ", wcsname=" "):          closefobj(f, fobj)          raise ValueError("Input parameters problem") -    if isinstance(ext, int) or isinstance(ext, tuple): -        ext = [ext] +    # Interpret input 'ext' value to get list of extensions to process +    ext = _buildExtlist(fobj, ext) +      if isinstance(toext, str):          toext = [toext] @@ -222,7 +216,7 @@ def restoreWCS(f, ext=None, fromext=None, toext=None, wcskey=" ", wcsname=" "):          #fobj.writeto(name)          closefobj(f, fobj) -def deleteWCS(fname, ext=None, wcskey=" ", wcsname=" "): +def deleteWCS(fname, ext, wcskey=" ", wcsname=" "):      """      Delete an alternate WCS defined with wcskey.      If wcskey is " " try to get a key from WCSNAME. @@ -230,8 +224,10 @@ def deleteWCS(fname, ext=None, wcskey=" ", wcsname=" "):      Parameters      ----------      fname:   sting or a pyfits.HDUList object -    ext:     an int, a tuple, a python list of integers or a python list of tuples (e.g.('sci',1)) -             fits extensions to work with +    ext:    an int, a tuple, string, or list of integers or tuples (e.g.('sci',1)) +            fits extensions to work with +            If a string is provided, it should specify the EXTNAME of extensions +            with WCSs to be archived      wcskey:  one of 'A'-'Z' or " "      wcsname: string               Name of alternate WCS description @@ -245,10 +241,8 @@ def deleteWCS(fname, ext=None, wcskey=" ", wcsname=" "):          closefobj(fname, fobj)          raise ValueError("Input parameters problem") -    if not ext: -        ext = range(len(fobj)) -    elif isinstance(ext, int) or isinstance(ext, tuple): -        ext = [ext] +    # Interpret input 'ext' value to get list of extensions to process +    ext = _buildExtlist(fobj, ext)      # Do not allow deleting the original WCS.      if wcskey == 'O': @@ -293,6 +287,34 @@ def deleteWCS(fname, ext=None, wcskey=" ", wcsname=" "):          print "Did not find WCS with key %s in any of the extensions" % wkey      closefobj(fname, fobj) +def _buildExtlist(fobj, ext): +    """ +    Utility function to interpret the provided value of 'ext' and return a list  +    of 'valid' values which can then be used by the rest of the functions in  +    this module. +     +    Parameters +    ---------- +    fobj: HDUList +        file to be examined +    ext:    an int, a tuple, string, list of integers or tuples (e.g.('sci',1)) +            fits extensions to work with +            If a string is provided, it should specify the EXTNAME of extensions +            with WCSs to be archived +    """ +    if not isinstance(ext,list): +        if isinstance(ext,str):     +            extstr = ext +            ext = [] +            for extn in range(1, len(fobj)): +                if 'extname' in fobj[extn].header and fobj[extn].header['extname'] == extstr: +                    ext.append(extn) +        elif isinstance(ext, int) or isinstance(ext, tuple): +            ext = [ext] +        else: +            raise KeyError("Valid extensions in 'ext' parameter need to be specified.") +    return ext +  def _restore(fobj, ukey, fromextnum, toextnum=None, fromextnam=None, toextnam=None):      """      fobj: string of HDUList @@ -597,8 +619,9 @@ def _parpasscheck(fobj, ext, wcskey, fromext=None, toext=None, reusekey=False):              return False      if not isinstance(ext, int) and not isinstance(ext, tuple) \ -       and not isinstance(ext, list) and ext is not None: -        print "Ext must be integer, tuple, a list of int extension numbers, \ +        and not isinstance(ext,str) \ +        and not isinstance(ext, list) and ext is not None: +        print "Ext must be integer, tuple, string,a list of int extension numbers, \n\          or a list of tuples representing a fits extension, for example ('sci', 1)."          return False diff --git a/lib/stwcs/wcsutil/headerlet.py b/lib/stwcs/wcsutil/headerlet.py index 6f8ee6f..34fb6d0 100644 --- a/lib/stwcs/wcsutil/headerlet.py +++ b/lib/stwcs/wcsutil/headerlet.py @@ -689,6 +689,11 @@ def write_headerlet(filename, hdrname, output=None, sciext='SCI',      """      initLogging('write_headerlet') +    if isinstance(filename,str): +        fname = filename +    else: +        fname = filename.filename() +      if wcsname in [None,' ','','INDEF'] and wcskey is None:          print '='*60          print '[write_headerlet]' @@ -885,9 +890,10 @@ def create_headerlet(filename, sciext='SCI', hdrname=None, destim=None, wcskey="              hdrname = fobj[1].header['HDRNAME']          except KeyError:              try: +                wname = ('WCSNAME'+wcskey).rstrip()                  hdrname = fobj[1].header['WCSNAME'+wcskey] -                print 'Using default value for HDRNAME of "%d"', -                print ' derived from WCSNAME%d.'%(hdrname,wcskey) +                print 'Using default value for HDRNAME of "%s"'%(hdrname), +                print ' derived from %s.'%(wname)              except KeyError, detail:                  message = "Required keywords 'HDRNAME' or 'WCSNAME' not found"                  module_logger.critical(message) @@ -1693,12 +1699,8 @@ class Headerlet(pyfits.HDUList):                of the primary          """          self.hverify() +        fobj,fname,close_dest = parseFilename(fobj,mode='update')          if self.verify_dest(fobj): -            if not isinstance(fobj, pyfits.HDUList): -                fobj = pyfits.open(fobj, mode='update') -                close_dest = True -            else: -                close_dest = False              # Check to see whether the distortion model in the destination              # matches the distortion model in the headerlet being applied @@ -1749,7 +1751,7 @@ class Headerlet(pyfits.HDUList):                      numhlt += 1                      orig_hlt_hdu.header.update('EXTVER',numhlt) -                wcsextn = mapFitsExt2HDUListInd(fobj.filename(),"SCI")[('SCI',1)] +                wcsextn = mapFitsExt2HDUListInd(fname,"SCI")[('SCI',1)]                  if dist_models_equal:                      # Use the WCSNAME to determine whether or not to archive                       # Primary WCS as altwcs @@ -1870,9 +1872,9 @@ class Headerlet(pyfits.HDUList):                  fobj.close()          else:              self.hdr_logger.critical("Observation %s cannot be updated with headerlet " -                            "%s" % (fobj.filename(), self.hdrname)) +                            "%s" % (fname, self.hdrname))              print "Observation %s cannot be updated with headerlet %s" \ -                  % (fobj.filename(), self.hdrname) +                  % (fname, self.hdrname)      def apply_as_alternate(self, fobj, attach=True, wcskey=None, wcsname=None):          """ @@ -1896,13 +1898,8 @@ class Headerlet(pyfits.HDUList):                      """          self.hverify() +        fobj,fname,close_dest = parseFilename(fobj,mode='update')          if self.verify_dest(fobj): -            if not isinstance(fobj, pyfits.HDUList): -                fobj = pyfits.open(fobj, mode='update') -                close_dest = True -            else: -                close_dest = False -            fname = fobj.filename()              # Verify whether this headerlet has the same distortion found in              # the image being updated @@ -1995,13 +1992,13 @@ class Headerlet(pyfits.HDUList):                  new_hlt.update_ext_version(numhlt + 1)                  fobj.append(new_hlt) -            if close_dest: -                fobj.close()          else:              self.hdr_logger.critical("Observation %s cannot be updated with headerlet "                              "%s" % (fname, self.hdrname))              print "Observation %s cannot be updated with headerlet %s" \                    % (fname, self.hdrname) +        if close_dest: +            fobj.close()      def attach_to_file(self,fobj):          """ @@ -2021,11 +2018,8 @@ class Headerlet(pyfits.HDUList):          - update wcscorr           """          self.hverify() -        if not isinstance(fobj, pyfits.HDUList): -            fobj = pyfits.open(fobj, mode='update') -            close_dest = True -        else: -            close_dest = False +        fobj,fname,close_dest = parseFilename(fobj,mode='update') +          if self.verify_dest(fobj) and self.verify_hdrname(fobj):              numhlt = countExtn(fobj, 'HDRLET') @@ -2037,9 +2031,9 @@ class Headerlet(pyfits.HDUList):          else:              self.hdr_logger.critical("Observation %s cannot be updated with headerlet " -                            "%s" % (fobj.filename(), self.hdrname)) +                            "%s" % (fname, self.hdrname))              print "Observation %s cannot be updated with headerlet %s" \ -                  % (fobj.filename(), self.hdrname) +                  % (fname, self.hdrname)          if close_dest:              fobj.close() | 
