1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
from __future__ import (absolute_import, unicode_literals, division, print_function)
import numpy as np
from astropy.io import fits
from astropy import wcs as pywcs
def sip2idc(wcs):
"""
Converts SIP style coefficients to IDCTAB coefficients.
Parameters
----------
wcs : `astropy.io.fits.Header` or `astropy.wcs.WCS` object
"""
if isinstance(wcs, fits.Header):
ocx10 = wcs.get('OCX10', None)
ocx11 = wcs.get('OCX11', None)
ocy10 = wcs.get('OCY10', None)
ocy11 = wcs.get('OCY11', None)
order = wcs.get('A_ORDER', None)
sipa, sipb = _read_sip_kw(wcs)
if None in [ocx10, ocx11, ocy10, ocy11, sipa, sipb]:
print('Cannot convert SIP to IDC coefficients.\n')
return None, None
elif isinstance(wcs, pywcs.WCS):
try:
ocx10 = wcs.ocx10
ocx11 = wcs.ocx11
ocy10 = wcs.ocy10
ocy11 = wcs.ocy11
except AttributeError:
print('First order IDCTAB coefficients are not available.\n')
print('Cannot convert SIP to IDC coefficients.\n')
return None, None
try:
sipa = wcs.sip.a
sipb = wcs.sip.b
except AttributeError:
print('SIP coefficients are not available.')
print('Cannot convert SIP to IDC coefficients.\n')
return None, None
try:
order = wcs.sip.a_order
except AttributeError:
print('SIP model order unknown, exiting ...\n')
return None, None
else:
print('Input to sip2idc must be a PyFITS header or a wcsutil.HSTWCS object\n')
return
if None in [ocx10, ocx11, ocy10, ocy11]:
print('First order IDC coefficients not found, exiting ...\n')
return None, None
idc_coeff = np.array([[ocx11, ocx10], [ocy11, ocy10]])
cx = np.zeros((order + 1, order + 1), dtype=np.double)
cy = np.zeros((order + 1, order + 1), dtype=np.double)
for n in range(order + 1):
for m in range(order + 1):
if n >= m and n >= 2:
sipval = np.array([[sipa[m, n - m]], [sipb[m, n - m]]])
idcval = np.dot(idc_coeff, sipval)
cx[n, m] = idcval[0]
cy[n, m] = idcval[1]
cx[1, 0] = ocx10
cx[1, 1] = ocx11
cy[1, 0] = ocy10
cy[1, 1] = ocy11
return cx, cy
def _read_sip_kw(header):
"""
Reads SIP header keywords and returns an array of coefficients.
If no SIP header keywords are found, None is returned.
"""
if "A_ORDER" in header:
if "B_ORDER" not in header:
raise ValueError(
"A_ORDER provided without corresponding B_ORDER "
"keyword for SIP distortion")
m = int(header["A_ORDER"])
a = np.zeros((m + 1, m + 1), np.double)
for i in range(m + 1):
for j in range(m - i + 1):
a[i, j] = header.get("A_%d_%d" % (i, j), 0.0)
m = int(header["B_ORDER"])
b = np.zeros((m + 1, m + 1), np.double)
for i in range(m + 1):
for j in range(m - i + 1):
b[i, j] = header.get("B_%d_%d" % (i, j), 0.0)
elif "B_ORDER" in header:
raise ValueError(
"B_ORDER provided without corresponding A_ORDER "
"keyword for SIP distortion")
else:
a = None
b = None
return a, b
"""
def idc2sip(wcsobj, idctab = None):
if isinstance(wcs,pywcs.WCS):
try:
cx10 = wcsobj.ocx10
cx11 = wcsobj.cx11
cy10 = wcsobj.cy10
cy11 = wcsobj.cy11
except AttributeError:
print
try:
order = wcs.sip.a_order
except AttributeError:
print 'SIP model order unknown, exiting ...\n'
return
else:
print 'Input to sip2idc must be a PyFITS header or a wcsutil.HSTWCS object\n'
return
if None in [ocx10, ocx11, ocy10, ocy11]:
print 'First order IDC coefficients not found, exiting ...\n'
return
idc_coeff = np.array([[wcsobj.cx11, wcsobj.cx10], [wcsobj.cy11, wcsobj.cy10]])
cx = numpy.zeros((order+1,order+1), dtype=numpy.double)
cy = numpy.zeros((order+1,order+1), dtype=numpy.double)
for n in range(order+1):
for m in range(order+1):
if n >= m and n>=2:
sipval = numpy.array([[wcsobj.sip.a[n,m]],[wcsobj.sip.b[n,m]]])
idcval = numpy.dot(idc_coeff, sipval)
cx[m,n-m] = idcval[0]
cy[m,n-m] = idcval[1]
return cx, cy
"""
|