drizzle 2.0.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of drizzle might be problematic. Click here for more details.

@@ -0,0 +1,29 @@
1
+ import numpy as np
2
+
3
+ from drizzle import cdrizzle
4
+
5
+
6
+ def test_cdrizzle():
7
+ """
8
+ Call C unit tests for cdrizzle, which are in the src/tests directory
9
+ """
10
+
11
+ size = 100
12
+ data = np.zeros((size, size), dtype='float32')
13
+ weights = np.ones((size, size), dtype='float32')
14
+
15
+ pixmap = np.indices((size, size), dtype='float64')
16
+ pixmap = pixmap.transpose()
17
+
18
+ output_data = np.zeros((size, size), dtype='float32')
19
+ output_counts = np.zeros((size, size), dtype='float32')
20
+ output_context = np.zeros((size, size), dtype='int32')
21
+
22
+ cdrizzle.test_cdrizzle(
23
+ data,
24
+ weights,
25
+ pixmap,
26
+ output_data,
27
+ output_counts,
28
+ output_context,
29
+ )
@@ -0,0 +1,262 @@
1
+ from itertools import product
2
+ from math import sqrt
3
+
4
+ import numpy as np
5
+ import pytest
6
+
7
+ from drizzle.cdrizzle import clip_polygon, invert_pixmap
8
+
9
+ SQ2 = 1.0 / sqrt(2.0)
10
+
11
+
12
+ def _is_poly_eq(p1, p2, rtol=0, atol=4e-12):
13
+ if len(p1) != len(p2):
14
+ return False
15
+
16
+ p1 = p1[:]
17
+ for _ in p1:
18
+ p1.append(p1.pop(0))
19
+ if np.allclose(p1, p2, rtol=rtol, atol=atol):
20
+ return True
21
+ return False
22
+
23
+
24
+ def _coord_mapping(xin, yin):
25
+ crpix = (289, 348) # center of distortions
26
+ shift = (1000, 1000)
27
+ rmat = 2.0 * np.array([[0.78103169, 0.66712321], [-0.63246699, 0.74091539]])
28
+ x = xin - crpix[0]
29
+ y = yin - crpix[1]
30
+
31
+ # add non-linear distortions
32
+ x += 2.4e-6 * x**2 - 1.0e-7 * x * y + 3.1e-6 * y**2
33
+ y += 1.2e-6 * x**2 - 2.0e-7 * x * y + 1.1e-6 * y**2
34
+
35
+ x, y = np.dot(rmat, [x, y])
36
+ x += shift[0]
37
+ y += shift[1]
38
+
39
+ return x, y
40
+
41
+
42
+ def _roll_vertices(polygon, n=1):
43
+ n = n % len(polygon)
44
+ return polygon[n:] + polygon[:n]
45
+
46
+
47
+ def test_invert_pixmap():
48
+ yin, xin = np.indices((1000, 1200), dtype=float)
49
+ xin = xin.flatten()
50
+ yin = yin.flatten()
51
+
52
+ xout, yout = _coord_mapping(xin, yin)
53
+ xout = xout.reshape((1000, 1200))
54
+ yout = yout.reshape((1000, 1200))
55
+ pixmap = np.dstack([xout, yout])
56
+
57
+ test_coords = [
58
+ (300, 600),
59
+ (0, 0),
60
+ (1199, 999),
61
+ (0, 999),
62
+ (1199, 0),
63
+ (200, 0),
64
+ (0, 438),
65
+ (1199, 432),
66
+ ]
67
+
68
+ for xr, yr in test_coords:
69
+ xout_t, yout_t = _coord_mapping(xr, yr)
70
+ xyin = invert_pixmap(pixmap, [xout_t, yout_t], [[-0.5, 1199.5], [-0.5, 999.5]])
71
+ assert np.allclose(xyin, [xr, yr], atol=0.05)
72
+
73
+
74
+ def test_invert_small_pixmap():
75
+ yin, xin = np.indices((2, 2), dtype=float)
76
+ pixmap = np.dstack([xin, yin])
77
+
78
+ test_coords = list(product(*(2 * [[-0.5, 1.5]])))
79
+
80
+ for xr, yr in test_coords:
81
+ xyin = invert_pixmap(pixmap, [xr, yr], [[-0.5, 1.5], [-0.5, 1.5]])
82
+ assert np.allclose(xyin, [xr, yr], atol=0.05)
83
+
84
+
85
+ def test_poly_intersection_with_self():
86
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
87
+
88
+ for k in range(4):
89
+ q = _roll_vertices(p, k)
90
+
91
+ pq = clip_polygon(q, p)
92
+ assert _is_poly_eq(pq, q)
93
+
94
+
95
+ @pytest.mark.parametrize(
96
+ 'shift', [(0.25, 0.1), (-0.25, -0.1), (-0.25, 0.1), (0.25, -0.1)],
97
+ )
98
+ def test_poly_intersection_shifted(shift):
99
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
100
+ sx, sy = shift
101
+ pq_ref = sorted(
102
+ [
103
+ (max(0, sx), max(0, sy)),
104
+ (min(1, sx + 1), max(0, sy)),
105
+ (min(1, sx + 1), min(1, sy + 1)),
106
+ (max(0, sx), min(1, sy + 1)),
107
+ ],
108
+ )
109
+
110
+ for k in range(4):
111
+ q = [(x + sx, y + sy) for x, y in p]
112
+ q = _roll_vertices(q, k)
113
+ pq = clip_polygon(q, p)
114
+ assert np.allclose(sorted(pq), pq_ref)
115
+
116
+
117
+ @pytest.mark.parametrize(
118
+ 'shift', [(0, 70), (70, 0), (0, -70), (-70, 0)],
119
+ )
120
+ def test_poly_intersection_shifted_large(shift):
121
+ p = [(-0.5, -0.5), (99.5, -0.5), (99.5, 99.5), (-0.5, 99.5)]
122
+ sx, sy = shift
123
+ pq_ref = sorted(
124
+ [
125
+ (max(-0.5, -0.5 + sx), max(-0.5, -0.5 + sy)),
126
+ (min(99.5, 99.5 + sx), max(-0.5, -0.5 + sy)),
127
+ (min(99.5, 99.5 + sx), min(99.5, 99.5 + sy)),
128
+ (max(-0.5, -0.5 + sx), min(99.5, 99.5 + sy)),
129
+ ],
130
+ )
131
+
132
+ for k in range(4):
133
+ q = [(x + sx, y + sy) for x, y in p]
134
+ q = _roll_vertices(q, k)
135
+ pq = clip_polygon(p, q)
136
+ assert len(pq) == 4
137
+ assert np.allclose(sorted(pq), pq_ref)
138
+
139
+
140
+ def test_poly_intersection_rotated45():
141
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
142
+ q = [(0, 0), (SQ2, -SQ2), (2.0 * SQ2, 0), (SQ2, SQ2)]
143
+ pq_ref = [(0, 0), (SQ2, SQ2), (1, 0), (1, SQ2 / (1.0 + SQ2))]
144
+
145
+ for k in range(4):
146
+ q = _roll_vertices(q, k)
147
+ pq = clip_polygon(p, q)
148
+ assert np.allclose(sorted(pq), pq_ref)
149
+
150
+
151
+ @pytest.mark.parametrize(
152
+ 'axis', [0, 1],
153
+ )
154
+ def test_poly_intersection_flipped_axis(axis):
155
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
156
+ # (flipped wrt X-axis or Y-axis). Also change direction:
157
+ if axis == 0:
158
+ q = [(i, -j) for i, j in p][::-1]
159
+ else:
160
+ q = [(-i, j) for i, j in p][::-1]
161
+
162
+ for k in range(4):
163
+ q = _roll_vertices(q, k)
164
+ pq = clip_polygon(p, q)
165
+ assert len(pq) == 0
166
+
167
+
168
+ def test_poly_intersection_reflect_origin():
169
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
170
+ # reflect wrt origin:
171
+ q = [(-i, -j) for i, j in p]
172
+
173
+ for k in range(4):
174
+ q = _roll_vertices(q, k)
175
+ pq = clip_polygon(p, q)
176
+ assert not pq
177
+
178
+
179
+ @pytest.mark.parametrize(
180
+ 'q,small',
181
+ [
182
+ ([(0.1, 0.1), (0.9, 0.1), (0.9, 0.9), (0.1, 0.9)], True),
183
+ ([(0.0, 0.0), (1.0, 0.0), (1.0, 0.4), (0.0, 0.4)], True),
184
+ ([(-0.1, -0.1), (1.1, -0.1), (1.1, 1.1), (-0.1, 1.1)], False),
185
+ ],
186
+ )
187
+ def test_poly_includes_the_other(q, small):
188
+ wnd = [(0, 0), (1, 0), (1, 1), (0, 1)]
189
+
190
+ for k in range(4):
191
+ q = _roll_vertices(q, k)
192
+ qp = clip_polygon(q, wnd)
193
+
194
+ assert _is_poly_eq(qp, q if small else wnd)
195
+
196
+
197
+ @pytest.mark.parametrize(
198
+ 'q',
199
+ [
200
+ [(0, 0), (1, 0), (0.5, 0.6)],
201
+ [(0.1, 0), (0.9, 0), (0.5, 0.6)],
202
+ ],
203
+ )
204
+ def test_poly_triangle_common_side(q):
205
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
206
+ sq = sorted(q)
207
+
208
+ for k in range(3):
209
+ q = _roll_vertices(q, k)
210
+ pq = clip_polygon(p, q)
211
+ assert np.allclose(sq, sorted(pq))
212
+
213
+
214
+ def test_poly_triangle_common_side_lg():
215
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
216
+ q = [(-0.1, 0), (1.1, 0), (0.5, 0.6)]
217
+ ref_pq = [(0, 0), (0, 0.1), (0.5, 0.6), (1, 0), (1, 0.1)]
218
+
219
+ for k in range(3):
220
+ q = _roll_vertices(q, k)
221
+ pq = clip_polygon(p, q)
222
+ assert np.allclose(ref_pq, sorted(pq))
223
+
224
+
225
+ def test_poly_intersection_with_self_extra_vertices():
226
+ p = [(0, 0), (1, 0), (1, 1), (0, 1)]
227
+ p_ref = [(0, 0), (0, 1), (1, 0), (1, 1)]
228
+ # Q is same as P with extra vertices places along P's edges
229
+ q = [(0, 0), (0.5, 0), (1, 0), (1, 0.4), (1, 1), (0.7, 1), (0, 1), (0, 0.2)]
230
+
231
+ for k in range(4):
232
+ q = _roll_vertices(q, k)
233
+
234
+ pq = clip_polygon(p, q)
235
+ assert sorted(pq) == p_ref
236
+
237
+ pq = clip_polygon(q, p)
238
+ assert sorted(pq) == p_ref
239
+
240
+
241
+ def test_intersection_case01():
242
+ # a real case of failure of the code from PR #104
243
+ p = [
244
+ (4517.377385, 8863.424319),
245
+ (5986.279535, 12966.888023),
246
+ (1917.908619, 14391.538506),
247
+ (453.893145, 10397.019260),
248
+ ]
249
+
250
+ wnd = [(-0.5, -0.5), (5224.5, -0.5), (5224.5, 15999.5), (-0.5, 15999.5)]
251
+
252
+ cp_ref = [
253
+ (4517.377385, 8863.424319),
254
+ (5224.5, 10838.812526396974),
255
+ (5224.5, 13233.64580022457),
256
+ (1917.908619, 14391.538506),
257
+ (453.893145, 10397.01926),
258
+ ]
259
+
260
+ cp = clip_polygon(p, wnd)
261
+
262
+ assert _is_poly_eq(cp, cp_ref)