source: sasview/test/sasfit/test/utest_fit_smeared.py @ a3f125f0

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 a3f125f0 was a3f125f0, checked in by Paul Kienzle <pkienzle@…>, 9 years ago

refactor resolution calculation to enable sasmodels resolution calcuator for pinhole smearing, but don't enable it yet

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