source: sasview/sansmodels/src/sans/models/test/utest_modelmultiplication_new.py @ dffee80

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 dffee80 was b7a25a7e, checked in by Jae Cho <jhjcho@…>, 15 years ago

utest for new MultiplicationModel? functions.: olders will not pass.

  • Property mode set to 100644
File size: 6.1 KB
RevLine 
[b7a25a7e]1"""
2    Unit tests for specific models
3    @author: Gervaise Alina / UTK
4"""
5#This test replaces the older utests for multiplicationModel. Aug. 31, 2009. JC
6import unittest, numpy,math
7
8from sans.models.MultiplicationModel import MultiplicationModel
9from sans.models.SphereModel import SphereModel
10from sans.models.SquareWellStructure import SquareWellStructure
11     
12class TestDisperser(unittest.TestCase):
13    """ Unit tests for sphere model * SquareWellStructure"""
14    model1= SphereModel()
15    model2= SquareWellStructure()
16    model3= MultiplicationModel(model1, model2)
17    details={}
18    details['scale'] = ['', None, None]
19    #details['radius'] = ['[A]', None, None]#Non ASCII charater
20    #details['contrast'] = ['[1/A^2]', None, None] #Non ASCII charater
21    details['background'] = ['[1/cm]', None, None]
22    details['volfraction'] = ['', None, None]
23    details['welldepth'] = ['[kT]', None, None]
24    details['wellwidth'] = ['', None, None]
25   
26    ## fittable parameters
27    fixed=[]
28    fixed=['radius.width']
29   
30    #Radius of model1.calculate_ER should be equal to the out of Diamfunctions
31    def test_multplication_radius(self):
32        "" "test multiplication model"""
33        from sans.models.MultiplicationModel import MultiplicationModel
34        from sans.models.CylinderModel import CylinderModel
35        from sans.models.HardsphereStructure import HardsphereStructure
36        from sans.models.DiamCylFunc import DiamCylFunc
37        model1 = CylinderModel()
38        modelD = DiamCylFunc()
39        model1.setParam("radius", 20)
40        model1.setParam("length", 400)
41        modelD.setParam("radius", 20)
42        modelD.setParam("length", 400)     
43        model2 = HardsphereStructure()
44        model  =  MultiplicationModel(model1,model2 )
45       
46        modelDrun = modelD.run(0.1)/2
47        model2.setParam("volfraction", 0.2)
48        model2.setParam("effect_radius", modelDrun )
49       
50        #Compare new method with old method
51         
52        self.assertEqual(model.run(0.1), model1.run(0.1)*model2.run(0.1))
53       
54        #Compare radius from two different calculations. Note: modelD.run(0.0) is DIAMETER
55        self.assertEqual(model1.calculate_ER(), modelD.run(0.1)/2)
56       
57    def test_multplication_radius1(self):
58        "" "test multiplication model"""
59        from sans.models.MultiplicationModel import MultiplicationModel
60        from sans.models.EllipsoidModel import EllipsoidModel
61        from sans.models.HardsphereStructure import HardsphereStructure
62        from sans.models.DiamEllipFunc import DiamEllipFunc
63        model1 = EllipsoidModel()
64        modelD = DiamEllipFunc()
65        model1.setParam("radius_a", 20)
66        model1.setParam("radius_b", 400)
67        modelD.setParam("radius_a", 20)
68        modelD.setParam("radius_b", 400)
69       
70        model2 = HardsphereStructure()
71        model2.setParam("volfraction", 0.2)
72        model  =  MultiplicationModel(model1,model2 )       
73        model.setParam("radius_a", 20)
74        model.setParam("radius_b", 400)
75        self.assertEqual(model.getParam("radius_a"), 20)
76        model2_in = modelD.run(0.1)/2
77        model_out = model.run(0.1)
78       
79        model2.setParam("effect_radius", model2_in)
80             
81        #Compare new method with old method
82        self.assertEqual(model_out, model1.run(0.1)*model2.run(0.1))
83       
84        #Compare radius from two different calculations
85        self.assertEqual(model1.calculate_ER(), model2_in)
86   
87    def test_multiplication(self):
88        """ test multiplication model"""
89        from sans.models.MultiplicationModel import MultiplicationModel
90        from sans.models.SphereModel import SphereModel
91        from sans.models.NoStructure import NoStructure
92        model1  =  MultiplicationModel(SphereModel(),NoStructure())
93        model2 = SphereModel()
94        x= 2
95        a = model1.run(x)
96       
97        b=  model2.run(x)
98        self.assertEqual(a, b)
99        model2.setParam("scale", 10)
100        c=  model2.run(x)
101        self.assertEqual(c, 10*b)
102        model1.setParam("scale", 10)
103        d=  model1.run(x)
104        self.assertEqual(d, 10*a)
105        self.assertEqual(model1.getParam("scale"), 10)
106       
107       
108    def testMultiplicationModel(self):
109        """ Test Multiplication  sphere with SquareWellStructure"""
110        ## test details dictionary
111        #self.assertEqual(self.model3.details, self.details)
112       
113        ## test parameters list
114        list3= self.model3.getParamList()
115
116        for item in self.model1.getParamList():
117            self.assert_(item in list3)
118        for item in self.model2.getParamList():
119            #model3 parameters should not include effect_radius*
120            if not 'effect_radius' in item: 
121                self.assert_(item in list3)
122           
123        ## test set value for parameters and get paramaters
124        self.model3.setParam("scale", 15)
125        self.assertEqual(self.model3.getParam("scale"), 15)
126        self.model3.setParam("radius", 20)
127        self.assertEqual(self.model3.getParam("radius"), 20)
128        self.model3.setParam("radius.width", 15)
129        self.assertEqual(self.model3.getParam("radius.width"), 15)
130       
131        ## Dispersity
132        list3= self.model3.getDispParamList()
133        self.assertEqual(list3, ['radius.npts', 'radius.nsigmas', 'radius.width'])
134       
135        from sans.models.dispersion_models import ArrayDispersion
136        disp_th = ArrayDispersion()
137       
138        values_th = numpy.zeros(100)
139        weights   = numpy.zeros(100)
140        for i in range(100):
141            values_th[i]=(math.pi/99.0*i)
142            weights[i]=(1.0)
143   
144        disp_th.set_weights(values_th, weights)
145       
146        self.model3.set_dispersion('radius', disp_th)
147       
148        val_1d = self.model3.run(math.sqrt(0.0002))
149        val_2d = self.model3.runXY([0.01,0.01]) 
150       
151        self.assertTrue(math.fabs(val_1d-val_2d)/val_1d < 0.02)
152        model4= self.model3.clone()
153        self.assertEqual(model4.getParam("radius"), 20)
154       
155if __name__ == '__main__':
156    unittest.main()
Note: See TracBrowser for help on using the repository browser.