diff options
author | dencheva <dencheva@stsci.edu> | 2009-03-26 11:33:12 -0400 |
---|---|---|
committer | dencheva <dencheva@stsci.edu> | 2009-03-26 11:33:12 -0400 |
commit | f4f7b6033617c1943e2348820f9698960259e44b (patch) | |
tree | b94fe1835d33a18cd8b8660d90e7d1540beb16f6 | |
parent | faf6b5f51af44a794f743a2e2b5de3f176023185 (diff) | |
download | stwcs_hcf-f4f7b6033617c1943e2348820f9698960259e44b.tar.gz |
Removed wcs_pix2sky method, detector to image correction is not applied in this case.
Added sip2foc method.
Added 'minerr' parameter to HSTWCS class to allow switching distortion application off
Added docstrings.
Changed imports of numpy
git-svn-id: http://svn.stsci.edu/svn/ssb/stsci_python/development/trunk/updatewcs@7804 fe389314-cf27-0410-b35b-8c050e845b92
-rw-r--r-- | wcsutil/__init__.py | 103 | ||||
-rw-r--r-- | wcsutil/instruments.py | 16 |
2 files changed, 82 insertions, 37 deletions
diff --git a/wcsutil/__init__.py b/wcsutil/__init__.py index 57e2460..7bf16f7 100644 --- a/wcsutil/__init__.py +++ b/wcsutil/__init__.py @@ -4,7 +4,7 @@ import pyfits import instruments #from .. distortion import models from updatewcs.distortion import models -import numpy as N +import numpy as np from pytools import fileutil from pytools.fileutil import DEGTORAD, RADTODEG @@ -25,7 +25,7 @@ class HSTWCS(WCS): Create a WCS object based on the instrument. It has all basic WCS kw as attribbutes (set by pywcs). It also uses the primary and extension header to define - instrument specific attributes needed by the correction classes. + instrument specific attributes. """ def __init__(self, fobj=None, ext=None, instrument=None, detector=None, minerr=0.0): @@ -40,10 +40,15 @@ class HSTWCS(WCS): if ext==None, it is assumed the data is in the primary hdu `instrument`: string one of 'ACS', 'NICMOS', 'WFPC2', 'STIS', 'WFC3' + Used only to define a default HSTWCS object, when fobj==None `detector`: string for example 'WFC' - If instrument and detector parameters are give, a default HSTWCS - instrument is created. + If instrument and detector parameters are given, a default HSTWCS + instrument is created. Used only with fobj==None + `minerr`: float + minimum value a distortion correction must have in order to be applied. + If CPERRja, CQERRja are smaller than minerr, the corersponding + distortion is not applied. """ self.inst_kw = ins_spec_kw @@ -121,10 +126,10 @@ class HSTWCS(WCS): self.pav3 = primhdr['PA_V3'] except KeyError: - print 'Kw PA_V3 not found in primary header.' - print 'This is typical for some old files. Please retrieve the files fromthe archive again.' - print 'Quitting ...' - raise + print 'Keyword PA_V3 not found in primary header.' + print 'This is typical for some old files. Please retrieve the files from the archive again.' + #print 'Quitting ...' + #raise @@ -161,13 +166,13 @@ class HSTWCS(WCS): cd11 = self.wcs.cd[0][0] cd21 = self.wcs.cd[1][0] - self.pscale = N.sqrt(N.power(cd11,2)+N.power(cd21,2)) * 3600. + self.pscale = np.sqrt(np.power(cd11,2)+np.power(cd21,2)) * 3600. def setOrient(self): # Recompute ORIENTAT cd12 = self.wcs.cd[0][1] cd22 = self.wcs.cd[1][1] - self.orientat = RADTODEG(N.arctan2(cd12,cd22)) + self.orientat = RADTODEG(np.arctan2(cd12,cd22)) def updatePscale(self, pscale): """Given a plate scale, update the CD matrix""" @@ -185,11 +190,11 @@ class HSTWCS(WCS): old_orient = self.orientat self.orientat = orient angle = fileutil.DEGTORAD(orient) - cd11 = -N.cos(angle) - cd12 = N.sin(angle) + cd11 = -np.cos(angle) + cd12 = np.sin(angle) cd21 = cd12 cd22 = -cd11 - cdmat = N.array([[cd11, cd12],[cd21,cd22]]) + cdmat = np.array([[cd11, cd12],[cd21,cd22]]) self.wcs.cd = cdmat * self.pscale/3600 @@ -222,14 +227,27 @@ class HSTWCS(WCS): return else: self.updatehdr(header) - + """ + The next four methods overwrite the corresponding PyWCS methods + If detector to image correction is specified in the primary science + header and a correction extension exists (D2IMEXT keyword) then + this correction is applied before the corrsponding PyWCS method is called. + """ def all_pix2sky(self, *args, **kwargs): + + origin = self.get_origin(*args) if self.det2imext != None: return WCS.all_pix2sky(self, self.det2im(*args),origin ) else: return WCS.all_pix2sky(self, *args) - + all_pix2sky.__doc__ = """ + Applies detector to image correction before it does the + following pixel transformations: + + %s + """ % (WCS.all_pix2sky.__doc__) + def pix2foc(self, *args, **kwargs): origin = self.get_origin(*args) if self.det2imext != None: @@ -237,30 +255,56 @@ class HSTWCS(WCS): else: return WCS.pix2foc(self, *args) + pix2foc.__doc__ = """ + Applies detector to image correction before it does the + following pixel transformations: + + %s + """ % (WCS.pix2foc.__doc__) + def p4_pix2foc(self, *args, **kwargs): origin = self.get_origin(*args) if self.det2imext != None: return WCS.p4_pix2foc(self, self.det2im(*args), origin) else: return WCS.p4_pix2foc(self, *args) - - def wcs_pix2sky(self, *args, **kwargs): + + p4_pix2foc.__doc__ = """ + Applies detector to image correction before it does the + following pixel transformations: + + %s + """ % (WCS.p4_pix2foc.__doc__) + + def sip_pix2foc(self, *args, **kwargs): origin = self.get_origin(*args) if self.det2imext != None: - return WCS.wcs_pix2sky(self, self.det2im(*args), origin) + return WCS.sip_pix2foc(self, self.det2im(*args), origin) else: - return WCS.wcs_pix2sky(self, *args) + return WCS.sip_pix2foc(self, *args) + sip_pix2foc.__doc__ = """ + Applies detector to image correction before it does the + following pixel transformations: + + %s + """ % (WCS.sip_pix2foc.__doc__) + def get_origin(self, *args): + # Parse the arguments to get the origin of the + #transformation: 0 or 1 if len(args) == 2: - origin = args[1] + return args[1] elif len(args) == 3: - origin = args[2] - - return origin + return args[2] + raise TypeError("Expected 2 or 3 arguments, %d given" % len(args)) + def det2im(self, *args): + """ + Convert detector to image coordinates + """ cpdis = self.get_d2im_lookup() d2im_wcs = WCS() if self.axiscorr == 1: @@ -270,7 +314,7 @@ class HSTWCS(WCS): if len(args) == 2: xy, origin = args try: - xy = N.asarray(xy) + xy = np.asarray(xy) origin = int(origin) except: raise TypeError( @@ -279,8 +323,8 @@ class HSTWCS(WCS): elif len(args) == 3: x, y, origin = args try: - x = N.asarray(x) - y = N.asarray(y) + x = np.asarray(x) + y = np.asarray(y) origin = int(origin) except: raise TypeError( @@ -288,7 +332,7 @@ class HSTWCS(WCS): if len(x) != len(y): raise ValueError("x and y arrays are not the same size") length = len(x) - xy = N.hstack((x.reshape((length, 1)), + xy = np.hstack((x.reshape((length, 1)), y.reshape((length, 1)))) img = d2im_wcs.p4_pix2foc(xy,origin) @@ -296,8 +340,11 @@ class HSTWCS(WCS): return [img[:, i] for i in range(img.shape[1])] def get_d2im_lookup(self): + """ + Create a paper IV type lookup table from a reference file + """ d2im_data = pyfits.getdata(self.filename, ext=('D2IMARR', 1)) - d2im_data = N.array([d2im_data]) + d2im_data = np.array([d2im_data]) d2im_hdr = pyfits.getheader(self.filename, ext=('D2IMARR', 1)) crpix = (d2im_hdr['CRPIX1'],d2im_hdr['CRPIX2']) diff --git a/wcsutil/instruments.py b/wcsutil/instruments.py index 6d41e2a..7ac18f4 100644 --- a/wcsutil/instruments.py +++ b/wcsutil/instruments.py @@ -1,5 +1,4 @@ import pyfits -import numpy as N #from .. mappings import ins_spec_kw from mappings import ins_spec_kw, prim_hdr_kw @@ -88,6 +87,8 @@ class InstrWCS(object): # in a different header, so this is to be handled by the instrument classes pass + + class ACSWCS(InstrWCS): """ get instrument specific kw @@ -220,11 +221,7 @@ class NICMOSWCS(InstrWCS): def set_filter2(self): #Nicmos idc tables do not allow 2 filters. self.filter2 = 'CLEAR' - """ - self.filter2 = self.primhdr.get('FILTER2', None) - if self.filter2 == " " or self.filter2 == None: - self.filter2 = 'CLEAR2' - """ + def set_chip(self): self.chip = self.detector @@ -237,7 +234,7 @@ class NICMOSWCS(InstrWCS): class STISWCS(InstrWCS): """ - Create a NICMOS specific class + A STIS specific class """ def __init__(self, hdr0, hdr): @@ -245,7 +242,7 @@ class STISWCS(InstrWCS): self.exthdr = hdr InstrWCS.__init__(self,hdr0, hdr) self.set_ins_spec_kw() - + def set_parity(self): self.parity = [[-1.0,0.],[0.,1.0]] @@ -264,4 +261,5 @@ class STISWCS(InstrWCS): self.detector = self.primhdr['DETECTOR'] except KeyError: print 'ERROR: Detector kw not found.\n' - raise
\ No newline at end of file + raise + |