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