diff options
-rw-r--r-- | .travis.yml | 52 | ||||
-rw-r--r-- | setup.cfg | 14 | ||||
-rwxr-xr-x | setup.py | 50 | ||||
-rw-r--r-- | stwcs/__init__.py (renamed from lib/stwcs/__init__.py) | 1 | ||||
-rw-r--r-- | stwcs/distortion/__init__.py (renamed from lib/stwcs/distortion/__init__.py) | 0 | ||||
-rw-r--r-- | stwcs/distortion/coeff_converter.py (renamed from lib/stwcs/distortion/coeff_converter.py) | 0 | ||||
-rw-r--r-- | stwcs/distortion/models.py (renamed from lib/stwcs/distortion/models.py) | 0 | ||||
-rw-r--r-- | stwcs/distortion/mutil.py (renamed from lib/stwcs/distortion/mutil.py) | 0 | ||||
-rw-r--r-- | stwcs/distortion/utils.py (renamed from lib/stwcs/distortion/utils.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/__init__.py (renamed from lib/stwcs/gui/__init__.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/apply_headerlet.help (renamed from lib/stwcs/gui/apply_headerlet.help) | 0 | ||||
-rw-r--r-- | stwcs/gui/apply_headerlet.py (renamed from lib/stwcs/gui/apply_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/archive_headerlet.py (renamed from lib/stwcs/gui/archive_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/attach_headerlet.py (renamed from lib/stwcs/gui/attach_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/delete_headerlet.py (renamed from lib/stwcs/gui/delete_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/extract_headerlet.py (renamed from lib/stwcs/gui/extract_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/headerlet_summary.py (renamed from lib/stwcs/gui/headerlet_summary.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/apply_headerlet.cfg (renamed from lib/stwcs/gui/pars/apply_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/apply_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/apply_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/archive_headerlet.cfg (renamed from lib/stwcs/gui/pars/archive_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/archive_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/archive_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/attach_headerlet.cfg (renamed from lib/stwcs/gui/pars/attach_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/attach_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/attach_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/delete_headerlet.cfg (renamed from lib/stwcs/gui/pars/delete_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/delete_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/delete_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/extract_headerlet.cfg (renamed from lib/stwcs/gui/pars/extract_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/extract_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/extract_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/headerlet_summary.cfg (renamed from lib/stwcs/gui/pars/headerlet_summary.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/headerlet_summary.cfgspc (renamed from lib/stwcs/gui/pars/headerlet_summary.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/restore_headerlet.cfg (renamed from lib/stwcs/gui/pars/restore_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/restore_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/restore_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/updatewcs.cfg (renamed from lib/stwcs/gui/pars/updatewcs.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/updatewcs.cfgspc (renamed from lib/stwcs/gui/pars/updatewcs.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/write_headerlet.cfg (renamed from lib/stwcs/gui/pars/write_headerlet.cfg) | 0 | ||||
-rw-r--r-- | stwcs/gui/pars/write_headerlet.cfgspc (renamed from lib/stwcs/gui/pars/write_headerlet.cfgspc) | 0 | ||||
-rw-r--r-- | stwcs/gui/restore_headerlet.help (renamed from lib/stwcs/gui/restore_headerlet.help) | 0 | ||||
-rw-r--r-- | stwcs/gui/restore_headerlet.py (renamed from lib/stwcs/gui/restore_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/updatewcs.py (renamed from lib/stwcs/gui/updatewcs.py) | 0 | ||||
-rw-r--r-- | stwcs/gui/write_headerlet.py (renamed from lib/stwcs/gui/write_headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/tests/__init__.py | 0 | ||||
-rw-r--r-- | stwcs/tests/data/__init__.py | 0 | ||||
-rw-r--r-- | stwcs/tests/data/j94f05bgq_flt.fits | 1 | ||||
-rwxr-xr-x | stwcs/tests/data/new_wfc_d2i.fits | bin | 0 -> 43200 bytes | |||
-rw-r--r-- | stwcs/tests/data/postsm4_idc.fits | 60 | ||||
-rw-r--r-- | stwcs/tests/data/qbu16424j_npl.fits | 94 | ||||
-rw-r--r-- | stwcs/tests/data/simple.fits | 1 | ||||
-rw-r--r-- | stwcs/tests/test_altwcs.py | 170 | ||||
-rw-r--r-- | stwcs/tests/test_headerlet.py | 276 | ||||
-rw-r--r-- | stwcs/tests/test_updatewcs.py | 305 | ||||
-rw-r--r-- | stwcs/updatewcs/__init__.py (renamed from lib/stwcs/updatewcs/__init__.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/apply_corrections.py (renamed from lib/stwcs/updatewcs/apply_corrections.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/corrections.py (renamed from lib/stwcs/updatewcs/corrections.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/det2im.py (renamed from lib/stwcs/updatewcs/det2im.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/makewcs.py (renamed from lib/stwcs/updatewcs/makewcs.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/npol.py (renamed from lib/stwcs/updatewcs/npol.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/utils.py (renamed from lib/stwcs/updatewcs/utils.py) | 0 | ||||
-rw-r--r-- | stwcs/updatewcs/wfpc2_dgeo.py (renamed from lib/stwcs/updatewcs/wfpc2_dgeo.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/__init__.py (renamed from lib/stwcs/wcsutil/__init__.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/altwcs.py (renamed from lib/stwcs/wcsutil/altwcs.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/convertwcs.py (renamed from lib/stwcs/wcsutil/convertwcs.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/getinput.py (renamed from lib/stwcs/wcsutil/getinput.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/headerlet.py (renamed from lib/stwcs/wcsutil/headerlet.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/hstwcs.py (renamed from lib/stwcs/wcsutil/hstwcs.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/instruments.py (renamed from lib/stwcs/wcsutil/instruments.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/mappings.py (renamed from lib/stwcs/wcsutil/mappings.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/mosaic.py (renamed from lib/stwcs/wcsutil/mosaic.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/wcscorr.py (renamed from lib/stwcs/wcsutil/wcscorr.py) | 0 | ||||
-rw-r--r-- | stwcs/wcsutil/wcsdiff.py (renamed from lib/stwcs/wcsutil/wcsdiff.py) | 0 |
68 files changed, 1010 insertions, 14 deletions
diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..30b8711 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,52 @@ +language: c + +os: + - linux + - osx + +sudo: false + +env: + # CONDA_JWST_DEPENDENCIES is used because CONDA_DEPENDENCIES is not truly global. + global: + - MAIN_CMD='python setup.py' + - CONDA_CHANNELS='http://ssb.stsci.edu/conda-dev' + - CONDA_DEPENDENCIES='pytest jwst sphinx=1.3.5' + - CONDA_JWST_DEPENDENCIES='pytest stsci-jwst sphinx=1.3.5' + - PIP_DEPENDENCIES="" + - CRDS_SERVER_URL='https://jwst-crds.stsci.edu' + - CRDS_PATH='/tmp/crds_cache' + + matrix: + - PYTHON_VERSION=2.7 SETUP_CMD='install' + - PYTHON_VERSION=2.7 SETUP_CMD='test' + - PYTHON_VERSION=3.5 SETUP_CMD='install' + - PYTHON_VERSION=3.5 SETUP_CMD='test' + +matrix: + include: + # pep8 check (only once, i.e. "os: linux") + - os: linux + env: PYTHON_VERSION=3.5 MAIN_CMD='pep8 --count' + SETUP_CMD='jwst' TEST_CMD='pep8 --version' + CONDA_DEPENDENCIES=$CONDA_JWST_DEPENDENCIES + + # build sphinx documentation + - os: linux + env: PYTHON_VERSION=3.5 MAIN_CMD='docs/mkdocs.sh' + SETUP_CMD='' + CONDA_DEPENDENCIES=$CONDA_JWST_DEPENDENCIES + + allow_failures: + # pep8 will fail for numerous reasons. Ignore it. + - env: PYTHON_VERSION=3.5 MAIN_CMD='pep8 --count' + SETUP_CMD='jwst' TEST_CMD='pep8 --version' + CONDA_DEPENDENCIES=$CONDA_JWST_DEPENDENCIES + +install: + - git clone git://github.com/astropy/ci-helpers.git + - source ci-helpers/travis/setup_conda_$TRAVIS_OS_NAME.sh + +script: + - $MAIN_CMD $SETUP_CMD + @@ -1,3 +1,17 @@ +[metadata] +package_name = stwcs +description = Computes the WCS of HST images. +long_description = Recomputes and records the WCS of an HST imaging observation (including distortion) in the file. +author = STScI +author_email = help@stsci.edu +license = BSD +edit_on_github = False +github_project = spacetelescope/stwcs + +[pytest] +minversion = 2.2 +norecursedirs = build docs/_build relic + [bdist_wheel] # This flag says that the code is written to work on both Python 2 and Python # 3. If at all possible, it is good practice to do this. If you cannot, you @@ -2,10 +2,8 @@ import os import subprocess import sys -from glob import glob -from numpy import get_include as np_include -from setuptools import setup, find_packages, Extension - +from setuptools import setup, find_packages +from setuptools.command.test import test as TestCommand if os.path.exists('relic'): sys.path.insert(1, 'relic') @@ -25,14 +23,41 @@ else: version = relic.release.get_info() -relic.release.write_template(version, 'lib/stwcs') +relic.release.write_template(version, 'stwcs') + +try: + from distutils.config import ConfigParser +except ImportError: + from configparser import ConfigParser + +conf = ConfigParser() +conf.read(['setup.cfg']) + +# Get some config values +metadata = dict(conf.items('metadata')) +PACKAGENAME = metadata.get('package_name', 'stwcs') +DESCRIPTION = metadata.get('description', '') +AUTHOR = metadata.get('author', 'STScI') +AUTHOR_EMAIL = metadata.get('author_email', 'help@stsci.edu') + +class PyTest(TestCommand): + def finalize_options(self): + TestCommand.finalize_options(self) + self.test_args = ['stwcs/tests'] + self.test_suite = True + + def run_tests(self): + # import here, cause outside the eggs aren't loaded + import pytest + errno = pytest.main(self.test_args) + sys.exit(errno) setup( - name = 'stwcs', + name = PACKAGENAME, version = version.pep386, - author = 'Nadia Dencheva, Warren Hack', - author_email = 'help@stsci.edu', - description = 'Recomputes and records the WCS of an HST observation (includeing distortion) in the file.', + author = AUTHOR, + author_email = AUTHOR_EMAIL, + description = DESCRIPTION, url = 'https://github.com/spacetelescope/stwcs', classifiers = [ 'Intended Audience :: Science/Research', @@ -47,13 +72,12 @@ setup( 'numpy', 'stsci.tools', ], - package_dir = { - '': 'lib', - }, - packages = find_packages('lib'), + packages = find_packages(), + tests_require = ['pytest'], package_data = { 'stwcs/gui': ['*.help'], 'stwcs/gui/pars': ['*'], 'stwcs/gui/htmlhelp': ['*'], }, + cmdclass = {"test": PyTest} ) diff --git a/lib/stwcs/__init__.py b/stwcs/__init__.py index 9f12bce..cd8b0e6 100644 --- a/lib/stwcs/__init__.py +++ b/stwcs/__init__.py @@ -21,7 +21,6 @@ from . import distortion from stsci.tools import fileutil from stsci.tools import teal -__docformat__ = 'restructuredtext' from .version import * diff --git a/lib/stwcs/distortion/__init__.py b/stwcs/distortion/__init__.py index e69de29..e69de29 100644 --- a/lib/stwcs/distortion/__init__.py +++ b/stwcs/distortion/__init__.py diff --git a/lib/stwcs/distortion/coeff_converter.py b/stwcs/distortion/coeff_converter.py index 415b512..415b512 100644 --- a/lib/stwcs/distortion/coeff_converter.py +++ b/stwcs/distortion/coeff_converter.py diff --git a/lib/stwcs/distortion/models.py b/stwcs/distortion/models.py index 231a9f1..231a9f1 100644 --- a/lib/stwcs/distortion/models.py +++ b/stwcs/distortion/models.py diff --git a/lib/stwcs/distortion/mutil.py b/stwcs/distortion/mutil.py index ed6a1ea..ed6a1ea 100644 --- a/lib/stwcs/distortion/mutil.py +++ b/stwcs/distortion/mutil.py diff --git a/lib/stwcs/distortion/utils.py b/stwcs/distortion/utils.py index 4228f62..4228f62 100644 --- a/lib/stwcs/distortion/utils.py +++ b/stwcs/distortion/utils.py diff --git a/lib/stwcs/gui/__init__.py b/stwcs/gui/__init__.py index cd21bf6..cd21bf6 100644 --- a/lib/stwcs/gui/__init__.py +++ b/stwcs/gui/__init__.py diff --git a/lib/stwcs/gui/apply_headerlet.help b/stwcs/gui/apply_headerlet.help index f701b52..f701b52 100644 --- a/lib/stwcs/gui/apply_headerlet.help +++ b/stwcs/gui/apply_headerlet.help diff --git a/lib/stwcs/gui/apply_headerlet.py b/stwcs/gui/apply_headerlet.py index d517e9f..d517e9f 100644 --- a/lib/stwcs/gui/apply_headerlet.py +++ b/stwcs/gui/apply_headerlet.py diff --git a/lib/stwcs/gui/archive_headerlet.py b/stwcs/gui/archive_headerlet.py index 7ad3d4d..7ad3d4d 100644 --- a/lib/stwcs/gui/archive_headerlet.py +++ b/stwcs/gui/archive_headerlet.py diff --git a/lib/stwcs/gui/attach_headerlet.py b/stwcs/gui/attach_headerlet.py index 873c549..873c549 100644 --- a/lib/stwcs/gui/attach_headerlet.py +++ b/stwcs/gui/attach_headerlet.py diff --git a/lib/stwcs/gui/delete_headerlet.py b/stwcs/gui/delete_headerlet.py index b3df5a7..b3df5a7 100644 --- a/lib/stwcs/gui/delete_headerlet.py +++ b/stwcs/gui/delete_headerlet.py diff --git a/lib/stwcs/gui/extract_headerlet.py b/stwcs/gui/extract_headerlet.py index 02ecd7a..02ecd7a 100644 --- a/lib/stwcs/gui/extract_headerlet.py +++ b/stwcs/gui/extract_headerlet.py diff --git a/lib/stwcs/gui/headerlet_summary.py b/stwcs/gui/headerlet_summary.py index 82a3e0c..82a3e0c 100644 --- a/lib/stwcs/gui/headerlet_summary.py +++ b/stwcs/gui/headerlet_summary.py diff --git a/lib/stwcs/gui/pars/apply_headerlet.cfg b/stwcs/gui/pars/apply_headerlet.cfg index 06d6daf..06d6daf 100644 --- a/lib/stwcs/gui/pars/apply_headerlet.cfg +++ b/stwcs/gui/pars/apply_headerlet.cfg diff --git a/lib/stwcs/gui/pars/apply_headerlet.cfgspc b/stwcs/gui/pars/apply_headerlet.cfgspc index 648e562..648e562 100644 --- a/lib/stwcs/gui/pars/apply_headerlet.cfgspc +++ b/stwcs/gui/pars/apply_headerlet.cfgspc diff --git a/lib/stwcs/gui/pars/archive_headerlet.cfg b/stwcs/gui/pars/archive_headerlet.cfg index 97cd7ef..97cd7ef 100644 --- a/lib/stwcs/gui/pars/archive_headerlet.cfg +++ b/stwcs/gui/pars/archive_headerlet.cfg diff --git a/lib/stwcs/gui/pars/archive_headerlet.cfgspc b/stwcs/gui/pars/archive_headerlet.cfgspc index 03e67f0..03e67f0 100644 --- a/lib/stwcs/gui/pars/archive_headerlet.cfgspc +++ b/stwcs/gui/pars/archive_headerlet.cfgspc diff --git a/lib/stwcs/gui/pars/attach_headerlet.cfg b/stwcs/gui/pars/attach_headerlet.cfg index d131a70..d131a70 100644 --- a/lib/stwcs/gui/pars/attach_headerlet.cfg +++ b/stwcs/gui/pars/attach_headerlet.cfg diff --git a/lib/stwcs/gui/pars/attach_headerlet.cfgspc b/stwcs/gui/pars/attach_headerlet.cfgspc index bc91bca..bc91bca 100644 --- a/lib/stwcs/gui/pars/attach_headerlet.cfgspc +++ b/stwcs/gui/pars/attach_headerlet.cfgspc diff --git a/lib/stwcs/gui/pars/delete_headerlet.cfg b/stwcs/gui/pars/delete_headerlet.cfg index d156937..d156937 100644 --- a/lib/stwcs/gui/pars/delete_headerlet.cfg +++ b/stwcs/gui/pars/delete_headerlet.cfg diff --git a/lib/stwcs/gui/pars/delete_headerlet.cfgspc b/stwcs/gui/pars/delete_headerlet.cfgspc index 43790b1..43790b1 100644 --- a/lib/stwcs/gui/pars/delete_headerlet.cfgspc +++ b/stwcs/gui/pars/delete_headerlet.cfgspc diff --git a/lib/stwcs/gui/pars/extract_headerlet.cfg b/stwcs/gui/pars/extract_headerlet.cfg index 3dd0a7a..3dd0a7a 100644 --- a/lib/stwcs/gui/pars/extract_headerlet.cfg +++ b/stwcs/gui/pars/extract_headerlet.cfg diff --git a/lib/stwcs/gui/pars/extract_headerlet.cfgspc b/stwcs/gui/pars/extract_headerlet.cfgspc index b50d4bf..b50d4bf 100644 --- a/lib/stwcs/gui/pars/extract_headerlet.cfgspc +++ b/stwcs/gui/pars/extract_headerlet.cfgspc diff --git a/lib/stwcs/gui/pars/headerlet_summary.cfg b/stwcs/gui/pars/headerlet_summary.cfg index 7203552..7203552 100644 --- a/lib/stwcs/gui/pars/headerlet_summary.cfg +++ b/stwcs/gui/pars/headerlet_summary.cfg diff --git a/lib/stwcs/gui/pars/headerlet_summary.cfgspc b/stwcs/gui/pars/headerlet_summary.cfgspc index ce65930..ce65930 100644 --- a/lib/stwcs/gui/pars/headerlet_summary.cfgspc +++ b/stwcs/gui/pars/headerlet_summary.cfgspc diff --git a/lib/stwcs/gui/pars/restore_headerlet.cfg b/stwcs/gui/pars/restore_headerlet.cfg index b0ec427..b0ec427 100644 --- a/lib/stwcs/gui/pars/restore_headerlet.cfg +++ b/stwcs/gui/pars/restore_headerlet.cfg diff --git a/lib/stwcs/gui/pars/restore_headerlet.cfgspc b/stwcs/gui/pars/restore_headerlet.cfgspc index df47e3f..df47e3f 100644 --- a/lib/stwcs/gui/pars/restore_headerlet.cfgspc +++ b/stwcs/gui/pars/restore_headerlet.cfgspc diff --git a/lib/stwcs/gui/pars/updatewcs.cfg b/stwcs/gui/pars/updatewcs.cfg index 35360f2..35360f2 100644 --- a/lib/stwcs/gui/pars/updatewcs.cfg +++ b/stwcs/gui/pars/updatewcs.cfg diff --git a/lib/stwcs/gui/pars/updatewcs.cfgspc b/stwcs/gui/pars/updatewcs.cfgspc index a3a3fb5..a3a3fb5 100644 --- a/lib/stwcs/gui/pars/updatewcs.cfgspc +++ b/stwcs/gui/pars/updatewcs.cfgspc diff --git a/lib/stwcs/gui/pars/write_headerlet.cfg b/stwcs/gui/pars/write_headerlet.cfg index 9eb4592..9eb4592 100644 --- a/lib/stwcs/gui/pars/write_headerlet.cfg +++ b/stwcs/gui/pars/write_headerlet.cfg diff --git a/lib/stwcs/gui/pars/write_headerlet.cfgspc b/stwcs/gui/pars/write_headerlet.cfgspc index ba28b05..ba28b05 100644 --- a/lib/stwcs/gui/pars/write_headerlet.cfgspc +++ b/stwcs/gui/pars/write_headerlet.cfgspc diff --git a/lib/stwcs/gui/restore_headerlet.help b/stwcs/gui/restore_headerlet.help index fe07a15..fe07a15 100644 --- a/lib/stwcs/gui/restore_headerlet.help +++ b/stwcs/gui/restore_headerlet.help diff --git a/lib/stwcs/gui/restore_headerlet.py b/stwcs/gui/restore_headerlet.py index 7570d76..7570d76 100644 --- a/lib/stwcs/gui/restore_headerlet.py +++ b/stwcs/gui/restore_headerlet.py diff --git a/lib/stwcs/gui/updatewcs.py b/stwcs/gui/updatewcs.py index 3dacb67..3dacb67 100644 --- a/lib/stwcs/gui/updatewcs.py +++ b/stwcs/gui/updatewcs.py diff --git a/lib/stwcs/gui/write_headerlet.py b/stwcs/gui/write_headerlet.py index e18bed8..e18bed8 100644 --- a/lib/stwcs/gui/write_headerlet.py +++ b/stwcs/gui/write_headerlet.py diff --git a/stwcs/tests/__init__.py b/stwcs/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/stwcs/tests/__init__.py diff --git a/stwcs/tests/data/__init__.py b/stwcs/tests/data/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/stwcs/tests/data/__init__.py diff --git a/stwcs/tests/data/j94f05bgq_flt.fits b/stwcs/tests/data/j94f05bgq_flt.fits new file mode 100644 index 0000000..61261d6 --- /dev/null +++ b/stwcs/tests/data/j94f05bgq_flt.fits @@ -0,0 +1 @@ +SIMPLE = T / Fits standard BITPIX = 16 / Bits per pixel NAXIS = 0 / Number of axes EXTEND = T / File may contain extensions IRAF-TLM= '2010-07-22T17:49:08' / Time of last modification NEXTEND = 6 / Number of standard extensions DATE = '2007-02-08T21:38:46' / date this file was written (yyyy-mm-dd) FILENAME= 'j94f05bgq_flt.fits' / name of file FILETYPE= 'SCI ' / type of data found in data file TELESCOP= 'HST' / telescope used to acquire data INSTRUME= 'ACS ' / identifier for instrument used to acquire data EQUINOX = 2000.0 / equinox of celestial coord. system / DATA DESCRIPTION KEYWORDS ROOTNAME= 'j94f05bgq ' / rootname of the observation set / TARGET INFORMATION RA_TARG = 5.655000000000E+00 / right ascension of the target (deg) (J2000) DEC_TARG= -7.207055555556E+01 / declination of the target (deg) (J2000) / PROPOSAL INFORMATION / EXPOSURE INFORMATION REFFRAME= 'GSC1 ' / guide star catalog version DATE-OBS= '2005-03-07' / UT date of start of observation (yyyy-mm-dd) TIME-OBS= '06:51:26' / UT time of start of observation (hh:mm:ss) EXPSTART= 5.343628571938E+04 / exposure start time (Modified Julian Date) EXPEND = 5.343629036114E+04 / exposure end time (Modified Julian Date) EXPTIME = 400.000000 / exposure duration (seconds)--calculated / POINTING INFORMATION PA_V3 = 337.125305 / position angle of V3-axis of HST (deg) / TARGET OFFSETS (POSTARGS) POSTARG1= 0.000000 / POSTARG in axis 1 direction POSTARG2= 0.000000 / POSTARG in axis 2 direction / DIAGNOSTIC KEYWORDS / SCIENCE INSTRUMENT CONFIGURATION SUBARRAY= F / data from a subarray (T) or full frame (F) DETECTOR= 'WFC' / detector in use: WFC, HRC, or SBC FILTER1 = 'F606W ' / element selected from filter wheel 1 FILTER2 = 'CLEAR2L ' / element selected from filter wheel 2 / CALIBRATION SWITCHES: PERFORM, OMIT, COMPLETE / CALIBRATION REFERENCE FILES IDCTAB = 'postsm4_idc.fits' / image distortion correction table DGEOFILE= 'jref$qbu16424j_dxy.fits' / Distortion correction image / COSMIC RAY REJECTION ALGORITHM PARAMETERS / OTFR KEYWORDS / PATTERN KEYWORDS / POST FLASH PARAMETERS / ENGINEERING PARAMETERS / CALIBRATED ENGINEERING PARAMETERS / ASSOCIATION KEYWORDS TDDCORR = 'PERFORM ' NPOLFILE= 'qbu16424j_npl.fits' D2IMFILE= 'new_wfc_d2i.fits' END XTENSION= 'IMAGE ' / Image extension BITPIX = 16 / Bits per pixel NAXIS = 2 / Number of axes NAXIS1 = 4096 / Axis length NAXIS2 = 2048 / Axis length PCOUNT = 0 / No 'random' parameters GCOUNT = 1 / Only one group EXTNAME = 'SCI ' / Extension name EXTVER = 1 / Extension version DATE = '2007-02-08T21:38:47' / Date FITS file was generated IRAF-TLM= '13:38:23 (20/08/2008)' / Time of last modification INHERIT = T / inherit the primary header EXPNAME = 'j94f05bgq ' / exposure identifier BUNIT = 'ELECTRONS' / brightness units / WFC CCD CHIP IDENTIFICATION CCDCHIP = 2 / CCD chip (1 or 2) / World Coordinate System and Related Parameters WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = 2048.0 / x-coordinate of reference pixel CRPIX2 = 1024.0 / y-coordinate of reference pixel CRVAL1 = 5.63056810618 / first axis value at reference pixel CRVAL2 = -72.05457184279 / second axis value at reference pixel CTYPE1 = 'RA---TAN-SIP' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN-SIP' / the coordinate type for the second axis CD1_1 = 1.290562563339972E-05 / partial of first axis coordinate w.r.t. x CD1_2 = 5.953091234198029E-06 / partial of first axis coordinate w.r.t. y CD2_1 = 5.0220581265601E-06 / partial of second axis coordinate w.r.t. x CD2_2 = -1.26447741482017E-05 / partial of second axis coordinate w.r.t. y LTV1 = 0.0000000E+00 / offset in X to subsection start LTV2 = 0.0000000E+00 / offset in Y to subsection start LTM1_1 = 1.0 / reciprocal of sampling rate in X LTM2_2 = 1.0 / reciprocal of sampling rate in Y RA_APER = 5.655000000000E+00 / RA of aperture reference position PA_APER = 154.533 / Position Angle of reference aperture center (deVAFACTOR= 1.000018683511E+00 / velocity aberration plate scale factor / READOUT DEFINITION PARAMETERS SIZAXIS1= 4096 / subarray axis1 size in unbinned detector pixelsSIZAXIS2= 2048 / subarray axis2 size in unbinned detector pixelsBINAXIS1= 1 / axis1 data bin size in unbinned detector pixelsBINAXIS2= 1 / axis2 data bin size in unbinned detector pixels / PHOTOMETRY KEYWORDS / REPEATED EXPOSURES INFO NCOMBINE= 1 / number of image sets combined during CR rejecti / DATA PACKET INFORMATION / ON-BOARD COMPRESSION INFORMATION WFCMPRSD= F / was WFC data compressed? (T/F) / IMAGE STATISTICS AND DATA QUALITY FLAGS NGOODPIX= 7822781 / number of good pixels OORIENTA= 154.7886863186197 / position angle of image y axis (deg. e of n) WCSCDATE= '21:39:44 (08/02/2007)' / Time WCS keywords were copied. TDDALPHA= 0.1195051334702275 TDDBETA = -0.03716837782340918 END diff --git a/stwcs/tests/data/new_wfc_d2i.fits b/stwcs/tests/data/new_wfc_d2i.fits Binary files differnew file mode 100755 index 0000000..f72e20e --- /dev/null +++ b/stwcs/tests/data/new_wfc_d2i.fits diff --git a/stwcs/tests/data/postsm4_idc.fits b/stwcs/tests/data/postsm4_idc.fits new file mode 100644 index 0000000..a03c08a --- /dev/null +++ b/stwcs/tests/data/postsm4_idc.fits @@ -0,0 +1,60 @@ +SIMPLE = T / Fits standard BITPIX = 16 / Bits per pixel NAXIS = 0 / Number of axes EXTEND = T / File may contain extensions ORIGIN = 'NOAO-IRAF FITS Image Kernel July 2003' / FITS file originator DATE = '2006-11-30T15:04:40' IRAF-TLM= '2010-05-21T13:29:07' COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H FILENAME= 'postsm4_idc.fits' / name of file NEXTEND = 1 / number of extensions in file USEAFTER= 'Jan 1 2009' PEDIGREE= 'INFLIGHT 01/06/2002 01/05/2006' INSTRUME= 'ACS ' NORDER = 4 FILETYPE= 'DISTORTION COEFFICIENTS' DETECTOR= 'WFC ' COMMENT = 'File created by C. Cox' DESCRIP = 'Supports all filter combinations' HISTORY File created June 9th by Colin Cox HISTORY Expanded version (using texpand) of previous file to HISTORY cover all possible filter combinations. HISTORY Duplicate rows removed plus a few rows that referred HISTORY to HRC-only filters and erroneously included in HISTORY previous tables. HISTORY trim_wfcallmodes_idc.fits renamed to q692007cj_idc.fits on Jun 9 2006 HISTORY Incorporate May 2006 distortion solution HISTORY File created by Colin Cox, Nov 30 2006 HISTORY Latest expansion includes all combinations HISTORY including the previously removed HRC-only ones. HISTORY Probably includes some duplicates but these HISTORY do not cause a problem HISTORY nov30_idc.fits renamed to qbu1641sj_idc.fits on Nov 30 2006 TDD_A0 = 0.095 TDD_A1 = 0.0360 TDD_B0 = -0.029 TDD_B1 = -0.012 TDD_D0 = 0. TDD_DATE= 2006.798432109 TDDORDER= 1 END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 166 / width of table in bytes NAXIS2 = 736 PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 39 TTYPE1 = 'DETCHIP ' / label for field 1 TFORM1 = '1I ' / data format of field: 2-byte INTEGER TUNIT1 = 'chip ' / physical unit of field TTYPE2 = 'DIRECTION' / label for field 2 TFORM2 = '8A ' / data format of field: ASCII Character TTYPE3 = 'FILTER1 ' / label for field 3 TFORM3 = '8A ' / data format of field: ASCII Character TTYPE4 = 'FILTER2 ' / label for field 4 TFORM4 = '8A ' / data format of field: ASCII Character TTYPE5 = 'XSIZE ' / label for field 5 TFORM5 = '1J ' / data format of field: 4-byte INTEGER TTYPE6 = 'YSIZE ' / label for field 6 TFORM6 = '1J ' / data format of field: 4-byte INTEGER TTYPE7 = 'XREF ' / label for field 7 TFORM7 = '1E ' / data format of field: 4-byte REAL TTYPE8 = 'YREF ' / label for field 8 TFORM8 = '1E ' / data format of field: 4-byte REAL TTYPE9 = 'V2REF ' / label for field 9 TFORM9 = '1E ' / data format of field: 4-byte REAL TTYPE10 = 'V3REF ' / label for field 10 TFORM10 = '1E ' / data format of field: 4-byte REAL TTYPE11 = 'SCALE ' / label for field 11 TFORM11 = '1E ' / data format of field: 4-byte REAL TUNIT11 = 'arcsec ' / physical unit of field TTYPE12 = 'CX10 ' / label for field 12 TFORM12 = '1E ' / data format of field: 4-byte REAL TTYPE13 = 'CX11 ' / label for field 13 TFORM13 = '1E ' / data format of field: 4-byte REAL TTYPE14 = 'CX20 ' / label for field 14 TFORM14 = '1E ' / data format of field: 4-byte REAL TTYPE15 = 'CX21 ' / label for field 15 TFORM15 = '1E ' / data format of field: 4-byte REAL TTYPE16 = 'CX22 ' / label for field 16 TFORM16 = '1E ' / data format of field: 4-byte REAL TTYPE17 = 'CX30 ' / label for field 17 TFORM17 = '1E ' / data format of field: 4-byte REAL TTYPE18 = 'CX31 ' / label for field 18 TFORM18 = '1E ' / data format of field: 4-byte REAL TTYPE19 = 'CX32 ' / label for field 19 TFORM19 = '1E ' / data format of field: 4-byte REAL TTYPE20 = 'CX33 ' / label for field 20 TFORM20 = '1E ' / data format of field: 4-byte REAL TTYPE21 = 'CX40 ' / label for field 21 TFORM21 = '1E ' / data format of field: 4-byte REAL TTYPE22 = 'CX41 ' / label for field 22 TFORM22 = '1E ' / data format of field: 4-byte REAL TTYPE23 = 'CX42 ' / label for field 23 TFORM23 = '1E ' / data format of field: 4-byte REAL TTYPE24 = 'CX43 ' / label for field 24 TFORM24 = '1E ' / data format of field: 4-byte REAL TTYPE25 = 'CX44 ' / label for field 25 TFORM25 = '1E ' / data format of field: 4-byte REAL TTYPE26 = 'CY10 ' / label for field 26 TFORM26 = '1E ' / data format of field: 4-byte REAL TTYPE27 = 'CY11 ' / label for field 27 TFORM27 = '1E ' / data format of field: 4-byte REAL TTYPE28 = 'CY20 ' / label for field 28 TFORM28 = '1E ' / data format of field: 4-byte REAL TTYPE29 = 'CY21 ' / label for field 29 TFORM29 = '1E ' / data format of field: 4-byte REAL TTYPE30 = 'CY22 ' / label for field 30 TFORM30 = '1E ' / data format of field: 4-byte REAL TTYPE31 = 'CY30 ' / label for field 31 TFORM31 = '1E ' / data format of field: 4-byte REAL TTYPE32 = 'CY31 ' / label for field 32 TFORM32 = '1E ' / data format of field: 4-byte REAL TTYPE33 = 'CY32 ' / label for field 33 TFORM33 = '1E ' / data format of field: 4-byte REAL TTYPE34 = 'CY33 ' / label for field 34 TFORM34 = '1E ' / data format of field: 4-byte REAL TTYPE35 = 'CY40 ' / label for field 35 TFORM35 = '1E ' / data format of field: 4-byte REAL TTYPE36 = 'CY41 ' / label for field 36 TFORM36 = '1E ' / data format of field: 4-byte REAL TTYPE37 = 'CY42 ' / label for field 37 TFORM37 = '1E ' / data format of field: 4-byte REAL TTYPE38 = 'CY43 ' / label for field 38 TFORM38 = '1E ' / data format of field: 4-byte REAL TTYPE39 = 'CY44 ' / label for field 39 TFORM39 = '1E ' / data format of field: 4-byte REAL TDISP1 = 'I4 ' / display format TNULL1 = -32767 / undefined value for column TDISP2 = 'A8 ' / display format TDISP3 = 'A8 ' / display format TDISP4 = 'A8 ' / display format TDISP5 = 'I8 ' / display format TNULL5 = -2147483647 / undefined value for column TDISP6 = 'I8 ' / display format TNULL6 = -2147483647 / undefined value for column TDISP7 = 'F10.2 ' / display format TDISP8 = 'F10.2 ' / display format TDISP9 = 'F12.6 ' / display format TDISP10 = 'F12.6 ' / display format TDISP11 = 'F12.4 ' / display format TDISP12 = 'E20.7 ' / display format TDISP13 = 'E20.7 ' / display format TDISP14 = 'E20.7 ' / display format TDISP15 = 'E20.7 ' / display format TDISP16 = 'E20.7 ' / display format TDISP17 = 'E20.7 ' / display format TDISP18 = 'E20.7 ' / display format TDISP19 = 'E20.7 ' / display format TDISP20 = 'E20.7 ' / display format TDISP21 = 'E20.7 ' / display format TDISP22 = 'E20.7 ' / display format TDISP23 = 'E20.7 ' / display format TDISP24 = 'E20.7 ' / display format TDISP25 = 'E20.7 ' / display format TDISP26 = 'E20.7 ' / display format TDISP27 = 'E20.7 ' / display format TDISP28 = 'E20.7 ' / display format TDISP29 = 'E20.7 ' / display format TDISP30 = 'E20.7 ' / display format TDISP31 = 'E20.7 ' / display format TDISP32 = 'E20.7 ' / display format TDISP33 = 'E20.7 ' / display format TDISP34 = 'E20.7 ' / display format TDISP35 = 'E20.7 ' / display format TDISP36 = 'E20.7 ' / display format TDISP37 = 'E20.7 ' / display format TDISP38 = 'E20.7 ' / display format TDISP39 = 'E20.7 ' / display format EXTNAME = 'IDCall.fits' / name of this binary table extension HISTORY Created Tue 14:31:35 28-Nov-2006 END +ƒ¥ +AѦYŒ +¬=Ë•¾Ë‚,wƒ%¨i{&–8ù§´Ï¦ûùU¦Sv +´üúA4ž¦%´Îª§¸¡¬,âZ¼¢d,tú›¨ÀÆ&Üô §©ðä¦ïQr¦K›½ +ç°Å¥8Ô2¦;{ +4ž‚ˆ´.›ªE—¬@OÁÁ:*,€v¨ +&Õƒ§¸&¬¦ß?¦V/à +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +C—÷m=LÌÍ;ö=Ihå4öT´‚l5 +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +?'‰Ê%ê«p&®ºÆ½M–ºØ+¦4¿÷é´Â
ÿ3ÈÍö-«3u+»Zú-ã>“¬þå`'†y¯&ãÌ'ùÄ%Sã+&f,• +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ +:øcTµDv4„ê¹´åè–Ýøe®ãCª…p}¨À'D…ý§Í·§1R¦—]™ diff --git a/stwcs/tests/data/qbu16424j_npl.fits b/stwcs/tests/data/qbu16424j_npl.fits new file mode 100644 index 0000000..6084bd3 --- /dev/null +++ b/stwcs/tests/data/qbu16424j_npl.fits @@ -0,0 +1,94 @@ +SIMPLE = T / Fits standard BITPIX = 16 / Bits per pixel NAXIS = 0 / Number of axes EXTEND = T / File may contain extensions ORIGIN = 'NOAO-IRAF FITS Image Kernel July 2003' / FITS file originator OBJECT = 'ACS F606W DGEOFILE' / Name of the object observed IRAF-TLM= '16:42:08 (30/11/2006)' NEXTEND = 4 / Number of standard extensions DATE = '2010-04-02T20:32:40' FILENAME= 'qbu16424j_npl.fits' / name of file FILETYPE= 'DXY GRID' / type of data found in data file TELESCOP= 'HST' / telescope used to acquire data INSTRUME= 'ACS ' / identifier for instrument used to acquire data EQUINOX = 2000.0 / equinox of celestial coord. system DETECTOR= 'WFC' / detector in use: WFC, HRC, or SBC FILTER1 = 'F606W ' / element selected from filter wheel 1 FILTER2 = 'CLEAR2L ' / element selected from filter wheel 2 HISTORY File generated from DGEOFILE: jref$qbu16424j_dxy.fits HISTORY wfc_f606w_dxy.fits renamed to o7f1140rj_dxy.fits on Jul 15 2004 HISTORY o7f1140rj_dxy.fits renamed to o8u22156j_dxy.fits on Aug 30 2004 COMMENT Accuracy to 0.01 pixels when dxy corrections included HISTORY wfc_f606w_dxy.fits renamed to qbu16424j_dxy.fits on Nov 30 2006 HISTORY Improved solution as reported in 2005 Cal Workshop HISTORY Average of 64x64 blocks from full DXY image jref$qbu16424j_dxy.fits END XTENSION= 'IMAGE ' / Image extension BITPIX = -32 / Bits per pixel NAXIS = 2 / Number of axes NAXIS1 = 65 / Axis length NAXIS2 = 33 / Axis length PCOUNT = 0 / No 'random' parameters GCOUNT = 1 / Only one group EXTNAME = 'DX ' / Extension name EXTVER = 1 / Extension version ORIGIN = 'NOAO-IRAF FITS Image Kernel July 2003' / FITS file originator INHERIT = F / Inherits global header DATE = '2004-04-28T16:44:21' IRAF-TLM= '16:42:08 (30/11/2006)' WCSDIM = 2 LTM1_1 = 1. LTM2_2 = 1. WAT0_001= 'system=physical' WAT1_001= 'wtype=linear' WAT2_001= 'wtype=linear' CCDCHIP = 2 / CCDCHIP from full size dgeo file LTV1 = 0 LTV2 = 0 ONAXIS1 = 4096 / NAXIS1 of full size dgeo file ONAXIS2 = 2048 / NAXIS2 of full size dgeo file CDELT1 = 64 / Coordinate increment along axis CDELT2 = 64 / Coordinate increment along axis END ¼ñ½¹¼‡QT»Èþ{<Hù’<ÜVd=N¿=&®=3)=ð÷<úî‰<´D<PCÓ;~ ºv•t»9•Ö»d~¼1õ0¼jä–¼‚B¼¥ÇŸ¼°'B¼˜ëJ¼@ À¼í¼.ª¥»Ò© +;Ãó¨;ñHd<@Ÿš<ZIo<Sµº<a3;£ÉÁ;Gq;äåþ<?<«J<ÍNR<¡àÖ<…AŸ<s+a<J Ö<1=Î<ë;&Ã=»¢°¼-O†¼“¼§âp¼ kÏ¼Š¢+¼•‚L¼¢y¼o&¼@»íe»–é¼*þ¼@_5¼6øø¼Aéù¼o¹¼ŽåÔ¼Èò#¼Ac:’tí<xLv<ж== +¼‘q¼«×p¼¶ìí¼È§3¼ÂK^¼±†ª¼o(ˆ¼;Ûk¼Fû0»½
*;j¿;¸7©;ÿv<'>l<pÜh<…±8<н<mÇ<EE_<,«H<G¢<‰U<´Ü¾<Ç´<³<—dç<šË[<|C<sÕ5<I"c;Ú´.ºd8°»Ô¶û¼zp¼C%¼œð5¼…ò¼—Q¼‘‡/¼|쀼rN»à‡àºó-(»;¡»~±ƒ»O¦ºÕ1R»¦¼É2¼°¸Ê¼à;«wº<’´:<Ѻ™<Ùµp<º#!<m®Ü<É;+”a»…ð<¼,(h¼Š-¼¦Bí¼±~¼º¥w¼Ôk¼íÍ¥¼ï?H¼ðvù¼à„¼Æ*м’7¼_ì¼HU©»Ÿ¦ö;cú‘;þT<"<N|<“¡È<¡)”<¦í<ª0<žù<Š…˜<&b<³øo<Ç¿9<Ñ×Ë<¶
<±·ß<<˜ï›<ŒRh<}¿ß<!h;.Ÿ»/ç¼eh¼¡®l¼¨0¦¼ªG¼CV¼,E¼zC¼Üä»Ñ,î:å§Ü;{XV;Iyr;¤ + ¼8ô¼YõF¼n°V¼¸>¹¼îó•¼þ½/5½]н"U3½$Øê½{`½'%½ +ð;ýo"<Gå|<ˆ›<½Ð…<ê†ù<ýú?<ðzí<ÓȨ<Ð>ñ<Õ<Ù'–<ÔÓÜ<Øl½<ÄYÝ<®~×<±ÏÕ<µ-Œ<€GÂ<ÉÙ;·<»IWD»ùͼ9»Ï¼fU¼r¾ˆ¼] ¼{½¼–Ǫ¼ ¯þ¼A*J»‡ G;zœ< +E¼Ø9¼£A¼Œä«¼@#¿»ËxL:¡î¬<¡f<DaÚ<}6•<£Gè<àp=Î<ýÏ<àüB<Üc <ñ:^<ôú—<øzÃ<ó.<Ïhž<¢ôÏ<®Ô¹<±ÝU<xž^;¼Td:ŒÑ¢»•$ˆ»êú¼0þÓ¼/cA¼k¼vú‡¼ 唼±¼ª +Ù¼o]N»Ü&:C4;}<_ͺ<¤3j<¸`<Ü0ô=r;Ò™k<TÖ<#V<¿u·<×;A<à<°XC<p»†Þ/¼Y‚x¼²+ܽ´½²w½"°>½ +O½#¢½8õ½6Q»½#Nê½%R½ù•¼ä⼘†Ž¼‰ÊD¼Hšó»{Íë;Ðíè< «<9ÌY<‡ú~<œ†g<ØÎ¹<üM=€×<ñ_n<åŒ=…=^Î=Ð=~A<×ã<€ê<¶· +<.¿å<•®<»Jb<é‚è=º<Ù¾<„«Ë<®¶%<ÙÞ<ÍM<¹ú€<•ݼ<:¡6ù¼
ŽÙ¼¡a°¼óÃ}½„%½&Àˆ½ø½X„½";·½/}½/vb½(Z½ eª¼úw›¼¶ o¼ˆÖ¼V1b»w¼×;°Ïv<ÑJ<9Æè<oÿa<«-í<Ö <ñ9ê<ó†M<Þ‘u<â7= =OÒ<ûö<ÿc<ÚdÞ<Í"¹<Ðé½<Àî<\šT<膺.>X¼5꼎þ?¼›èǼ²a›¼Èú”¼Ö…¼ÛB²¼Âm뼩3Z¼Jcü»Ò#ü»±¦›»`îò;Ϙ¼<yÕ(<´M!<ó›L=ä<Uíá<©z*<ϨK<Ö'<Æ[«<½¿ê<–°</Z;yAt»¤_ô¼rš>¼Ùê½5@½z¬½µS½»½äÉ½àÆ½hî½ ¾÷½ƒ©¼ûN¼¿‹¼Šq5¼J$×»¿®:9ëö@;þ:"<8•–<^7r<¡g<¼!7<µì»<°{<» +’<żÚ<ØÈ\<úä%<îgá<ðô¿<Ûdï<Å$d<À”U<³ã<M2;Äm:ºÑ¾Ø¼2°¼•ôq¼Âô¼á>¼ï€K¼ôÙò¼ñ‹N¼èD;¼Öµ¿¼‘ÿö¼!uw¼ +żѣ³¼È3·¼Î>„¼Ô‰,¼Û©‚¼Óéþ¼ó¸g½ õR½B +¼Ö¡<¼²”¼•L¼Œ»‰ò>9‚a +¼†Æ!¼„Iò¼Š©ç¼©n”¼¨}³¼°¼¼è‚J¼ð·¼ÊxS¼¥O•¼†Áu¼ã»fÛ;;CŸ<<n°·<šSÑ<¤øÃ<ž5<ˆT¹<ˆÀ‘<ŠaÉ<¤T1<½+Ó<ÆÚ<ÇM<Èã<¸ÜÚ<©¶<›3<¿(<Nè”;æ–9û¬4¼!¼¥ð¼â«I½–½Tó½%#½')û½,›B½I¼ù,ß¼•‹¼¤ÖºÓ%d;ÞE<iŸ„<º)Û=œæ=1ìÍ»‚Hé;¬<[Ÿ<¯ê<ò=x= +£Áº0 +P;Ñ™à<: <np`<‘¨@<’ÒF<I Z<©–<,i[<JǶ<YÀ<eò<d¤<t@¯<Š_˜<‘.<rJ·<$<˜;« +m~:0ôÖ»ð¬à¼-*}¼¼ +d +9[³»zk»©Í¼È*¼Œš¼Ë¢}¼áoÖ¼í»N¼éiÙ¼ÛL?¼Äd‚¼Òâ|¼éÉ£¼íê¼ÂÁ¯¼z³â9-Æ€<¯@<Éu^=6Ö=sŸ=+ŽÊ¼Ë +;ˆíF;w¢ºåcA»{¸º%3é»^»—–ºãCì;2y=;á!;_x|;õ¦ê<[F<YÝ5<HT]<Dwi<MyB<3ë3<ûü<fñ;ÇÞV;â„;ñ!Ð<)¶~<í;þk +<,-< Þ;\ÅØ:(ÀÜ;}l <ói;Öh^9Âåл¹nª¼M䜼ž¡ +»€’; +‚^;ªöª<XV<¦ä<êç<4N<eÑ<‚k~<dù<CØö<"»6<0iÒ<`[˜<‡é©<_Ò<
P;¼ˆ;ŸÉ¡;Ǫà<À9<Ïž;¡Æ»tç¼NÉh¼"¼´ú$¼¹zû¼ÓŸ&¼Ìž¼£±Î¼0œ@»cÝ;‹h<‘p;и°;¾/À<:Û<häÖ<•sä<VH<}½Ÿ½]íY½?ª!½O°¼…üš».Ú¼;õßâ<K¯|<C]y<f”0<˜aÐ<£‰·<”˜Ø<ƒª3<€ <ƒi<D;š5»5¼d¼€º¼Mÿé¼P’¼7¿»ãp8:VO;wü;ÏØ;¶u;™æ;Û<<¶ö<I<öÄ< ><zú<ëZ<rªÊ< æ<ˆ,Y<1¦§<!ð<¯ü<<ª;îPr<V;Qì¡»Y¼B…¼ˆws¼ì¼¸ï¼»Îe¼³Ò¼š$¼T`:Fá<b<\šì<qp2<JîB<9b<NA&<eÎ<Ù;GßÒ½}›Ñ½Wüý½82º½Ä¤¼Z +:/Š€<ER,<z=ª<‰Ð<›Ý’<ºB€<Æ£<¸*®<—Ü<ŒãŠ<~òT<[z;ä‹»ãb¼/Øx¼O® +¼R®:¼™¼ +ŸI»70:Uh9T°»+?±»“±ˆ»eÍ:´lÖ;Sœx;EÝØ;9<6;ÖO“<&ûò<’ß<ŸÙÅ<—¥<Î<^á <.Œ;à•É;ÇB<mº;•F»S¥U¼Ð¼6~ ¼p“i¼›\{¼p˼ŒÎD¼th¼ +¢Í;ª<a!‚<‰)&<ƒåÌ<Tíê<FÄÌ< & <Ö ; »™ÇN½g4w½?»û½€1¼ÎR»¶4 <]ç<”º><¯¨<¼¥1<¸´Ø<ɧž<Öwy<Ñ·ø<‹<âˆ<Wø<$¸ú¹ûˆ¼$¼7¦`¼'ô¼<þü¼8K¸¼(² +K<{èY< +~;æ¡å;ØÀŠ;°7Vºš»~z»£Ž¼(‹¼iqt¼ª»½ªº‡Õ;Ý”t<€ƒÒ<›ºc<š‹<ƒ.é;¾ñ<8„Œ »!Aë¼w?¼ä^o½AUŸ½Ø.¼–6B»`~<16š<·ÇÐ=`™=Õ=¾Û=5þ=Ô”=4Æ=œ[<ú˜=<Ésr<‹íè<çaºÉÏĻℼ2/¼>è ¼v¼¡°³¼ÄºÚ¼úgƽr"½È½¾U¼ëŽ:¼ÁN¯Z¼WÉë¼=p¼UÊ€¼/E»Õ]Ã;fË+<^P¤<»H¦<ù”F= <þ`<½ºÃ<m©Ð<" ç<+u©<9ø;N®¹³¦ºw=ˆ»Ë²‘¼œ"»‡„º!2æ;‰§(<V7<žu<«wW<³kå<†‡C;´o}»º»û¼1_ݼÅsÿ½b½8ʼâR¼@m;ËîÕ<©×<ûl= !ÿ=0¾Â=1ù#=5ªà=+Î += þ=˜Ô=ßÄ<ιl<eÊÝ;Óퟹó¾Í»že¼Ñj¼-Ê¢¼‹Ù»¼¼¬{½r^½*çî½BX½P×ê½;˜½L¼Ù†%¼°i<¼¡ä¿¼ž¨ß¼Ìb¼Òö5¼ªwë¼2‰?;HŽ<ƒ]= +b"<ã“Ý<£™r<k€Ë<c‰<?“_; ¨D;©s%;¶Çh:«,*»(v:=5P;^³<äk<•*Û<ÂŽ<¨A<‘Ã^<~šÈ;€x€¼T¼‡ûL½è ½FAÔ½6½Ç¼ÄÄF»¥`÷<X7"<õŽ=Vì=/£±=A/=O#Ù=K²$=:pÝ='0 +=Æv=63<ÀÅ<M ;¿‚:UÙQ»"ÖŠ»ªjݼh¼£ŽR¼ô¼ ½(jȽc‘½1{½{û_½U6:½#Ɉ¼õ3G¼Ãem¼Í÷9¼ó´¤½Øv½)äó½"ƒ¼ãZ ¼#H<1’Z<ô^Ê=
=Á=Ó1<ÍÀ<—*<’åÉ<>®<B@®<W*R<nd^<*Ï;Ù%<B8<1„"<TÔÓ<µ“<Ãy“<£Z8<nà"<.SÞ9R P¼9´œ¼ L‹½E”½gd½TÆ—¼÷,·¼#?m<L‚<ðöê=,y='*i=61=IR—=O=F!=+¯Z=#§~= µ~<Óü”<‰£<¸·º7ź’Xû»!¼Sx%¼ß¢Ð½>(½[=c½”¾½£W½•çs½m +†<ÅQ<¶'=<²is<²ôè<Æ]–<òšf<ò‡9<¼Çq<”~;<LÌpºÇm¶¼ˆ§E¼è½½Iª«½‰ÁQ½hóm½¦ˆ¼jÜî<8wL<èÖ]==%(=DÀ±=\ü=c\t=[8ë=E#˜=9€É=#±= +û= †=ž=à=‚?<öU<øGˆ=®ù=îH=‘¥<ÑÈ&<“ÆZ< ìÌ»¿bº¼Èùz½´c½jmñ½›Ô½€±½%h%¼´X<¶<à=È=&Ù¹=OLo=p d=omf=gúÇ=R =Jæ =9¿/=<ÒŸê<x‚ï;Ž:8êл’l¼\QļíD@½?^j½†j˜½®ÿt½¿½«J½‚F]½8
½34¼ÛϹ¼ú-7½!½r½_*>½‚^˽Œ>m½g-½©šºûƒA<ô!=G?"=\E=NÄ:=Fªl=?6Ö=L§=>·ý=/„¹=.Ê=94|=5aÎ=&÷="=b=E='E=;Š=%*<éú‚<—3<;Ù_a¼^1½E½:—0½„(`½©7K +¹.;§ë¸ËÞFº®0`ºÔT»˜Ä6¼¬¼…¼1ͼ&õ/¼USì¼^ż‰H²¼–1¼¥gÚ¼»¼®b¼š
¼Œ«¼kS®¼)³I»Ð®É:Ëw:æŽk;¼öë<a˜<¢Ñ<Sþ<o ¸<676<
Rø;Œû:Ë~é¹ò»™I\¼@mϼ‡êÕ¼œkn=º<Æ5½<k]ºÔåc¼]¢¼L¯–¼IEJ¼¦/»– ;Å;¨ÆÕ<.r<”¯Z<¹Wo<§Ž<Ÿ*<ÀÊX<ÑÖ\<ÓI<ÅV<¶É)<°˜Y<»åÞ<ÎN•<Ê‘Y<Y<oÑ•<7ˆ<B;;¶è;‡ðµ:^É»‹Ñ„¼'=ä¼e˜ú¼u¸Ã¼fzr¼‹i¿¼¢¢¬¼šü×¼Ü]¼§‡¼µ’â¼£7>¼}ºh¼cmM¼I¨I¼
绢$2»T}õ»NÅ:»¸ì<&›'<ƒü×<j‘<<º*</¯†<2‘5;îü:ýZ»Èùý¼Rºõ¼–¨ì¼Ñ„>¼úÀ=IÒ<·ª;íaö»j¿¼#;¼EÞļL(ؼÂâ»M·ï;ƒ·d<Ÿ +<‰S <J÷½<$º;¿D;&O®ºX†Ü»¦lt¼D°]¼‚O'¼¢©~¼¤ +Á¼´Ž£¼Ä\¼¼û²¼¢º{¼ Èμ/ì¼}¤!¼7 h¼€»êó»·ás»œº%ɹºŽ1Æ;+Ëî<UQ<ƒ–À<f<D“<d¹¬<ˆ÷Ú<.ˆ9㚉¼àe¼„q‘¼Ãóœ¼ú¨½Ìu<ô¨M<€Ÿ—;»ócª¼[óE¼ht¾¼{,ú¼Fì¿»³Ž;†S<§t<'V<©®Ô<²Hµ<¢/)<¤Ê[<©ö¦<¾+¶<éå<=Iý=
|ƒ<õ®<ØpÈ<äf¦<Ù2A<£|<\òÛ<(e:;ç.[:V6»ŽÚ»ü +¬<?Š<úÙ<?BË<ƒ-<ˆ=n<'ó<©<›ûÁ<|W2<nWþ<uœ”<j¥<,Ú¦;œ5}ºÖ•»0àлaJ-»GÆ~»fB„»È{¼úš¼B¼’a3¼Âar¼Ù“¼¼Ó6ë¼ÚzO¼ûeܼùWʼ¿µš¼–Bå¼fÃÆ»à¾B:º‚œ< +Ÿ>»aôV¼„¿˜¼ó"´½+É<®½;¦ý¼5I¼•±‚¼ÉÕϽ®.½ +Ãýة½
o½ +½Ö-½&AÙ½6Ž +¯}< +ðP;Î}ö;Þg;¸i<ƒœ<Q.J<zÇ<dpý;ø7^;ÿ1ºA‰9ò!e;JXD;ºI;«ž;jк‹¼ +¾;¼ØØ;Û\¯;üNP;ÙE·;gf:£W»Á¡»Uô»µ‡ù»Å%r¼^ì¼Dļ{*¼Œ•¼“éÒ¼©©¼¥f¼‘Š„¼mŸÌ¼FøZ¼iC»FU:°e:<Eð<–<Ò@|<þÙ<=X*=-MÎ=/Å=57=YF<æ¿ +<¡›V< öX»®9μ“Yö¼ÿÄ‹½86O<)ïº4ž¼é¼L–-¼ ©„¼Ò-Û¼ñ2¼éϨ¼ì8мÖÀœ¼Çžý¼¾ü|¼´dx¼‡y¼$ï<»ÓI»EnY9‡|;jÃ;Ä1Ê;뜃;ñb•< +–ã<¢<B1;[£;$ v;ØÝ_<Kº<Ø;Ù·:ËP»“^2»û‡F¼ +l»Ë:Ú;×J~<<#³<…Ü1<§_<¼Ÿl<ºïß<À3•<µ?d<¥”™<ŽJ-<’(ß<=¥À:¸æ»ú + •¼\Äd¼Žý;¼§L¼Çè¼ê¯ ½ +Ûª½¿m½M +½50½í¼é0Ó¼ËR¼´^¼®ã¼±Ñ ¼u,¼$JË»©EÒº§µ[;Ø&¬<}]<–ô<µÙ‰<͸O<Ô0ª<¸ÙÓ<—^0<P“œ;³n,:J¦»‘~Ǽ$/Ù¼–Ÿ)¼¸O¼ª’ý=ëÐ=¡=K=¸¦<Å <tj-<#
’º;\½¼ £#¼‚k¼“áY¼³c̼©œó¼kDR¼K +~»Ë“ºª=Ô;P+";ß¶;ØøA;¨HÅ;”f:辨»òÊ»‹ªU»Û9d»:º¥:—íá< +&=i¾b=<†ÃŠ»l„Ÿ¼”…š¼åZ0½Õ½?R½U&o½YÒX½Y@Ž_fc½U’ ½:f™½‘Ò¼û~3¼ÉÁ¿¼—Sn¼í:·_;<;>×<s<žÝè<ËžÅ=û
=S_ó=€áŸ=ƒX=ƒf5=ŒZv=‘ªã=‘Î=‰6=p=@£=jC<ï@À<WO»‡”S¼Åš¼øÏã½&aO½5í¢½5€½A[9½YÁ½S
Û½8Kï½ÆÞ½'¼ð‘x¼Ø`~¼¿—"¼Jâ¼Uì¼£#¼OfºÎžæ;â\À<0Š<ZWô<µO<õ:T= ýç=<FÄ +½JUg½iR4½j.½t«ã½Ù'Y½cêp»¢³®=(~û= v¾=ÜÜÆ=û³ƒ=üŠ=ä¢?=± =hÓ|=l¢<EiÔ¼FÛÔ½];½a½‹³'½œZ̽£¡½¨G޽»ÞǽÕ|ö½ç½ô4½òR½ÖO½£WѽM†)¼ºÉ +¢Ž½mˆ½÷½!b½Ëx·½\»ý¿Þ=¡=•£ô=ÊQ¦=éƒ{=êI=ÖÛS=§®@=f5=
ÌN<zó×»¼Œ1¼Ó±x½3¶J½eT\½ƒIx½Œþ½‘.>½ ~ƽ·óÙ½Í8}½Ö™h½ÔÌe½Á$–½›æª½Z¡¼ôfF¼ +=3<20<§;Í<ÐçT<Óræ<Ç20<ì¾Ú=- +=ox9=˜Ç=¹h=Êy%=ÅST=²Û=šæ1=Ù=Bþí=Úð<ÍŠ<X·Ž;°@¼a¼‡œM¼•£G¼£Üv¼™>r¼k<¼?–p¼D)¼Bl^¼jŽö¼Ÿƒi¼¾MW¼šÓ¼·L¼,½É4~½j²¼u‘ = ý=€èF=«ëÜ=ÏlJ=Ø,›=À=šlÂ=cûÑ=±8<‘¡ºÌ ¼°xj½Ü†½Rï½lfd½ƒ-|½‹ñÕ½“.Ô½¤™¶½·òd½Á$4½¿<ؽ¯J½Þ½b†½Mܼw›ˆ;E’B<föy<¬ÿ<Ø·<í¡=
°=@@Ñ=z¥W=œ›=¯ìX=·Xø=÷<=œv¡=‚ý@=LäP=p(<À=<=^$¹¾=¼XP=¼Ó ó¼é©/¼ø”:½¹l½ +´X¼ò¢÷¼Ö¥Ô¼Áµh¼’·a¼®@¼–É;¼t»àÎ;+K°<9H|½¼Ø°½ae¼†•H<Îé9=\œ‡=“‰;=·bg=È[a=³ý†=’æ6=hÑr= ùœ<£Õ:Sä¼… +<»Nk=G¯¦=‡:‡=§IS=¸g„=¬0å=d€=u¡=9K2<ÅOá;Ç
×¼!ŽÖ¼ËQ½F*½L(ƒ½mð½~Œ?½ˆ:ª½$Û½’LJ½™WϽ˜Û=½Ž_\½pν6C̼ùˆ:¼™¼$ûL:ºzÖ<l<æ’¹=Å=8V‰=j]Ü=‡Œ¹=R5=¥C=…šl=haž=AßÂ=q<Ö$.<Hk:¤}ö¼/õN¼Ê&«ä½R¶²½^3S½j½uˆÍ½xFX½_£½2ä½7Ǽ踼ª–4¼WìY»VZj<n\ê<ìŸ=.R½‘o½$‰"¼/m<ÇR!=EÞ=‚©þ=œô=¬\?=¢WŒ=‘p=y“æ=A/Ô<æËÜ<W%ºmKp¼‘äq½
(½1ÆŸ½K«½lš½€`ͽvª§½xÊë½zÙþ½y³˜½dt6½;ûf½Á’¼Ö+F¼Œ_¼7˜:É=®<vnœ<øL=&C=D‰I=j#==.=€•Ð=˜=e‚ +=?Z=ÈÀ<à¾È<lí<:Ðf¼+‘мÉä˽.!–½j +½‰½… ½ˆ¦½ˆ•½„@ô½dœh½@½$Q¼þ©Í¼£/I¼Né;¥ó:<ÈLÑ=Ø-=``½Šöy½+¶ÿ¼` <ªe!=;x°={t +=pj=ž=¹=˜÷=~Jø=U¢=)%<íÙ=<eÃ;¯¼P
`¼×yœ½R}½1]нY¼ ½bjà½\P½Qâ×½C¡þ½B+¯½,!ݼîù¼ŸÒ較Ño¼!€9Et`<Y<˜Ò¾<ýôw=%HG=6ïô=P_=_È*=fn6=XæM=;K£= Y<é¾<îË;;H@»È<¼ž½$º½]$7½‚˜º½Ž”N½Žq齆`¦½„W½|§Ù½e#½A¬Š½%ò~¼û$³¼‰³|ºrÅÄ<–+=%y=Uô=‹Uǽ€ì'½‡‘¼Lë<””b=$ÿ=e'í=‰fØ=‘Vå=…j…=]A&=4§;=ª<½Ò×<6–:§ôY»µ“#¼|ͼ߶½
s½@kr½Qí½JR`½7¤w½#P½ðǼÑ:^¼?› +ï=B¿Ø=5†!=C<ùÝ<¯,‘;ÛÙ»ƒ´¼f¼ö˜ ½H#½p_F½†|Q½Uº½‹ý@½…ÑÆ½xhœ½e-û½Uö½6I¦½‚…¼¸zI¼1 +Ò»4«s¼Ÿÿ½,C½GK0½oç©½Šæ½ôÀ½Á*½‡—m½H̽Xf´½*Wz¼ù˜=¼HK¼óV;Ùj<—Ì=DQ=[%¯=’¡=¨^W=¿ny½„k;½2i¼«Û87à<¯R˜=¥w=6‘9=3û}=5Z=$§D<ò‰å<–WÏ<HØò<cM¤<o§<{”<çq»&C¼l¼¾¼õKä¼öò¼Ð ȼ™N¼ +/;—öT<Žž¾<ůÜ<ëÅy=z–=*¬j='ô=(«=82Î=6_{=ea=1Y<ïmm<²V±<k÷‰<B&:» Ø»¼ƒJ.¼ó\•½)Ž]½]¯½„b뽌fÕ½ŽS½†Cº½{õ$½XQ¿½20¼Ék[¼}&r»DM;׫R<Ó_<öÃX=EÆ==„‡V= j
=²äÆ=à >½€!½)¤.¼º«×».u<‰W»<ú×&=ï³=
SN=š²=5[<ÆÝ<’”<‡½U<”¦<’P<Üh<K¡e:ÂL–¼8Ü¡¼”‚a¼¼Øz¼Üm¼Ôš¼•ˆá¼¿™;Í`<´ÂF=V =Á=Hc=Yíò=O……=L;ä=CÍÎ=.sZ=Ï2<õÌP<ª±è<_ª”;ñ<ìºp4¼òâ¼’ð$¼é¿$½ wå½@kú½c³:½u’½‰B½‹I˽…R®½n‚¡½71ɼë1ô¼SJÓ»wX%;Ì&o<”t´<ö£½=)}=c]°=¯=¦Õ =¯
€=¹¯E½x)é½%Ã
m»tp'<o8Ý<Ñÿ$<ïÉs<ê¶Ò<å•4<Üúw<¶ÙW<«Hž<·d<»Ò®<¹®<¨†><zϤ;_>!»ò9ð¼iqX¼´+Ö¼Ó¶œ¼Ós~¼›…ã»ØQÑ<¡þ<Ñ:Z= ¬…=LU¥=nd?=|::=q±p=fÌŠ=Jè¸=&Y<ù=<–®;ö_}9ù;Ø»ºã’¼sœÛ¼¾¡½ +H½)Õ½KÎ7½bñO½mý ½y5B½ŒsN½”o°½Œ·Ò½iÝ»½#Mɼ´hÈ»ìžh;Õ>X<‡õc<ñ§=(ø¾=Vƒ=‚
H=•\=¤¨Ž=¦Ó7=©k½ôÙ½=Õñ¼ó”ϼ^$;º˜@<¬<Æô£<ɘ®<¥§<<¶®þ<ØÆË<Õ=ù<ñu×<ö¶Ä<ëˆÓ<š"¬<æC»wÃå¼?|¼µù¼ÔÊ‘¼Ó˜©¼šò&»³1’<Q‹<ûr=6Ÿ=e™‚=ÖÍ=†¯W=’ä=pw©=U-P=$–6<°š;½a8»áõ6¼˜ÞK¼Ò¼ýX½Îî½B¯>½\×¼½oh½yš½|Û½ƒîh½˜™½¤!´½˜9ê½e¥½ú)¼¦¾:»™S<$–e<ÚëÞ=%z=Mm!=nNh=…Û}=ŒÇ×=–t±=˜}=™1A½ŽîB½\°–½!3+¼™»†”ú;¤7O<[—²<r¹<zç<„ß<¬8<Þc_= +<iŒ<n<½_$<¨%Æ<yc<F~»˜Â ¼Œ ¼È™¼Ä®p¼«D༈Öy»¸ßÌ<Aeü<ý8r=J8Ÿ=u©Ž=†y=”l=†›å=shÝ=Z:Ž=-*À<°¡:ོX)˜¼Çg ½[½<[L½TF½d“û½tÆø½z¸½|!a½ré5½g½_~^½dN½d½4̼Û1¼R¸¼»J!g<<ª<ÜH7=U,=h´=û<Úu<Aj<HÓB<lD—<~€D<uy½†¤‰½u¯^½WÄH½+½½½¼ÐW¼¶Îû¼ž©¼lP¼Üwº3p;̈<C!<2ù<f5;ü๟i”¼Cî¼r:!¼¥_6¼’üR»Ÿ8;Ç£¦<¯q†=A˜=QGg=€F =‡÷[=‡Np=}>Ö=h`Ê=Og=ºU<£ùÁ;RA>¼/¸O¼¹¥ƒ½O)½,Þü½?àz½OðƽPè½V7̽[åî½Z逽Nô«½K*½KÖ°½4^H½¿5¼Œãù»ŒvÂ;´ÀX<…'<ÜßÑ<ûÝ<Ù#¾<¡¶><HbR;¢rª»A`ºå´»—CŒ»«Ù‡½vºa½[úW½FÖ“½+ +¤¼ýµ`¼Úzv¼Ú0ô¼Ìz|¼Íä¼t[œ¼:Ï:€ˆŽ<
,6<[¶ø<.öè;ªÐá8õ»»@¿P¼
T´¼("Œ»Æ|X:ô¨Ò<,Ê&<®?= Æ=:RŽ=bËX="ñ=„Á+=}Xr=d–í=SÉk=3’ÿ=qÆ<ŽŒ‚;Îm_»Ø[̼§’l½ +ê¹¼Æ
Ÿ»ä4¼;åJÞ<ƒ®<£)º<à +<-ç<7¤Š:¬ÜÊ»p>=¼!‚¼„Y7¼¸‡ª¼×Ü ¼Øü¿¼ã1 ¼î—w¼úòç½Ü¬½æs½¼ÿ¦œ¼¾k¼LT9;;%ò<˜›–<ØÚì<Ò[ü<Éí<»Å€<K¡l¸ŠÄ +Å3=B*<çÙÁ< kŠ<(V:ˆ-¼µ¼{F´¼¯z]¼ØÜ¼°ŸŽ¼Úm„¼úTa=jwT=5^<þ +<®Ùª<fC5;Ï6ºP&ž»ÈÝ\¼<-¼ùD¼²:+¼xyF»¸”¶; `J<K<[÷=<?¬P;ÑÙ;Ì +%Ã=†<ý±D<®3m<EÆ´;|ÃQ»c¢X¼n¼ˆJ²¼¹q¶¼àÛ¼Ä]¼óÿ7=‡R‡=PFë=G¨<Îpè<š;úîæ9©ÑP¹ÆÆð»|¹¼;Ü£¼””¤¼b¿š»·É¹.?P;spo;Þÿ¸;ƒ«»]²È¼
¨¼¸¼Qˆm¼-ð¼Ê¼O$¼íõ¼:ê[¼7]*¼ó¼€/¼$„M¼5ñr¼ö¼mö¼!¨¼648»Úzº»dÌẢE»Õz»@M7:fhÂ;³üJ;§†;µ¹;´(<™ø<&kÍ<y(v<Ääã='= +Ã=á=sC=
Ú<ãÀ<¥óí<r—f;¸ lºßaÀ»å\?¼F¼ŒÜ¹¼:À¤¼ et¼×܉=Ž’ +úŸ=‡+=Oç9= t<Ωî<SÚ\;E²»IÌ»¼cè»ô*•¼;@I¼ƒMp¼Ôp¼†U¼Œ£¼Q•¼:lc¼ˆ.¼×½ˆ½3i½qö½3OU½Dн5R*½¾c½Ù~½e´½ +e´¼Cž´¼N8¥¼‡eY¼¢ÐB¼wº¼Z¼"{<¼™¼+t¼®Zˆ½
^F½:]¾½Vx½rE½|Ì8½c;½BOɽ2Ïî½5g„½ y¿½K½ÛÕ½À@½ ¯¼¹ô¯¼C—»Šà¹Í–h;\00< ³<\¼ú<†–¼<Ææ/={=u=ß„=;Ðñ=K‰–=Jh[=Lü=Rê¡=GòQ=I«l=K2“=>þS=+= +"<ó8ø<¾(<¢V¬<7\î;'ši¼=I²¼Ú!]½)Ñe½:Pν{i½• ž +†›½ð¬Ñ½Ê¡‡½˜ú8½B¡å¼·äû:Ç`<¶X¿=*ö‰=q—=˜ð=³¥d=Ϙà=ïSÑ>÷M>C_=÷ì/=àÒ[=¿Mƒ=—¢=Xb <Ì·¼»w¼·ë½Ké½77ì½F¨ˆ½Vêy½cm½nÓ½¤%½’kM½¤•-½µrý½¹Æ{½µD"½¤
½ŠÇ=½cV¨½8Cû½Â©¼™·j»Î™Ÿ:*h;•0Ø;¤tò;ËlM<šT;çA;û‚<YM¿<š:<¯28<©Q|<ÜD=S&>(>=Æçö=-Ú¼þ+½C$Ƚ¨êí½èŒ¾'›¾ F½þ`½Þq¹½º\½ŒØ½A¿ˆ¼Ä¦+ºjx$<«•Û=!k=YQ$=Œ-=¥–6=½Z=ÕCü=ê=íÝ=ç9=Øf€=»Ò +€Ç=´¢ò=*Ø/»Ä² ½*¶½šB½Ô¼û½ù!½ý-‘½ñU²½Ù^½µG½‹Kæ½BZ‡¼Íì ºƒ®X<šÕç=P‚=Ns’=‚óÀ=š~˜=¬MÞ=Â
=Ó°=Þu±=à¦{=Ô‡Ÿ=À+R=¹„=r°9=ó<j”I»¹5þ¼ˆ_ï¼Á½ +=Ã=$<w== +í»×<Á½.½Œ)½Âg4½èsA½ì¯É½äÓØ½Ó.µ½·.뽎¿º½A –¼ËœX»0¾÷<~Z= ç=IÉû=€Â=”Œ=¦
é=·ˆx=Æ•»=Òê=Ö‘==ÐÌ“=¾ÞÓ=¨´ü=Šò~=G<ø¢¹<fY`¸gFi¼Æ¼‘o‹¼ÁÆ+½ +ɽ-Ì‹½[Ñ·½e½ŽŠ{½×—½„ÉܽdkÛ½6„á½”µ¼«R»ëâr<)?Î<Éñc=!š=U%=zÔš=‹î(=[¾=‡)=y<+=Wøm=.6<öa)<oJ +½•Œ½oh +½ó½[iʽƒî¡½’NsÜq½ŽÏ½s Ö½9þý½ý8¼Âðj¼s²ÿ»€¦í;ð<§:j=
e£=BÁ=rão=€Í}=…h'=~“=fò|=J*Ì=%üª<æFØ<‘—_<+Wé;ˆú<» +Ki=JŸ_=…O=¤ù=¶$5=´Œ;=¦Íš=–ª=‚á"=Tä‘=Wb<\—ˆ»½Áº¼ì9¨½\°R½™fH½Ãû„=wU%="q¿<èÍ»aï¼ÐÕd½)0Ô½\åj½mAñ½pÚ…½dâ§½7á轑°¼Âjí¼ÛܼOyü»œ¶d;®[K<†Ø]<ÚN¼=G=F2Ÿ=]z=bè©=^Á@=Go=î<ÚéV<x>W;.’ؼÏ<¼ws@¼µG¦¼þyȽ(Zv½XO̽m…½€Á½—\½™*½‘G½}a=½`gÚ½:Þj½Îb¼À2¼ca<#)<Úݬ=)y|=dî!=ÙP=¬Ù =µ%T=¨Â”=–k¨=…ÿ=Wt= <š0µ:Gòͼ°9~½2ûj½†¼-½ë®½Ø‹Ù=f¿0=j/<š5z9ñ›¼”|Ù½ +ÅÝ¼Êæ¼]%?¹½Š{<C~Æ<Þl¶==¹==„}x=¡ð=«Ç÷='N=£¹ò=Š%ø=U‡î=(Í<°*g;G¡Ü¼”I0½ë½`ù½™h‹½ºÊã½Ùë4½ú·Q=K%==.< +<Ž'²= +k½ƒÝ½šè"½¨’½¸>—½ÆQ=SÒÎ=+Y<ú¶s<’f< +û<Âý=± =6zÐ=<=:}ß=‰-<Ÿ¬™»Bø¼Ü®]½3Õb½n8½Dï½¶Ú½¶É½¦ëo½÷½f@ʽ.1¼ÄÉ"»ø¡;³oš<‚Ìž<çc¿="Ëü=Pë¤=rñs=|§1==Œ™Q=œ=«ði=²oÝ=«äÙ=“R*=]Sé<þø~<!L÷¼2Ž\¼êh½(‰½Rðõ½uß½…‹:½‰„Q½‘w¾½™¶@=Zz[=;y=!é/<åZ$<›w-<0ðz;Ï%ð;® +;Ñ„„;…`@¹åt껨³¦¼V½¼¢êƼ±Hï¼–ªK¼(zºüRò<Hʵ<ål¡=ˆ=*©þ=7ˆ™=1™!=Sü<•œ…¼"¼ý†½Kà•½‰èG½§-0½»¡7½»é½¦â ½‹Ÿ½V³í½~”¼ˆI:àåw<€”k<Ö2-=Ê=N«M=x=9=™Ì=šgf=Ÿ:Œ=¦aœ=«W)=¯@s=¤aâ=‰}“=E’½<ßB<¦t¼.‰ß¼×÷н#½5h½K”ƒ½M̽FC›½S„h½`À=Y#Õ=F¦Q=6S=#‰Ý<ö¸<¤@<íE<‰þ!<gBË<PÈv<Ì#;³>†»Îª,¼eö=¼o¼M¨„»¯Ý„;4\¬<€–Á<ð?‰=r=&…=òá=¢<Ìš<;´Õ}¼de½"Ÿ½fÞq½ñ%½¨A½²Ÿµ½®¢ö½›Ú˽€E½J™½¥¼2ßR<¹7<¦3Š=õ=5¿e=R–o=xAå=’©û=™F=›=ž,=¢ææ=Ÿä=œ°€=¶7=ifN=Ý<¼‰o<¡o»äjʼ¨ ¼åV3½2½¼ý'l¼Ø;æ½uƒ½P¿=G)˜=@ø‚=9¬L=7ào=Ý<߇<½á–<—ÛÃ<‘á‹<—¤k<wQø<*¨¹é´Ä»Ë¹#¼T%»ûÀ¿»*™¬;Ž +Äl;q¥:õ¤8›¯:‡0H;Àð¹<`ÃŽ<¤¬K<§ƒ<¯…þ<…ßÑ;Ô‡¼ch¼å©Ã½+ؽg„ª½‰\2½–š½¡mõ½·!½‘˜P½s:½R*½)d†¼ßêW¼‚ã;·áX<•±<Þª=õ =ùU=2ñy=Gf¼=T!=T~¢=YxR=b+h=i|«=d>N=Døð=
û=<Çi…<J§Q;ÃÚºá—è»+³»¬õڻÉøºì;œ:—=ƒ;Qº´Æ¤»¨¢ÿ<Ѧ<áîé<öï= +:1…³;~r½;äÄ<L~G<‚¼<ª³Ò<“5<‚á|¼Cêÿ»ñ
;¹iå;±<7< <8Y<C¶,<‚¸†<ÄCØ= +vé½1õ½Cí½O«½^Eç½d††½]’u½RÜd½@M ½%N½fH¼ÿi¼èÞ‹¼¢ æ¼y"»¹¡» [Z;¿'J<ZÒÆ<Vò‡<u›†<š[d<¡œ<¹µì<ê-Ì=‚.=
œ= +V<ÍÎ<M3m;X]»kˇ»¼ºØ6Ê;Qã6;좆<D-<†`<™}<¨Ç<—×Å<{áܽ Mº¼Ñ½…¼„èQ¼x3»A~y;©‰;Ç'><Xãj<¯k~<í_b=éª<õb[<¨<Šä€<6ü¼:²Ž»¬>¬»çˆ¼$ÁѼ*Ò›¼oÚ±¼ƒPò¼¸Œ±¼ÿe0½Lé½ ½*—½0×W½+t½$¤½
½Óμú6ݼåQ¼¿(ʼ™³â¼{‰>¼?q ¼<‚»kW›9?±½;6z;mbA;¯6·<%žA<X™õ<¤<âVº<ï÷~==æ<òÿ <“þé;uÒh»hÉ*»÷›I¼/M(»·¥,;};;Á><LÒ<š#¡<¤ªC<²);<¿1<MM‘½s—D½=ªâ½
j +¼·à—¼€¹¼)[:+Y<9ä<„QÉ<´b<ê_è<ùè×<½£ˆ<‰Zé<Gó8< +’¤8Ryó»døj»ªòF»ð¦¼ËP¼?¼‹7¼¹,ͼÔ/Ò¼àU$¼ì:Ú¼ç¯ß¼ÕͼȻ¼ÛÝ?¼Öïd¼Â¶¼µ°z¼—³™¼vfϼ‡¸¢¼‚ei¼8Pʻ㗻ÍÉÉ»Ú\=»:ng:ñÓ¤;™[v<#Ö<†°ê<Ëk=<ÐA|<Ê™<£†…<Ê£ºÜ@¼¼VÄ[¼Œr¢¼&äºÓ¤²;©¯<Ý<‰ <‹Â<§Øó<~9:<J°½£ ½‚_½Jê,½´¼ÍíM¼\”õ»vö;º…O<Kd<zÕ‘<½óp<×Õ«<ŸË<w×–<Aÿ<)Žâ;æMÄ;›mœ;‹wÃ;°ÖO;“PH:½#»¸ã¼(-żMÞØ¼UC¼jjJ¼QÁ¼;n ¼Q©˜¼„eÚ¼ˆÖw¼“Öj¼7E¼T¼}¦‰¼¢ÛM¼Žmd¼ˆâ6¼z(e¼nþ¼g’h¼8ÌQ»_(›;MÔ$;à²)<]a±<waá<~J2<c¿>;ÚPÿºÚ!¼!èî¼fåô¼wÜß¼{Ö¼+„º{zk;np)<þ.<hÂ<})<¢°â<‚$ì<o¡—½²àh½±—½c7d½"æy¼Ø»©¼Jæ¹Øö;<®!;õÓ*<Q©=<ªåµ<Èy<ºBž<£×<šþ<§Í<‡¨|<Žbá<œÑµ<·åÞ<ºû{<›ï#<v<*UY;Î?Ó;Ã.;Ô ;Åú;0Æ+¹âëm» Ö¼M¼ ¢¼Uš/¼;X»¼U?›¼—Sм›Zœ¼¬ïl¼©jß¼›ý%¼—¹¸¼€ ù¼"^{»‘ºÕ;¢:…¥ :,ï_ºéê»OLQ¼¾Š¼€º¼º§•¼ÛH¤¼»*L¼•^¼:·Q»ç:d\<ÇÆ<;œ¾<qG<¤¨Â<¥Ü¿<¤4ཱིê0½‘.½_!½˜-¼Ä8¼6!:Ê‘P;ïö<G48<‡–<» “<Úç]<ÞÉÓ<òÔ<êȽ<Ò§<Ôr¼<þ?-=ã-=<¦=,ÄÒ=.~û=*6×=±Å<öó<äpò<ÙuB<ë£<vÒë<6·`;ßɽ;-»†ž¼ .·»ûÓ¼%7ؼ‡SW¼²k1¼£G¼€W¼šÄм¥¢¼…ýd¼Nê–¼Cù¥¼%ïè¼A¼:żdY༓žš¼¦Œ¢¼ÑQ(½„ƒ½ ¹0¼òñ®¼´ç*¼Z>"¼šsºÿ“ <9u<RE<¬¼J<µÇ×=g½= ½®0p½Šô0½MA¾½¼3)»ü*æ;Qس<'2<k´ˆ<›Ô9<áZn= diff --git a/stwcs/tests/data/simple.fits b/stwcs/tests/data/simple.fits new file mode 100644 index 0000000..6bb9fd1 --- /dev/null +++ b/stwcs/tests/data/simple.fits @@ -0,0 +1 @@ +SIMPLE = T / Fits standard BITPIX = -64 / Bits per pixel NAXIS = 2 / Number of axes NAXIS1 = 2 / Axis length NAXIS2 = 2 / Axis length EXTEND = T / File may contain extensions ORIGIN = 'NOAO-IRAF FITS Image Kernel July 2003' / FITS file originator EXTVER = 1 / Extension version DATE = '2007-02-08T21:38:47' / Date FITS file was generated IRAF-TLM= '2011-08-05T18:56:26' / Time of last modification EXPNAME = 'j94f05bgq ' / exposure identifier BUNIT = 'ELECTRONS' / brightness units / WFC CCD CHIP IDENTIFICATION CCDCHIP = 2 / CCD chip (1 or 2) / World Coordinate System and Related Parameters WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = 2048 / x-coordinate of reference pixel CRPIX2 = 1024 / y-coordinate of reference pixel CRVAL1 = 5.63056810618 / first axis value at reference pixel CRVAL2 = -72.0545718428 / second axis value at reference pixel CTYPE1 = 'RA---TAN-SIP' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN-SIP' / the coordinate type for the second axis CD1_1 = 1.29055157671E-05 / partial of first axis coordinate w.r.t. x CD1_2 = 5.95250061078E-06 / partial of first axis coordinate w.r.t. y CD2_1 = 5.02263802553E-06 / partial of second axis coordinate w.r.t. x CD2_2 = -1.26448442232E-05 / partial of second axis coordinate w.r.t. y LTV1 = 0.0000000E+00 / offset in X to subsection start LTV2 = 0.0000000E+00 / offset in Y to subsection start LTM1_1 = 1.0 / reciprocal of sampling rate in X LTM2_2 = 1.0 / reciprocal of sampling rate in Y ORIENTAT= 154.7915106251955 / position angle of image y axis (deg. e of n) RA_APER = 5.655000000000E+00 / RA of aperture reference position DEC_APER= -7.207055555556E+01 / Declination of aperture reference position PA_APER = 154.533 / Position Angle of reference aperture center (deVAFACTOR= 1.000018683511E+00 / velocity aberration plate scale factor / READOUT DEFINITION PARAMETERS CENTERA1= 2073 / subarray axis1 center pt in unbinned dect. pix CENTERA2= 1035 / subarray axis2 center pt in unbinned dect. pix SIZAXIS1= 4096 / subarray axis1 size in unbinned detector pixelsSIZAXIS2= 2048 / subarray axis2 size in unbinned detector pixelsBINAXIS1= 1 / axis1 data bin size in unbinned detector pixelsBINAXIS2= 1 / axis2 data bin size in unbinned detector pixels / PHOTOMETRY KEYWORDS PHOTMODE= 'ACS WFC1 F606W' / observation con PHOTFLAM= 7.9064521E-20 / inverse sensitivity, ergs/cm2/Ang/electron PHOTZPT = -2.1100000E+01 / ST magnitude zero point PHOTPLAM= 5.9176797E+03 / Pivot wavelength (Angstroms) PHOTBW = 6.7231146E+02 / RMS bandwidth of filter plus detector / REPEATED EXPOSURES INFO NCOMBINE= 1 / number of image sets combined during CR rejecti / DATA PACKET INFORMATION FILLCNT = 0 / number of segments containing fill ERRCNT = 0 / number of segments containing errors PODPSFF = F / podps fill present (T/F) STDCFFF = F / ST DDF fill present (T/F) STDCFFP = 'x5569 ' / ST DDF fill pattern (hex) / ON-BOARD COMPRESSION INFORMATION WFCMPRSD= F / was WFC data compressed? (T/F) CBLKSIZ = 0 / size of compression block in 2-byte words LOSTPIX = 0 / #pixels lost due to buffer overflow COMPTYP = 'None ' / compression type performed (Partial/Full/None) / IMAGE STATISTICS AND DATA QUALITY FLAGS NGOODPIX= 7822781 / number of good pixels SDQFLAGS= 31743 / serious data quality flags GOODMIN = -2.5959351E+02 / minimum value of good pixels GOODMAX = 6.5220551E+04 / maximum value of good pixels GOODMEAN= 2.0491536E+02 / mean value of good pixels SOFTERRS= 0 / number of soft error pixels (DQF=1) SNRMIN = -8.0327058E-01 / minimum signal to noise of good pixels SNRMAX = 2.1379723E+02 / maximum signal to noise of good pixels SNRMEAN = 1.0889255E+01 / mean value of signal to noise of good pixels MEANDARK= 1.5474443E+00 / average of the dark values subtracted MEANBLEV= 2.4558604E+03 / average of all bias levels subtracted MEANFLSH= 0.000000 / Mean number of counts in post flash exposure OCRVAL1 = 5.63056810618 / first axis value at reference pixel OCRVAL2 = -72.05457184279 / second axis value at reference pixel OCRPIX2 = 1024.0 / y-coordinate of reference pixel OCRPIX1 = 2048.0 / x-coordinate of reference pixel ONAXIS2 = 2048 / Axis length ONAXIS1 = 4096 / Axis length OCD2_2 = -1.26445E-05 / partial of second axis coordinate w.r.t. y OCD2_1 = 5.02243E-06 / partial of second axis coordinate w.r.t. x OORIENTA= 154.7886863186197 / position angle of image y axis (deg. e of n) OCTYPE1 = 'RA---TAN' / the coordinate type for the first axis OCD1_1 = 1.29046E-05 / partial of first axis coordinate w.r.t. x OCD1_2 = 5.9531E-06 / partial of first axis coordinate w.r.t. y OCTYPE2 = 'DEC--TAN' / the coordinate type for the second axis WCSCDATE= '21:39:44 (08/02/2007)' / Time WCS keywords were copied. A_0_2 = 2.16615952976212E-06 B_0_2 = -7.2168814507744E-06 A_1_1 = -5.1974576466834E-06 B_1_1 = 6.18443235774478E-06 A_2_0 = 8.55127758255650E-06 B_2_0 = -1.7464918770586E-06 A_0_3 = 1.08193519820265E-11 B_0_3 = -4.1754720492749E-10 A_1_2 = -5.2348707436924E-10 B_1_2 = -6.1692652686813E-11 A_2_1 = -3.9771547747287E-11 B_2_1 = -5.0857161673862E-10 A_3_0 = -4.7304448292227E-10 B_3_0 = 8.56763542781631E-11 A_0_4 = 1.49356171166049E-14 B_0_4 = -9.9570490655478E-15 A_1_3 = -2.4569975537746E-14 B_1_3 = 1.21743011568848E-14 A_2_2 = 3.46791267104378E-14 B_2_2 = -3.6614325928657E-14 A_3_1 = 1.97102297166030E-15 B_3_1 = -3.7795068054874E-15 A_4_0 = 2.37430106240231E-14 B_4_0 = -1.7687653826004E-14 A_ORDER = 4 B_ORDER = 4 CPERROR1= 0.0 / Maximum error of NPOL correction for axis 1 CPERROR2= 0.0 / Maximum error of NPOL correction for axis 2 HISTORY The following throughput tables were used: crotacomp$hst_ota_007_syn.fitHISTORY s, cracscomp$acs_wfc_im123_004_syn.fits, cracscomp$acs_f606w_005_syn.fitHISTORY s, cracscomp$acs_wfc_ebe_win12f_005_syn.fits, cracscomp$acs_wfc_ccd1_017HISTORY _syn.fits TDDALPHA= 0.03676157754622637 TDDBETA = -0.00958719251540879 IDCSCALE= 0.05 IDCV2REF= 256.6222229003906 IDCV3REF= 302.2264099121094 IDCTHETA= 0.0 OCX10 = 0.001959713482071437 OCX11 = 0.04983122487595928 OCY10 = 0.05027393143048926 OCY11 = 0.00148847536166365 SORIENTA= 154.7925383197021 / position angle of image y axis (deg. e of n) SCRVAL1 = 5.63056810618 / first axis value at reference pixel SNAXIS2 = 2048 / Axis length SNAXIS1 = 4096 / Axis length SCRVAL2 = -72.05457184279 / second axis value at reference pixel SCTYPE1 = 'RA---TAN-SIP' / the coordinate type for the first axis SCTYPE2 = 'DEC--TAN-SIP' / the coordinate type for the second axis SCD2_2 = -1.264489181627715E-05 / partial of second axis coordinate w.r.t. y SCD2_1 = 5.022886862247075E-06 / partial of second axis coordinate w.r.t. x SCD1_2 = 5.952245949610081E-06 / partial of first axis coordinate w.r.t. y SCRPIX2 = 1024.0 / y-coordinate of reference pixel SCRPIX1 = 2048.0 / x-coordinate of reference pixel SCD1_1 = 1.290545120875315E-05 / partial of first axis coordinate w.r.t. x IDCXREF = 2048.0 IDCYREF = 1024.0 WCSNAMEO= 'OPUS ' WCSAXESO= 2 CRPIX1O = 2048 CRPIX2O = 1024 CDELT1O = 1 CDELT2O = 1 CUNIT1O = 'deg ' CUNIT2O = 'deg ' CTYPE1O = 'RA---TAN-SIP' CTYPE2O = 'DEC--TAN-SIP' CRVAL1O = 5.63056810618 CRVAL2O = -72.0545718428 LONPOLEO= 180 LATPOLEO= -72.0545718428 RESTFRQO= 0 RESTWAVO= 0 CD1_1O = 1.29055157671E-05 CD1_2O = 5.95250061078E-06 CD2_1O = 5.02263802553E-06 CD2_2O = -1.26448442232E-05 D2IMEXT = 'wfc_ref68col_d2i.fits' D2IMERR = 0.002770500956103206 IDCTAB = 'postsm4_idc.fits' WCSNAMEA= 'IDC_postsm4' WCSAXESA= 2 CRPIX1A = 2048 CRPIX2A = 1024 CDELT1A = 1 CDELT2A = 1 CUNIT1A = 'deg ' CUNIT2A = 'deg ' CTYPE1A = 'RA---TAN-SIP' CTYPE2A = 'DEC--TAN-SIP' CRVAL1A = 5.63056810618 CRVAL2A = -72.0545718428 LONPOLEA= 180 LATPOLEA= -72.0545718428 RESTFRQA= 0 RESTWAVA= 0 CD1_1A = 1.29055157671E-05 CD1_2A = 5.95250061078E-06 CD2_1A = 5.02263802553E-06 CD2_2A = -1.26448442232E-05 NPOLEXT = 'qbu16424j_npl.fits' END diff --git a/stwcs/tests/test_altwcs.py b/stwcs/tests/test_altwcs.py new file mode 100644 index 0000000..86d100f --- /dev/null +++ b/stwcs/tests/test_altwcs.py @@ -0,0 +1,170 @@ +import shutil +import os +from astropy.io import fits as pyfits +from stwcs.wcsutil import altwcs +from stwcs import updatewcs +from stwcs.wcsutil import HSTWCS +import numpy as np +from numpy.testing import utils + +from . import data +data_path = os.path.split(os.path.abspath(data.__file__))[0] + + +def get_filepath(filename, directory=data_path): + return os.path.join(directory, filename) + + +def compare_wcs(w1, w2, exclude_keywords=None): + """ + Compare two WCSs. + + Parameters + ---------- + w1, w2 : `astropy.wcs.WCS` objects + exclude_keywords : list + List of keywords to excude from comparison. + """ + exclude_ctype = False + keywords = ['crval', 'crpix', 'cd'] + if exclude_keywords is not None: + exclude_keywords = [kw.lower() for kw in exclude_keywords] + if 'ctype' in exclude_keywords: + exclude_ctype = True + exclude_keywords.remove('ctype') + for kw in exclude_keywords: + keywords.remove(kw) + for kw in keywords: + kw1 = getattr(w1.wcs, kw) + kw2 = getattr(w2.wcs, kw) + utils.assert_allclose(kw1, kw2, 1e-10) + #utils.assert_allclose(w1.wcs.crpix, w2.wcs.crpix, 1e-10) + #utils.assert_allclose(w1.wcs.cd, w2.wcs.cd, 1e-10) + if not exclude_ctype: + utils.assert_array_equal(np.array(w1.wcs.ctype), np.array(w2.wcs.ctype)) + +class TestAltWCS(object): + + def setup_class(self): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + simple_orig_file = get_filepath('simple.fits') + current_dir = os.path.abspath(os.path.curdir) + simple_file = get_filepath('simple.fits', current_dir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + try: + os.remove(acs_file) + os.remove(simple_file) + except OSError: + pass + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + shutil.copyfile(acs_orig_file, acs_file) + shutil.copyfile(simple_orig_file, simple_file) + pyfits.setval(acs_file, ext=0, keyword="IDCTAB", value=idctab) + pyfits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + pyfits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + + updatewcs.updatewcs(acs_file) + self.acs_file = acs_file + self.simplefits = simple_file + self.ww = HSTWCS(self.acs_file, ext=1) + + def test_archive(self): + altwcs.archiveWCS(self.acs_file, ext=1, wcskey='Z', wcsname='ZTEST', reusekey=False) + w1 = HSTWCS(self.acs_file, ext=1) + w1z = HSTWCS(self.acs_file, ext=1, wcskey='Z') + compare_wcs(w1, w1z) + + def test_archive_clobber(self): + altwcs.archiveWCS(self.acs_file, ext=1, wcskey='Z', wcsname='ZTEST', reusekey=True) + w1 = HSTWCS(self.acs_file, ext=1) + w1z = HSTWCS(self.acs_file, ext=1, wcskey='Z') + compare_wcs(w1, w1z) + + def test_restore_wcs(self): + # test restore on a file + altwcs.restoreWCS(self.acs_file, ext=1, wcskey='O') + w1o = HSTWCS(self.acs_file, ext=1, wcskey='O') + w1 = HSTWCS(self.acs_file, ext=1) + compare_wcs(w1, w1o, exclude_keywords=['ctype']) + + def test_restore_wcs_mem(self): + # test restore on an HDUList object + altwcs.archiveWCS(self.acs_file, ext=[('SCI', 1), ('SCI', 2)], wcskey='T') + pyfits.setval(self.acs_file, ext=('SCI', 1), keyword='CRVAL1', value=1) + pyfits.setval(self.acs_file, ext=('SCI', 2), keyword='CRVAL1', value=1) + f = pyfits.open(self.acs_file, mode='update') + altwcs.restoreWCS(f, ext=1, wcskey='T') + f.close() + w1o = HSTWCS(self.acs_file, ext=1, wcskey='T') + w1 = HSTWCS(self.acs_file, ext=1) + compare_wcs(w1, w1o) + + def test_restore_simple(self): + # test restore on simple fits format + altwcs.archiveWCS(self.simplefits, ext=0, wcskey='R') + pyfits.setval(self.simplefits, ext=0, keyword='CRVAL1R', value=1) + altwcs.restoreWCS(self.simplefits, ext=0, wcskey='R') + wo = HSTWCS(self.simplefits, ext=0, wcskey='R') + ws = HSTWCS(self.simplefits, ext=0) + compare_wcs(ws, wo) + + def test_restore_wcs_from_to(self): + # test restore from ... to ... + #altwcs.archiveWCS(self.acs_file, ext=[('SCI',1), ('SCI',2)], wcskey='T') + pyfits.setval(self.acs_file, ext=('SCI', 1), keyword='CRVAL1', value=1) + pyfits.setval(self.acs_file, ext=('SCI', 2), keyword='CRVAL1', value=1) + f = pyfits.open(self.acs_file, mode='update') + altwcs.restore_from_to(f, fromext='SCI', toext=['SCI', 'ERR', 'DQ'], + wcskey='T') + f.close() + w1o = HSTWCS(self.acs_file, ext=('SCI', 1), wcskey='T') + w1 = HSTWCS(self.acs_file, ext=('SCI', 1)) + compare_wcs(w1, w1o) + w2 = HSTWCS(self.acs_file, ext=('ERR', 1)) + compare_wcs(w2, w1o, exclude_keywords=['ctype']) + w3 = HSTWCS(self.acs_file, ext=('DQ', 1)) + compare_wcs(w3, w1o, exclude_keywords=['ctype']) + w4o = HSTWCS(self.acs_file, ext=4, wcskey='T') + w4 = HSTWCS(self.acs_file, ext=('SCI', 2)) + compare_wcs(w4, w4o) + w5 = HSTWCS(self.acs_file, ext=('ERR', 2)) + compare_wcs(w5, w4o, exclude_keywords=['ctype']) + w6 = HSTWCS(self.acs_file, ext=('DQ', 2)) + compare_wcs(w3, w1o, exclude_keywords=['ctype']) + + def test_delete_wcs(self): + #altwcs.archiveWCS(self.acs_file, ext=1, wcskey='Z') + altwcs.deleteWCS(self.acs_file, ext=1, wcskey='Z') + utils.assert_raises(KeyError, HSTWCS, self.acs_file, ext=1, wcskey='Z') + + def test_pars_file_mode1(self): + assert(not altwcs._parpasscheck(self.acs_file, ext=1, wcskey='Z')) + + def test_pars_file_mode2(self): + f = pyfits.open(self.acs_file) + assert(not altwcs._parpasscheck(f, ext=1, wcskey='Z')) + f.close() + + def test_pars_ext(self): + f = pyfits.open(self.acs_file, mode='update') + assert(altwcs._parpasscheck(f, ext=1, wcskey='Z')) + assert(altwcs._parpasscheck(f, ext=[('sci', 1), ('sci', 2)], wcskey='Z')) + assert(altwcs._parpasscheck(f, ext=('sci', 1), wcskey='Z')) + f.close() + + def test_pars_wcskey_not1char(self): + f = pyfits.open(self.acs_file, mode='update') + assert(not altwcs._parpasscheck(f, ext=1, wcskey='ZZ')) + f.close() + + def test_pars_wcskey(self): + f = pyfits.open(self.acs_file, mode='update') + assert(altwcs._parpasscheck(f, ext=1, wcskey=' ')) + #assert(not altwcs._parpasscheck(f, ext=1, wcskey=' ', reusekey=False)) + #assert(altwcs._parpasscheck(f, ext=1, wcskey='O')) + #assert(not altwcs._parpasscheck(f, ext=1, wcskey='O', reusekey=False)) + f.close() diff --git a/stwcs/tests/test_headerlet.py b/stwcs/tests/test_headerlet.py new file mode 100644 index 0000000..48fb470 --- /dev/null +++ b/stwcs/tests/test_headerlet.py @@ -0,0 +1,276 @@ +import shutil +import os +from astropy.io import fits +from stwcs import updatewcs +from stwcs.wcsutil import headerlet, wcsdiff +from stwcs.wcsutil import HSTWCS +import numpy as np +from numpy.testing import utils +from nose.tools import * + +from . import data +data_path = os.path.split(os.path.abspath(data.__file__))[0] + + +def get_filepath(filename, directory=data_path): + return os.path.join(directory, filename) + + +class TestCreateHeaderlet(object): + + def setup_class(self): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + simple_orig_file = get_filepath('simple.fits') + current_dir = os.path.abspath(os.path.curdir) + simple_file = get_filepath('simple.fits', current_dir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + comp_file = get_filepath('comp.fits', current_dir) + self.headerlet_name = get_filepath('acs_hlet.fits', current_dir) + + try: + os.remove(acs_file) + os.remove('comp.fits') + os.remove(simple_file) + except OSError: + pass + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + shutil.copyfile(acs_orig_file, acs_file) + shutil.copyfile(simple_orig_file, simple_file) + fits.setval(acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + + updatewcs.updatewcs(acs_file) + + shutil.copyfile(acs_file, comp_file) + self.comp_file = comp_file + self.simple_file = simple_file + + def testAllExt(self): + """ + Test create_headerlet stepping through all + extensions in the science file + """ + hlet = headerlet.create_headerlet(self.comp_file, hdrname='hdr1') + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [1, 4], [("SIPWCS", 1), ("SIPWCS", 2)], + verbose=True)[0]) + + def testSciExtList(self): + """ + Test create_headerlet using a list of (EXTNAME, EXTNUM) + extensions in the science file + """ + hlet = headerlet.create_headerlet(self.comp_file, + sciext=[('SCI', 1), ('SCI', 2)], + hdrname='hdr1') + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [1, 4], [("SIPWCS", 1), ("SIPWCS", 2)], + verbose=True)[0]) + + def testSciExtNumList(self): + """ + Test create_headerlet using a list of EXTNUM + extensions in the science file + """ + hlet = headerlet.create_headerlet(self.comp_file, + sciext=[1, 4], + hdrname='hdr1') + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [1, 4], [("SIPWCS", 1), ("SIPWCS", 2)], + verbose=True)[0]) + + def testHletFromSimpleFITS(self): + """ + Test create_headerlet using a FITS HDUList extension + number in the science file + """ + hlet = headerlet.create_headerlet(self.simple_file, + sciext=0, + hdrname='hdr1') + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.simple_file, self.headerlet_name, + [0], [1], verbose=True)[0]) + + @raises(KeyError) + def test_no_HDRNAME_no_WCSNAME(self): + """ + Test create_headerlet stepping through all + extensions in the science file + """ + newf = get_filepath('ncomp.fits', os.path.abspath(os.path.curdir)) + shutil.copyfile(self.comp_file, newf) + fits.delval(newf, 'HDRNAME', ext=1) + fits.delval(newf, 'WCSNAME', ext=1) + hlet = headerlet.create_headerlet(newf) + + def test1SciExt(self): + """ + Create a headerlet from only 1 SCI ext + """ + hlet = headerlet.create_headerlet(self.comp_file, + sciext=4, + hdrname='hdr1') + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [4], [1], verbose=True)[0]) + + +class TestApplyHeaderlet: + + def setup_class(self): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + simple_orig_file = get_filepath('simple.fits') + current_dir = os.path.abspath(os.path.curdir) + simple_file = get_filepath('simple.fits', current_dir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + comp_file = get_filepath('comp.fits', current_dir) + self.headerlet_name = get_filepath('acs_hlet.fits', current_dir) + + try: + os.remove(acs_file) + os.remove('comp.fits') + os.remove(simple_file) + except OSError: + pass + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + shutil.copyfile(acs_orig_file, acs_file) + shutil.copyfile(simple_orig_file, simple_file) + fits.setval(acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + + updatewcs.updatewcs(acs_file) + + shutil.copyfile(acs_file, comp_file) + self.comp_file = comp_file + + ''' + def setUp(self): + try: + os.remove('j94f05bgq_flt.fits') + os.remove('comp.fits') + except OSError: + pass + shutil.copyfile('orig/j94f05bgq_flt.fits', './j94f05bgq_flt.fits') + updatewcs.updatewcs('j94f05bgq_flt.fits') + shutil.copyfile('j94f05bgq_flt.fits', './comp.fits') + ''' + """ + Does not raise an error currently, should it? + @raises(TypeError) + def testWrongDestim(self): + hlet = headerlet.create_headerlet('comp.fits', sciext=4, + hdrname='hdr1', destim='WRONG') + hlet.apply_as_primary('comp.fits') + """ + + @raises(ValueError) + def testWrongSIPModel(self): + hlet = headerlet.create_headerlet(self.comp_file, hdrname='test1', + sipname='WRONG') + hlet.apply_as_primary(self.comp_file) + + @raises(ValueError) + def testWrongNPOLModel(self): + hlet = headerlet.create_headerlet(self.comp_file, hdrname='test1', + npolfile='WRONG') + hlet.apply_as_primary(self.comp_file) + + @raises(ValueError) + def testWrongD2IMModel(self): + hlet = headerlet.create_headerlet(self.comp_file, hdrname='test1', + d2imfile='WRONG') + hlet.apply_as_primary(self.comp_file) + + def test_apply_as_primary_method(self): + hlet = headerlet.create_headerlet(self.comp_file, hdrname='test2') + hlet['SIPWCS', 1].header['CRPIX1'] = 1 + hlet['SIPWCS', 1].header['CRPIX2'] = 1 + hlet['SIPWCS', 2].header['CRPIX1'] = 2 + hlet['SIPWCS', 2].header['CRPIX2'] = 2 + hlet.apply_as_primary(self.comp_file) + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [('SCI', 1), ('SCI', 2)], + [("SIPWCS", 1), ("SIPWCS", 2)], + verbose=True)[0]) + # repeated hlet should not change sci file + try: + headerlet.apply_headerlet_as_primary(self.comp_file, 'hdr1_hlet.fits') + except: + pass + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [('SCI', 1), ('SCI', 2)], + [("SIPWCS", 1), ("SIPWCS", 2)], + verbose=True)[0]) + + def test_apply_as_alternate_method(self): + hlet = headerlet.create_headerlet(self.comp_file, hdrname='test1') + hlet.apply_as_alternate(self.comp_file, wcskey='K', wcsname='KK') + hlet.writeto(self.headerlet_name, clobber=True) + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [('SCI', 1), ('SCI', 2)], + [("SIPWCS", 1), ("SIPWCS", 2)], + scikey='K', verbose=True)[0]) + headerlet.apply_headerlet_as_alternate(self.comp_file, + self.headerlet_name, wcskey='P') + assert(wcsdiff.is_wcs_identical(self.comp_file, self.headerlet_name, + [('SCI', 1), ('SCI', 2)], + [("SIPWCS", 1), ("SIPWCS", 2)], + scikey='P', verbose=True)[0]) + + +class TestLegacyFiles: + + def setup_class(self): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + self.acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + self.legacy_file = get_filepath('jlegacy.fits', current_dir) + + try: + os.remove(self.acs_file) + os.remove(self.legacy_file) + except OSError: + pass + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + shutil.copyfile(acs_orig_file, self.acs_file) + shutil.copyfile(acs_orig_file, self.legacy_file) + + fits.setval(self.acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(self.acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(self.acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + updatewcs.updatewcs(self.acs_file) + + ''' + def setUp(self): + try: + os.remove('j94f05bgq_flt.fits') + os.remove('jlegacy.fits') + except OSError: + pass + shutil.copyfile('orig/j94f05bgq_flt.fits', './j94f05bgq_flt.fits') + shutil.copyfile('j94f05bgq_flt.fits', './jlegacy.fits') + updatewcs.updatewcs('j94f05bgq_flt.fits') + ''' + + def test_update_legacy_file(self): + hlet = headerlet.create_headerlet(self.acs_file) + hlet.apply_as_primary(self.legacy_file, archive=False, attach=False) + assert(wcsdiff.is_wcs_identical(self.acs_file, self.legacy_file, + [('SCI', 1), ('SCI', 2)], + [("SCI", 1), ("SCI", 2)], + verbose=True)[0]) diff --git a/stwcs/tests/test_updatewcs.py b/stwcs/tests/test_updatewcs.py new file mode 100644 index 0000000..dc5a34f --- /dev/null +++ b/stwcs/tests/test_updatewcs.py @@ -0,0 +1,305 @@ +import shutil +import os + +from astropy import wcs +from astropy.io import fits +from stwcs import updatewcs +from stwcs.updatewcs import apply_corrections +from stwcs.distortion import utils as dutils +from stwcs.wcsutil import HSTWCS +import numpy as np +from numpy.testing import utils +import pytest + + +from . import data +data_path = os.path.split(os.path.abspath(data.__file__))[0] + + +def get_filepath(filename, directory=data_path): + return os.path.join(directory, filename) + + +class TestStwcs(object): + + def setup_class(self): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + self.ref_file = get_filepath('j94f05bgq_flt_r.fits', current_dir) + self.acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + try: + os.remove(self.acs_file) + os.remove(self.ref_file) + except OSError: + pass + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + shutil.copyfile(acs_orig_file, self.acs_file) + + fits.setval(self.acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(self.acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(self.acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + updatewcs.updatewcs(self.acs_file) + #self.ref_file = ref_file + shutil.copyfile(self.acs_file, self.ref_file) + + self.w1 = HSTWCS(self.acs_file, ext=1) + self.w4 = HSTWCS(self.acs_file, ext=4) + self.w = wcs.WCS() + + def test_default(self): + crval = np.array([0., 0.]) + crpix = np.array([0., 0.]) + cdelt = np.array([1., 1.]) + pc = np.array([[1., 0], [0., 1.]]) + ctype = np.array(['', '']) + utils.assert_almost_equal(self.w.wcs.crval, crval) + utils.assert_almost_equal(self.w.wcs.crpix, crpix) + utils.assert_almost_equal(self.w.wcs.cdelt, cdelt) + utils.assert_almost_equal(self.w.wcs.pc, pc) + assert((self.w.wcs.ctype == np.array(['', ''])).all()) + + def test_simple_sci1(self): + """ + A simple sanity check that CRPIX corresponds to CRVAL within wcs + """ + px1 = np.array([self.w1.wcs.crpix]) + rd1 = np.array([self.w1.wcs.crval]) + assert(((self.w1.all_pix2world(px1, 1) - rd1) < 5E-7).all()) + + def test_simple_sci2(self): + """ + A simple sanity check that CRPIX corresponds to CRVAL within wcs + """ + px4 = np.array([self.w4.wcs.crpix]) + rd4 = np.array([self.w4.wcs.crval]) + assert(((self.w4.all_pix2world(px4, 1) - rd4) < 2E-6).all()) + + def test_pipeline_sci1(self): + """ + Internal consistency check of the wcs pipeline + """ + px = np.array([[100, 125]]) + sky1 = self.w1.all_pix2world(px, 1) + dpx1 = self.w1.det2im(px, 1) + #fpx1 = dpx1 + (self.w1.sip_pix2foc(dpx1,1)-dpx1) + (self.w1.p4_pix2foc(dpx1,1)-dpx1) + fpx1 = dpx1 + (self.w1.sip_pix2foc(dpx1, 1)-dpx1+self.w1.wcs.crpix) + \ + (self.w1.p4_pix2foc(dpx1, 1)-dpx1) + pipelinepx1 = self.w1.wcs_pix2world(fpx1, 1) + utils.assert_almost_equal(pipelinepx1, sky1) + + def test_pipeline_sci2(self): + """ + Internal consistency check of the wcs pipeline + """ + px = np.array([[100, 125]]) + sky4 = self.w4.all_pix2world(px, 1) + dpx4 = self.w4.det2im(px, 1) + fpx4 = dpx4 + (self.w4.sip_pix2foc(dpx4, 1)-dpx4 + self.w4.wcs.crpix) + \ + (self.w4.p4_pix2foc(dpx4, 1)-dpx4) + pipelinepx4 = self.w4.wcs_pix2world(fpx4, 1) + utils.assert_almost_equal(pipelinepx4, sky4) + + def test_outwcs(self): + """ + Test the WCS of the output image + """ + outwcs = dutils.output_wcs([self.w1, self.w4]) + + #print('outwcs.wcs.crval = {0}'.format(outwcs.wcs.crval)) + utils.assert_allclose( + outwcs.wcs.crval, np.array([5.65109952, -72.0674181]), rtol=1e-7) + + utils.assert_almost_equal(outwcs.wcs.crpix, np.array([2107.0, 2118.5])) + utils.assert_almost_equal( + outwcs.wcs.cd, + np.array([[1.2787045268089949e-05, 5.4215042082174661e-06], + [5.4215042082174661e-06, -1.2787045268089949e-05]])) + assert(outwcs._naxis1 == 4214) + assert(outwcs._naxis2 == 4237) + + def test_repeate(self): + # make sure repeated runs of updatewcs do not change the WCS. + updatewcs.updatewcs(self.acs_file) + w1 = HSTWCS(self.acs_file, ext=('SCI', 1)) + w4 = HSTWCS(self.acs_file, ext=('SCI', 2)) + w1r = HSTWCS(self.ref_file, ext=('SCI', 1)) + w4r = HSTWCS(self.ref_file, ext=('SCI', 2)) + utils.assert_almost_equal(w1.wcs.crval, w1r.wcs.crval) + utils.assert_almost_equal(w1.wcs.crpix, w1r.wcs.crpix) + utils.assert_almost_equal(w1.wcs.cdelt, w1r.wcs.cdelt) + utils.assert_almost_equal(w1.wcs.cd, w1r.wcs.cd) + assert((np.array(w1.wcs.ctype) == np.array(w1r.wcs.ctype)).all()) + utils.assert_almost_equal(w1.sip.a, w1r.sip.a) + utils.assert_almost_equal(w1.sip.b, w1r.sip.b) + utils.assert_almost_equal(w4.wcs.crval, w4r.wcs.crval) + utils.assert_almost_equal(w4.wcs.crpix, w4r.wcs.crpix) + utils.assert_almost_equal(w4.wcs.cdelt, w4r.wcs.cdelt) + utils.assert_almost_equal(w4.wcs.cd, w4r.wcs.cd) + assert((np.array(self.w4.wcs.ctype) == np.array(w4r.wcs.ctype)).all()) + utils.assert_almost_equal(w4.sip.a, w4r.sip.a) + utils.assert_almost_equal(w4.sip.b, w4r.sip.b) + + +def test_remove_npol_distortion(): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + try: + os.remove(acs_file) + except OSError: + pass + + shutil.copyfile(acs_orig_file, acs_file) + fits.setval(acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + + updatewcs.updatewcs(acs_file) + fits.setval(acs_file, keyword="NPOLFILE", value="N/A") + updatewcs.updatewcs(acs_file) + w1 = HSTWCS(acs_file, ext=("SCI", 1)) + w4 = HSTWCS(acs_file, ext=("SCI", 2)) + assert w1.cpdis1 is None + assert w4.cpdis2 is None + + +def test_remove_d2im_distortion(): + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + try: + os.remove(acs_file) + except OSError: + pass + shutil.copyfile(acs_orig_file, acs_file) + fits.setval(acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + + updatewcs.updatewcs(acs_file) + fits.setval(acs_file, keyword="D2IMFILE", value="N/A") + updatewcs.updatewcs(acs_file) + w1 = HSTWCS(acs_file, ext=("SCI", 1)) + w4 = HSTWCS(acs_file, ext=("SCI", 2)) + assert w1.det2im1 is None + assert w4.det2im2 is None + + +def test_missing_idctab(): + """ Tests that an IOError is raised if an idctab file is not found on disk.""" + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + try: + os.remove(acs_file) + except OSError: + pass + shutil.copyfile(acs_orig_file, acs_file) + + fits.setval(acs_file, keyword="IDCTAB", value="my_missing_idctab.fits") + with pytest.raises(IOError): + updatewcs.updatewcs(acs_file) + + +def test_missing_npolfile(): + """ Tests that an IOError is raised if an NPOLFILE file is not found on disk.""" + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + try: + os.remove(acs_file) + except OSError: + pass + + shutil.copyfile(acs_orig_file, acs_file) + + fits.setval(acs_file, keyword="NPOLFILE", value="missing_npl.fits") + with pytest.raises(IOError): + updatewcs.updatewcs(acs_file) + + +def test_missing_d2imfile(): + """ Tests that an IOError is raised if a D2IMFILE file is not found on disk.""" + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + try: + os.remove(acs_file) + except OSError: + pass + + shutil.copyfile(acs_orig_file, acs_file) + + fits.setval(acs_file, keyword="D2IMFILE", value="missing_d2i.fits") + with pytest.raises(IOError): + updatewcs.updatewcs(acs_file) + + +def test_found_idctab(): + """ Tests the return value of apply_corrections.foundIDCTAB().""" + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + try: + os.remove(acs_file) + except OSError: + pass + + shutil.copyfile(acs_orig_file, acs_file) + fits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + fits.setval(acs_file, keyword="IDCTAB", value="N/A") + corrections = apply_corrections.setCorrections(acs_file) + assert('MakeWCS' not in corrections) + assert('TDDCor' not in corrections) + assert('CompSIP' not in corrections) + + +def test_add_radesys(): + """ test that RADESYS was successfully added to headers.""" + acs_orig_file = get_filepath('j94f05bgq_flt.fits') + current_dir = os.path.abspath(os.path.curdir) + acs_file = get_filepath('j94f05bgq_flt.fits', current_dir) + + idctab = get_filepath('postsm4_idc.fits') + npol_file = get_filepath('qbu16424j_npl.fits') + d2imfile = get_filepath('new_wfc_d2i.fits ') + + try: + os.remove(acs_file) + except OSError: + pass + + shutil.copyfile(acs_orig_file, acs_file) + fits.setval(acs_file, ext=0, keyword="IDCTAB", value=idctab) + fits.setval(acs_file, ext=0, keyword="NPOLFILE", value=npol_file) + fits.setval(acs_file, ext=0, keyword="D2IMFILE", value=d2imfile) + + #shutil.copyfile('orig/ibof01ahq_flt.fits', './ibof01ahq_flt.fits') + updatewcs.updatewcs(acs_file) + # updatewcs.updatewcs('ibof01ahq_flt.fits') + for ext in [('SCI', 1), ('SCI', 2)]: + hdr = fits.getheader(acs_file, ext) + assert hdr['RADESYS'] == 'FK5' + + #hdr = fits.getheader('ibof01ahq_flt.fits', ext=('SCI', 1)) + #assert hdr['RADESYS'] == 'ICRS' diff --git a/lib/stwcs/updatewcs/__init__.py b/stwcs/updatewcs/__init__.py index eb5e850..eb5e850 100644 --- a/lib/stwcs/updatewcs/__init__.py +++ b/stwcs/updatewcs/__init__.py diff --git a/lib/stwcs/updatewcs/apply_corrections.py b/stwcs/updatewcs/apply_corrections.py index 86b623a..86b623a 100644 --- a/lib/stwcs/updatewcs/apply_corrections.py +++ b/stwcs/updatewcs/apply_corrections.py diff --git a/lib/stwcs/updatewcs/corrections.py b/stwcs/updatewcs/corrections.py index d3641eb..d3641eb 100644 --- a/lib/stwcs/updatewcs/corrections.py +++ b/stwcs/updatewcs/corrections.py diff --git a/lib/stwcs/updatewcs/det2im.py b/stwcs/updatewcs/det2im.py index bddb37b..bddb37b 100644 --- a/lib/stwcs/updatewcs/det2im.py +++ b/stwcs/updatewcs/det2im.py diff --git a/lib/stwcs/updatewcs/makewcs.py b/stwcs/updatewcs/makewcs.py index 06c6f9c..06c6f9c 100644 --- a/lib/stwcs/updatewcs/makewcs.py +++ b/stwcs/updatewcs/makewcs.py diff --git a/lib/stwcs/updatewcs/npol.py b/stwcs/updatewcs/npol.py index 33579f0..33579f0 100644 --- a/lib/stwcs/updatewcs/npol.py +++ b/stwcs/updatewcs/npol.py diff --git a/lib/stwcs/updatewcs/utils.py b/stwcs/updatewcs/utils.py index 1214199..1214199 100644 --- a/lib/stwcs/updatewcs/utils.py +++ b/stwcs/updatewcs/utils.py diff --git a/lib/stwcs/updatewcs/wfpc2_dgeo.py b/stwcs/updatewcs/wfpc2_dgeo.py index e57bb5c..e57bb5c 100644 --- a/lib/stwcs/updatewcs/wfpc2_dgeo.py +++ b/stwcs/updatewcs/wfpc2_dgeo.py diff --git a/lib/stwcs/wcsutil/__init__.py b/stwcs/wcsutil/__init__.py index 65280be..65280be 100644 --- a/lib/stwcs/wcsutil/__init__.py +++ b/stwcs/wcsutil/__init__.py diff --git a/lib/stwcs/wcsutil/altwcs.py b/stwcs/wcsutil/altwcs.py index aae1a9f..aae1a9f 100644 --- a/lib/stwcs/wcsutil/altwcs.py +++ b/stwcs/wcsutil/altwcs.py diff --git a/lib/stwcs/wcsutil/convertwcs.py b/stwcs/wcsutil/convertwcs.py index a384eb1..a384eb1 100644 --- a/lib/stwcs/wcsutil/convertwcs.py +++ b/stwcs/wcsutil/convertwcs.py diff --git a/lib/stwcs/wcsutil/getinput.py b/stwcs/wcsutil/getinput.py index 8ee1123..8ee1123 100644 --- a/lib/stwcs/wcsutil/getinput.py +++ b/stwcs/wcsutil/getinput.py diff --git a/lib/stwcs/wcsutil/headerlet.py b/stwcs/wcsutil/headerlet.py index c0dd9b0..c0dd9b0 100644 --- a/lib/stwcs/wcsutil/headerlet.py +++ b/stwcs/wcsutil/headerlet.py diff --git a/lib/stwcs/wcsutil/hstwcs.py b/stwcs/wcsutil/hstwcs.py index bfebcfc..bfebcfc 100644 --- a/lib/stwcs/wcsutil/hstwcs.py +++ b/stwcs/wcsutil/hstwcs.py diff --git a/lib/stwcs/wcsutil/instruments.py b/stwcs/wcsutil/instruments.py index f662513..f662513 100644 --- a/lib/stwcs/wcsutil/instruments.py +++ b/stwcs/wcsutil/instruments.py diff --git a/lib/stwcs/wcsutil/mappings.py b/stwcs/wcsutil/mappings.py index 24038bf..24038bf 100644 --- a/lib/stwcs/wcsutil/mappings.py +++ b/stwcs/wcsutil/mappings.py diff --git a/lib/stwcs/wcsutil/mosaic.py b/stwcs/wcsutil/mosaic.py index 9d2d0a3..9d2d0a3 100644 --- a/lib/stwcs/wcsutil/mosaic.py +++ b/stwcs/wcsutil/mosaic.py diff --git a/lib/stwcs/wcsutil/wcscorr.py b/stwcs/wcsutil/wcscorr.py index 3f9b7d5..3f9b7d5 100644 --- a/lib/stwcs/wcsutil/wcscorr.py +++ b/stwcs/wcsutil/wcscorr.py diff --git a/lib/stwcs/wcsutil/wcsdiff.py b/stwcs/wcsutil/wcsdiff.py index cfc2d66..cfc2d66 100644 --- a/lib/stwcs/wcsutil/wcsdiff.py +++ b/stwcs/wcsutil/wcsdiff.py |