forked from diffpy/diffpy.srfit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_characteristicfunctions.py
154 lines (125 loc) · 4.52 KB
/
test_characteristicfunctions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env python
##############################################################################
#
# diffpy.srfit by DANSE Diffraction group
# Simon J. L. Billinge
# (c) 2010 The Trustees of Columbia University
# in the City of New York. All rights reserved.
#
# File coded by: Pavol Juhas
#
# See AUTHORS.txt for a list of people who contributed.
# See LICENSE_DANSE.txt for license information.
#
##############################################################################
"""Tests for sas package."""
import unittest
import numpy
from utils import _msg_nosas, has_sas
from diffpy.srfit.sas.sasimport import sasimport
# Global variables to be assigned in setUp
cf = None
# ----------------------------------------------------------------------------
@unittest.skipUnless(has_sas, _msg_nosas)
class TestSASCF(unittest.TestCase):
def setUp(self):
global cf
import diffpy.srfit.pdf.characteristicfunctions as cf
return
def testSphere(self):
radius = 25
# Calculate sphere cf from SphereModel
SphereModel = sasimport("sas.models.SphereModel").SphereModel
model = SphereModel()
model.setParam("radius", radius)
ff = cf.SASCF("sphere", model)
r = numpy.arange(1, 60, 0.1, dtype=float)
fr1 = ff(r)
# Calculate sphere cf analytically
fr2 = cf.sphericalCF(r, 2 * radius)
diff = fr1 - fr2
res = numpy.dot(diff, diff)
res /= numpy.dot(fr2, fr2)
self.assertAlmostEqual(0, res, 4)
return
def testSpheroid(self):
prad = 20.9
erad = 33.114
# Calculate cf from EllipsoidModel
EllipsoidModel = sasimport("sas.models.EllipsoidModel").EllipsoidModel
model = EllipsoidModel()
model.setParam("radius_a", prad)
model.setParam("radius_b", erad)
ff = cf.SASCF("spheroid", model)
r = numpy.arange(0, 100, 1 / numpy.pi, dtype=float)
fr1 = ff(r)
# Calculate cf analytically
fr2 = cf.spheroidalCF(r, erad, prad)
diff = fr1 - fr2
res = numpy.dot(diff, diff)
res /= numpy.dot(fr2, fr2)
self.assertAlmostEqual(0, res, 4)
return
def testShell(self):
radius = 19.2
thickness = 7.8
# Calculate cf from VesicleModel
VesicleModel = sasimport("sas.models.VesicleModel").VesicleModel
model = VesicleModel()
model.setParam("radius", radius)
model.setParam("thickness", thickness)
ff = cf.SASCF("vesicle", model)
r = numpy.arange(0, 99.45, 0.1, dtype=float)
fr1 = ff(r)
# Calculate sphere cf analytically
fr2 = cf.shellCF(r, radius, thickness)
diff = fr1 - fr2
res = numpy.dot(diff, diff)
res /= numpy.dot(fr2, fr2)
self.assertAlmostEqual(0, res, 4)
return
def testCylinder(self):
"""Make sure cylinder works over different r-ranges"""
radius = 100
length = 30
CylinderModel = sasimport("sas.models.CylinderModel").CylinderModel
model = CylinderModel()
model.setParam("radius", radius)
model.setParam("length", length)
ff = cf.SASCF("cylinder", model)
r1 = numpy.arange(0, 10, 0.1, dtype=float)
r2 = numpy.arange(0, 50, 0.1, dtype=float)
r3 = numpy.arange(0, 100, 0.1, dtype=float)
r4 = numpy.arange(0, 500, 0.1, dtype=float)
fr1 = ff(r1)
fr2 = ff(r2)
fr3 = ff(r3)
fr4 = ff(r4)
d = fr1 - numpy.interp(r1, r2, fr2)
res12 = numpy.dot(d, d)
res12 /= numpy.dot(fr1, fr1)
self.assertAlmostEqual(0, res12, 4)
d = fr1 - numpy.interp(r1, r3, fr3)
res13 = numpy.dot(d, d)
res13 /= numpy.dot(fr1, fr1)
self.assertAlmostEqual(0, res13, 4)
d = fr1 - numpy.interp(r1, r4, fr4)
res14 = numpy.dot(d, d)
res14 /= numpy.dot(fr1, fr1)
self.assertAlmostEqual(0, res14, 4)
d = fr2 - numpy.interp(r2, r3, fr3)
res23 = numpy.dot(d, d)
res23 /= numpy.dot(fr2, fr2)
self.assertAlmostEqual(0, res23, 4)
d = fr2 - numpy.interp(r2, r4, fr4)
res24 = numpy.dot(d, d)
res24 /= numpy.dot(fr2, fr2)
self.assertAlmostEqual(0, res24, 4)
d = fr3 - numpy.interp(r3, r4, fr4)
res34 = numpy.dot(d, d)
res34 /= numpy.dot(fr3, fr3)
self.assertAlmostEqual(0, res34, 4)
return
# End of class TestSASCF
if __name__ == "__main__":
unittest.main()