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

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1249
Last change on this file since dbfd307 was 4cbb2f5, checked in by Paul Kienzle <pkienzle@…>, 5 years ago

pull conflicting changes from master

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