source: sasview/test/park_integration/test/utest_fit_smeared.py @ 76f132a

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 76f132a was 76f132a, checked in by pkienzle, 10 years ago

test resolution and dispersion

  • Property mode set to 100644
File size: 7.1 KB
Line 
1"""
2    Unit tests for fitting module
3    @author M. Doucet
4"""
5import unittest
6import math
7import numpy
8from sans.fit.AbstractFitEngine import Model
9from sans.fit.Fitting import Fit
10from sans.dataloader.loader import Loader
11from sans.models.qsmearing import smear_selection
12from sans.models.CylinderModel import CylinderModel
13from sans.models.SphereModel import SphereModel
14
15class testFitModule(unittest.TestCase):
16    """ test fitting """
17   
18    def test_scipy(self):
19        """ Simple cylinder model fit (scipy)  """
20       
21        out=Loader().load("cyl_400_20.txt")
22        # This data file has not error, add them
23        #out.dy = out.y
24       
25        fitter = Fit('scipy')
26        fitter.set_data(out,1)
27       
28        # Receives the type of model for the fitting
29        model1  = CylinderModel()
30        model1.setParam("scale", 1.0)
31        model1.setParam("radius",18)
32        model1.setParam("length", 397)
33        model1.setParam("sldCyl",3e-006 )
34        model1.setParam("sldSolv",0.0 )
35        model1.setParam("background", 0.0)
36        model = Model(model1)
37        pars1 =['length','radius','scale']
38        fitter.set_model(model,1,pars1)
39       
40        # What the hell is this line for?
41        fitter.select_problem_for_fit(id=1,value=1)
42        result1, = fitter.fit()
43        #print "result1",result1
44
45        self.assert_(result1)
46        self.assertTrue(len(result1.pvec) > 0)
47        self.assertTrue(len(result1.stderr) > 0)
48       
49        self.assertTrue( math.fabs(result1.pvec[0]-400.0)/3.0 < result1.stderr[0] )
50        self.assertTrue( math.fabs(result1.pvec[1]-20.0)/3.0  < result1.stderr[1] )
51        self.assertTrue( math.fabs(result1.pvec[2]-1)/3.0   < result1.stderr[2] )
52        self.assertTrue( result1.fitness < 1.0 )
53
54    def test_park_dispersion(self):
55        """
56            Cylinder fit with dispersion
57        """
58        self._dispersion(fitter = Fit('park'))
59
60    def test_bumps_dispersion(self):
61        """
62            Cylinder fit with dispersion
63        """
64        alg = 'amoeba'
65        from bumps import fitters
66        fitters.FIT_DEFAULT = alg
67        #fitters.FIT_OPTIONS[alg].options.update(opts)
68        fitters.FIT_OPTIONS[alg].options.update(monitors=[])
69        self._dispersion(fitter = Fit('bumps'))
70
71    def test_scipy_dispersion(self):
72        """
73            Cylinder fit with dispersion
74        """
75        self._dispersion(fitter = Fit('scipy'))
76
77    def _dispersion(self, fitter):
78        # Load data
79        # This data is for a cylinder with
80        #   length=400, radius=20, radius disp=5, scale=1e-10
81        out=Loader().load("cyl_400_20_disp5r.txt")
82        out.dy = numpy.zeros(len(out.y))
83        for i in range(len(out.y)):
84            out.dy[i] = math.sqrt(out.y[i])
85       
86        # Receives the type of model for the fitting
87        model1  = CylinderModel()
88        model1.setParam("scale", 10.0)
89        model1.setParam("radius",18)
90        model1.setParam("length", 397)
91        model1.setParam("sldCyl",3e-006 )
92        model1.setParam("sldSolv",0.0 )
93        model1.setParam("background", 0.0)
94
95        # Dispersion parameters
96        model1.dispersion['radius']['width'] = 0.25
97        model1.dispersion['radius']['npts'] = 50
98
99        model = Model(model1)
100
101        pars1 =['length','radius','scale','radius.width']
102        fitter.set_data(out,1)
103        fitter.set_model(model,1,pars1)
104        fitter.select_problem_for_fit(id=1,value=1)
105        result1, = fitter.fit()
106       
107        self.assert_(result1)
108        self.assertTrue(len(result1.pvec)>0)
109        self.assertTrue(len(result1.stderr)>0)
110
111        self.assertTrue( math.fabs(result1.pvec[0]-399.8)/3.0 < result1.stderr[0] )
112        self.assertTrue( math.fabs(result1.pvec[1]-17.5)/3.0  < result1.stderr[1] )
113        self.assertTrue( math.fabs(result1.pvec[2]-11.1)/3.0   < result1.stderr[2] )
114        self.assertTrue( math.fabs(result1.pvec[3]-0.276)/3.0   < result1.stderr[3] )
115        self.assertTrue( result1.fitness < 1.0 )
116       
117       
118class smear_testdata(unittest.TestCase):
119    """
120        Test fitting with the smearing operations
121        The output of the fits should be compated to fits
122        done with IGOR for the same models and data sets.
123    """
124    def setUp(self):
125        data = Loader().load("latex_smeared.xml")
126        self.data_res = data[0]
127        self.data_slit = data[1]
128       
129        self.sphere = SphereModel()
130        self.sphere.setParam('background', 0)
131        self.sphere.setParam('radius', 5000.0)
132        self.sphere.setParam('scale', 0.4)
133        self.sphere.setParam('sldSolv',0)
134        self.sphere.setParam('sldSph',1e-6)
135        #self.sphere.setParam('radius.npts', 30)
136        #self.sphere.setParam('radius.width',50)
137
138    def test_reso(self):
139
140        # Let the data module find out what smearing the
141        # data needs
142        smear = smear_selection(self.data_res)
143        self.assertEqual(smear.__class__.__name__, 'QSmearer')
144
145        # Fit
146        fitter = Fit('scipy')
147       
148        # Data: right now this is the only way to set the smearer object
149        # We should improve that and have a way to get access to the
150        # data for a given fit.
151        fitter.set_data(self.data_res,1)
152        fitter._engine.fit_arrange_dict[1].data_list[0].smearer = smear
153
154        # Model: maybe there's a better way to do this.
155        # Ideally we should have to create a new model from our sans model.
156        fitter.set_model(Model(self.sphere),1, ['radius','scale', 'background'])
157       
158        # Why do we have to do this...?
159        fitter.select_problem_for_fit(id=1,value=1)
160
161        # Perform the fit (might take a while)
162        result1, = fitter.fit()
163       
164        #print "v",result1.pvec
165        #print "dv",result1.stderr
166        #print "chisq(v)",result1.fitness
167
168        self.assertTrue( math.fabs(result1.pvec[0]-5000) < 20 )
169        self.assertTrue( math.fabs(result1.pvec[1]-0.48) < 0.02 )
170        self.assertTrue( math.fabs(result1.pvec[2]-0.060)  < 0.002 )
171
172
173    def test_slit(self):
174        smear = smear_selection(self.data_slit)
175        self.assertEqual(smear.__class__.__name__, 'SlitSmearer')
176
177        fitter = Fit('scipy')
178       
179        # Data: right now this is the only way to set the smearer object
180        # We should improve that and have a way to get access to the
181        # data for a given fit.
182        fitter.set_data(self.data_slit,1)
183        fitter._engine.fit_arrange_dict[1].data_list[0].smearer = smear
184        fitter._engine.fit_arrange_dict[1].data_list[0].qmax = 0.003
185       
186        # Model
187        fitter.set_model(Model(self.sphere),1, ['radius','scale'])
188        fitter.select_problem_for_fit(id=1,value=1)
189       
190        result1, = fitter.fit()
191       
192        #print "v",result1.pvec
193        #print "dv",result1.stderr
194        #print "chisq(v)",result1.fitness
195       
196        self.assertTrue( math.fabs(result1.pvec[0]-2340) < 20 )
197        self.assertTrue( math.fabs(result1.pvec[1]-0.010) < 0.002 )
198
199if __name__ == '__main__':
200    unittest.main()
Note: See TracBrowser for help on using the repository browser.