source: sasview/test/sasrealspace/test/utest_oriented.py @ 88d2e70

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1249
Last change on this file since 88d2e70 was 88d2e70, checked in by Paul Kienzle <pkienzle@…>, 5 years ago

support for py37 in unit tests

  • Property mode set to 100644
File size: 15.7 KB
RevLine 
[959eb01]1"""
2    Unit tests for specific oriented models
3    @copyright: University of Tennessee, for the DANSE project
4"""
[aaf5e49]5from __future__ import print_function
[959eb01]6
7import unittest, math, sys
8
9# Disable "missing docstring" complaint
10# pylint: disable-msg=C0111
[1cdbcd8]11# Disable "too many methods" complaint
12# pylint: disable-msg=R0904
13# Disable "could be a function" complaint
[959eb01]14# pylint: disable-msg=R0201
15# pylint: disable-msg=W0702
16
[1cdbcd8]17from sasmodels.sasview_model import _make_standard_model
18EllipsoidModel = _make_standard_model('ellipsoid')
19SphereModel = _make_standard_model('sphere')
20CylinderModel = _make_standard_model('cylinder')
21CoreShellModel = _make_standard_model('core_shell_sphere')
22
23import sas.sascalc.realspace.VolumeCanvas as VolumeCanvas
24
25
[959eb01]26
27class TestSphere(unittest.TestCase):
28    """ Tests for oriented (2D) systems """
[1cdbcd8]29
[959eb01]30    def setUp(self):
31        """
32            Set up canvas
33        """
34        self.model = VolumeCanvas.VolumeCanvas()
[1cdbcd8]35
[959eb01]36        handle = self.model.add('sphere')
[1cdbcd8]37
[959eb01]38        radius = 10
39        density = .1
[1cdbcd8]40
[959eb01]41        ana = SphereModel()
42        ana.setParam('scale', 1.0)
43        ana.setParam('background', 0.0)
[1cdbcd8]44        ana.setParam('sld', 1.0)
45        ana.setParam('sld_solvent', 0.0)
[959eb01]46        ana.setParam('radius', radius)
47        self.ana = ana
[1cdbcd8]48
[959eb01]49        self.model.setParam('lores_density', density)
50        self.model.setParam('scale' , 1.0)
51        self.model.setParam('background' , 0.0)
[1cdbcd8]52        self.model.setParam('%s.contrast' % handle, 1.0)
53        self.model.setParam('%s.radius' % handle, radius)
54
55
[959eb01]56    def testdefault(self):
57        """ Testing sphere """
58        # Default orientation
59        ana_val = self.ana.runXY([0.1, 0.1])
60        sim_val = self.model.getIq2D(0.1, 0.1)
[88d2e70]61        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.1 )
[1cdbcd8]62
[959eb01]63class TestCylinderAddObject(unittest.TestCase):
64    """ Tests for oriented (2D) systems """
[1cdbcd8]65
[959eb01]66    def setUp(self):
67        """ Set up cylinder model """
68        radius = 5
69        length = 40
70        density = 20
[1cdbcd8]71
[959eb01]72        # Analytical model
73        self.ana = CylinderModel()
74        self.ana.setParam('scale', 1.0)
75        self.ana.setParam('background', 0.0)
[1cdbcd8]76        self.ana.setParam('sld', 1.0)
77        self.ana.setParam('sld_solvent', 0.0)
[959eb01]78        self.ana.setParam('radius', radius)
79        self.ana.setParam('length', length)
[1cdbcd8]80
[959eb01]81        # Simulation model
82        self.model = VolumeCanvas.VolumeCanvas()
83        cyl = VolumeCanvas.CylinderDescriptor()
84        self.handle = self.model.addObject(cyl)
85        self.model.setParam('lores_density', density)
86        self.model.setParam('scale' , 1.0)
87        self.model.setParam('background' , 0.0)
[1cdbcd8]88        self.model.setParam('%s.contrast' % self.handle, 1.0)
89        self.model.setParam('%s.radius' % self.handle, radius)
90        self.model.setParam('%s.length' % self.handle, length)
91
[959eb01]92    def testalongY(self):
93        """ Testing cylinder along Y axis """
[1cdbcd8]94        self.ana.setParam('theta', math.pi/2.0)
95        self.ana.setParam('phi', math.pi/2.0)
96
[959eb01]97        self.model.setParam('%s.orientation' % self.handle, [0,0,0])
[1cdbcd8]98
[959eb01]99        ana_val = self.ana.runXY([0.1, 0.2])
100        sim_val = self.model.getIq2D(0.1, 0.2)
101        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]102
[88d2e70]103        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]104
105
[959eb01]106class TestCylinder(unittest.TestCase):
107    """ Tests for oriented (2D) systems """
[1cdbcd8]108
[959eb01]109    def setUp(self):
110        """ Set up cylinder model """
111        radius = 5
112        length = 40
113        density = 20
[1cdbcd8]114
[959eb01]115        # Analytical model
116        self.ana = CylinderModel()
117        self.ana.setParam('scale', 1.0)
118        self.ana.setParam('background', 0.0)
[1cdbcd8]119        self.ana.setParam('sld', 1.0)
120        self.ana.setParam('sld_solvent', 0.0)
[959eb01]121        self.ana.setParam('radius', radius)
122        self.ana.setParam('length', length)
[1cdbcd8]123
[959eb01]124        # Simulation model
125        self.model = VolumeCanvas.VolumeCanvas()
126        self.handle = self.model.add('cylinder')
127        self.model.setParam('lores_density', density)
[1cdbcd8]128        self.model.setParam('scale' , 1.0)
129        self.model.setParam('background' , 0.0)
[959eb01]130        self.model.setParam('%s.radius' % self.handle, radius)
131        self.model.setParam('%s.length' % self.handle, length)
132        self.model.setParam('%s.contrast' % self.handle, 1.0)
[1cdbcd8]133
[959eb01]134    def testalongY(self):
135        """ Testing cylinder along Y axis """
[1cdbcd8]136        self.ana.setParam('theta', math.pi/2.0)
137        self.ana.setParam('phi', math.pi/2.0)
138
[959eb01]139        self.model.setParam('%s.orientation' % self.handle, [0,0,0])
[1cdbcd8]140
[959eb01]141        ana_val = self.ana.runXY([0.1, 0.2])
142        sim_val = self.model.getIq2D(0.1, 0.2)
143        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]144
[88d2e70]145        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]146
[959eb01]147    def testalongZ(self):
148        """ Testing cylinder along Z axis """
[1cdbcd8]149        self.ana.setParam('theta', 0)
150        self.ana.setParam('phi', 0)
151
[959eb01]152        self.model.setParam('%s.orientation' % self.handle, [90,0,0])
[1cdbcd8]153
[959eb01]154        ana_val = self.ana.runXY([0.1, 0.2])
155        sim_val = self.model.getIq2D(0.1, 0.2)
156        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]157
[88d2e70]158        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]159
[959eb01]160    def testalongX(self):
161        """ Testing cylinder along X axis """
[1cdbcd8]162        self.ana.setParam('theta', 1.57)
163        self.ana.setParam('phi', 0)
164
[959eb01]165        self.model.setParam('%s.orientation' % self.handle, [0,0,90])
[1cdbcd8]166
[959eb01]167        ana_val = self.ana.runXY([0.1, 0.2])
168        sim_val = self.model.getIq2D(0.1, 0.2)
169        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]170
[88d2e70]171        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]172
[959eb01]173class TestEllipsoid(unittest.TestCase):
174    """ Tests for oriented (2D) systems """
[1cdbcd8]175
[959eb01]176    def setUp(self):
177        """ Set up ellipsoid """
[1cdbcd8]178
[959eb01]179        radius_a = 60
180        radius_b = 10
181        density = 30
[1cdbcd8]182
[959eb01]183        self.ana = EllipsoidModel()
184        self.ana.setParam('scale', 1.0)
185        self.ana.setParam('background', 0.0)
[1cdbcd8]186        self.ana.setParam('sld', 1.0)
187        self.ana.setParam('sld_solvent', 0.0)
188        self.ana.setParam('radius_polar', radius_a)
189        self.ana.setParam('radius_equatorial', radius_b)
[959eb01]190        # Default orientation is there=1.57, phi=0
191        # Radius_a is along the x direction
[1cdbcd8]192
[959eb01]193        canvas = VolumeCanvas.VolumeCanvas()
194        self.handle = canvas.add('ellipsoid')
[1cdbcd8]195        canvas.setParam('lores_density', density)
196        canvas.setParam('scale' , 1.0)
197        canvas.setParam('background' , 0.0)
[959eb01]198        canvas.setParam('%s.radius_x' % self.handle, radius_a)
199        canvas.setParam('%s.radius_y' % self.handle, radius_b)
200        canvas.setParam('%s.radius_z' % self.handle, radius_b)
201        canvas.setParam('%s.contrast' % self.handle, 1.0)
[1cdbcd8]202        self.canvas = canvas
[959eb01]203
204    def testalongX(self):
205        """ Testing ellipsoid along X """
[1cdbcd8]206        self.ana.setParam('theta', 1.57)
207        self.ana.setParam('phi', 0)
208
[959eb01]209        self.canvas.setParam('%s.orientation' % self.handle, [0,0,0])
[1cdbcd8]210
[959eb01]211        ana_val = self.ana.runXY([0.1, 0.2])
212        sim_val = self.canvas.getIq2D(0.1, 0.2)
213        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]214
[88d2e70]215        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[959eb01]216
217    def testalongZ(self):
218        """ Testing ellipsoid along Z """
[1cdbcd8]219        self.ana.setParam('theta', 0)
220        self.ana.setParam('phi', 0)
221
[959eb01]222        self.canvas.setParam('%s.orientation' % self.handle, [0,90,0])
[1cdbcd8]223
[959eb01]224        ana_val = self.ana.runXY([0.1, 0.2])
225        sim_val = self.canvas.getIq2D(0.1, 0.2)
226        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]227
[88d2e70]228        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[959eb01]229
230    def testalongY(self):
231        """ Testing ellipsoid along Y """
[1cdbcd8]232        self.ana.setParam('theta', math.pi/2.0)
233        self.ana.setParam('phi', math.pi/2.0)
234
[959eb01]235        self.canvas.setParam('%s.orientation' % self.handle, [0,0,90])
[1cdbcd8]236
[959eb01]237        ana_val = self.ana.runXY([0.05, 0.15])
238        sim_val = self.canvas.getIq2D(0.05, 0.15)
239        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]240
[959eb01]241        try:
[88d2e70]242            self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]243        except Exception:
[aaf5e49]244            print("Error", ana_val, sim_val, sim_val/ana_val)
[1cdbcd8]245            raise
[959eb01]246
247class TestCoreShell(unittest.TestCase):
248    """ Tests for oriented (2D) systems """
[1cdbcd8]249
[959eb01]250    def setUp(self):
251        """ Set up zero-SLD-average core-shell model """
[1cdbcd8]252
[959eb01]253        radius = 15
254        thickness = 5
255        density = 20
[1cdbcd8]256
[959eb01]257        core_vol = 4.0/3.0*math.pi*radius*radius*radius
258        self.outer_radius = radius+thickness
259        shell_vol = 4.0/3.0*math.pi*self.outer_radius*self.outer_radius*self.outer_radius - core_vol
260        self.shell_sld = -1.0*core_vol/shell_vol
261
262        self.density = density
[1cdbcd8]263
[959eb01]264        # Core-shell
265        sphere = CoreShellModel()
[1cdbcd8]266        sphere.setParam('scale', 1.0)
267        sphere.setParam('background', 0.0)
[959eb01]268        # Core radius
269        sphere.setParam('radius', radius)
270        # Shell thickness
271        sphere.setParam('thickness', thickness)
[1cdbcd8]272        sphere.setParam('sld_core', 1.0)
273        sphere.setParam('sld_shell', self.shell_sld)
274        sphere.setParam('sld_solvent', 0.0)
[959eb01]275        self.ana = sphere
[1cdbcd8]276
277        canvas = VolumeCanvas.VolumeCanvas()
[959eb01]278        canvas.setParam('lores_density', self.density)
[1cdbcd8]279        canvas.setParam('scale' , 1.0)
280        canvas.setParam('background' , 0.0)
281
[959eb01]282        handle = canvas.add('sphere')
283        canvas.setParam('%s.radius' % handle, self.outer_radius)
284        canvas.setParam('%s.contrast' % handle, self.shell_sld)
[1cdbcd8]285
[959eb01]286        handle2 = canvas.add('sphere')
287        canvas.setParam('%s.radius' % handle2, radius)
288        canvas.setParam('%s.contrast' % handle2, 1.0)
[1cdbcd8]289
290        self.canvas = canvas
291
[959eb01]292    def testdefault(self):
293        """ Testing default core-shell orientation """
294        ana_val = self.ana.runXY([0.1, 0.2])
295        sim_val, err = self.canvas.getIq2DError(0.1, 0.2)
[1cdbcd8]296
[88d2e70]297        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]298
[959eb01]299class TestCoreShellError(unittest.TestCase):
300    """ Tests for oriented (2D) systems """
[1cdbcd8]301
[959eb01]302    def setUp(self):
303        """ Set up zero-SLD-average core-shell model """
[1cdbcd8]304
[959eb01]305        radius = 15
306        thickness = 5
307        density = 5
[1cdbcd8]308
[959eb01]309        core_vol = 4.0/3.0*math.pi*radius*radius*radius
310        self.outer_radius = radius+thickness
311        shell_vol = 4.0/3.0*math.pi*self.outer_radius*self.outer_radius*self.outer_radius - core_vol
312        self.shell_sld = -1.0*core_vol/shell_vol
313
314        self.density = density
[1cdbcd8]315
[959eb01]316        # Core-shell
317        sphere = CoreShellModel()
[1cdbcd8]318        sphere.setParam('scale', 1.0)
319        sphere.setParam('background', 0.0)
[959eb01]320        # Core radius
321        sphere.setParam('radius', radius)
322        # Shell thickness
323        sphere.setParam('thickness', thickness)
[1cdbcd8]324        sphere.setParam('sld_core', 1.0)
325        sphere.setParam('sld_shell', self.shell_sld)
326        sphere.setParam('sld_solvent', 0.0)
[959eb01]327        self.ana = sphere
[1cdbcd8]328
329        canvas = VolumeCanvas.VolumeCanvas()
[959eb01]330        canvas.setParam('lores_density', self.density)
[1cdbcd8]331        canvas.setParam('scale' , 1.0)
332        canvas.setParam('background' , 0.0)
333
[959eb01]334        handle = canvas.add('sphere')
335        canvas.setParam('%s.radius' % handle, self.outer_radius)
336        canvas.setParam('%s.contrast' % handle, self.shell_sld)
[1cdbcd8]337
[959eb01]338        handle2 = canvas.add('sphere')
339        canvas.setParam('%s.radius' % handle2, radius)
340        canvas.setParam('%s.contrast' % handle2, 1.0)
[1cdbcd8]341
342        self.canvas = canvas
343
[959eb01]344    def testdefault(self):
345        """ Testing default core-shell orientation """
346        ana_val = self.ana.runXY([0.1, 0.2])
347        sim_val, err = self.canvas.getIq2DError(0.1, 0.2)
[1cdbcd8]348
[88d2e70]349        self.assertTrue( math.fabs(sim_val-ana_val) < 3.0 * err )
[959eb01]350
351class TestRunMethods(unittest.TestCase):
352    """ Tests run methods for oriented (2D) systems """
353
354    def setUp(self):
355        """ Set up ellipsoid """
[1cdbcd8]356
[959eb01]357        radius_a = 10
358        radius_b = 15
359        density = 5
[1cdbcd8]360
[959eb01]361        self.ana = EllipsoidModel()
362        self.ana.setParam('scale', 1.0)
363        self.ana.setParam('background', 0.0)
[1cdbcd8]364        self.ana.setParam('sld', 1.0)
365        self.ana.setParam('sld_solvent', 1.0)
366        self.ana.setParam('radius_polar', radius_a)
367        self.ana.setParam('radius_equatorial', radius_b)
368
[959eb01]369
370        canvas = VolumeCanvas.VolumeCanvas()
371        self.handle = canvas.add('ellipsoid')
[1cdbcd8]372        canvas.setParam('lores_density', density)
373        canvas.setParam('scale' , 1.0)
374        canvas.setParam('background' , 0.0)
[959eb01]375        canvas.setParam('%s.radius_x' % self.handle, radius_a)
376        canvas.setParam('%s.radius_y' % self.handle, radius_b)
377        canvas.setParam('%s.radius_z' % self.handle, radius_b)
378        canvas.setParam('%s.contrast' % self.handle, 1.0)
[1cdbcd8]379        self.canvas = canvas
380
381        self.ana.setParam('theta', 1.57)
382        self.ana.setParam('phi', 0)
383
[959eb01]384        self.canvas.setParam('%s.orientation' % self.handle, [0,0,0])
[1cdbcd8]385
[959eb01]386
387    def testRunXY_List(self):
388        """ Testing ellipsoid along X """
389        ana_val = self.ana.runXY([0.1, 0.2])
390        sim_val = self.canvas.runXY([0.1, 0.2])
391        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]392
[959eb01]393        try:
[88d2e70]394            self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]395        except Exception:
[aaf5e49]396            print("Error", ana_val, sim_val, sim_val/ana_val)
[1cdbcd8]397            raise
[959eb01]398
399    def testRunXY_float(self):
400        """ Testing ellipsoid along X """
401        ana_val = self.ana.runXY(0.1)
402        sim_val = self.canvas.runXY(0.1)
403        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]404
[959eb01]405        try:
[88d2e70]406            self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]407        except Exception:
[aaf5e49]408            print("Error", ana_val, sim_val, sim_val/ana_val)
[1cdbcd8]409            raise
[959eb01]410
411    def testRun_float(self):
412        """ Testing ellipsoid along X """
413        ana_val = self.ana.run(0.1)
414        sim_val = self.canvas.run(0.1)
415        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]416
[959eb01]417        try:
[88d2e70]418            self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]419        except Exception:
[aaf5e49]420            print("Error", ana_val, sim_val, sim_val/ana_val)
[1cdbcd8]421            raise
[959eb01]422
423    def testRun_list(self):
424        """ Testing ellipsoid along X """
425        ana_val = self.ana.run([0.1, 33.0])
426        sim_val = self.canvas.run([0.1, 33.0])
427        #print ana_val, sim_val, sim_val/ana_val
[1cdbcd8]428
[959eb01]429        try:
[88d2e70]430            self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]431        except Exception:
[aaf5e49]432            print("Error", ana_val, sim_val, sim_val/ana_val)
[1cdbcd8]433            raise
[959eb01]434
435class TestParamChange(unittest.TestCase):
436    """ Tests for oriented (2D) systems """
[1cdbcd8]437
[959eb01]438    def setUp(self):
439        """ Set up cylinder model """
440        radius = 5
441        length = 40
442        density = 20
[1cdbcd8]443
[959eb01]444        # Analytical model
445        self.ana = CylinderModel()
446        self.ana.setParam('scale', 1.0)
447        self.ana.setParam('background', 0.0)
[1cdbcd8]448        self.ana.setParam('sld', 1.0)
449        self.ana.setParam('sld_solvent', 0.0)
[959eb01]450        self.ana.setParam('radius', radius)
451        self.ana.setParam('length', length)
[1cdbcd8]452        self.ana.setParam('theta', math.pi/2.0)
453        self.ana.setParam('phi', math.pi/2.0)
454
[959eb01]455        # Simulation model
456        self.model = VolumeCanvas.VolumeCanvas()
457        self.handle = self.model.add('cylinder')
458        self.model.setParam('lores_density', density)
[1cdbcd8]459        self.model.setParam('scale' , 1.0)
460        self.model.setParam('background' , 0.0)
[959eb01]461        self.model.setParam('%s.radius' % self.handle, radius)
462        self.model.setParam('%s.length' % self.handle, length)
463        self.model.setParam('%s.contrast' % self.handle, 1.0)
464        self.model.setParam('%s.orientation' % self.handle, [0,0,0])
[1cdbcd8]465
[959eb01]466    def testalongY(self):
467        """ Test that a parameter change forces the generation
468            of new space points
469        """
470        ana_val = self.ana.runXY([0.1, 0.2])
471        sim_val = self.model.getIq2D(0.1, 0.2)
[1cdbcd8]472
[88d2e70]473        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[1cdbcd8]474
[959eb01]475        # Change the radius a re-evaluate
476        self.ana.setParam('radius', 10)
477        self.model.setParam('%s.radius' % self.handle, 10)
[1cdbcd8]478
[959eb01]479        ana_val = self.ana.runXY([0.1, 0.2])
480        sim_val = self.model.getIq2D(0.1, 0.2)
[88d2e70]481        self.assertTrue( math.fabs(sim_val/ana_val-1.0)<0.05 )
[959eb01]482
483
484if __name__ == '__main__':
[1cdbcd8]485    unittest.main()
Note: See TracBrowser for help on using the repository browser.