source: sasview/test/park_integration/test/test_fit_cylinder.py @ 6c00702

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

correct fitting tests so that they run (though not yet automatically)

  • Property mode set to 100644
File size: 5.1 KB
RevLine 
[ca6d914]1"""
2    Unit tests for fitting module
[eb575b0]3    @author G.alina
[ca6d914]4"""
5import unittest
[6c00702]6import math
[2eaaf1a]7
[1e3169c]8from sans.fit.AbstractFitEngine import Model
[822f97e]9from sans.fit.Fitting import Fit
[6c00702]10from sans.dataloader.loader import Loader
[822f97e]11
[2eaaf1a]12class TestSingleFit(unittest.TestCase):
13    """ test single fitting """
14    def setUp(self):
15        """ initialize data"""
[1e3169c]16        self.data = Loader().load("cyl_400_20.txt")
[2eaaf1a]17        # Create model that fitting engine understands
[ca6d914]18        from sans.models.CylinderModel import CylinderModel
[fd6b789]19        self.model  = CylinderModel()
20        self.model.setParam("scale", 1.0)
21        self.model.setParam("radius",18)
22        self.model.setParam("length", 397)
[6c00702]23        self.model.setParam("sldCyl",3e-006 )
24        self.model.setParam("sldSolv",0.0 )
[fd6b789]25        self.model.setParam("background", 0.0)
26        #select parameters to fit
[2eaaf1a]27        self.pars1 =['length','radius','scale']
28       
29    def _fit(self, name="scipy"):
30        """ return fit result """
31        fitter = Fit(name)
32        fitter.set_data(self.data,1)
33        fitter.set_model(self.model,1,self.pars1)
[6c00702]34        fitter.select_problem_for_fit(id=1,value=1)
[2eaaf1a]35        return  fitter.fit()
36       
37
38    def test_scipy(self):
39        """ Simple cylinder model fit (scipy)  """
40       
[6c00702]41        result1, = self._fit("scipy")
[822f97e]42       
43        self.assert_(result1)
44        self.assertTrue(len(result1.pvec)>0 or len(result1.pvec)==0 )
45        self.assertTrue(len(result1.stderr)> 0 or len(result1.stderr)==0)
46       
47        self.assertTrue( math.fabs(result1.pvec[0]-400.0)/3.0 < result1.stderr[0] )
48        self.assertTrue( math.fabs(result1.pvec[1]-20.0)/3.0  < result1.stderr[1] )
[2eaaf1a]49        self.assertTrue( math.fabs(result1.pvec[2]-1.0)/3.0   < result1.stderr[2] )
[822f97e]50        self.assertTrue( result1.fitness < 1.0 )
51       
[2eaaf1a]52       
[822f97e]53    def test_park(self):
54        """ Simple cylinder model fit (park)  """
[6c00702]55        #raise NotImplementedError()
56        result1, = self._fit("park")
[822f97e]57       
[ca6d914]58        self.assert_(result1)
59        self.assertTrue(len(result1.pvec)>0 or len(result1.pvec)==0 )
60        self.assertTrue(len(result1.stderr)> 0 or len(result1.stderr)==0)
[2eaaf1a]61       
[822f97e]62        self.assertTrue( math.fabs(result1.pvec[0]-400.0)/3.0 < result1.stderr[0] )
63        self.assertTrue( math.fabs(result1.pvec[1]-20.0)/3.0  < result1.stderr[1] )
[2eaaf1a]64        self.assertTrue( math.fabs(result1.pvec[2]-1.0)/3.0   < result1.stderr[2] )
[822f97e]65        self.assertTrue( result1.fitness < 1.0 )
66       
[2eaaf1a]67       
68       
69class TestSimultaneousFit(unittest.TestCase):
70    """ test simultaneous fitting """
71    def setUp(self):
72        """ initialize data"""
[822f97e]73       
[1e3169c]74        self.data1=Loader().load("cyl_400_20.txt")
75        self.data2=Loader().load("cyl_400_40.txt")
[2eaaf1a]76   
[822f97e]77        # Receives the type of model for the fitting
78        from sans.models.CylinderModel import CylinderModel
79        cyl1  = CylinderModel()
80        cyl1.name = "C1"
[2eaaf1a]81        self.model1 = Model(cyl1)
82        self.model1.set(scale= 1.0)
83        self.model1.set(radius=18)
84        self.model1.set(length=396)
[6c00702]85        self.model1.set(sldCyl=3e-006, sldSolv=0.0)
[2eaaf1a]86        self.model1.set(background=0.0)
[822f97e]87       
88        cyl2  = CylinderModel()
89        cyl2.name = "C2"
[2eaaf1a]90        self.model2 = Model(cyl2)
91        self.model2.set(scale= 1.0)
92        self.model2.set(radius=37)
93        self.model2.set(length='C1.length')
[6c00702]94        self.model2.set(sldCyl=3e-006, sldSolv=0.0)
[2eaaf1a]95        self.model2.set(background=0.0)
96       
97    def _fit(self, name="park"):
98        """ return fit result """
99        fitter = Fit(name)
100        fitter.set_data(self.data1,1)
101        fitter.set_model(self.model1, 1, ['length','radius','scale'])
102       
103        fitter.set_data(self.data2,2)
104        fitter.set_model(self.model2, 2, ['radius','scale'])
[6c00702]105        fitter.select_problem_for_fit(id=1,value=1)
106        fitter.select_problem_for_fit(id=2,value=1)
[2eaaf1a]107        return fitter.fit()
108   
109   
110    def test_park2(self):
111        """ Simultaneous cylinder model fit (park)  """
[6c00702]112        #raise NotImplementedError()
113        result1,= self._fit('park')
[822f97e]114        self.assert_(result1)
[2eaaf1a]115        self.assertTrue(len(result1.pvec)>=0  )
116        self.assertTrue(len(result1.stderr)>= 0)
117     
[822f97e]118        for par in result1.parameters:
119            if par.name=='C1.length':
120                print par.name, par.value
121                self.assertTrue( math.fabs(par.value-400.0)/3.0 < par.stderr )
122            elif par.name=='C1.radius':
123                print par.name, par.value
124                self.assertTrue( math.fabs(par.value-20.0)/3.0 < par.stderr )
125            elif par.name=='C2.radius':
126                print par.name, par.value
127                self.assertTrue( math.fabs(par.value-40.0)/3.0 < par.stderr )
128            elif par.name=='C1.scale':
129                print par.name, par.value
[2eaaf1a]130                self.assertTrue( math.fabs(par.value-1.0)/3.0 < par.stderr )
[822f97e]131            elif par.name=='C2.scale':
132                print par.name, par.value
[2eaaf1a]133                self.assertTrue( math.fabs(par.value-1.0)/3.0 < par.stderr )
[822f97e]134           
[2eaaf1a]135
136if __name__ == '__main__':
137    unittest.main()       
[ca6d914]138       
Note: See TracBrowser for help on using the repository browser.