source: sasview/test/sasdataloader/test/utest_abs_reader.py @ 4cbb2f5

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1249
Last change on this file since 4cbb2f5 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
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}')
[bd5c3b1]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)
[bb074b3]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
[fa749b7]78    def test_usans_negative_dxl(self):
[4cbb2f5]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):
[88d2e70]82            self.assertEqual(data_abs.x[i], data_cor.x[i])
83            self.assertEqual(data_abs.y[i], data_cor.y[i])
[4cbb2f5]84            self.assertEqual(data_abs.dxl[i], -data_cor.dx[i])
85            self.assertTrue(data_abs.dxl[i] > 0)
[fa749b7]86
87
[ad92c5a]88class DanseReaderTests(unittest.TestCase):
[5a8cdbb]89
[bb074b3]90    def setUp(self):
[c551bb3]91        reader = DANSEReader()
[f53d684]92        self.data_list = reader.read(find("MP_New.sans"))
[fe15198]93        self.data = self.data_list[0]
[bb074b3]94
95    def test_checkdata(self):
96        """
[5a8cdbb]97            Check the data content to see whether
[bb074b3]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        """
[fe15198]103        self.assertEqual(len(self.data_list), 1)
[f53d684]104        self.assertEqual(os.path.basename(self.data.filename), "MP_New.sans")
[bb074b3]105        self.assertEqual(self.data.meta_data['loader'], "DANSE")
[5a8cdbb]106
[bb074b3]107        self.assertEqual(self.data.source.wavelength_unit, 'A')
108        self.assertEqual(self.data.source.wavelength, 7.5)
[5a8cdbb]109
[bb074b3]110        self.assertEqual(self.data.detector[0].distance_unit, 'mm')
111        self.assertAlmostEqual(self.data.detector[0].distance, 5414.99, 3)
[5a8cdbb]112
[bb074b3]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)
[5a8cdbb]118
[4cbb2f5]119        self.assertEqual(self.data.I_unit, 'cm^{-1}')
[bb074b3]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
[c551bb3]128    def test_generic_loader(self):
129        # the generic loader should work as well
[f53d684]130        data = Loader().load(find("MP_New.sans"))
[fe15198]131        self.assertEqual(len(data), 1)
[17e257b5]132        self.assertEqual(data[0].meta_data['loader'], "DANSE")
[c551bb3]133
[5a8cdbb]134
[bb074b3]135class cansas_reader(unittest.TestCase):
[5a8cdbb]136
[bb074b3]137    def setUp(self):
[c551bb3]138        reader = CANSASReader()
[f53d684]139        self.data_list = reader.read(find("cansas1d.xml"))
[fe15198]140        self.data = self.data_list[0]
[c551bb3]141
142    def test_generic_loader(self):
143        # the generic loader should work as well
[f53d684]144        data = Loader().load(find("cansas1d.xml"))
[fe15198]145        self.assertEqual(len(data), 1)
[c551bb3]146        self.assertEqual(data[0].meta_data['loader'], "CanSAS XML 1D")
147
[bb074b3]148    def test_cansas_checkdata(self):
[f53d684]149        self.assertEqual(os.path.basename(self.data.filename), "cansas1d.xml")
[bb074b3]150        self._checkdata()
[5a8cdbb]151
[bb074b3]152    def _checkdata(self):
153        """
[5a8cdbb]154            Check the data content to see whether
[bb074b3]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        """
[fe15198]160        self.assertEqual(len(self.data_list), 1)
[bb074b3]161        self.assertEqual(self.data.run[0], "1234")
[5f26aa4]162        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D")
[5a8cdbb]163
[bb074b3]164        # Data
165        self.assertEqual(len(self.data.x), 2)
[a78a02f]166        self.assertEqual(self.data.x_unit, 'A^{-1}')
167        self.assertEqual(self.data.y_unit, 'cm^{-1}')
[bb074b3]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")
[5a8cdbb]178
[bb074b3]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')
[5f26aa4]183        self.assertAlmostEqual(self.data.sample.thickness, 1.03)
[5a8cdbb]184
[5f26aa4]185        self.assertAlmostEqual(self.data.sample.transmission, 0.327)
[5a8cdbb]186
[bb074b3]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
[5a8cdbb]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
[bb074b3]201        # Instrument info
202        self.assertEqual(self.data.instrument, "canSAS instrument")
[5a8cdbb]203
[bb074b3]204        # Source
205        self.assertEqual(self.data.source.radiation, "neutron")
[5a8cdbb]206
[bb074b3]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)
[5a8cdbb]211
[bb074b3]212        self.assertEqual(self.data.source.beam_shape, "disc")
[5a8cdbb]213
[bb074b3]214        self.assertEqual(self.data.source.wavelength_unit, "A")
215        self.assertEqual(self.data.source.wavelength, 6)
[5a8cdbb]216
[bb074b3]217        self.assertEqual(self.data.source.wavelength_max_unit, "nm")
[5f26aa4]218        self.assertAlmostEqual(self.data.source.wavelength_max, 1.0)
[bb074b3]219        self.assertEqual(self.data.source.wavelength_min_unit, "nm")
[5f26aa4]220        self.assertAlmostEqual(self.data.source.wavelength_min, 0.22)
[bb074b3]221        self.assertEqual(self.data.source.wavelength_spread_unit, "percent")
222        self.assertEqual(self.data.source.wavelength_spread, 14.3)
[5a8cdbb]223
[bb074b3]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')
[5a8cdbb]229
[bb074b3]230        for item in self.data.collimation[0].aperture:
231            self.assertEqual(item.size_unit,'mm')
232            self.assertEqual(item.distance_unit,'mm')
[5f26aa4]233
[c551bb3]234            if item.size.x == 50 \
235                and item.distance == 11000.0 \
236                and item.name == 'source' \
237                and item.type == 'radius':
[bb074b3]238                _found1 = True
[c551bb3]239            elif item.size.x == 1.0 \
240                and item.name == 'sample' \
241                and item.type == 'radius':
[bb074b3]242                _found2 = True
[5a8cdbb]243
[574adc7]244        if not _found1 or not _found2:
245            raise RuntimeError("Could not find all data %s %s"
246                               % (_found1, _found2))
[5a8cdbb]247
[bb074b3]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)
[5a8cdbb]252
[bb074b3]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)
[5a8cdbb]257
[bb074b3]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)
[5a8cdbb]262
[bb074b3]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)
[5a8cdbb]267
[bb074b3]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)
[5a8cdbb]272
[bb074b3]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:
[c551bb3]281                if (t['name'] == "ABS:DSTAND"
282                    and t['unit'] == 'mm'
283                    and float(t['value']) == 1.0):
[bb074b3]284                    _found_term2 = True
[c551bb3]285                elif (t['name'] == "radialstep"
286                      and t['unit'] == 'mm'
287                      and float(t['value']) == 10.0):
[bb074b3]288                    _found_term1 = True
[5a8cdbb]289
[574adc7]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))
[ad92c5a]293
[bb074b3]294    def test_writer(self):
[c551bb3]295        r = CANSASReader()
296
[bb074b3]297        filename = "write_test.xml"
[f53d684]298        r.write(find(filename), self.data)
299        data = Loader().load(find(filename))
[bb074b3]300        self.data = data[0]
[fe15198]301        self.assertEqual(len(data), 1)
[bb074b3]302        self.assertEqual(self.data.filename, filename)
303        self._checkdata()
[17c9436]304        if os.path.isfile(filename):
305            os.remove(filename)
[ad92c5a]306
[bb074b3]307    def test_units(self):
308        """
309            Check units.
310            Note that not all units are available.
311        """
312        filename = "cansas1d_units.xml"
[f53d684]313        data = CANSASReader().read(find(filename))
[bb074b3]314        self.data = data[0]
[fe15198]315        self.assertEqual(len(data), 1)
[bb074b3]316        self.assertEqual(self.data.filename, filename)
317        self._checkdata()
[ad92c5a]318
[bb074b3]319    def test_badunits(self):
320        """
321            Check units.
322            Note that not all units are available.
323        """
324        filename = "cansas1d_badunits.xml"
[f53d684]325        data = CANSASReader().read(find(filename))
[bb074b3]326        self.data = data[0]
[fe15198]327        self.assertEqual(len(data), 1)
[bb074b3]328        self.assertEqual(self.data.filename, filename)
329        # The followed should not have been loaded
[5f26aa4]330        self.assertAlmostEqual(self.data.sample.thickness, 0.00103)
[bb074b3]331        # This one should
[5f26aa4]332        self.assertAlmostEqual(self.data.sample.transmission, 0.327)
[5a8cdbb]333
[5f26aa4]334        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D")
[17e257b5]335        self.assertEqual(len(self.data.errors), 0)
[ad92c5a]336
[bb074b3]337    def test_slits(self):
338        """
339            Check slit data
340        """
341        filename = "cansas1d_slit.xml"
[f53d684]342        data = CANSASReader().read(find(filename))
[bb074b3]343        self.data = data[0]
[fe15198]344        self.assertEqual(len(data), 1)
345        self.assertEqual(len(self.data_list), 1)
[bb074b3]346        self.assertEqual(self.data.filename, filename)
347        self.assertEqual(self.data.run[0], "1234")
[5a8cdbb]348
[bb074b3]349        # Data
350        self.assertEqual(len(self.data.x), 2)
[a78a02f]351        self.assertEqual(self.data.x_unit, 'A^{-1}')
352        self.assertEqual(self.data.y_unit, 'cm^{-1}')
[bb074b3]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)
[88d2e70]359        self.assertAlmostEqual(self.data.y[1], 1001.0)
[bb074b3]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")
[ad92c5a]365
[bb074b3]366
367if __name__ == '__main__':
[5f26aa4]368    unittest.main()
Note: See TracBrowser for help on using the repository browser.