source: sasview/test/sasdataloader/test/utest_abs_reader.py @ 3a473ef

ESS_GUIESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalc
Last change on this file since 3a473ef was 3a473ef, checked in by Piotr Rozyczko <rozyczko@…>, 6 years ago

Manual update of test/ directory with changes on master - SASVIEW-996

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