source: sasview/park_integration/test/testfitting.py @ 1c94a9f1

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 1c94a9f1 was cf3b781, checked in by Gervaise Alina <gervyh@…>, 16 years ago

need more tests.but usecase 3 implemented

  • Property mode set to 100644
File size: 8.0 KB
Line 
1"""
2    Unit tests for fitting module
3"""
4import unittest
5from sans.guitools.plottables import Theory1D
6from sans.guitools.plottables import Data1D
7from sans.fit.ScipyFitting import Parameter
8import math
9class testFitModule(unittest.TestCase):
10    """ test fitting """
11    def testLoader(self):
12        """
13            test module Load
14        """
15        from sans.fit.Loader import Load
16        load= Load()
17       
18        load.set_filename("testdata_line.txt")
19        self.assertEqual(load.get_filename(),"testdata_line.txt")
20        load.set_values()
21        x=[]
22        y=[]
23        dx=[]
24        dy=[]
25       
26        x,y,dx,dy = load.get_values()
27       
28        # test that values have been loaded
29        self.assertNotEqual(x, None)
30        self.assertNotEqual(y, [])
31        self.assertNotEqual(dy, None)
32        self.assertEqual(len(x),len(y))
33        self.assertEqual(len(dy),len(y))
34       
35        # test data the two plottables contained values loaded
36        data1 = Theory1D(x=[], y=[], dy=None)
37        data2 = Data1D(x=[], y=[],dx=None, dy=None)
38        data1.name = "data1"
39        data2.name = "data2"
40        load.load_data(data1)
41        load.load_data(data2)
42       
43       
44        for i in range(len(x)):
45            self.assertEqual(data2.x[i],x[i])
46            self.assertEqual(data1.y[i],y[i])
47            self.assertEqual(data2.y[i],y[i])
48            self.assertEqual(data1.dx[i],dx[i])
49            self.assertEqual(data2.dy[i],dy[i])
50            self.assertEqual(data1.x[i],data2.x[i])
51            self.assertEqual(data2.y[i],data2.y[i])
52           
53           
54    def testfit_1Data_1Model(self):
55        """ test fitting for one data and one model"""
56        #load data
57        from sans.fit.Loader import Load
58        load= Load()
59        load.set_filename("testdata_line.txt")
60        load.set_values()
61        data1 = Data1D(x=[], y=[],dx=None, dy=None)
62        load.load_data(data1)
63       
64        #Importing the Fit module
65        from sans.fit.Fitting import Fit
66        fitter= Fit()
67        fitter.fit_engine('scipy')
68        engine = fitter.returnEngine()
69        # Receives the type of model for the fitting
70        from sans.guitools.LineModel import LineModel
71        model  = LineModel()
72       
73        #Do the fit SCIPY
74        engine.set_data(data1,1)
75        engine.set_param( model,"M1", {'A':2,'B':4})
76        engine.set_model(model,1)
77       
78        chisqr1, out1, cov1=engine.fit({'A':2,'B':1},None,None)
79        """ testing SCIPy results"""
80        self.assert_(math.fabs(out1[1]-2.5)/math.sqrt(cov1[1][1]) < 2)
81        self.assert_(math.fabs(out1[0]-4.0)/math.sqrt(cov1[0][0]) < 2)
82        self.assert_(chisqr1/len(data1.x) < 2)
83        # PARK
84        fitter= Fit()
85        fitter.fit_engine('park')
86        engine = fitter.returnEngine()
87       
88        #Do the fit
89        engine.set_data(data1,1)
90        engine.set_param( model1,"M1", {'A':2,'B':4})
91        engine.set_model(model,1)
92       
93        engine.fit({'A':2,'B':1},None,None)
94       
95        self.assert_(math.fabs(out2[1]-2.5)/math.sqrt(cov2[1][1]) < 2)
96        self.assert_(math.fabs(out2[0]-4.0)/math.sqrt(cov2[0][0]) < 2)
97        self.assert_(chisqr2/len(data1.x) < 2)
98       
99        self.assertEqual(out1[1], out2[1])
100        self.assertEquals(out1[0], out2[0])
101        self.assertEquals(cov1[0][0], cov2[0][0])
102        self.assertEquals(cov1[1][1], cov2[1][1])
103        self.assertEquals(chisqr1, chisqr2)
104       
105    def testfit_2Data_1Model(self):
106        """ test fitting for two set of data  and one model"""
107        from sans.fit.Loader import Load
108        load= Load()
109        #Load the first set of data
110        load.set_filename("testdata1.txt")
111        load.set_values()
112        data1 = Data1D(x=[], y=[],dx=None, dy=None)
113        load.load_data(data1)
114       
115        #Load the second set of data
116        load.set_filename("testdata2.txt")
117        load.set_values()
118        data2 = Data1D(x=[], y=[],dx=None, dy=None)
119        load.load_data(data2)
120       
121        #Importing the Fit module
122        from sans.fit.Fitting import Fit
123        fitter= Fit()
124        # Receives the type of model for the fitting
125        from sans.guitools.LineModel import LineModel
126        model  = LineModel()
127        #set engine for scipy
128        fitter.fit_engine('scipy')
129        engine = fitter.returnEngine()
130        #Do the fit
131        engine.set_param( model,"M1", {'A':2,'B':4})
132        engine.set_model(model,1)
133   
134        engine.set_data(data1,1)
135        engine.set_data(data2,1)
136   
137       
138        chisqr1, out1, cov1= engine.fit({'A':2,'B':1},None,None)
139     
140        """ Testing results for SCIPY"""
141        self.assert_(math.fabs(out1[1]-2.5)/math.sqrt(cov1[1][1]) < 2)
142        self.assert_(math.fabs(out1[0]-4.0)/math.sqrt(cov1[0][0]) < 2)
143        self.assert_(chisqr1/len(data1.x+data2.x) < 2)
144        #self.assert_(chisqr1/len(data2.x) < 2)
145       
146        #set engine for park
147        fitter= Fit()
148        fitter.fit_engine('park')
149        engine = fitter.returnEngine()
150        #Do the fit
151        engine.set_data(data1,1)
152        engine.set_model(model,1)
153        engine.set_data(data2,1)
154        engine.fit({'A':2,'B':1},None,None)
155       
156        chisqr2, out2, cov2= engine.fit({'A':2,'B':1},None,None)
157        #print "park",chisqr2, out2, cov2
158        self.assert_(math.fabs(out2[1]-2.5)/math.sqrt(cov2[1][1]) < 2)
159        self.assert_(math.fabs(out2[0]-4.0)/math.sqrt(cov2[0][0]) < 2)
160        self.assert_(chisqr2/len(data1.x) < 2)
161        self.assert_(chisqr2/len(data2.x) < 2)
162       
163        self.assertEqual(out1[0],out2[0])
164        self.assertEqual(out1[1],out2[1])
165        self.assertEqual(chisqr1,chisqr2)
166        self.assertEqual(cov1[0][0],cov2[0][0])
167        self.assertEqual(cov1[1][1],cov2[1][1])
168       
169    def test2models2dataonconstraint(self):
170        """ test for 2 Models two data one constraint"""
171        from sans.fit.Loader import Load
172        load= Load()
173        #Load the first set of data
174        load.set_filename("testdata1.txt")
175        load.set_values()
176        data1 = Data1D(x=[], y=[],dx=None, dy=None)
177        load.load_data(data1)
178       
179        #Load the second set of data
180        load.set_filename("testdata2.txt")
181        load.set_values()
182        data2 = Data1D(x=[], y=[],dx=None, dy=None)
183        load.load_data(data2)
184       
185        #Importing the Fit module
186        from sans.fit.Fitting import Fit
187        fitter= Fit()
188        # Receives the type of model for the fitting
189        from sans.guitools.LineModel import LineModel
190        model1  = LineModel()
191        model2  = LineModel()
192       
193        #set engine for scipy
194        """
195            fitter.fit_engine('scipy')
196            engine = fitter.returnEngine()
197            #Do the fit
198            engine.set_param( model1,"M1", {'A':2,'B':4})
199            engine.set_model(model1,1)
200            engine.set_data(data1,1)
201            engine.set_param( model1,"M2", {'A':2.1,'B':3})
202            engine.set_model(model2,2)
203            engine.set_data(data2,2)
204       
205            try: engine.fit({'A':2,'B':1},None,None)
206            except ValueError,msg:
207                assert str(msg)=="cannot fit more than one model",'Message: <%s>'%(msg)
208        """
209        #set engine for park
210        fitter= Fit()
211        fitter.fit_engine('park')
212        engine = fitter.returnEngine()
213        #Do the fit
214        engine.set_data(data1,1)
215        engine.set_param(model1,"M1",{'A':2,'B':1})
216        engine.set_model(model1,1)
217       
218        engine.set_param(model2,"M2",{'A':3,'B':'M1.B'})
219        engine.set_model(model2,2)
220        engine.set_data(data2,2)
221        chisqr2, out2, cov2= engine.fit({'A':2,'B':1},None,None)
222       
223       
224        self.assert_(math.fabs(out2[1]-2.5)/math.sqrt(cov2[1][1]) < 2)
225        self.assert_(math.fabs(out2[0]-4.0)/math.sqrt(cov2[0][0]) < 2)
226        self.assert_(chisqr2/len(data1.x) < 2)
227        self.assert_(chisqr2/len(data2.x) < 2)
228       
Note: See TracBrowser for help on using the repository browser.