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

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 aaf5e49 was aaf5e49, checked in by andyfaff, 7 years ago

MAINT: few more print instances

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