source: sasview/test/park_integration/test/test_fit_line.py @ 6fe5100

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

Bumps first pass. Fitting works but no pretty pictures

  • Property mode set to 100644
File size: 8.4 KB
RevLine 
[ca6d914]1"""
2    Unit tests for fitting module
[2eaaf1a]3    @author Gervaise Alina
[ca6d914]4"""
5import unittest
[6fe5100]6import math
[2eaaf1a]7
[1e3169c]8from sans.fit.AbstractFitEngine import Model
[6c00702]9from sans.dataloader.loader import Loader
10from sans.fit.Fitting import Fit
11from sans.models.LineModel import LineModel
12from sans.models.Constant import Constant
13
[ca6d914]14class testFitModule(unittest.TestCase):
15    """ test fitting """
[2eaaf1a]16   
[ca6d914]17    def test1(self):
[8bbab51]18        """ Fit 1 data (testdata_line.txt)and 1 model(lineModel) """
[ca6d914]19        #load data
[1e3169c]20        data = Loader().load("testdata_line.txt")
[da5d8e8]21        data.name = data.filename
[ca6d914]22        #Importing the Fit module
[6fe5100]23        from bumps import fitters
24        fitters.FIT_DEFAULT = 'dream'
25        print fitters.FIT_OPTIONS['dream'].__dict__
26        fitter = Fit('bumps')
[ca6d914]27        # Receives the type of model for the fitting
28        model1  = LineModel()
29        model1.name = "M1"
[6c00702]30        model = Model(model1,data)
[ca6d914]31        #fit with scipy test
32       
33        pars1= ['param1','param2']
34        fitter.set_data(data,1)
35        try:fitter.set_model(model,1,pars1)
[6c00702]36        except ValueError,exc:
37            #print "ValueError was correctly raised: "+str(msg)
38            assert str(exc).startswith('wrong parameter')
39        else: raise AssertionError("No error raised for scipy fitting with wrong parameters name to fit")
[ca6d914]40        pars1= ['A','B']
41        fitter.set_model(model,1,pars1)
[dd8ee14]42        fitter.select_problem_for_fit(id=1,value=1)
[da5d8e8]43        result1, = fitter.fit()
[6c00702]44
[da5d8e8]45        self.assertTrue( math.fabs(result1.pvec[0]-4)/3 <= result1.stderr[0] )
46        self.assertTrue( math.fabs(result1.pvec[1]-2.5)/3 <= result1.stderr[1])
47        self.assertTrue( result1.fitness/len(data.x) < 2 )
[6c00702]48
[6fe5100]49        return
[ca6d914]50        #fit with park test
51        fitter = Fit('park')
52        fitter.set_data(data,1)
53        fitter.set_model(model,1,pars1)
[dd8ee14]54        fitter.select_problem_for_fit(id=1,value=1)
[da5d8e8]55        result2, = fitter.fit()
[ca6d914]56       
57        self.assert_(result2)
[2eaaf1a]58        self.assertTrue( math.fabs(result2.pvec[0]-4)/3 <= result2.stderr[0] ) 
59        self.assertTrue( math.fabs(result2.pvec[1]-2.5)/3 <= result2.stderr[1] )
60        self.assertTrue( result2.fitness/len(data.x) < 2)
[ca6d914]61        # compare fit result result for scipy and park
62        self.assertAlmostEquals( result1.pvec[0], result2.pvec[0] )
63        self.assertAlmostEquals( result1.pvec[1],result2.pvec[1] )
64        self.assertAlmostEquals( result1.stderr[0],result2.stderr[0] )
65        self.assertAlmostEquals( result1.stderr[1],result2.stderr[1] )
[2eaaf1a]66        self.assertAlmostEquals( result1.fitness,
67                                 result2.fitness/len(data.x),1 )
68       
[ca6d914]69       
70    def test2(self):
71        """ fit 2 data and 2 model with no constrainst"""
72        #load data
73        l = Loader()
[1e3169c]74        data1=l.load("testdata_line.txt")
[da5d8e8]75        data1.name = data1.filename
[1e3169c]76     
77        data2=l.load("testdata_line1.txt")
[da5d8e8]78        data2.name = data2.filename
[1e3169c]79     
[ca6d914]80        #Importing the Fit module
81        fitter = Fit('scipy')
82        # Receives the type of model for the fitting
83        model11  = LineModel()
84        model11.name= "M1"
85        model22  = LineModel()
86        model11.name= "M2"
[1e3169c]87     
[da5d8e8]88        model1 = Model(model11,data1)
89        model2 = Model(model22,data2)
[ca6d914]90        #fit with scipy test
91        pars1= ['A','B']
92        fitter.set_data(data1,1)
93        fitter.set_model(model1,1,pars1)
[dd8ee14]94        fitter.select_problem_for_fit(id=1,value=0)
[ca6d914]95        fitter.set_data(data2,2)
96        fitter.set_model(model2,2,pars1)
[dd8ee14]97        fitter.select_problem_for_fit(id=2,value=0)
[8bbab51]98       
[6c00702]99        try: result1, = fitter.fit()
[8bbab51]100        except RuntimeError,msg:
101           assert str(msg)=="No Assembly scheduled for Scipy fitting."
[da5d8e8]102        else: raise AssertionError,"No error raised for scipy fitting with no model"
[dd8ee14]103        fitter.select_problem_for_fit(id=1,value=1)
104        fitter.select_problem_for_fit(id=2,value=1)
[6c00702]105        try: result1, = fitter.fit()
[ca6d914]106        except RuntimeError,msg:
107           assert str(msg)=="Scipy can't fit more than a single fit problem at a time."
[da5d8e8]108        else: raise AssertionError,"No error raised for scipy fitting with more than 2 models"
[6fe5100]109
110        return
[ca6d914]111        #fit with park test
112        fitter = Fit('park')
113        fitter.set_data(data1,1)
114        fitter.set_model(model1,1,pars1)
115        fitter.set_data(data2,2)
116        fitter.set_model(model2,2,pars1)
[dd8ee14]117        fitter.select_problem_for_fit(id=1,value=1)
118        fitter.select_problem_for_fit(id=2,value=1)
[da5d8e8]119        R1,R2 = fitter.fit()
[ca6d914]120       
[da5d8e8]121        self.assertTrue( math.fabs(R1.pvec[0]-4)/3 <= R1.stderr[0] )
122        self.assertTrue( math.fabs(R1.pvec[1]-2.5)/3 <= R1.stderr[1] )
123        self.assertTrue( R1.fitness/(len(data1.x)+len(data2.x)) < 2)
[ca6d914]124       
125       
126    def test3(self):
127        """ fit 2 data and 2 model with 1 constrainst"""
[6fe5100]128        return
[ca6d914]129        #load data
130        l = Loader()
[1e3169c]131        data1= l.load("testdata_line.txt")
[da5d8e8]132        data1.name = data1.filename
[1e3169c]133        data2= l.load("testdata_cst.txt")
[da5d8e8]134        data2.name = data2.filename
[1e3169c]135       
[ca6d914]136        # Receives the type of model for the fitting
137        model11  = LineModel()
138        model11.name= "line"
[2eaaf1a]139        model11.setParam("A", 1.0)
140        model11.setParam("B",1.0)
141       
[ca6d914]142        model22  = Constant()
143        model22.name= "cst"
[2eaaf1a]144        model22.setParam("value", 1.0)
[8bbab51]145       
[da5d8e8]146        model1 = Model(model11,data1)
147        model2 = Model(model22,data2)
[8bbab51]148        model1.set(A=4)
149        model1.set(B=3)
[1e3169c]150        # Constraint the constant value to be equal to parameter B (the real value is 2.5)
[8bbab51]151        model2.set(value='line.B')
[ca6d914]152        #fit with scipy test
153        pars1= ['A','B']
154        pars2= ['value']
155       
[1e3169c]156        #Importing the Fit module
157        fitter = Fit('park')
[ca6d914]158        fitter.set_data(data1,1)
159        fitter.set_model(model1,1,pars1)
[8296ff5]160        fitter.set_data(data2,2,smearer=None)
[ca6d914]161        fitter.set_model(model2,2,pars2)
[dd8ee14]162        fitter.select_problem_for_fit(id=1,value=1)
163        fitter.select_problem_for_fit(id=2,value=1)
[ca6d914]164       
[da5d8e8]165        R1,R2 = fitter.fit()
166        self.assertTrue( math.fabs(R1.pvec[0]-4.0)/3. <= R1.stderr[0])
167        self.assertTrue( math.fabs(R1.pvec[1]-2.5)/3. <= R1.stderr[1])
168        self.assertTrue( R1.fitness/(len(data1.x)+len(data2.x)) < 2)
[ca6d914]169       
170       
171    def test4(self):
172        """ fit 2 data concatenates with limited range of x and  one model """
173            #load data
174        l = Loader()
[1e3169c]175        data1 = l.load("testdata_line.txt")
[da5d8e8]176        data1.name = data1.filename
[1e3169c]177        data2 = l.load("testdata_line1.txt")
[da5d8e8]178        data2.name = data2.filename
179
[ca6d914]180        # Receives the type of model for the fitting
181        model1  = LineModel()
182        model1.name= "M1"
[2eaaf1a]183        model1.setParam("A", 1.0)
184        model1.setParam("B",1.0)
[da5d8e8]185        model = Model(model1,data1)
[1e3169c]186     
[ca6d914]187        #fit with scipy test
188        pars1= ['A','B']
[1e3169c]189        #Importing the Fit module
190        fitter = Fit('scipy')
[ca6d914]191        fitter.set_data(data1,1,qmin=0, qmax=7)
192        fitter.set_model(model,1,pars1)
193        fitter.set_data(data2,1,qmin=1,qmax=10)
[dd8ee14]194        fitter.select_problem_for_fit(id=1,value=1)
[ca6d914]195       
[6c00702]196        result1, = fitter.fit()
[6fe5100]197        #print(result1)
[ca6d914]198        self.assert_(result1)
[916a15f]199
[2eaaf1a]200        self.assertTrue( math.fabs(result1.pvec[0]-4)/3 <= result1.stderr[0] )
201        self.assertTrue( math.fabs(result1.pvec[1]-2.5)/3 <= result1.stderr[1])
202        self.assertTrue( result1.fitness/len(data1.x) < 2 )
[6fe5100]203
204        return
[ca6d914]205        #fit with park test
206        fitter = Fit('park')
207        fitter.set_data(data1,1,qmin=0, qmax=7)
208        fitter.set_model(model,1,pars1)
209        fitter.set_data(data2,1,qmin=1,qmax=10)
[dd8ee14]210        fitter.select_problem_for_fit(id=1,value=1)
[da5d8e8]211        result2, = fitter.fit()
[ca6d914]212       
213        self.assert_(result2)
[2eaaf1a]214        self.assertTrue( math.fabs(result2.pvec[0]-4)/3 <= result2.stderr[0] )
215        self.assertTrue( math.fabs(result2.pvec[1]-2.5)/3 <= result2.stderr[1] )
216        self.assertTrue( result2.fitness/len(data1.x) < 2)
[ca6d914]217        # compare fit result result for scipy and park
218        self.assertAlmostEquals( result1.pvec[0], result2.pvec[0] )
219        self.assertAlmostEquals( result1.pvec[1],result2.pvec[1] )
220        self.assertAlmostEquals( result1.stderr[0],result2.stderr[0] )
221        self.assertAlmostEquals( result1.stderr[1],result2.stderr[1] )
[1e3169c]222        self.assertTrue( result2.fitness/(len(data2.x)+len(data1.x)) < 2 )
[6fe5100]223
224
225if __name__ == "__main__":
226    unittest.main()
[2eaaf1a]227   
Note: See TracBrowser for help on using the repository browser.