Skip to content

Commit 9c825ec

Browse files
committed
tests: characteristicfunctions and contribution
1 parent 685df37 commit 9c825ec

File tree

2 files changed

+227
-226
lines changed

2 files changed

+227
-226
lines changed

tests/test_characteristicfunctions.py

Lines changed: 120 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -17,136 +17,135 @@
1717
import unittest
1818

1919
import numpy
20+
import pytest
2021

2122
from diffpy.srfit.sas.sasimport import sasimport
22-
23-
from .utils import _msg_nosas, has_sas
23+
import diffpy.srfit.pdf.characteristicfunctions as cf
2424

2525
# Global variables to be assigned in setUp
2626
cf = None
2727

2828
# ----------------------------------------------------------------------------
2929

3030

31-
@unittest.skipUnless(has_sas, _msg_nosas)
32-
class TestSASCF(unittest.TestCase):
33-
34-
def setUp(self):
35-
global cf
36-
import diffpy.srfit.pdf.characteristicfunctions as cf
37-
38-
return
39-
40-
def testSphere(self):
41-
radius = 25
42-
# Calculate sphere cf from SphereModel
43-
SphereModel = sasimport("sas.models.SphereModel").SphereModel
44-
model = SphereModel()
45-
model.setParam("radius", radius)
46-
ff = cf.SASCF("sphere", model)
47-
r = numpy.arange(1, 60, 0.1, dtype=float)
48-
fr1 = ff(r)
49-
50-
# Calculate sphere cf analytically
51-
fr2 = cf.sphericalCF(r, 2 * radius)
52-
diff = fr1 - fr2
53-
res = numpy.dot(diff, diff)
54-
res /= numpy.dot(fr2, fr2)
55-
self.assertAlmostEqual(0, res, 4)
56-
return
57-
58-
def testSpheroid(self):
59-
prad = 20.9
60-
erad = 33.114
61-
# Calculate cf from EllipsoidModel
62-
EllipsoidModel = sasimport("sas.models.EllipsoidModel").EllipsoidModel
63-
model = EllipsoidModel()
64-
model.setParam("radius_a", prad)
65-
model.setParam("radius_b", erad)
66-
ff = cf.SASCF("spheroid", model)
67-
r = numpy.arange(0, 100, 1 / numpy.pi, dtype=float)
68-
fr1 = ff(r)
69-
70-
# Calculate cf analytically
71-
fr2 = cf.spheroidalCF(r, erad, prad)
72-
diff = fr1 - fr2
73-
res = numpy.dot(diff, diff)
74-
res /= numpy.dot(fr2, fr2)
75-
self.assertAlmostEqual(0, res, 4)
76-
return
77-
78-
def testShell(self):
79-
radius = 19.2
80-
thickness = 7.8
81-
# Calculate cf from VesicleModel
82-
VesicleModel = sasimport("sas.models.VesicleModel").VesicleModel
83-
model = VesicleModel()
84-
model.setParam("radius", radius)
85-
model.setParam("thickness", thickness)
86-
ff = cf.SASCF("vesicle", model)
87-
r = numpy.arange(0, 99.45, 0.1, dtype=float)
88-
fr1 = ff(r)
89-
90-
# Calculate sphere cf analytically
91-
fr2 = cf.shellCF(r, radius, thickness)
92-
diff = fr1 - fr2
93-
res = numpy.dot(diff, diff)
94-
res /= numpy.dot(fr2, fr2)
95-
self.assertAlmostEqual(0, res, 4)
96-
return
97-
98-
def testCylinder(self):
99-
"""Make sure cylinder works over different r-ranges."""
100-
radius = 100
101-
length = 30
102-
103-
CylinderModel = sasimport("sas.models.CylinderModel").CylinderModel
104-
model = CylinderModel()
105-
model.setParam("radius", radius)
106-
model.setParam("length", length)
107-
108-
ff = cf.SASCF("cylinder", model)
109-
110-
r1 = numpy.arange(0, 10, 0.1, dtype=float)
111-
r2 = numpy.arange(0, 50, 0.1, dtype=float)
112-
r3 = numpy.arange(0, 100, 0.1, dtype=float)
113-
r4 = numpy.arange(0, 500, 0.1, dtype=float)
114-
115-
fr1 = ff(r1)
116-
fr2 = ff(r2)
117-
fr3 = ff(r3)
118-
fr4 = ff(r4)
119-
120-
d = fr1 - numpy.interp(r1, r2, fr2)
121-
res12 = numpy.dot(d, d)
122-
res12 /= numpy.dot(fr1, fr1)
123-
self.assertAlmostEqual(0, res12, 4)
124-
125-
d = fr1 - numpy.interp(r1, r3, fr3)
126-
res13 = numpy.dot(d, d)
127-
res13 /= numpy.dot(fr1, fr1)
128-
self.assertAlmostEqual(0, res13, 4)
129-
130-
d = fr1 - numpy.interp(r1, r4, fr4)
131-
res14 = numpy.dot(d, d)
132-
res14 /= numpy.dot(fr1, fr1)
133-
self.assertAlmostEqual(0, res14, 4)
134-
135-
d = fr2 - numpy.interp(r2, r3, fr3)
136-
res23 = numpy.dot(d, d)
137-
res23 /= numpy.dot(fr2, fr2)
138-
self.assertAlmostEqual(0, res23, 4)
139-
140-
d = fr2 - numpy.interp(r2, r4, fr4)
141-
res24 = numpy.dot(d, d)
142-
res24 /= numpy.dot(fr2, fr2)
143-
self.assertAlmostEqual(0, res24, 4)
144-
145-
d = fr3 - numpy.interp(r3, r4, fr4)
146-
res34 = numpy.dot(d, d)
147-
res34 /= numpy.dot(fr3, fr3)
148-
self.assertAlmostEqual(0, res34, 4)
149-
return
31+
def testSphere(sas_available):
32+
if not sas_available:
33+
pytest.skip("sas package not available")
34+
radius = 25
35+
# Calculate sphere cf from SphereModel
36+
SphereModel = sasimport("sas.models.SphereModel").SphereModel
37+
model = SphereModel()
38+
model.setParam("radius", radius)
39+
ff = cf.SASCF("sphere", model)
40+
r = numpy.arange(1, 60, 0.1, dtype=float)
41+
fr1 = ff(r)
42+
43+
# Calculate sphere cf analytically
44+
fr2 = cf.sphericalCF(r, 2 * radius)
45+
diff = fr1 - fr2
46+
res = numpy.dot(diff, diff)
47+
res /= numpy.dot(fr2, fr2)
48+
assert res == pytest.approx(0, abs=1e-4)
49+
return
50+
51+
def testSpheroid(sas_available):
52+
if not sas_available:
53+
pytest.skip("sas package not available")
54+
prad = 20.9
55+
erad = 33.114
56+
# Calculate cf from EllipsoidModel
57+
EllipsoidModel = sasimport("sas.models.EllipsoidModel").EllipsoidModel
58+
model = EllipsoidModel()
59+
model.setParam("radius_a", prad)
60+
model.setParam("radius_b", erad)
61+
ff = cf.SASCF("spheroid", model)
62+
r = numpy.arange(0, 100, 1 / numpy.pi, dtype=float)
63+
fr1 = ff(r)
64+
65+
# Calculate cf analytically
66+
fr2 = cf.spheroidalCF(r, erad, prad)
67+
diff = fr1 - fr2
68+
res = numpy.dot(diff, diff)
69+
res /= numpy.dot(fr2, fr2)
70+
assert res == pytest.approx(0, abs=1e-4)
71+
return
72+
73+
def testShell(sas_available):
74+
if not sas_available:
75+
pytest.skip("sas package not available")
76+
radius = 19.2
77+
thickness = 7.8
78+
# Calculate cf from VesicleModel
79+
VesicleModel = sasimport("sas.models.VesicleModel").VesicleModel
80+
model = VesicleModel()
81+
model.setParam("radius", radius)
82+
model.setParam("thickness", thickness)
83+
ff = cf.SASCF("vesicle", model)
84+
r = numpy.arange(0, 99.45, 0.1, dtype=float)
85+
fr1 = ff(r)
86+
87+
# Calculate sphere cf analytically
88+
fr2 = cf.shellCF(r, radius, thickness)
89+
diff = fr1 - fr2
90+
res = numpy.dot(diff, diff)
91+
res /= numpy.dot(fr2, fr2)
92+
assert res == pytest.approx(0, abs=1e-4)
93+
return
94+
95+
def testCylinder(sas_available):
96+
if not sas_available:
97+
pytest.skip("sas package not available")
98+
"""Make sure cylinder works over different r-ranges."""
99+
radius = 100
100+
length = 30
101+
102+
CylinderModel = sasimport("sas.models.CylinderModel").CylinderModel
103+
model = CylinderModel()
104+
model.setParam("radius", radius)
105+
model.setParam("length", length)
106+
107+
ff = cf.SASCF("cylinder", model)
108+
109+
r1 = numpy.arange(0, 10, 0.1, dtype=float)
110+
r2 = numpy.arange(0, 50, 0.1, dtype=float)
111+
r3 = numpy.arange(0, 100, 0.1, dtype=float)
112+
r4 = numpy.arange(0, 500, 0.1, dtype=float)
113+
114+
fr1 = ff(r1)
115+
fr2 = ff(r2)
116+
fr3 = ff(r3)
117+
fr4 = ff(r4)
118+
119+
d = fr1 - numpy.interp(r1, r2, fr2)
120+
res12 = numpy.dot(d, d)
121+
res12 /= numpy.dot(fr1, fr1)
122+
assert res12 == pytest.approx(0, abs=1e-4)
123+
124+
d = fr1 - numpy.interp(r1, r3, fr3)
125+
res13 = numpy.dot(d, d)
126+
res13 /= numpy.dot(fr1, fr1)
127+
assert res13 == pytest.approx(0, abs=1e-4)
128+
129+
d = fr1 - numpy.interp(r1, r4, fr4)
130+
res14 = numpy.dot(d, d)
131+
res14 /= numpy.dot(fr1, fr1)
132+
assert res14 == pytest.approx(0, abs=1e-4)
133+
134+
d = fr2 - numpy.interp(r2, r3, fr3)
135+
res23 = numpy.dot(d, d)
136+
res23 /= numpy.dot(fr2, fr2)
137+
assert res23 == pytest.approx(0, abs=1e-4)
138+
139+
d = fr2 - numpy.interp(r2, r4, fr4)
140+
res24 = numpy.dot(d, d)
141+
res24 /= numpy.dot(fr2, fr2)
142+
assert res24 == pytest.approx(0, abs=1e-4)
143+
144+
d = fr3 - numpy.interp(r3, r4, fr4)
145+
res34 = numpy.dot(d, d)
146+
res34 /= numpy.dot(fr3, fr3)
147+
assert res34 == pytest.approx(0, abs=1e-4)
148+
return
150149

151150

152151
# End of class TestSASCF

0 commit comments

Comments
 (0)