source: sasview/test/sasdataloader/test/utest_abs_reader.py @ fe15198

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since fe15198 was fe15198, checked in by krzywon, 6 years ago

Add unit tests to be sure the correct number of data sets are returned when loading data.

  • Property mode set to 100644
File size: 13.6 KB
Line 
1"""
2    Unit tests for data manipulations
3"""
4from __future__ import print_function
5
6import unittest
7import numpy as np
8from sas.sascalc.dataloader.loader import Loader
9from sas.sascalc.dataloader.readers.abs_reader import Reader as AbsReader
10from sas.sascalc.dataloader.readers.danse_reader import Reader as DANSEReader
11from sas.sascalc.dataloader.readers.cansas_reader import Reader as CANSASReader
12
13from sas.sascalc.dataloader.data_info import Data1D
14
15import os.path
16
17
18class abs_reader(unittest.TestCase):
19
20    def setUp(self):
21        reader = AbsReader()
22        self.data_list = reader.read("jan08002.ABS")
23        self.data = self.data_list[0]
24
25    def test_abs_checkdata(self):
26        """
27            Check the data content to see whether
28            it matches the specific file we loaded.
29            Check the units too to see whether the
30            Data1D defaults changed. Otherwise the
31            tests won't pass
32        """
33        self.assertEqual(self.data.filename, "jan08002.ABS")
34        self.assertEqual(self.data.meta_data['loader'], "IGOR 1D")
35
36        self.assertEqual(self.data.source.wavelength_unit, 'A')
37        self.assertEqual(self.data.source.wavelength, 6.0)
38
39        self.assertEqual(self.data.detector[0].distance_unit, 'mm')
40        self.assertEqual(self.data.detector[0].distance, 1000.0)
41
42        self.assertEqual(self.data.sample.transmission, 0.5667)
43
44        self.assertEqual(self.data.detector[0].beam_center_unit, 'mm')
45        center_x = 114.58*5.08
46        center_y = 64.22*5.08
47        self.assertEqual(self.data.detector[0].beam_center.x, center_x)
48        self.assertEqual(self.data.detector[0].beam_center.y, center_y)
49
50        self.assertEqual(self.data.y_unit, 'cm^{-1}')
51        self.assertEqual(self.data.x[0], 0.002618)
52        self.assertEqual(self.data.x[1], 0.007854)
53        self.assertEqual(self.data.x[2], 0.01309)
54        self.assertEqual(self.data.x[126], 0.5828)
55
56        self.assertEqual(self.data.y[0], 0.02198)
57        self.assertEqual(self.data.y[1], 0.02201)
58        self.assertEqual(self.data.y[2], 0.02695)
59        self.assertEqual(self.data.y[126], 0.2958)
60
61        self.assertEqual(self.data.dy[0], 0.002704)
62        self.assertEqual(self.data.dy[1], 0.001643)
63        self.assertEqual(self.data.dy[2], 0.002452)
64        self.assertEqual(self.data.dy[126], 1)
65
66    def test_checkdata2(self):
67        self.assertEqual(self.data.dy[126], 1)
68
69    def test_generic_loader(self):
70        # the generic loader should work as well
71        data = Loader().load("jan08002.ABS")
72        self.assertEqual(data[0].meta_data['loader'], "IGOR 1D")
73
74class DanseReaderTests(unittest.TestCase):
75
76    def setUp(self):
77        reader = DANSEReader()
78        self.data_list = reader.read("MP_New.sans")
79        self.data = self.data_list[0]
80
81    def test_checkdata(self):
82        """
83            Check the data content to see whether
84            it matches the specific file we loaded.
85            Check the units too to see whether the
86            Data1D defaults changed. Otherwise the
87            tests won't pass
88        """
89        self.assertEqual(len(self.data_list), 1)
90        self.assertEqual(self.data.filename, "MP_New.sans")
91        self.assertEqual(self.data.meta_data['loader'], "DANSE")
92
93        self.assertEqual(self.data.source.wavelength_unit, 'A')
94        self.assertEqual(self.data.source.wavelength, 7.5)
95
96        self.assertEqual(self.data.detector[0].distance_unit, 'mm')
97        self.assertAlmostEqual(self.data.detector[0].distance, 5414.99, 3)
98
99        self.assertEqual(self.data.detector[0].beam_center_unit, 'mm')
100        center_x = 68.74*5.0
101        center_y = 64.77*5.0
102        self.assertEqual(self.data.detector[0].beam_center.x, center_x)
103        self.assertEqual(self.data.detector[0].beam_center.y, center_y)
104
105        self.assertEqual(self.data.I_unit, '1/cm')
106        self.assertEqual(self.data.data[0], 1.57831)
107        self.assertEqual(self.data.data[1], 2.70983)
108        self.assertEqual(self.data.data[2], 3.83422)
109
110        self.assertEqual(self.data.err_data[0], 1.37607)
111        self.assertEqual(self.data.err_data[1], 1.77569)
112        self.assertEqual(self.data.err_data[2], 2.06313)
113
114    def test_generic_loader(self):
115        # the generic loader should work as well
116        data = Loader().load("MP_New.sans")
117        self.assertEqual(len(data), 1)
118        self.assertEqual(data[0].meta_data['loader'], "DANSE")
119
120
121class cansas_reader(unittest.TestCase):
122
123    def setUp(self):
124        reader = CANSASReader()
125        self.data_list = reader.read("cansas1d.xml")
126        self.data = self.data_list[0]
127
128    def test_generic_loader(self):
129        # the generic loader should work as well
130        data = Loader().load("cansas1d.xml")
131        self.assertEqual(len(data), 1)
132        self.assertEqual(data[0].meta_data['loader'], "CanSAS XML 1D")
133
134    def test_cansas_checkdata(self):
135        self.assertEqual(self.data.filename, "cansas1d.xml")
136        self._checkdata()
137
138    def _checkdata(self):
139        """
140            Check the data content to see whether
141            it matches the specific file we loaded.
142            Check the units too to see whether the
143            Data1D defaults changed. Otherwise the
144            tests won't pass
145        """
146        self.assertEqual(len(self.data_list), 1)
147        self.assertEqual(self.data.run[0], "1234")
148        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D")
149
150        # Data
151        self.assertEqual(len(self.data.x), 2)
152        self.assertEqual(self.data.x_unit, 'A^{-1}')
153        self.assertEqual(self.data.y_unit, 'cm^{-1}')
154        self.assertAlmostEqual(self.data.x[0], 0.02, 6)
155        self.assertAlmostEqual(self.data.y[0], 1000, 6)
156        self.assertAlmostEqual(self.data.dx[0], 0.01, 6)
157        self.assertAlmostEqual(self.data.dy[0], 3, 6)
158        self.assertAlmostEqual(self.data.x[1], 0.03, 6)
159        self.assertAlmostEqual(self.data.y[1], 1001.0)
160        self.assertAlmostEqual(self.data.dx[1], 0.02, 6)
161        self.assertAlmostEqual(self.data.dy[1], 4, 6)
162        self.assertEqual(self.data.run_name['1234'], 'run name')
163        self.assertEqual(self.data.title, "Test title")
164
165        # Sample info
166        self.assertEqual(self.data.sample.ID, "SI600-new-long")
167        self.assertEqual(self.data.sample.name, "my sample")
168        self.assertEqual(self.data.sample.thickness_unit, 'mm')
169        self.assertAlmostEqual(self.data.sample.thickness, 1.03)
170
171        self.assertAlmostEqual(self.data.sample.transmission, 0.327)
172
173        self.assertEqual(self.data.sample.temperature_unit, 'C')
174        self.assertEqual(self.data.sample.temperature, 0)
175
176        self.assertEqual(self.data.sample.position_unit, 'mm')
177        self.assertEqual(self.data.sample.position.x, 10)
178        self.assertEqual(self.data.sample.position.y, 0)
179
180        self.assertEqual(self.data.sample.orientation_unit, 'degree')
181        self.assertAlmostEqual(self.data.sample.orientation.x, 22.5, 6)
182        self.assertAlmostEqual(self.data.sample.orientation.y, 0.02, 6)
183
184        self.assertEqual(self.data.sample.details[0], "http://chemtools.chem.soton.ac.uk/projects/blog/blogs.php/bit_id/2720")
185        self.assertEqual(self.data.sample.details[1], "Some text here")
186
187        # Instrument info
188        self.assertEqual(self.data.instrument, "canSAS instrument")
189
190        # Source
191        self.assertEqual(self.data.source.radiation, "neutron")
192
193        self.assertEqual(self.data.source.beam_size_unit, "mm")
194        self.assertEqual(self.data.source.beam_size_name, "bm")
195        self.assertEqual(self.data.source.beam_size.x, 12)
196        self.assertEqual(self.data.source.beam_size.y, 13)
197
198        self.assertEqual(self.data.source.beam_shape, "disc")
199
200        self.assertEqual(self.data.source.wavelength_unit, "A")
201        self.assertEqual(self.data.source.wavelength, 6)
202
203        self.assertEqual(self.data.source.wavelength_max_unit, "nm")
204        self.assertAlmostEqual(self.data.source.wavelength_max, 1.0)
205        self.assertEqual(self.data.source.wavelength_min_unit, "nm")
206        self.assertAlmostEqual(self.data.source.wavelength_min, 0.22)
207        self.assertEqual(self.data.source.wavelength_spread_unit, "percent")
208        self.assertEqual(self.data.source.wavelength_spread, 14.3)
209
210        # Collimation
211        _found1 = False
212        _found2 = False
213        self.assertEqual(self.data.collimation[0].length, 123.)
214        self.assertEqual(self.data.collimation[0].name, 'test coll name')
215
216        for item in self.data.collimation[0].aperture:
217            self.assertEqual(item.size_unit,'mm')
218            self.assertEqual(item.distance_unit,'mm')
219
220            if item.size.x == 50 \
221                and item.distance == 11000.0 \
222                and item.name == 'source' \
223                and item.type == 'radius':
224                _found1 = True
225            elif item.size.x == 1.0 \
226                and item.name == 'sample' \
227                and item.type == 'radius':
228                _found2 = True
229
230        if not _found1 or not _found2:
231            raise RuntimeError("Could not find all data %s %s"
232                               % (_found1, _found2))
233
234        # Detector
235        self.assertEqual(self.data.detector[0].name, "fictional hybrid")
236        self.assertEqual(self.data.detector[0].distance_unit, "mm")
237        self.assertEqual(self.data.detector[0].distance, 4150)
238
239        self.assertEqual(self.data.detector[0].orientation_unit, "degree")
240        self.assertAlmostEqual(self.data.detector[0].orientation.x, 1.0, 6)
241        self.assertEqual(self.data.detector[0].orientation.y, 0.0)
242        self.assertEqual(self.data.detector[0].orientation.z, 0.0)
243
244        self.assertEqual(self.data.detector[0].offset_unit, "m")
245        self.assertEqual(self.data.detector[0].offset.x, .001)
246        self.assertEqual(self.data.detector[0].offset.y, .002)
247        self.assertEqual(self.data.detector[0].offset.z, None)
248
249        self.assertEqual(self.data.detector[0].beam_center_unit, "mm")
250        self.assertEqual(self.data.detector[0].beam_center.x, 322.64)
251        self.assertEqual(self.data.detector[0].beam_center.y, 327.68)
252        self.assertEqual(self.data.detector[0].beam_center.z, None)
253
254        self.assertEqual(self.data.detector[0].pixel_size_unit, "mm")
255        self.assertEqual(self.data.detector[0].pixel_size.x, 5)
256        self.assertEqual(self.data.detector[0].pixel_size.y, 5)
257        self.assertEqual(self.data.detector[0].pixel_size.z, None)
258
259        # Process
260        _found_term1 = False
261        _found_term2 = False
262        for item in self.data.process:
263            self.assertTrue(item.name in ['NCNR-IGOR', 'spol'])
264            self.assertTrue(item.date in ['04-Sep-2007 18:35:02',
265                                          '03-SEP-2006 11:42:47'])
266            for t in item.term:
267                if (t['name'] == "ABS:DSTAND"
268                    and t['unit'] == 'mm'
269                    and float(t['value']) == 1.0):
270                    _found_term2 = True
271                elif (t['name'] == "radialstep"
272                      and t['unit'] == 'mm'
273                      and float(t['value']) == 10.0):
274                    _found_term1 = True
275
276        if not _found_term1 or not _found_term2:
277            raise RuntimeError("Could not find all process terms %s %s"
278                               % (_found_term1, _found_term2))
279
280    def test_writer(self):
281        r = CANSASReader()
282
283        filename = "write_test.xml"
284        r.write(filename, self.data)
285        data = Loader().load(filename)
286        self.data = data[0]
287        self.assertEqual(len(data), 1)
288        self.assertEqual(self.data.filename, filename)
289        self._checkdata()
290        if os.path.isfile(filename):
291            os.remove(filename)
292
293    def test_units(self):
294        """
295            Check units.
296            Note that not all units are available.
297        """
298        filename = "cansas1d_units.xml"
299        data = CANSASReader().read(filename)
300        self.data = data[0]
301        self.assertEqual(len(data), 1)
302        self.assertEqual(self.data.filename, filename)
303        self._checkdata()
304
305    def test_badunits(self):
306        """
307            Check units.
308            Note that not all units are available.
309        """
310        filename = "cansas1d_badunits.xml"
311        data = CANSASReader().read(filename)
312        self.data = data[0]
313        self.assertEqual(len(data), 1)
314        self.assertEqual(self.data.filename, filename)
315        # The followed should not have been loaded
316        self.assertAlmostEqual(self.data.sample.thickness, 0.00103)
317        # This one should
318        self.assertAlmostEqual(self.data.sample.transmission, 0.327)
319
320        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D")
321        self.assertEqual(len(self.data.errors), 0)
322
323    def test_slits(self):
324        """
325            Check slit data
326        """
327        filename = "cansas1d_slit.xml"
328        data = CANSASReader().read(filename)
329        self.data = data[0]
330        self.assertEqual(len(data), 1)
331        self.assertEqual(len(self.data_list), 1)
332        self.assertEqual(self.data.filename, filename)
333        self.assertEqual(self.data.run[0], "1234")
334
335        # Data
336        self.assertEqual(len(self.data.x), 2)
337        self.assertEqual(self.data.x_unit, 'A^{-1}')
338        self.assertEqual(self.data.y_unit, 'cm^{-1}')
339        self.assertEqual(self.data.x[0], 0.02)
340        self.assertEqual(self.data.y[0], 1000)
341        self.assertEqual(self.data.dxl[0], 0.005)
342        self.assertEqual(self.data.dxw[0], 0.001)
343        self.assertEqual(self.data.dy[0], 3)
344        self.assertEqual(self.data.x[1], 0.03)
345        self.assertAlmostEquals(self.data.y[1], 1001.0)
346        self.assertEqual(self.data.dxl[1], 0.005)
347        self.assertEqual(self.data.dxw[1], 0.001)
348        self.assertEqual(self.data.dy[1], 4)
349        self.assertEqual(self.data.run_name['1234'], 'run name')
350        self.assertEqual(self.data.title, "Test title")
351
352
353if __name__ == '__main__':
354    unittest.main()
Note: See TracBrowser for help on using the repository browser.