source: sasview/test/sasdataloader/test/utest_abs_reader.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@…>, 6 years ago

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

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