source: sasview/sansdataloader/test/utest_averaging.py @ 79b550a

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 79b550a was d12f294, checked in by Anders Markvardsen <anders.markvardsen@…>, 12 years ago

Fixed unit test (re #101)

  • Property mode set to 100644
File size: 8.6 KB
Line 
1
2import unittest
3
4from sans.dataloader.loader import  Loader
5from sans.dataloader.manipulations import Ring, CircularAverage, SectorPhi, get_q,reader2D_converter
6 
7import os.path
8import numpy, math
9import sans.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        r.nbins_phi = 20
109       
110        o = r(self.data)
111        answer = Loader().load('ring_testdata.txt')
112        for i in range(r.nbins_phi):
113            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
114            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
115            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
116           
117    def test_circularavg(self):
118        """
119            Test circular averaging
120            The test data was not generated by IGOR.
121        """
122        r = CircularAverage(r_min=.00, r_max=.025, 
123                 bin_width=0.0003)
124        r.nbins_phi = 20
125       
126        o = r(self.data)
127
128        answer = Loader().load('avg_testdata.txt')
129        for i in range(r.nbins_phi):
130            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
131            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
132            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
133           
134    def test_box(self):
135        """
136            Test circular averaging
137            The test data was not generated by IGOR.
138        """
139        from sans.dataloader.manipulations import Boxsum, Boxavg
140       
141        r = Boxsum(x_min=.01, x_max=.015, y_min=0.01, y_max=0.015)
142        s, ds, npoints = r(self.data)
143        self.assertAlmostEqual(s, 34.278990899999997, 4)
144        self.assertAlmostEqual(ds, 7.8007981835194293, 4)
145        self.assertAlmostEqual(npoints, 324.0000, 4)       
146   
147        r = Boxavg(x_min=.01, x_max=.015, y_min=0.01, y_max=0.015)
148        s, ds = r(self.data)
149        self.assertAlmostEqual(s, 0.10579935462962962, 4)
150        self.assertAlmostEqual(ds, 0.024076537603455028, 4)
151           
152    def test_slabX(self):
153        """
154            Test slab in X
155            The test data was not generated by IGOR.
156        """
157        from sans.dataloader.manipulations import SlabX
158       
159        r = SlabX(x_min=-.01, x_max=.01, y_min=-0.0002, y_max=0.0002, bin_width=0.0004)
160        r.fold = False
161        o = r(self.data)
162
163        answer = Loader().load('slabx_testdata.txt')
164        for i in range(len(o.x)):
165            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
166            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
167            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
168           
169    def test_slabY(self):
170        """
171            Test slab in Y
172            The test data was not generated by IGOR.
173        """
174        from sans.dataloader.manipulations import SlabY
175       
176        r = SlabY(x_min=.005, x_max=.01, y_min=-0.01, y_max=0.01, bin_width=0.0004)
177        r.fold = False
178        o = r(self.data)
179
180        answer = Loader().load('slaby_testdata.txt')
181        for i in range(len(o.x)):
182            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
183            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
184            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
185           
186    def test_sectorphi_full(self):
187        """
188            Test sector averaging I(phi)
189            When considering the whole azimuthal range (2pi),
190            the answer should be the same as ring averaging.
191            The test data was not generated by IGOR.
192        """
193        from sans.dataloader.manipulations import SectorPhi
194        import math
195       
196        r = SectorPhi(r_min=.005, r_max=.01, phi_min=0, phi_max=math.pi*2.0)
197        r.nbins_phi = 20
198        o = r(self.data)
199
200        answer = Loader().load('ring_testdata.txt')
201        for i in range(len(o.x)):
202            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
203            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
204            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
205           
206    def test_sectorphi_quarter(self):
207        """
208            Test sector averaging I(phi)
209            The test data was not generated by IGOR.
210        """
211        from sans.dataloader.manipulations import SectorPhi
212        import math
213       
214        r = SectorPhi(r_min=.005, r_max=.01, phi_min=0, phi_max=math.pi/2.0)
215        r.nbins_phi = 20
216        o = r(self.data)
217
218        answer = Loader().load('sectorphi_testdata.txt')
219        for i in range(len(o.x)):
220            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
221            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
222            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
223           
224    def test_sectorq_full(self):
225        """
226            Test sector averaging I(q)
227            The test data was not generated by IGOR.
228        """
229        from sans.dataloader.manipulations import SectorQ
230        import math
231       
232        r = SectorQ(r_min=.005, r_max=.01, phi_min=0, phi_max=math.pi/2.0)
233        r.nbins_phi = 20
234        o = r(self.data)
235
236        answer = Loader().load('sectorq_testdata.txt')
237        for i in range(len(o.x)):
238            self.assertAlmostEqual(o.x[i], answer.x[i], 4)
239            self.assertAlmostEqual(o.y[i], answer.y[i], 4)
240            self.assertAlmostEqual(o.dy[i], answer.dy[i], 4)
241           
242
243if __name__ == '__main__':
244    unittest.main()
Note: See TracBrowser for help on using the repository browser.