summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/stwcs/distortion/mutil.py27
-rw-r--r--lib/stwcs/updatewcs/corrections.py62
-rw-r--r--setup.cfg2
3 files changed, 76 insertions, 15 deletions
diff --git a/lib/stwcs/distortion/mutil.py b/lib/stwcs/distortion/mutil.py
index 80fd6bf..d116bbf 100644
--- a/lib/stwcs/distortion/mutil.py
+++ b/lib/stwcs/distortion/mutil.py
@@ -256,6 +256,9 @@ def readIDCtab (tabname, chip=1, date=None, direction='forward',
def read_tdd_coeffs(phdr, chip=1):
''' Read in the TDD related keywords from the PRIMARY header of the IDCTAB
'''
+ # Insure we have an integer form of chip
+ ic = int(chip)
+
skew_coeffs = {}
skew_coeffs['TDDORDER'] = 0
skew_coeffs['TDD_DATE'] = ""
@@ -266,9 +269,23 @@ def read_tdd_coeffs(phdr, chip=1):
skew_coeffs['TDD_CX_BETA'] = None
skew_coeffs['TDD_CX_ALPHA'] = None
- if "TDD_CYB1" in phdr:
+ # Skew-based TDD coefficients
+ skew_terms = ['TDD_CTB','TDD_CTA','TDD_CYA','TDD_CYB','TDD_CXA','TDD_CXB']
+ for s in skew_terms:
+ skew_coeffs[s] = None
+
+ if "TDD_CTB1" in phdr:
+ # We have the 2015-calibrated TDD correction to apply
+ # This correction is based on correcting the skew in the linear terms
+ # not just set polynomial terms
+ print("Using 2015-calibrated VAFACTOR-corrected TDD correction...")
+ skew_coeffs['TDD_DATE'] = phdr['TDD_DATE']
+ for s in skew_terms:
+ skew_coeffs[s] = phdr.get('{0}{1}'.format(s,ic),None)
+
+ elif "TDD_CYB1" in phdr:
# We have 2014-calibrated TDD correction to apply, not J.A.-derived values
- print "Using 2014-calibrated TDD correction..."
+ print("Using 2014-calibrated TDD correction...")
skew_coeffs['TDD_DATE'] = phdr['TDD_DATE']
# Read coefficients for TDD Y coefficient
cyb_kw = 'TDD_CYB{0}'.format(int(chip))
@@ -290,7 +307,7 @@ def read_tdd_coeffs(phdr, chip=1):
if "TDDORDER" in phdr:
n = int(phdr["TDDORDER"])
else:
- print 'TDDORDER kw not present, using default TDD correction'
+ print ('TDDORDER kw not present, using default TDD correction')
return None
a = np.zeros((n+1,), np.float64)
@@ -299,8 +316,8 @@ def read_tdd_coeffs(phdr, chip=1):
a[i] = phdr.get(("TDD_A%d" % i), 0.0)
b[i] = phdr.get(("TDD_B%d" % i), 0.0)
if (a==0).all() and (b==0).all():
- print 'Warning: TDD_A and TDD_B coeffiecients have values of 0, \n \
- but TDDORDER is %d.' % TDDORDER
+ print ('Warning: TDD_A and TDD_B coeffiecients have values of 0, \n \
+ but TDDORDER is %d.' % TDDORDER)
skew_coeffs['TDDORDER'] = n
skew_coeffs['TDD_DATE'] = phdr['TDD_DATE']
diff --git a/lib/stwcs/updatewcs/corrections.py b/lib/stwcs/updatewcs/corrections.py
index 5a51868..f44b73b 100644
--- a/lib/stwcs/updatewcs/corrections.py
+++ b/lib/stwcs/updatewcs/corrections.py
@@ -1,5 +1,6 @@
from __future__ import division # confidence high
+import copy
import datetime
import numpy as np
from numpy import linalg
@@ -64,20 +65,41 @@ class TDDCorr(object):
- Writes 2 new kw to the extension header: TDDALPHA and TDDBETA
"""
logger.info("\n\tStarting TDDCorr: %s" % time.asctime())
+ ext_wcs.idcmodel.ocx = copy.deepcopy(ext_wcs.idcmodel.cx)
+ ext_wcs.idcmodel.ocy = copy.deepcopy(ext_wcs.idcmodel.cy)
+
+ newkw = {'TDDALPHA': None, 'TDDBETA':None,
+ 'OCX10':ext_wcs.idcmodel.ocx[1,0],
+ 'OCX11':ext_wcs.idcmodel.ocx[1,1],
+ 'OCY10':ext_wcs.idcmodel.ocy[1,0],
+ 'OCY11':ext_wcs.idcmodel.ocy[1,1],
+ 'TDD_CTA':None, 'TDD_CTB':None,
+ 'TDD_CYA':None, 'TDD_CYB':None,
+ 'TDD_CXA':None, 'TDD_CXB':None}
if ext_wcs.idcmodel.refpix['skew_coeffs']is not None and \
+ ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CTB'] is not None:
+ cls.apply_tdd2idc2015(ref_wcs)
+ cls.apply_tdd2idc2015(ext_wcs)
+
+ newkw.update({
+ 'TDD_CTA':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CTA'],
+ 'TDD_CYA':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CYA'],
+ 'TDD_CXA':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CXA'],
+ 'TDD_CTB':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CTB'],
+ 'TDD_CYB':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CYB'],
+ 'TDD_CXB':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CXB']})
+
+ elif ext_wcs.idcmodel.refpix['skew_coeffs']is not None and \
ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CY_BETA'] is not None:
logger.info("\n\t Applying 2014-calibrated TDD: %s" % time.asctime())
# We have 2014-calibrated TDD, not J.A.-style TDD
cls.apply_tdd2idc2(ref_wcs)
cls.apply_tdd2idc2(ext_wcs)
- newkw = {'TDDALPHA': None, 'TDDBETA':None, 'OCX10':ext_wcs.idcmodel.cx[1,0],
- 'OCX11':ext_wcs.idcmodel.cx[1,1],'OCY10':ext_wcs.idcmodel.cy[1,0],
- 'OCY11':ext_wcs.idcmodel.cy[1,1],
- 'TDD_CYA':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CY_ALPHA'],
+ newkw.update({'TDD_CYA':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CY_ALPHA'],
'TDD_CYB':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CY_BETA'],
'TDD_CXA':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CX_ALPHA'],
- 'TDD_CXB':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CX_BETA']}
+ 'TDD_CXB':ext_wcs.idcmodel.refpix['skew_coeffs']['TDD_CX_BETA']})
else:
alpha, beta = cls.compute_alpha_beta(ext_wcs)
@@ -88,14 +110,32 @@ class TDDCorr(object):
ref_wcs.idcmodel.refpix['TDDALPHA'] = alpha
ref_wcs.idcmodel.refpix['TDDBETA'] = beta
- newkw = {'TDDALPHA': alpha, 'TDDBETA':beta, 'OCX10':ext_wcs.idcmodel.cx[1,0],
- 'OCX11':ext_wcs.idcmodel.cx[1,1],'OCY10':ext_wcs.idcmodel.cy[1,0],
- 'OCY11':ext_wcs.idcmodel.cy[1,1],
- 'TDD_CYA':None, 'TDD_CYB':None, 'TDD_CXA':None, 'TDD_CXB':None}
+ newkw.update( {'TDDALPHA': alpha, 'TDDBETA':beta} )
return newkw
updateWCS = classmethod(updateWCS)
+ def apply_tdd2idc2015(cls, hwcs):
+ """ Applies 2015-calibrated TDD correction to a couple of IDCTAB
+ coefficients for ACS/WFC observations.
+ """
+ if not isinstance(hwcs.date_obs,float):
+ year,month,day = hwcs.date_obs.split('-')
+ rdate = datetime.datetime(int(year),int(month),int(day))
+ rday = float(rdate.strftime("%j"))/365.25 + rdate.year
+ else:
+ rday = hwcs.date_obs
+
+ skew_coeffs = hwcs.idcmodel.refpix['skew_coeffs']
+ delta_date = rday - skew_coeffs['TDD_DATE']
+
+ hwcs.idcmodel.cx[1,1] = skew_coeffs['TDD_CXA'] + skew_coeffs['TDD_CXB']*delta_date
+ hwcs.idcmodel.cy[1,1] = skew_coeffs['TDD_CTA'] + skew_coeffs['TDD_CTB']*delta_date
+ hwcs.idcmodel.cy[1,0] = skew_coeffs['TDD_CYA'] + skew_coeffs['TDD_CYB']*delta_date
+ #print("CX[1,1]_TDD={}, CY[1,1]_TDD={}, CY[1,0]_TDD={}".format(hwcs.idcmodel.cx[1,1],hwcs.idcmodel.cy[1,1],hwcs.idcmodel.cy[1,0]))
+
+ apply_tdd2idc2015 = classmethod(apply_tdd2idc2015)
+
def apply_tdd2idc2(cls, hwcs):
""" Applies 2014-calibrated TDD correction to single IDCTAB coefficient
of an ACS/WFC observation.
@@ -111,17 +151,21 @@ class TDDCorr(object):
cy_beta = skew_coeffs['TDD_CY_BETA']
cy_alpha = skew_coeffs['TDD_CY_ALPHA']
delta_date = rday - skew_coeffs['TDD_DATE']
+ print("DELTA_DATE: {0} based on rday: {1}, TDD_DATE: {2}".format(delta_date,rday,skew_coeffs['TDD_DATE']))
+
if cy_alpha is None:
hwcs.idcmodel.cy[1,1] += cy_beta*delta_date
else:
new_beta = cy_alpha + cy_beta*delta_date
hwcs.idcmodel.cy[1,1] = new_beta
+ print("CY11: {0} based on alpha: {1}, beta: {2}".format(hwcs.idcmodel.cy[1,1],cy_alpha,cy_beta))
cx_beta = skew_coeffs['TDD_CX_BETA']
cx_alpha = skew_coeffs['TDD_CX_ALPHA']
if cx_alpha is not None:
new_beta = cx_alpha + cx_beta*delta_date
hwcs.idcmodel.cx[1,1] = new_beta
+ print("CX11: {0} based on alpha: {1}, beta: {2}".format(new_beta,cx_alpha,cx_beta))
apply_tdd2idc2 = classmethod(apply_tdd2idc2)
diff --git a/setup.cfg b/setup.cfg
index 2b9af68..d7c05da 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = stwcs
-version = 1.2.1.dev
+version = 1.2.2.dev
author = Nadia Dencheva, Warren Hack
author-email = help@stsci.edu
summary = Recomputes the WCS of an HST observation and puts all distortion