source: sasview/test/sasdataloader/test/utest_abs_reader.py @ 2a52b0e

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 2a52b0e 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
Line 
1"""
2    Unit tests for data manipulations
3"""
4from __future__ import print_function
5
6import unittest
7import numpy as np
8from sas.sascalc.dataloader.loader import Loader
9from sas.sascalc.dataloader.readers.IgorReader import Reader as IgorReader
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
14
15from sas.sascalc.dataloader.data_info import Data1D
16
17import os.path
18
19
20class abs_reader(unittest.TestCase):
21
22    def setUp(self):
23        reader = AbsReader()
24        self.data = reader.read("jan08002.ABS")
25
26    def test_abs_checkdata(self):
27        """
28            Check the data content to see whether
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")
36
37        self.assertEqual(self.data.source.wavelength_unit, 'A')
38        self.assertEqual(self.data.source.wavelength, 6.0)
39
40        self.assertEqual(self.data.detector[0].distance_unit, 'mm')
41        self.assertEqual(self.data.detector[0].distance, 1000.0)
42
43        self.assertEqual(self.data.sample.transmission, 0.5667)
44
45        self.assertEqual(self.data.detector[0].beam_center_unit, 'mm')
46        center_x = 114.58*5.08
47        center_y = 64.22*5.08
48        self.assertEqual(self.data.detector[0].beam_center.x, center_x)
49        self.assertEqual(self.data.detector[0].beam_center.y, center_y)
50
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)
56
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)
61
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)
66
67    def test_checkdata2(self):
68        self.assertEqual(self.data.dy[126], 1)
69
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
75
76class hfir_reader(unittest.TestCase):
77
78    def setUp(self):
79        reader = HFIRReader()
80        self.data = reader.read("S2-30dq.d1d")
81
82    def test_hfir_checkdata(self):
83        """
84            Check the data content to see whether
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)
92        #          Q           I               dI          dQ
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
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
104class DanseReaderTests(unittest.TestCase):
105
106    def setUp(self):
107        reader = DANSEReader()
108        self.data = reader.read("MP_New.sans")
109
110    def test_checkdata(self):
111        """
112            Check the data content to see whether
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")
120
121        self.assertEqual(self.data.source.wavelength_unit, 'A')
122        self.assertEqual(self.data.source.wavelength, 7.5)
123
124        self.assertEqual(self.data.detector[0].distance_unit, 'mm')
125        self.assertAlmostEqual(self.data.detector[0].distance, 5414.99, 3)
126
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)
132
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
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
147
148class cansas_reader(unittest.TestCase):
149
150    def setUp(self):
151        reader = CANSASReader()
152        data = reader.read("cansas1d.xml")
153        self.data = data[0]
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
160    def test_cansas_checkdata(self):
161        self.assertEqual(self.data.filename, "cansas1d.xml")
162        self._checkdata()
163
164    def _checkdata(self):
165        """
166            Check the data content to see whether
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")
173        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D")
174
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")
189
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')
194        self.assertAlmostEqual(self.data.sample.thickness, 1.03)
195
196        self.assertAlmostEqual(self.data.sample.transmission, 0.327)
197
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
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
212        # Instrument info
213        self.assertEqual(self.data.instrument, "canSAS instrument")
214
215        # Source
216        self.assertEqual(self.data.source.radiation, "neutron")
217
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)
222
223        self.assertEqual(self.data.source.beam_shape, "disc")
224
225        self.assertEqual(self.data.source.wavelength_unit, "A")
226        self.assertEqual(self.data.source.wavelength, 6)
227
228        self.assertEqual(self.data.source.wavelength_max_unit, "nm")
229        self.assertAlmostEqual(self.data.source.wavelength_max, 1.0)
230        self.assertEqual(self.data.source.wavelength_min_unit, "nm")
231        self.assertAlmostEqual(self.data.source.wavelength_min, 0.22)
232        self.assertEqual(self.data.source.wavelength_spread_unit, "percent")
233        self.assertEqual(self.data.source.wavelength_spread, 14.3)
234
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')
240
241        for item in self.data.collimation[0].aperture:
242            self.assertEqual(item.size_unit,'mm')
243            self.assertEqual(item.distance_unit,'mm')
244
245            if item.size.x == 50 \
246                and item.distance == 11000.0 \
247                and item.name == 'source' \
248                and item.type == 'radius':
249                _found1 = True
250            elif item.size.x == 1.0 \
251                and item.name == 'sample' \
252                and item.type == 'radius':
253                _found2 = True
254
255        if _found1 == False or _found2 == False:
256            raise RuntimeError, "Could not find all data %s %s" % (_found1, _found2)
257
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)
262
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)
267
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)
272
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)
277
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)
282
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'])
290            print(item.term)
291            for t in item.term:
292                if (t['name'] == "ABS:DSTAND"
293                    and t['unit'] == 'mm'
294                    and float(t['value']) == 1.0):
295                    _found_term2 = True
296                elif (t['name'] == "radialstep"
297                      and t['unit'] == 'mm'
298                      and float(t['value']) == 10.0):
299                    _found_term1 = True
300
301        if _found_term1 == False or _found_term2 == False:
302            raise RuntimeError, "Could not find all process terms %s %s" % (_found_term1, _found_term2)
303
304    def test_writer(self):
305        r = CANSASReader()
306
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()
313        if os.path.isfile(filename):
314            os.remove(filename)
315
316    def test_units(self):
317        """
318            Check units.
319            Note that not all units are available.
320        """
321        filename = "cansas1d_units.xml"
322        data = CANSASReader().read(filename)
323        self.data = data[0]
324        self.assertEqual(self.data.filename, filename)
325        self._checkdata()
326
327    def test_badunits(self):
328        """
329            Check units.
330            Note that not all units are available.
331        """
332        filename = "cansas1d_badunits.xml"
333        data = CANSASReader().read(filename)
334        self.data = data[0]
335        self.assertEqual(self.data.filename, filename)
336        # The followed should not have been loaded
337        self.assertAlmostEqual(self.data.sample.thickness, 0.00103)
338        # This one should
339        self.assertAlmostEqual(self.data.sample.transmission, 0.327)
340
341        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D")
342        print(self.data.errors)
343        self.assertEqual(len(self.data.errors), 1)
344
345    def test_slits(self):
346        """
347            Check slit data
348        """
349        filename = "cansas1d_slit.xml"
350        data = CANSASReader().read(filename)
351        self.data = data[0]
352        self.assertEqual(self.data.filename, filename)
353        self.assertEqual(self.data.run[0], "1234")
354
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")
372
373
374if __name__ == '__main__':
375    unittest.main()
Note: See TracBrowser for help on using the repository browser.