summaryrefslogtreecommitdiff
path: root/distortion/coeff_converter.py
blob: e31854d7b1e26c6c9ae3d5aca77ca8e7cf34de81 (plain) (blame)
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
import numpy as np
import pyfits
import pywcs

def sip2idc(wcs):
    """
    Converts SIP style coefficients to IDCTAB coefficients.
    
    :Parameters:
    `wcs`: pyfits.Header or pywcs.WCS object
    """
    if isinstance(wcs,pyfits.Header):
        ocx10 = wcs.get('OCX10', None)
        ocx11 = wcs.get('OCX11', None)
        ocy10 = wcs.get('OCY10', None)
        ocy11 = wcs.get('OCY11', None)
        order = hdr.get('A_ORDER', None)
        sipa, sipb = _read_sip_kw(header)
        if sipa == None or sipb == None:
            print 'SIP coefficients are not available.\n'
            print 'Cannot convert SIP to IDC coefficients.\n'
            return
    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
        try:
            sipa = wcs.sip.a
            sipb = wcs.sip.b
        except AttributeError:
            print 'SIP coefficients are not available.\n'
            print 'Cannot convert SIP to IDC coefficients.\n'
            return
    else:
        print 'Input to sip2idc must be a PyFITS header or a wcsutil.HSTWCS object\n'
        return
    
    try:
        order = wcs.sip.a_order
    except AttributeError:
        print 'SIP model order unknown, exiting ...\n'
        return

    if None in [ocx10, ocx11, ocy10, ocy11]:
        print 'First order IDC coefficients not found, exiting ...\n'
        return
    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 header.has_key("A_ORDER"):
        if not header.has_key("B_ORDER"):
            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 header.has_key("B_ORDER"):
        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
"""