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