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

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 a7030c4 was 5f26aa4, checked in by krzywon, 8 years ago

Fix cansas XML reader issues to resolve broken unit tests.

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