source: sasview/test/sasdataloader/test/utest_averaging.py @ ef3445e2

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.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since ef3445e2 was ef3445e2, checked in by krzywon, 9 years ago

Fixed the failing test associated with data loading and sector averaging
in utest_averaging.py. The ascii data loader throws out values where q=0
but the calculator does not resulting causing the first issue. The 2nd
issue was invalid starting and ending points in the sector calculation.

  • Property mode set to 100644
File size: 8.7 KB
Line 
1
2import unittest
3
4from sas.dataloader.loader import  Loader
5from sas.dataloader.manipulations import Ring, CircularAverage, SectorPhi, get_q,reader2D_converter
6 
7import os.path
8import numpy, math
9import sas.dataloader.data_info as data_info
10
11class Averaging(unittest.TestCase):
12    """
13        Test averaging manipulations on a flat distribution
14    """
15    def setUp(self):
16        """
17            Create a flat 2D distribution. All averaging results
18            should return the predefined height of the distribution (1.0).
19        """
20        x_0  = numpy.ones([100,100])
21        dx_0 = numpy.ones([100,100])
22       
23        self.data = data_info.Data2D(data=x_0, err_data=dx_0)
24        detector = data_info.Detector()
25        detector.distance = 1000.0  #mm
26        detector.pixel_size.x = 1.0 #mm
27        detector.pixel_size.y = 1.0 #mm
28       
29        # center in pixel position = (len(x_0)-1)/2
30        detector.beam_center.x = (len(x_0)-1)/2 #pixel number
31        detector.beam_center.y = (len(x_0)-1)/2 #pixel number
32        self.data.detector.append(detector)
33       
34        source = data_info.Source()
35        source.wavelength = 10.0 #A
36        self.data.source = source
37       
38        # get_q(dx, dy, det_dist, wavelength) where units are mm,mm,mm,and A respectively.
39        self.qmin = get_q(1.0, 1.0, detector.distance, source.wavelength)
40
41        self.qmax = get_q(49.5, 49.5, detector.distance, source.wavelength)
42       
43        self.qstep = len(x_0)
44        x=  numpy.linspace(start= -1*self.qmax,
45                               stop= self.qmax,
46                               num= self.qstep,
47                               endpoint=True ) 
48        y = numpy.linspace(start= -1*self.qmax,
49                               stop= self.qmax,
50                               num= self.qstep,
51                               endpoint=True )
52        self.data.x_bins=x
53        self.data.y_bins=y
54        self.data = reader2D_converter(self.data)
55           
56    def test_ring_flat_distribution(self):
57        """
58            Test ring averaging
59        """
60        r = Ring(r_min=2*self.qmin, r_max=5*self.qmin, 
61                 center_x=self.data.detector[0].beam_center.x, 
62                 center_y=self.data.detector[0].beam_center.y)
63        r.nbins_phi = 20
64       
65        o = r(self.data)
66        for i in range(20):
67            self.assertEqual(o.y[i], 1.0)
68           
69    def test_sectorphi_full(self):
70        """
71            Test sector averaging
72        """
73        r = SectorPhi(r_min=self.qmin, r_max=3*self.qmin, 
74                      phi_min=0, phi_max=math.pi*2.0)
75        r.nbins_phi = 20
76        o = r(self.data)
77        for i in range(7):
78            self.assertEqual(o.y[i], 1.0)
79           
80           
81    def test_sectorphi_partial(self):
82        """
83        """
84        phi_max = math.pi * 1.5
85        r = SectorPhi(r_min=self.qmin, r_max=3*self.qmin, 
86                      phi_min=0, phi_max=phi_max)
87        self.assertEqual(r.phi_max, phi_max)
88        r.nbins_phi = 20
89        o = r(self.data)
90        self.assertEqual(r.phi_max, phi_max)
91        for i in range(17):
92            self.assertEqual(o.y[i], 1.0)
93           
94           
95
96class data_info_tests(unittest.TestCase):
97   
98    def setUp(self):
99        self.data = Loader().load('MAR07232_rest.ASC')
100       
101    def test_ring(self):
102        """
103            Test ring averaging
104        """
105        r = Ring(r_min=.005, r_max=.01, 
106                 center_x=self.data.detector[0].beam_center.x, 
107                 center_y=self.data.detector[0].beam_center.y,
108                 nbins = 20)
109        ##r.nbins_phi = 20
110       
111        o = r(self.data)
112        answer = Loader().load('ring_testdata.txt')
113       
114        for i in range(r.nbins_phi - 1):
115            self.assertAlmostEqual(o.x[i + 1], answer.x[i], 4)
116            self.assertAlmostEqual(o.y[i + 1], answer.y[i], 4)
117            self.assertAlmostEqual(o.dy[i + 1], answer.dy[i], 4)
118           
119    def test_circularavg(self):
120        """
121            Test circular averaging
122            The test data was not generated by IGOR.
123        """
124        r = CircularAverage(r_min=.00, r_max=.025, 
125                 bin_width=0.0003)
126        r.nbins_phi = 20
127       
128        o = r(self.data)
129
130        answer = Loader().load('avg_testdata.txt')
131        for i in range(r.nbins_phi):
132            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
133            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
134            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
135           
136    def test_box(self):
137        """
138            Test circular averaging
139            The test data was not generated by IGOR.
140        """
141        from sas.dataloader.manipulations import Boxsum, Boxavg
142       
143        r = Boxsum(x_min=.01, x_max=.015, y_min=0.01, y_max=0.015)
144        s, ds, npoints = r(self.data)
145        self.assertAlmostEqual(s, 34.278990899999997, 4)
146        self.assertAlmostEqual(ds, 7.8007981835194293, 4)
147        self.assertAlmostEqual(npoints, 324.0000, 4)       
148   
149        r = Boxavg(x_min=.01, x_max=.015, y_min=0.01, y_max=0.015)
150        s, ds = r(self.data)
151        self.assertAlmostEqual(s, 0.10579935462962962, 4)
152        self.assertAlmostEqual(ds, 0.024076537603455028, 4)
153           
154    def test_slabX(self):
155        """
156            Test slab in X
157            The test data was not generated by IGOR.
158        """
159        from sas.dataloader.manipulations import SlabX
160       
161        r = SlabX(x_min=-.01, x_max=.01, y_min=-0.0002, y_max=0.0002, bin_width=0.0004)
162        r.fold = False
163        o = r(self.data)
164
165        answer = Loader().load('slabx_testdata.txt')
166        for i in range(len(o.x)):
167            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
168            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
169            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
170           
171    def test_slabY(self):
172        """
173            Test slab in Y
174            The test data was not generated by IGOR.
175        """
176        from sas.dataloader.manipulations import SlabY
177       
178        r = SlabY(x_min=.005, x_max=.01, y_min=-0.01, y_max=0.01, bin_width=0.0004)
179        r.fold = False
180        o = r(self.data)
181
182        answer = Loader().load('slaby_testdata.txt')
183        for i in range(len(o.x)):
184            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
185            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
186            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
187           
188    def test_sectorphi_full(self):
189        """
190            Test sector averaging I(phi)
191            When considering the whole azimuthal range (2pi),
192            the answer should be the same as ring averaging.
193            The test data was not generated by IGOR.
194        """
195        from sas.dataloader.manipulations import SectorPhi
196        import math
197       
198        r = SectorPhi(r_min=.005,
199                      r_max=.01,
200                      phi_min=0.15707963,
201                      phi_max=math.pi*2.-0.15707963,
202                      nbins=19)
203        o = r(self.data)
204
205        answer = Loader().load('ring_testdata.txt')
206        for i in range(len(o.x)):
207            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
208            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
209            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
210           
211    def test_sectorphi_quarter(self):
212        """
213            Test sector averaging I(phi)
214            The test data was not generated by IGOR.
215        """
216        from sas.dataloader.manipulations import SectorPhi
217        import math
218       
219        r = SectorPhi(r_min=.005, r_max=.01, phi_min=0, phi_max=math.pi/2.0)
220        r.nbins_phi = 20
221        o = r(self.data)
222
223        answer = Loader().load('sectorphi_testdata.txt')
224        for i in range(len(o.x)):
225            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
226            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
227            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
228           
229    def test_sectorq_full(self):
230        """
231            Test sector averaging I(q)
232            The test data was not generated by IGOR.
233        """
234        from sas.dataloader.manipulations import SectorQ
235        import math
236       
237        r = SectorQ(r_min=.005, r_max=.01, phi_min=0, phi_max=math.pi/2.0)
238        r.nbins_phi = 20
239        o = r(self.data)
240
241        answer = Loader().load('sectorq_testdata.txt')
242        for i in range(len(o.x)):
243            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
244            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
245            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
246           
247
248if __name__ == '__main__':
249    unittest.main()
Note: See TracBrowser for help on using the repository browser.