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

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 3eb7bf2 was 2a52b0e, checked in by lewis, 7 years ago

Remove unit test reliance on IgorReader?

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