source: sasview/test/sasdataloader/test/utest_abs_reader.py @ 574adc7

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalcmagnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 574adc7 was 574adc7, checked in by Paul Kienzle <pkienzle@…>, 2 years ago

convert sascalc to python 2/3 syntax

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