source: sasview/test/park_integration/test/test_fit_line.py @ da5d8e8

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

improve fitting tests (but they are still not correct)

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