source: sasview/test/sasdataloader/test/utest_abs_reader.py @ 36d69e1

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

MAINT: refactor IgorReader?.py

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