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

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 ce8c7bd was ce8c7bd, checked in by lewis, 7 years ago

Remove support for loading .d1d files

HFIR no longer use the .d1d format, so there's no need to support it
anymore.

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