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