source: sasview/test/park_integration/test/utest_fit_smeared.py @ 386ffe1

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 386ffe1 was 386ffe1, checked in by pkienzle, 9 years ago

remove scipy levenburg marquardt and park from ui

  • Property mode set to 100644
File size: 6.9 KB
RevLine 
[5893cdb]1"""
2    Unit tests for fitting module
[eb575b0]3    @author M. Doucet
[5893cdb]4"""
5import unittest
6import math
[e3efa6b3]7
[5893cdb]8import numpy
[35ec279]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
[5893cdb]15
16class testFitModule(unittest.TestCase):
17    """ test fitting """
18   
[386ffe1]19    def test_without_resolution(self):
20        """ Simple cylinder model fit  """
[5893cdb]21       
22        out=Loader().load("cyl_400_20.txt")
23        # This data file has not error, add them
[76f132a]24        #out.dy = out.y
[5893cdb]25       
[386ffe1]26        fitter = Fit('bumps')
[5893cdb]27        fitter.set_data(out,1)
28       
29        # Receives the type of model for the fitting
30        model1  = CylinderModel()
[76f132a]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)
[5893cdb]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?
[6c00702]42        fitter.select_problem_for_fit(id=1,value=1)
43        result1, = fitter.fit()
[76f132a]44        #print "result1",result1
45
[5893cdb]46        self.assert_(result1)
[76f132a]47        self.assertTrue(len(result1.pvec) > 0)
48        self.assertTrue(len(result1.stderr) > 0)
[5893cdb]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] )
[76f132a]52        self.assertTrue( math.fabs(result1.pvec[2]-1)/3.0   < result1.stderr[2] )
[5893cdb]53        self.assertTrue( result1.fitness < 1.0 )
[76f132a]54
[386ffe1]55    def test_dispersion(self):
[76f132a]56        """
57            Cylinder fit with dispersion
58        """
[e3efa6b3]59        alg = 'lm'
[76f132a]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):
[5893cdb]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()
[76f132a]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)
[6c00702]83
[5893cdb]84        # Dispersion parameters
[76f132a]85        model1.dispersion['radius']['width'] = 0.25
86        model1.dispersion['radius']['npts'] = 50
87
[5893cdb]88        model = Model(model1)
[76f132a]89
[5893cdb]90        pars1 =['length','radius','scale','radius.width']
91        fitter.set_data(out,1)
92        fitter.set_model(model,1,pars1)
[6c00702]93        fitter.select_problem_for_fit(id=1,value=1)
[e3efa6b3]94        #import time; T0 = time.time()
[6c00702]95        result1, = fitter.fit()
[e3efa6b3]96        #print "time",time.time()-T0,fitter._engine.__class__.__name__
[5893cdb]97       
98        self.assert_(result1)
[76f132a]99        self.assertTrue(len(result1.pvec)>0)
100        self.assertTrue(len(result1.stderr)>0)
101
[e3efa6b3]102        #print [z for z in zip(result1.param_list,result1.pvec,result1.stderr)]
[76f132a]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] )
[5893cdb]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()
[76f132a]122        self.sphere.setParam('background', 0)
[5893cdb]123        self.sphere.setParam('radius', 5000.0)
[76f132a]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
[5893cdb]130    def test_reso(self):
[6c00702]131
[5893cdb]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
137        # Fit
[386ffe1]138        fitter = Fit('bumps')
[5893cdb]139       
140        # Data: right now this is the only way to set the smearer object
141        # We should improve that and have a way to get access to the
142        # data for a given fit.
143        fitter.set_data(self.data_res,1)
[6c00702]144        fitter._engine.fit_arrange_dict[1].data_list[0].smearer = smear
[76f132a]145
[5893cdb]146        # Model: maybe there's a better way to do this.
[35ec279]147        # Ideally we should have to create a new model from our sas model.
[76f132a]148        fitter.set_model(Model(self.sphere),1, ['radius','scale', 'background'])
[5893cdb]149       
150        # Why do we have to do this...?
[6c00702]151        fitter.select_problem_for_fit(id=1,value=1)
[76f132a]152
[5893cdb]153        # Perform the fit (might take a while)
[6c00702]154        result1, = fitter.fit()
[5893cdb]155       
[76f132a]156        #print "v",result1.pvec
157        #print "dv",result1.stderr
158        #print "chisq(v)",result1.fitness
159
160        self.assertTrue( math.fabs(result1.pvec[0]-5000) < 20 )
161        self.assertTrue( math.fabs(result1.pvec[1]-0.48) < 0.02 )
162        self.assertTrue( math.fabs(result1.pvec[2]-0.060)  < 0.002 )
163
164
[5893cdb]165    def test_slit(self):
166        smear = smear_selection(self.data_slit)
167        self.assertEqual(smear.__class__.__name__, 'SlitSmearer')
168
[386ffe1]169        fitter = Fit('bumps')
[5893cdb]170       
171        # Data: right now this is the only way to set the smearer object
172        # We should improve that and have a way to get access to the
173        # data for a given fit.
174        fitter.set_data(self.data_slit,1)
[6c00702]175        fitter._engine.fit_arrange_dict[1].data_list[0].smearer = smear
176        fitter._engine.fit_arrange_dict[1].data_list[0].qmax = 0.003
[5893cdb]177       
178        # Model
179        fitter.set_model(Model(self.sphere),1, ['radius','scale'])
[6c00702]180        fitter.select_problem_for_fit(id=1,value=1)
[5893cdb]181       
[6c00702]182        result1, = fitter.fit()
[5893cdb]183       
[76f132a]184        #print "v",result1.pvec
185        #print "dv",result1.stderr
186        #print "chisq(v)",result1.fitness
[5893cdb]187       
[76f132a]188        self.assertTrue( math.fabs(result1.pvec[0]-2340) < 20 )
189        self.assertTrue( math.fabs(result1.pvec[1]-0.010) < 0.002 )
190
[5893cdb]191if __name__ == '__main__':
[35ec279]192    unittest.main()
Note: See TracBrowser for help on using the repository browser.