1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from math import cos, pi, sin
24 from numpy import array, dot, float64, transpose, zeros
25 from unittest import TestCase
26
27
28 from data_store.diff_tensor import DiffTensorData
29 from lib.geometry.rotations import two_vect_to_R
30 from lib.errors import RelaxError
31
32
34 """Unit tests for the data.diff_tensor relax module."""
35
37 """Function for calculating the spheroidal diffusion tensor objects."""
38
39
40 Diso = 1/(6*tm)
41 Dpar = Diso + 2.0/3.0 * Da
42 Dper = Diso - 1.0/3.0 * Da
43 Dratio = Dpar / Dper
44
45
46 Dpar_unit = array([sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta)])
47
48
49 if Dpar > Dper:
50 axis = array([0, 0, 1], float64)
51 tensor_diag = array([[ Dper, 0.0, 0.0],
52 [ 0.0, Dper, 0.0],
53 [ 0.0, 0.0, Dpar]])
54 else:
55 axis = array([1, 0, 0], float64)
56 tensor_diag = array([[ Dpar, 0.0, 0.0],
57 [ 0.0, Dper, 0.0],
58 [ 0.0, 0.0, Dper]])
59
60
61 rotation = zeros((3, 3), float64)
62 two_vect_to_R(Dpar_unit, axis, rotation)
63
64
65 tensor = dot(rotation, dot(tensor_diag, transpose(rotation)))
66
67
68 return Diso, Dpar, Dper, Dratio, Dpar_unit, tensor_diag, rotation, tensor
69
70
72 """Set 'self.diff_data' to an empty instance of the DiffTensorData class."""
73
74 self.diff_data = DiffTensorData()
75
76
78 """Test the appending of Monte Carlo simulation spheroidal diffusion tensor parameters.
79
80 The following parameters will be appended to empty lists:
81 - tm: 8 ns
82 - Da: -1e7
83 - theta: 150 degrees
84 - phi: 30 degrees
85 """
86
87
88 tm = 8e-9
89 Da = -1e7
90 theta = (150 / 360.0) * 2.0 * pi
91 phi = (30 / 360.0) * 2.0 * pi
92
93
94 self.diff_data.set(param='type', value='spheroid')
95 self.diff_data.set(param='spheroid_type', value='oblate')
96
97
98 self.diff_data.set_sim_num(1)
99
100
101 self.diff_data.set(param='tm', value=tm, category='sim', sim_index=0)
102 self.diff_data.set(param='Da', value=Da, category='sim', sim_index=0)
103 self.diff_data.set(param='theta', value=theta, category='sim', sim_index=0)
104 self.diff_data.set(param='phi', value=phi, category='sim', sim_index=0)
105
106
107 self.assertEqual(self.diff_data.type, 'spheroid')
108 self.assertEqual(self.diff_data.tm_sim[0], tm)
109 self.assertEqual(self.diff_data.Da_sim[0], Da)
110 self.assertEqual(self.diff_data.theta_sim[0], theta)
111 self.assertEqual(self.diff_data.phi_sim[0], phi)
112
113
114 Diso, Dpar, Dper, Dratio, Dpar_unit, tensor_diag, rotation, tensor = self.calc_spheroid_objects(tm, Da, theta, phi)
115
116
117 self.assertEqual(self.diff_data.Diso_sim[0], Diso)
118 self.assertEqual(self.diff_data.Dpar_sim[0], Dpar)
119 self.assertEqual(self.diff_data.Dper_sim[0], Dper)
120 self.assertEqual(self.diff_data.Dratio_sim[0], Dratio)
121
122
123 self.assertEqual(self.diff_data.Dpar_unit_sim[0].tostring(), Dpar_unit.tostring())
124
125
126 self.assertEqual(self.diff_data.tensor_diag_sim[0].tostring(), tensor_diag.tostring())
127 self.assertEqual(self.diff_data.rotation_sim[0].tostring(), rotation.tostring())
128 self.assertEqual(self.diff_data.tensor_sim[0].tostring(), tensor.tostring())
129
130
132 """Test that the contents of the diffusion tensor object can be displayed."""
133
134 print(self.diff_data)
135
136
138 """Test that the Diso parameter cannot be set."""
139
140
141 self.assertRaises(RelaxError, setattr, self.diff_data, 'Diso', 1/(6*1e-8))
142
143
144 self.assertTrue(not hasattr(self.diff_data, 'Diso'))
145
146
148 """Test the setting of spheroidal diffusion tensor parameter errors.
149
150 The following parameter errors will be set:
151 - tm: 1 ns
152 - Da: 1e3
153 - theta: 3 degrees
154 - phi: 5 degrees
155 """
156
157
158 tm = 1e-8
159 Da = 1e3
160 theta = (3 / 360.0) * 2.0 * pi
161 phi = (5 / 360.0) * 2.0 * pi
162
163
164 self.diff_data.set(param='type', value='spheroid')
165 self.diff_data.set(param='spheroid_type', value='prolate')
166
167
168 self.diff_data.set(param='tm', value=tm, category='err')
169 self.diff_data.set(param='Da', value=Da, category='err')
170 self.diff_data.set(param='theta', value=theta, category='err')
171 self.diff_data.set(param='phi', value=phi, category='err')
172
173
174 self.assertEqual(self.diff_data.type, 'spheroid')
175 self.assertEqual(self.diff_data.tm_err, tm)
176 self.assertEqual(self.diff_data.Da_err, Da)
177 self.assertEqual(self.diff_data.theta_err, theta)
178 self.assertEqual(self.diff_data.phi_err, phi)
179
180
181 Diso, Dpar, Dper, Dratio, Dpar_unit, tensor_diag, rotation, tensor = self.calc_spheroid_objects(tm, Da, theta, phi)
182
183
184 self.assertEqual(self.diff_data.Diso_err, Diso)
185 self.assertEqual(self.diff_data.Dpar_err, Dpar)
186 self.assertEqual(self.diff_data.Dper_err, Dper)
187 self.assertEqual(self.diff_data.Dratio_err, Dratio)
188
189
190 self.assertEqual(self.diff_data.Dpar_unit_err.tostring(), Dpar_unit.tostring())
191
192
194 """Test the setting of spheroidal diffusion tensor parameters.
195
196 The following parameters will be set:
197 - tm: 20 ns
198 - Da: 2e6
199 - theta: 60 degrees
200 - phi: 290 degrees
201 """
202
203
204 tm = 2e-8
205 Da = 2e6
206 theta = (60 / 360.0) * 2.0 * pi
207 phi = (290 / 360.0) * 2.0 * pi
208
209
210 self.diff_data.set(param='type', value='spheroid')
211 self.diff_data.set(param='spheroid_type', value='prolate')
212
213
214 self.diff_data.set(param='tm', value=tm)
215 self.diff_data.set(param='Da', value=Da)
216 self.diff_data.set(param='theta', value=theta)
217 self.diff_data.set(param='phi', value=phi)
218
219
220 self.assertEqual(self.diff_data.type, 'spheroid')
221 self.assertEqual(self.diff_data.tm, tm)
222 self.assertEqual(self.diff_data.Da, Da)
223 self.assertEqual(self.diff_data.theta, theta)
224 self.assertEqual(self.diff_data.phi, phi)
225
226
227 Diso, Dpar, Dper, Dratio, Dpar_unit, tensor_diag, rotation, tensor = self.calc_spheroid_objects(tm, Da, theta, phi)
228
229
230 self.assertEqual(self.diff_data.Diso, Diso)
231 self.assertEqual(self.diff_data.Dpar, Dpar)
232 self.assertEqual(self.diff_data.Dper, Dper)
233 self.assertEqual(self.diff_data.Dratio, Dratio)
234
235
236 self.assertEqual(self.diff_data.Dpar_unit.tostring(), Dpar_unit.tostring())
237
238
239 self.assertEqual(self.diff_data.tensor_diag.tostring(), tensor_diag.tostring())
240 self.assertEqual(self.diff_data.rotation.tostring(), rotation.tostring())
241 self.assertEqual(self.diff_data.tensor.tostring(), tensor.tostring())
242
243
245 """Test the setting of Monte Carlo simulation spheroidal diffusion tensor parameters.
246
247 Firstly the following parameters will be appended to empty lists:
248 - tm: 2 ns
249 - Da: 1e5
250 - theta: 0 degrees
251 - phi: 360 degrees
252
253 These MC sim values will then be explicity overwritten by setting the first elements of the
254 lists to:
255 - tm: 0.5 ns
256 - Da: 3e5
257 - theta: 2 degrees
258 - phi: 0 degrees
259 """
260
261
262 self.diff_data.set(param='type', value='spheroid')
263 self.diff_data.set(param='spheroid_type', value='prolate')
264
265
266 self.diff_data.set_sim_num(1)
267
268
269 self.diff_data.set(param='tm', value=2e-9, category='sim', sim_index=0)
270 self.diff_data.set(param='Da', value=1e5, category='sim', sim_index=0)
271 self.diff_data.set(param='theta', value=0.0, category='sim', sim_index=0)
272 self.diff_data.set(param='phi', value=2.0 * pi, category='sim', sim_index=0)
273
274
275 tm = 0.5e-9
276 Da = 3e5
277 theta = (2 / 360.0) * 2.0 * pi
278 phi = 0.0
279
280
281 self.diff_data.set(param='tm', value=tm, category='sim', sim_index=0)
282 self.diff_data.set(param='Da', value=Da, category='sim', sim_index=0)
283 self.diff_data.set(param='theta', value=theta, category='sim', sim_index=0)
284 self.diff_data.set(param='phi', value=phi, category='sim', sim_index=0)
285
286
287 self.assertEqual(self.diff_data.type, 'spheroid')
288 self.assertEqual(self.diff_data.tm_sim[0], tm)
289 self.assertEqual(self.diff_data.Da_sim[0], Da)
290 self.assertEqual(self.diff_data.theta_sim[0], theta)
291 self.assertEqual(self.diff_data.phi_sim[0], phi)
292
293
294 Diso, Dpar, Dper, Dratio, Dpar_unit, tensor_diag, rotation, tensor = self.calc_spheroid_objects(tm, Da, theta, phi)
295
296
297 self.assertEqual(self.diff_data.Diso_sim[0], Diso)
298 self.assertEqual(self.diff_data.Dpar_sim[0], Dpar)
299 self.assertEqual(self.diff_data.Dper_sim[0], Dper)
300 self.assertEqual(self.diff_data.Dratio_sim[0], Dratio)
301
302
303 self.assertEqual(self.diff_data.Dpar_unit_sim[0].tostring(), Dpar_unit.tostring())
304
305
306 self.assertEqual(self.diff_data.tensor_diag_sim[0].tostring(), tensor_diag.tostring())
307 self.assertEqual(self.diff_data.rotation_sim[0].tostring(), rotation.tostring())
308 self.assertEqual(self.diff_data.tensor_sim[0].tostring(), tensor.tostring())
309
310
312 """Test the setting of the tm parameter.
313
314 The tm parameter will be set to 10 ns. The setting of tm should automatically create the
315 Diso parameter.
316 """
317
318
319 self.diff_data.set(param='type', value='sphere')
320
321
322 self.diff_data.set(param='tm', value=1e-8)
323
324
325 self.assertTrue(hasattr(self.diff_data, 'tm'))
326 self.assertEqual(self.diff_data.tm, 1e-8)
327
328
329 self.assertTrue(hasattr(self.diff_data, 'Diso'))
330 self.assertEqual(self.diff_data.Diso, 1/(6*1e-8))
331