source: sasview/test/sasguiframe/test/utest_manipulations.py @ f53d684

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since f53d684 was f53d684, checked in by Paul Kienzle <pkienzle@…>, 7 years ago

Make tests work from any directory and functional without special runner script (#124)

  • Property mode set to 100644
File size: 12.0 KB
Line 
1"""
2    Unit tests for data manipulations
3"""
4# TODO: what happens if you add a Data1D to a Data2D?
5
6import math
7import os.path
8import unittest
9
10import numpy as np
11
12from sas.sascalc.dataloader.loader import Loader
13from sas.sasgui.guiframe.dataFitting import Data1D
14from sas.sasgui.guiframe.dataFitting import Data2D
15
16
17def find(filename):
18    return os.path.join(os.path.dirname(__file__), filename)
19
20
21class DataInfoTests(unittest.TestCase):
22
23    def setUp(self):
24        data = Loader().load(find("cansas1d.xml"))
25        self.data = data[0]
26
27    def test_clone1D(self):
28        """
29            Test basic cloning
30        """
31        clone = self.data.clone_without_data()
32
33        for i in range(len(self.data.detector)):
34            self.assertEqual(
35                self.data.detector[i].distance, clone.detector[i].distance)
36
37
38class Theory1DTests(unittest.TestCase):
39
40    def setUp(self):
41        data = Loader().load(find("cansas1d.xml"))
42        self.data = data[0]
43
44    def test_clone_theory1D(self):
45        """
46            Test basic cloning
47        """
48        theory = Data1D(x=[], y=[], dy=None)
49        theory.clone_without_data(clone=self.data)
50        theory.copy_from_datainfo(data1d=self.data)
51        for i in range(len(self.data.detector)):
52            self.assertEqual(
53                self.data.detector[i].distance, theory.detector[i].distance)
54
55        for i in range(len(self.data.x)):
56            self.assertEqual(self.data.x[i], theory.x[i])
57            self.assertEqual(self.data.y[i], theory.y[i])
58            self.assertEqual(self.data.dy[i], theory.dy[i])
59
60
61class ManipTests(unittest.TestCase):
62
63    def setUp(self):
64        # Create two data sets to play with
65        x_0 = np.ones(5)
66        for i in range(5):
67            x_0[i] = x_0[i] * (i + 1.0)
68
69        y_0 = 2.0 * np.ones(5)
70        dy_0 = 0.5 * np.ones(5)
71        self.data = Data1D(x_0, y_0, dy=dy_0)
72
73        x = self.data.x
74        y = np.ones(5)
75        dy = np.ones(5)
76        self.data2 = Data1D(x, y, dy=dy)
77
78    def test_load(self):
79        """
80            Test whether the test file was loaded properly
81        """
82        # There should be 5 entries in the file
83        self.assertEqual(len(self.data.x), 5)
84
85        for i in range(5):
86            # The x values should be from 1 to 5
87            self.assertEqual(self.data.x[i], float(i + 1))
88
89            # All y-error values should be 0.5
90            self.assertEqual(self.data.dy[i], 0.5)
91
92            # All y values should be 2.0
93            self.assertEqual(self.data.y[i], 2.0)
94
95    def test_add(self):
96        result = self.data2 + self.data
97        for i in range(5):
98            self.assertEqual(result.y[i], 3.0)
99            self.assertEqual(result.dy[i], math.sqrt(0.5**2 + 1.0))
100
101    def test_sub(self):
102        result = self.data2 - self.data
103        for i in range(5):
104            self.assertEqual(result.y[i], -1.0)
105            self.assertEqual(result.dy[i], math.sqrt(0.5**2 + 1.0))
106
107    def test_mul(self):
108        result = self.data2 * self.data
109        for i in range(5):
110            self.assertEqual(result.y[i], 2.0)
111            self.assertEqual(result.dy[i], math.sqrt(
112                (0.5 * 1.0)**2 + (1.0 * 2.0)**2))
113
114    def test_div(self):
115        result = self.data2 / self.data
116        for i in range(5):
117            self.assertEqual(result.y[i], 0.5)
118            self.assertEqual(result.dy[i], math.sqrt(
119                (1.0 / 2.0)**2 + (0.5 * 1.0 / 4.0)**2))
120
121    def test_radd(self):
122        result = self.data + 3.0
123        for i in range(5):
124            self.assertEqual(result.y[i], 5.0)
125            self.assertEqual(result.dy[i], 0.5)
126
127        result = 3.0 + self.data
128        for i in range(5):
129            self.assertEqual(result.y[i], 5.0)
130            self.assertEqual(result.dy[i], 0.5)
131
132    def test_rsub(self):
133        result = self.data - 3.0
134        for i in range(5):
135            self.assertEqual(result.y[i], -1.0)
136            self.assertEqual(result.dy[i], 0.5)
137
138        result = 3.0 - self.data
139        for i in range(5):
140            self.assertEqual(result.y[i], 1.0)
141            self.assertEqual(result.dy[i], 0.5)
142
143    def test_rmul(self):
144        result = self.data * 3.0
145        for i in range(5):
146            self.assertEqual(result.y[i], 6.0)
147            self.assertEqual(result.dy[i], 1.5)
148
149        result = 3.0 * self.data
150        for i in range(5):
151            self.assertEqual(result.y[i], 6.0)
152            self.assertEqual(result.dy[i], 1.5)
153
154    def test_rdiv(self):
155        result = self.data / 4.0
156        for i in range(5):
157            self.assertEqual(result.y[i], 0.5)
158            self.assertEqual(result.dy[i], 0.125)
159
160        result = 6.0 / self.data
161        for i in range(5):
162            self.assertEqual(result.y[i], 3.0)
163            self.assertEqual(result.dy[i], 6.0 * 0.5 / 4.0)
164
165
166class Manin2DTests(unittest.TestCase):
167
168    def setUp(self):
169        # Create two data sets to play with
170        x_0 = 2.0 * np.ones(25)
171        dx_0 = 0.5 * np.ones(25)
172        qx_0 = np.arange(25)
173        qy_0 = np.arange(25)
174        mask_0 = np.zeros(25)
175        dqx_0 = np.arange(25) / 100
176        dqy_0 = np.arange(25) / 100
177        q_0 = np.sqrt(qx_0 * qx_0 + qy_0 * qy_0)
178        self.data = Data2D(image=x_0, err_image=dx_0, qx_data=qx_0,
179                           qy_data=qy_0, q_data=q_0, mask=mask_0,
180                           dqx_data=dqx_0, dqy_data=dqy_0)
181
182        y = np.ones(25)
183        dy = np.ones(25)
184        qx = np.arange(25)
185        qy = np.arange(25)
186        mask = np.zeros(25)
187        q = np.sqrt(qx * qx + qy * qy)
188        self.data2 = Data2D(image=y, err_image=dy, qx_data=qx, qy_data=qy,
189                            q_data=q, mask=mask)
190
191    def test_load(self):
192        """
193            Test whether the test file was loaded properly
194        """
195        # There should be 5 entries in the file
196        self.assertEqual(np.size(self.data.data), 25)
197
198        for i in range(25):
199            # All y-error values should be 0.5
200            self.assertEqual(self.data.err_data[i], 0.5)
201
202            # All y values should be 2.0
203            self.assertEqual(self.data.data[i], 2.0)
204
205    def test_add(self):
206        result = self.data2 + self.data
207        for i in range(25):
208            self.assertEqual(result.data[i], 3.0)
209            self.assertEqual(result.err_data[i], math.sqrt(0.5**2 + 1.0))
210
211    def test_sub(self):
212        result = self.data2 - self.data
213        for i in range(25):
214            self.assertEqual(result.data[i], -1.0)
215            self.assertEqual(result.err_data[i], math.sqrt(0.5**2 + 1.0))
216
217    def test_mul(self):
218        result = self.data2 * self.data
219        for i in range(25):
220            self.assertEqual(result.data[i], 2.0)
221            self.assertEqual(result.err_data[i], math.sqrt(
222                (0.5 * 1.0)**2 + (1.0 * 2.0)**2))
223
224    def test_div(self):
225        result = self.data2 / self.data
226        for i in range(25):
227            self.assertEqual(result.data[i], 0.5)
228            self.assertEqual(result.err_data[i], math.sqrt(
229                (1.0 / 2.0)**2 + (0.5 * 1.0 / 4.0)**2))
230
231    def test_radd(self):
232        result = self.data + 3.0
233        for i in range(25):
234            self.assertEqual(result.data[i], 5.0)
235            self.assertEqual(result.err_data[i], 0.5)
236
237        result = 3.0 + self.data
238        for i in range(25):
239            self.assertEqual(result.data[i], 5.0)
240            self.assertEqual(result.err_data[i], 0.5)
241
242    def test_rsub(self):
243        result = self.data - 3.0
244        for i in range(25):
245            self.assertEqual(result.data[i], -1.0)
246            self.assertEqual(result.err_data[i], 0.5)
247
248        result = 3.0 - self.data
249        for i in range(25):
250            self.assertEqual(result.data[i], 1.0)
251            self.assertEqual(result.err_data[i], 0.5)
252
253    def test_rmul(self):
254        result = self.data * 3.0
255        for i in range(25):
256            self.assertEqual(result.data[i], 6.0)
257            self.assertEqual(result.err_data[i], 1.5)
258
259        result = 3.0 * self.data
260        for i in range(25):
261            self.assertEqual(result.data[i], 6.0)
262            self.assertEqual(result.err_data[i], 1.5)
263
264    def test_rdiv(self):
265        result = self.data / 4.0
266        for i in range(25):
267            self.assertEqual(result.data[i], 0.5)
268            self.assertEqual(result.err_data[i], 0.125)
269
270        result = 6.0 / self.data
271        for i in range(25):
272            self.assertEqual(result.data[i], 3.0)
273            self.assertEqual(result.err_data[i], 6.0 * 0.5 / 4.0)
274
275
276class ExtraManip2DTests(unittest.TestCase):
277
278    def setUp(self):
279        # Create two data sets to play with
280        x_0 = 2.0 * np.ones(25)
281        dx_0 = 0.5 * np.ones(25)
282        qx_0 = np.arange(25)
283        qy_0 = np.arange(25)
284        mask_0 = np.zeros(25)
285        dqx_0 = np.arange(25) / 100
286        dqy_0 = np.arange(25) / 100
287        q_0 = np.sqrt(qx_0 * qx_0 + qy_0 * qy_0)
288        self.data = Data2D(image=x_0, err_image=dx_0, qx_data=qx_0,
289                           qy_data=qy_0, q_data=q_0, mask=mask_0,
290                           dqx_data=dqx_0, dqy_data=dqy_0)
291
292        y = np.ones(25)
293        dy = np.ones(25)
294        qx = np.arange(25)
295        qy = np.arange(25)
296        mask = np.zeros(25)
297        q = np.sqrt(qx * qx + qy * qy)
298        self.data2 = Data2D(image=y, err_image=dy, qx_data=qx, qy_data=qy,
299                            q_data=q, mask=mask)
300
301    def test_load(self):
302        """
303            Test whether the test file was loaded properly
304        """
305        # There should be 5 entries in the file
306        self.assertEqual(np.size(self.data.data), 25)
307
308        for i in range(25):
309            # All y-error values should be 0.5
310            self.assertEqual(self.data.err_data[i], 0.5)
311
312            # All y values should be 2.0
313            self.assertEqual(self.data.data[i], 2.0)
314
315    def test_add(self):
316        result = self.data2 + self.data
317        for i in range(25):
318            self.assertEqual(result.data[i], 3.0)
319            self.assertEqual(result.err_data[i], math.sqrt(0.5**2 + 1.0))
320
321    def test_sub(self):
322        result = self.data2 - self.data
323        for i in range(25):
324            self.assertEqual(result.data[i], -1.0)
325            self.assertEqual(result.err_data[i], math.sqrt(0.5**2 + 1.0))
326
327    def test_mul(self):
328        result = self.data2 * self.data
329        for i in range(25):
330            self.assertEqual(result.data[i], 2.0)
331            self.assertEqual(result.err_data[i], math.sqrt(
332                (0.5 * 1.0)**2 + (1.0 * 2.0)**2))
333
334    def test_div(self):
335        result = self.data2 / self.data
336        for i in range(25):
337            self.assertEqual(result.data[i], 0.5)
338            self.assertEqual(result.err_data[i], math.sqrt(
339                (1.0 / 2.0)**2 + (0.5 * 1.0 / 4.0)**2))
340
341    def test_radd(self):
342        result = self.data + 3.0
343        for i in range(25):
344            self.assertEqual(result.data[i], 5.0)
345            self.assertEqual(result.err_data[i], 0.5)
346
347        result = 3.0 + self.data
348        for i in range(25):
349            self.assertEqual(result.data[i], 5.0)
350            self.assertEqual(result.err_data[i], 0.5)
351
352    def test_rsub(self):
353        result = self.data - 3.0
354        for i in range(25):
355            self.assertEqual(result.data[i], -1.0)
356            self.assertEqual(result.err_data[i], 0.5)
357
358        result = 3.0 - self.data
359        for i in range(25):
360            self.assertEqual(result.data[i], 1.0)
361            self.assertEqual(result.err_data[i], 0.5)
362
363    def test_rmul(self):
364        result = self.data * 3.0
365        for i in range(25):
366            self.assertEqual(result.data[i], 6.0)
367            self.assertEqual(result.err_data[i], 1.5)
368
369        result = 3.0 * self.data
370        for i in range(25):
371            self.assertEqual(result.data[i], 6.0)
372            self.assertEqual(result.err_data[i], 1.5)
373
374    def test_rdiv(self):
375        result = self.data / 4.0
376        for i in range(25):
377            self.assertEqual(result.data[i], 0.5)
378            self.assertEqual(result.err_data[i], 0.125)
379
380        result = 6.0 / self.data
381        for i in range(25):
382            self.assertEqual(result.data[i], 3.0)
383            self.assertEqual(result.err_data[i], 6.0 * 0.5 / 4.0)
384
385
386if __name__ == '__main__':
387    unittest.main()
Note: See TracBrowser for help on using the repository browser.