1 | |
---|
2 | import unittest |
---|
3 | |
---|
4 | _SCALE = 1e-6 |
---|
5 | |
---|
6 | # the calculator default value for wavelength is 6 |
---|
7 | import periodictable |
---|
8 | from periodictable import formula |
---|
9 | from periodictable.xsf import xray_energy, xray_sld_from_atoms |
---|
10 | from periodictable.constants import avogadro_number |
---|
11 | from periodictable.nsf import neutron_scattering, neutron_sld |
---|
12 | |
---|
13 | |
---|
14 | def calculate_xray_sld(element, density, molecule_formula): |
---|
15 | """ |
---|
16 | Get an element and compute the corresponding SLD for a given formula |
---|
17 | :param element: elements a string of existing atom |
---|
18 | """ |
---|
19 | element_formula = formula(str(element)) |
---|
20 | if len(element_formula.atoms) != 1: |
---|
21 | return |
---|
22 | element = element_formula.atoms.keys()[0] |
---|
23 | energy = xray_energy(element.K_alpha) |
---|
24 | atom = molecule_formula.atoms |
---|
25 | return xray_sld_from_atoms(atom, density=density, energy=energy) |
---|
26 | |
---|
27 | |
---|
28 | class TestH2O(unittest.TestCase): |
---|
29 | """ |
---|
30 | Sld calculator test for H2O |
---|
31 | """ |
---|
32 | |
---|
33 | def setUp(self): |
---|
34 | """Inititialze variables""" |
---|
35 | |
---|
36 | self.compound = "H2O" |
---|
37 | self.density = 1.0 |
---|
38 | self.wavelength = 6.0 |
---|
39 | self.sld_formula = formula(self.compound, density=self.density) |
---|
40 | |
---|
41 | def test_neutron_sld(self): |
---|
42 | """ |
---|
43 | test sld |
---|
44 | """ |
---|
45 | #Compute incoherence , absorption, and incoherence |
---|
46 | (sld_real,sld_im,sld_inc), (coh,abs,incoh), length = neutron_scattering(self.compound, |
---|
47 | self.density, self.wavelength) |
---|
48 | cu_reel, cu_im = calculate_xray_sld(element="Cu", density=self.density, |
---|
49 | molecule_formula=self.sld_formula) |
---|
50 | mo_reel, mo_im = calculate_xray_sld(element="Mo", density=self.density, |
---|
51 | molecule_formula=self.sld_formula) |
---|
52 | #test sld |
---|
53 | self.assertAlmostEquals(sld_real * _SCALE, -5.6e-7, 1) |
---|
54 | self.assertAlmostEquals(sld_im * _SCALE, 0) |
---|
55 | #test absorption value |
---|
56 | self.assertAlmostEquals(abs, 0.0741, 2) |
---|
57 | self.assertAlmostEquals(incoh, 5.62, 2) |
---|
58 | #Test length |
---|
59 | self.assertAlmostEquals(length, 0.1755, 3) |
---|
60 | #test Cu sld |
---|
61 | self.assertAlmostEquals(cu_reel * _SCALE, 9.46e-6, 1) |
---|
62 | self.assertAlmostEquals(cu_im * _SCALE, 3.01e-8) |
---|
63 | # test Mo sld |
---|
64 | self.assertAlmostEquals(mo_reel * _SCALE, 9.43e-6) |
---|
65 | self.assertAlmostEquals(mo_im * _SCALE, 5.65e-7,1) |
---|
66 | |
---|
67 | |
---|
68 | class TestD2O(unittest.TestCase): |
---|
69 | """ |
---|
70 | Sld calculator test for D2O |
---|
71 | """ |
---|
72 | |
---|
73 | def setUp(self): |
---|
74 | """Inititialze variables""" |
---|
75 | |
---|
76 | self.compound = "D2O" |
---|
77 | self.density = 1.1 |
---|
78 | self.wavelength = 6.0 |
---|
79 | self.sld_formula = formula(self.compound, density=self.density) |
---|
80 | |
---|
81 | def test_neutron_sld(self): |
---|
82 | """ |
---|
83 | test sld |
---|
84 | """ |
---|
85 | #Compute incoherence , absorption, and incoherence |
---|
86 | (sld_real,sld_im,sld_inc), (coh,abs,incoh), length = neutron_scattering(self.compound, |
---|
87 | self.density, self.wavelength) |
---|
88 | cu_reel, cu_im = calculate_xray_sld(element="Cu", density=self.density, |
---|
89 | molecule_formula=self.sld_formula) |
---|
90 | mo_reel, mo_im = calculate_xray_sld(element="Mo", density=self.density, |
---|
91 | molecule_formula=self.sld_formula) |
---|
92 | #test sld |
---|
93 | self.assertAlmostEquals(sld_real * _SCALE, 6.33e-6, 1) |
---|
94 | self.assertAlmostEquals(sld_im * _SCALE, 0) |
---|
95 | #test absorption value |
---|
96 | self.assertAlmostEquals(abs, 1.35e-4, 2) |
---|
97 | self.assertAlmostEquals(incoh, 0.138, 2) |
---|
98 | #Test length |
---|
99 | self.assertAlmostEquals(length, 1.549, 3) |
---|
100 | #test Cu sld |
---|
101 | self.assertAlmostEquals(cu_reel * _SCALE, 9.36e-6, 1) |
---|
102 | self.assertAlmostEquals(cu_im * _SCALE, 2.98e-8) |
---|
103 | # test Mo sld |
---|
104 | self.assertAlmostEquals(mo_reel * _SCALE, 9.33e-6) |
---|
105 | self.assertAlmostEquals(mo_im * _SCALE, 5.59e-9,1) |
---|
106 | |
---|
107 | |
---|
108 | class TestCd(unittest.TestCase): |
---|
109 | """ |
---|
110 | Sld calculator test for Cd |
---|
111 | """ |
---|
112 | |
---|
113 | def setUp(self): |
---|
114 | """Inititialze variables""" |
---|
115 | # the calculator default value for wavelength is 6 |
---|
116 | self.compound = "Cd" |
---|
117 | self.density = 4.0 |
---|
118 | self.wavelength = 6.0 |
---|
119 | self.sld_formula = formula(self.compound, density=self.density) |
---|
120 | |
---|
121 | def test_neutron_sld(self): |
---|
122 | """ |
---|
123 | test sld |
---|
124 | """ |
---|
125 | #Compute incoherence , absorption, and incoherence |
---|
126 | (sld_real,sld_im,sld_inc), (coh,abs,incoh), length = neutron_scattering(self.compound, |
---|
127 | self.density, self.wavelength) |
---|
128 | cu_reel, cu_im = calculate_xray_sld(element="Cu", density=self.density, |
---|
129 | molecule_formula=self.sld_formula) |
---|
130 | mo_reel, mo_im = calculate_xray_sld(element="Mo", density=self.density, |
---|
131 | molecule_formula=self.sld_formula) |
---|
132 | #test sld |
---|
133 | self.assertAlmostEquals(sld_real * _SCALE, 1.04e-6, 1) |
---|
134 | self.assertAlmostEquals(sld_im * _SCALE, -1.5e-7, 1) |
---|
135 | #test absorption value |
---|
136 | self.assertAlmostEquals(abs, 180.0,0) |
---|
137 | self.assertAlmostEquals(incoh, 0.0754, 2) |
---|
138 | #Test length |
---|
139 | self.assertAlmostEquals(length, 0.005551, 4) |
---|
140 | #test Cu sld |
---|
141 | self.assertAlmostEquals(cu_reel * _SCALE, 2.89e-5, 1) |
---|
142 | self.assertAlmostEquals(cu_im * _SCALE, 2.81e-6) |
---|
143 | # test Mo sld |
---|
144 | self.assertAlmostEquals(mo_reel * _SCALE, 2.84e-5, 1) |
---|
145 | self.assertAlmostEquals(mo_im * _SCALE, 7.26e-7,1) |
---|
146 | |
---|
147 | if __name__ == '__main__': |
---|
148 | unittest.main() |
---|