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

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since c551bb3 was c551bb3, checked in by andyfaff, 7 years ago

TST: ensure specific readers work

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