diff options
-rw-r--r-- | wcsutil/__init__.py | 116 |
1 files changed, 89 insertions, 27 deletions
diff --git a/wcsutil/__init__.py b/wcsutil/__init__.py index 1ab9fea..0e2d04d 100644 --- a/wcsutil/__init__.py +++ b/wcsutil/__init__.py @@ -5,6 +5,7 @@ import instruments #from .. distortion import models from hstwcs.distortion import models import numpy as N +from pytools import fileutil #from .. mappings import inst_mappings, ins_spec_kw, DEGTORAD, RADTODEG, basic_wcs from hstwcs.mappings import inst_mappings, ins_spec_kw, DEGTORAD, RADTODEG @@ -22,55 +23,100 @@ class HSTWCS(WCS): instrument specific attributes needed by the correction classes. """ - def __init__(self, hdr0=None, ehdr=None, fobj=None, instrument=None): + def __init__(self, hdr0=None, ehdr=None, fobj=None, fname=None, instrument=None): """ :Parameters: + `fname`: string + file/extension name + filename[EXTNAME,EXTNUM] + filename[extension_number] `hdr0`: Pyfits Header primary header `ehdr`: Pyfits Header extension header `fobj`: PyFITS HDUList object or None pyfits file object + `instrument`: string + one of 'ACS', 'NICMOS', 'WFPC2', 'STIS', 'WFC3' """ - WCS.__init__(self, ehdr, fobj=fobj) + self.inst_kw = ins_spec_kw - if hdr0 == None and ehdr == None and instrument != None: - #default HSTWCS objectbased on instrument only + if fname == None and hdr0 == None and ehdr == None and instrument != None: + # create a default HSTWCS object based on instrument only self.instrument = instrument self.setInstrSpecKw() + elif fname != None: + # create an HSTWCS object from a filename + filename, extname = fileutil.parseFilename(fname) + self.filename = filename + self.extname = extname + if extname == None: + #data may be in the primary array + ehdr = pyfits.getheader(filename) + hdr0 = None + else: + ext = fileutil.parseExtn(extname) + hdr0 = pyfits.getheader(filename) + try: + ehdr = pyfits.getheader(filename, ext=ext) + except: + print 'Unable to get extension header based on filename %s. /n' % fname + elif fname == None and instrument == None: + # hdr0 may be None, a WCS object will still be created + if hdr0 == None and ehdr == None: + print 'Not enough information to create a WCS object\n' + self.help() + return + if hdr0 != None: + assert isinstance (hdr0, pyfits.Header) + if ehdr != None: + assert isinstance (ehdr, pyfits.Header) + + WCS.__init__(self, ehdr, fobj=fobj) + self.setHDR0kw(hdr0, ehdr) + #self.detector = self.setDetector(hdr0) + + self.setInstrSpecKw(hdr0, ehdr) + self.pscale = self.setPscale() + self.orientat = self.setOrient() + self.readIDCCoeffs(ehdr) + # if input was not a file name, try to get it from the primary header + self.filename = hdr0.get('FILENAME', "") + extname = ehdr.get('EXTNAME', "") + extnum = ehdr.get('EXTVER', None) + self.extname = (extname, extnum) - elif instrument == None: - assert isinstance (hdr0, pyfits.Header) - assert isinstance (ehdr, pyfits.Header) - - self.setHDR0kw(hdr0) - self.detector = self.setDetector(hdr0) - - self.setInstrSpecKw(hdr0, ehdr) - self.pscale = self.setPscale() - self.orientat = self.setOrient() - self.readIDCCoeffs(ehdr) - - def setHDR0kw(self, primhdr): + + def setHDR0kw(self, primhdr, ehdr): + if primhdr == None: + # we are given only an extension header + header = ehdr + elif ehdr == None: + header = primhdr + else: + hcards = primhdr.ascardlist() + hcards.extend(ehdr.ascardlist()) + header = pyfits.Header(cards = hcards) # Set attributes from kw defined in the primary header. - self.instrument = primhdr.get('INSTRUME', None) - self.offtab = primhdr.get('OFFTAB', None) - self.idctab = primhdr.get('IDCTAB', None) - self.date_obs = primhdr.get('DATE-OBS', None) - self.pav3 = primhdr.get('PA_V3', None) - self.ra_targ = primhdr.get('RA_TARG', None) - self.dec_targ = primhdr.get('DEC_TARG', None) - - + self.instrument = header.get('INSTRUME', None) + self.offtab = header.get('OFFTAB', None) + self.idctab = header.get('IDCTAB', None) + self.date_obs = header.get('DATE-OBS', None) + self.pav3 = header.get('PA_V3', None) + self.ra_targ = header.get('RA_TARG', None) + self.dec_targ = header.get('DEC_TARG', None) + self.detector = header.get('DETECTOR', None) + self.filename = header.get('FILENAME', "") + """ def setDetector(self, header): # Set detector attribute for instuments which have more than one detector if self.instrument in ['ACS', 'WFC3']: return header.get('DETECTOR', None) else: return None - + """ def readIDCCoeffs(self, header): """ Reads in first order IDCTAB coefficients if present in the header @@ -149,4 +195,20 @@ class HSTWCS(WCS): #ext_hdr.update('CENTERED', self.idcmodel.refpix['centered']) + def help(self): + print 'How to create an HSTWCS object:\n\n' + print """ \ + 1. Create an HSTWCS object using pyfits.Header objects. \n + Example:\n + hdr0 = pyfits.getheader('j9irw4b1q_flt.fits', ext=0)\n + hdr1 = pyfits.getheader('j9irw4b1q_flt.fits', ext=1)\n + f = pyfits.open('j9irw4b1q_flt.fits')\n + f is required only if a lookup table distortion is available.\n + w = wcsutil.HSTWCS(hdr0, hdr1,f)\n\n + + 2. Create an HSTWCS object using a qualified file name. \n + Example:\n + w = wcsutil.HSTWCS('j9irw4b1q_flt.fits[sci,1]')\n\n + """ +
\ No newline at end of file |