diff options
-rw-r--r-- | lib/stwcs/distortion/mutil.py | 27 | ||||
-rw-r--r-- | lib/stwcs/updatewcs/corrections.py | 62 | ||||
-rw-r--r-- | setup.cfg | 2 |
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) @@ -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 |