Package test_suite :: Package system_tests :: Module diffusion_tensor
[hide private]
[frames] | no frames]

Source Code for Module test_suite.system_tests.diffusion_tensor

  1  ############################################################################### 
  2  #                                                                             # 
  3  # Copyright (C) 2006-2013 Edward d'Auvergne                                   # 
  4  #                                                                             # 
  5  # This file is part of the program relax (http://www.nmr-relax.com).          # 
  6  #                                                                             # 
  7  # This program is free software: you can redistribute it and/or modify        # 
  8  # it under the terms of the GNU General Public License as published by        # 
  9  # the Free Software Foundation, either version 3 of the License, or           # 
 10  # (at your option) any later version.                                         # 
 11  #                                                                             # 
 12  # This program is distributed in the hope that it will be useful,             # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of              # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # 
 15  # GNU General Public License for more details.                                # 
 16  #                                                                             # 
 17  # You should have received a copy of the GNU General Public License           # 
 18  # along with this program.  If not, see <http://www.gnu.org/licenses/>.       # 
 19  #                                                                             # 
 20  ############################################################################### 
 21   
 22  # Python module imports. 
 23  from math import pi 
 24  from numpy import array, dot, float64, transpose, zeros 
 25  from os import sep 
 26   
 27  # relax module imports. 
 28  from data_store import Relax_data_store; ds = Relax_data_store() 
 29  from pipe_control.pipes import get_pipe 
 30  from pipe_control.reset import reset 
 31  from lib.geometry.coord_transform import spherical_to_cartesian 
 32  from lib.geometry.rotations import axis_angle_to_R, euler_to_R_zyz, two_vect_to_R 
 33  from lib.io import delete 
 34  from status import Status; status = Status() 
 35  from tempfile import mktemp 
 36  from test_suite.system_tests.base_classes import SystemTestCase 
 37   
 38   
39 -class Diffusion_tensor(SystemTestCase):
40 """Class for testing various aspects specific to the diffusion tensor.""" 41
42 - def setUp(self):
43 """Function for initialising a spherical, spheroidal, and ellipsoidal diffusion tensor.""" 44 45 # The status object. 46 status = Status() 47 48 # Create three data pipes for spherical, spheroidal, and ellipsoidal diffusion. 49 self.interpreter.pipe.create('sphere', 'mf') 50 self.interpreter.pipe.create('spheroid', 'mf') 51 self.interpreter.pipe.create('ellipsoid', 'mf') 52 53 # Sphere tensor initialization. 54 self.interpreter.pipe.switch('sphere') 55 self.interpreter.structure.read_pdb(file='Ap4Aase_res1-12.pdb', dir=status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures', read_model=1) 56 self.interpreter.sequence.read(file='Ap4Aase.seq', dir=status.install_path + sep+'test_suite'+sep+'shared_data'+sep, res_num_col=1, res_name_col=2) 57 self.interpreter.diffusion_tensor.init(10e-9, fixed=True) 58 self.tmpfile_sphere = mktemp() 59 60 # Spheroid tensor initialization. 61 self.interpreter.pipe.switch('spheroid') 62 self.interpreter.structure.read_pdb(file='Ap4Aase_res1-12.pdb', dir=status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures', read_model=1) 63 self.interpreter.sequence.read(file='Ap4Aase.seq', dir=status.install_path + sep+'test_suite'+sep+'shared_data'+sep, res_num_col=1, res_name_col=2) 64 self.interpreter.diffusion_tensor.init((5e-09, -10000000., 1.6, 2.7), angle_units='rad', spheroid_type='oblate', fixed=True) 65 self.tmpfile_spheroid = mktemp() 66 67 # Ellipsoid tensor initialization. 68 self.interpreter.pipe.switch('ellipsoid') 69 self.interpreter.structure.read_pdb(file='Ap4Aase_res1-12.pdb', dir=status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures', read_model=1) 70 self.interpreter.sequence.read(file='Ap4Aase.seq', dir=status.install_path + sep+'test_suite'+sep+'shared_data'+sep, res_num_col=1, res_name_col=2) 71 self.interpreter.diffusion_tensor.init((9e-8, 5e6, 0.3, 60+360, 290, 100), fixed=False) 72 self.tmpfile_ellipsoid = mktemp() 73 74 75 # Some fake MC simulations (for the sphere). 76 self.interpreter.pipe.switch('sphere') 77 cdp.diff_tensor.set(param='tm', value=10e-11, category='err') 78 cdp.diff_tensor.set_sim_num(5) 79 tm_sim = [8.98e-8, 8.99e-8, 9.00e-7, 9.01e-8, 9.02e-8] 80 for i in range(5): 81 cdp.diff_tensor.set(param='tm', value=tm_sim[i], category='sim', sim_index=i) 82 83 # Reset some values. 84 cdp.diff_tensor.set(param='tm', value=9.00e-8, category='sim', sim_index=0) 85 86 87 # Some fake MC simulations (for the spheroid). 88 self.interpreter.pipe.switch('spheroid') 89 90 # Set some errors. 91 cdp.diff_tensor.set(param='Da', value=1000000, category='err') 92 cdp.diff_tensor.set(param='theta', value=0.01, category='err') 93 cdp.diff_tensor.set(param='tm', value=1e-11, category='err') 94 cdp.diff_tensor.set(param='phi', value=0.01, category='err') 95 96 # The sim data. 97 cdp.diff_tensor.set_sim_num(5) 98 Da_sim = [-12000000., -11000000., -10000000., -9000000., -8000000.] 99 theta_sim = [1.70, 1.65, 1.6, 1.55, 1.50] 100 tm_sim = [5.4e-09, 4.8e-09, 5e-09, 5.4e-09, 5.8e-09] 101 phi_sim = [2.5, 2.6, 2.7, 2.8, 100] 102 for i in range(5): 103 cdp.diff_tensor.set(param='Da', value=Da_sim[i], category='sim', sim_index=i) 104 cdp.diff_tensor.set(param='theta', value=theta_sim[i], category='sim', sim_index=i) 105 cdp.diff_tensor.set(param='tm', value=tm_sim[i], category='sim', sim_index=i) 106 cdp.diff_tensor.set(param='phi', value=phi_sim[i], category='sim', sim_index=i) 107 108 # Reset some values. 109 cdp.diff_tensor.set(param='tm', value=4.4e-9, category='sim', sim_index=0) 110 cdp.diff_tensor.set(param='phi', value=2.9, category='sim', sim_index=4) 111 112 113 # Some fake MC simulations (for the ellipsoid). 114 self.interpreter.pipe.switch('ellipsoid') 115 116 # The sim data. 117 cdp.diff_tensor.set_sim_num(5) 118 Dr_sim = [0.28, 0.29, 0.3, 0.31, 0.32] 119 tm_sim = [8.97e-8, 8.99e-8, 9.00e-8, 9.01e-8, 9.02e-8] 120 Da_sim = [5.02e6, 5.01e6, 5.00e6, 4.99e6, 4.98e6] 121 alpha_sim = [80.0/360*2*pi, 70.0/360*2*pi, 60.0/360*2*pi, 50.0/360*2*pi, 40.0/360*2*pi] 122 beta_sim = [295.0/360*2*pi, 292.5/360*2*pi, 290.0/360*2*pi, 289.5/360*2*pi, 288.0/360*2*pi] 123 gamma_sim = [102.0/360*2*pi, 101.0/360*2*pi, 0, 99.0/360*2*pi, 98.0/360*2*pi] 124 for i in range(5): 125 cdp.diff_tensor.set(param='Dr', value=Dr_sim[i], category='sim', sim_index=i) 126 cdp.diff_tensor.set(param='tm', value=tm_sim[i], category='sim', sim_index=i) 127 cdp.diff_tensor.set(param='Da', value=Da_sim[i], category='sim', sim_index=i) 128 cdp.diff_tensor.set(param='alpha', value=alpha_sim[i], category='sim', sim_index=i) 129 cdp.diff_tensor.set(param='beta', value=beta_sim[i], category='sim', sim_index=i) 130 cdp.diff_tensor.set(param='gamma', value=gamma_sim[i], category='sim', sim_index=i) 131 132 # Reset some values. 133 cdp.diff_tensor.set(param='tm', value=8.98e-8, category='sim', sim_index=0) 134 cdp.diff_tensor.set(param='gamma', value=100.0/360*2*pi, category='sim', sim_index=2)
135 136
137 - def tearDown(self):
138 """Reset the relax data storage object.""" 139 140 # Reset relax. 141 reset() 142 143 # Delete the temporary files. 144 delete(self.tmpfile_sphere, fail=False) 145 delete(self.tmpfile_spheroid, fail=False) 146 delete(self.tmpfile_ellipsoid, fail=False)
147 148
149 - def check_ellipsoid(self, Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R):
150 """Check if the ellipsoid in the cdp has the same values as given.""" 151 152 # Print outs. 153 print("The relax data store diffusion tensor:\n\n%s\n\n" % cdp.diff_tensor) 154 print("\nThe real tensor:\n%s" % D) 155 print("\nThe tensor in relax:\n%s" % cdp.diff_tensor.tensor) 156 print("\nThe real tensor (in eig frame):\n%s" % D_prime) 157 print("\nThe tensor in relax (in eig frame):\n%s" % cdp.diff_tensor.tensor_diag) 158 159 # Check the Euler angles. 160 self.assertAlmostEqual(Dx * 1e-7, cdp.diff_tensor.Dx * 1e-7) 161 self.assertAlmostEqual(Dy * 1e-7, cdp.diff_tensor.Dy * 1e-7) 162 self.assertAlmostEqual(Dz * 1e-7, cdp.diff_tensor.Dz * 1e-7) 163 self.assertAlmostEqual(Diso * 1e-7, cdp.diff_tensor.Diso * 1e-7) 164 self.assertAlmostEqual(Da * 1e-7, cdp.diff_tensor.Da * 1e-7) 165 self.assertAlmostEqual(Dr * 1e-7, cdp.diff_tensor.Dr * 1e-7) 166 self.assertAlmostEqual(alpha, cdp.diff_tensor.alpha) 167 self.assertAlmostEqual(beta, cdp.diff_tensor.beta) 168 self.assertAlmostEqual(gamma, cdp.diff_tensor.gamma) 169 170 # Check the elements. 171 for i in range(3): 172 for j in range(3): 173 self.assertAlmostEqual(cdp.diff_tensor.tensor[i, j] * 1e-7, D[i, j] * 1e-7) 174 self.assertAlmostEqual(cdp.diff_tensor.tensor_diag[i, j] * 1e-7, D_prime[i, j] * 1e-7) 175 self.assertAlmostEqual(cdp.diff_tensor.rotation[i, j], R[i, j])
176 177
178 - def check_spheroid(self, tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type=None):
179 """Check if the spheroid in the cdp has the same values as given.""" 180 181 # Print outs. 182 print("The relax data store diffusion tensor:\n\n%s\n\n" % cdp.diff_tensor) 183 print("\nThe real tensor:\n%s" % D) 184 print("\nThe tensor in relax:\n%s" % cdp.diff_tensor.tensor) 185 print("\nThe real tensor (in eig frame):\n%s" % D_prime) 186 print("\nThe tensor in relax (in eig frame):\n%s" % cdp.diff_tensor.tensor_diag) 187 print("\nThe real rotation matrix:\n%s" % R) 188 print("\nThe rotation matrix in relax:\n%s" % cdp.diff_tensor.rotation) 189 190 # Check the Euler angles. 191 self.assertAlmostEqual(tm * 1e8, cdp.diff_tensor.tm * 1e8) 192 self.assertAlmostEqual(Dpar * 1e-7, cdp.diff_tensor.Dpar * 1e-7) 193 self.assertAlmostEqual(Dper * 1e-7, cdp.diff_tensor.Dper * 1e-7) 194 self.assertAlmostEqual(Diso * 1e-7, cdp.diff_tensor.Diso * 1e-7) 195 self.assertAlmostEqual(Da * 1e-7, cdp.diff_tensor.Da * 1e-7) 196 self.assertAlmostEqual(Dratio, cdp.diff_tensor.Dratio) 197 self.assertAlmostEqual(theta, cdp.diff_tensor.theta) 198 self.assertAlmostEqual(phi, cdp.diff_tensor.phi) 199 200 # Check the diagonalised tensor. 201 for i in range(3): 202 for j in range(3): 203 self.assertAlmostEqual(cdp.diff_tensor.tensor_diag[i, j] * 1e-7, D_prime[i, j] * 1e-7) 204 205 # Check the orientation. 206 vects = [] 207 vects.append([1, 0, 0]) 208 vects.append([0, 1, 0]) 209 vects.append([0, 0, 1]) 210 vects = array(vects) 211 for vect in vects: 212 # The projections. 213 proj1 = dot(vect, dot(cdp.diff_tensor.tensor, vect)) 214 proj2 = dot(vect, dot(D, vect)) 215 216 # Compare projections. 217 self.assertAlmostEqual(proj1, proj2) 218 219 # Check the type. 220 if spheroid_type: 221 self.assertEqual(spheroid_type, cdp.diff_tensor.spheroid_type)
222 223
224 - def check_spheroid_as_ellipsoid(self, tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R):
225 """Check if the ellipsoid in the cdp has the same values as given spheroid.""" 226 227 # Print outs. 228 print("The relax data store diffusion tensor:\n\n%s\n\n" % cdp.diff_tensor) 229 print("\nThe real tensor:\n%s" % D) 230 print("\nThe tensor in relax:\n%s" % cdp.diff_tensor.tensor) 231 print("\nThe real tensor (in eig frame):\n%s" % D_prime) 232 print("\nThe tensor in relax (in eig frame):\n%s" % cdp.diff_tensor.tensor_diag) 233 print("\nThe real rotation matrix:\n%s" % R) 234 print("\nThe rotation matrix in relax:\n%s" % cdp.diff_tensor.rotation) 235 236 # Check the Euler angles. 237 self.assertAlmostEqual(tm * 1e8, cdp.diff_tensor.tm * 1e8) 238 self.assertAlmostEqual(Dx * 1e-7, cdp.diff_tensor.Dx * 1e-7) 239 self.assertAlmostEqual(Dy * 1e-7, cdp.diff_tensor.Dy * 1e-7) 240 self.assertAlmostEqual(Dz * 1e-7, cdp.diff_tensor.Dz * 1e-7) 241 self.assertAlmostEqual(Diso * 1e-7, cdp.diff_tensor.Diso * 1e-7) 242 243 # Check the diagonalised tensor. 244 for i in range(3): 245 for j in range(3): 246 self.assertAlmostEqual(cdp.diff_tensor.tensor_diag[i, j] * 1e-7, D_prime[i, j] * 1e-7) 247 248 # Check the orientation. 249 vects = [] 250 vects.append([1, 0, 0]) 251 vects.append([0, 1, 0]) 252 vects.append([0, 0, 1]) 253 vects = array(vects) 254 for vect in vects: 255 # The projections. 256 proj1 = dot(vect, dot(cdp.diff_tensor.tensor, vect)) 257 proj2 = dot(vect, dot(D, vect)) 258 259 # Print out. 260 print("\nVector: %s" % vect) 261 print("Real proj: %s" % proj1) 262 print("Proj in relax: %s" % proj2) 263 264 # Compare projections. 265 self.assertAlmostEqual(proj1, proj2)
266 267
268 - def get_ellipsoid(self):
269 """Return all the diffusion tensor info about the {Dx, Dy, Dz, alpha, beta, gamma} = {1e7, 2e7, 3e7, 1, 2, 0.5} ellipsoid tensor.""" 270 271 # The tensor info. 272 Dx = 1e7 273 Dy = 2e7 274 Dz = 3e7 275 Diso = 2e7 276 Da = 1.5e7 277 Dr = 1.0/3.0 278 alpha = 1.0 279 beta = 2.0 280 gamma = 0.5 281 282 # The actual tensor in the PDB frame. 283 D = array([[ 22758858.4088357, -7267400.1700938, 6272205.75829415], 284 [ -7267400.1700938, 17923072.3436445, 1284270.53726401], 285 [ 6272205.75829415, 1284270.53726401, 19318069.2475198 ]], float64) 286 287 # The tensor in the eigenframe. 288 D_prime = zeros((3, 3), float64) 289 D_prime[0, 0] = Dx 290 D_prime[1, 1] = Dy 291 D_prime[2, 2] = Dz 292 293 # The rotation matrix. 294 R = zeros((3, 3), float64) 295 euler_to_R_zyz(gamma, beta, alpha, R) 296 R = transpose(R) 297 298 # Return the data. 299 return Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R
300 301
302 - def get_spheroid(self, Dpar=None, Dper=None, theta=None, phi=None):
303 """Return all the diffusion tensor info about the given spheroid tensor.""" 304 305 # The tensor info. 306 Diso = (Dpar + 2*Dper) / 3.0 307 tm = 1.0/(6.0 * Diso) 308 Da = Dpar - Dper 309 Dratio = Dpar / Dper 310 311 # The eigenvalues and unique axis in the eigenframe. 312 if Dpar > Dper: 313 Dx, Dy, Dz = Dper, Dper, Dpar 314 axis = array([0, 0, 1], float64) 315 else: 316 Dx, Dy, Dz = Dpar, Dper, Dper 317 axis = array([1, 0, 0], float64) 318 319 # The actual tensor in the PDB frame. 320 R = zeros((3, 3), float64) 321 spher_vect = array([1, theta, phi], float64) 322 diff_axis = zeros(3, float64) 323 spherical_to_cartesian(spher_vect, diff_axis) 324 two_vect_to_R(diff_axis, axis, R) 325 326 # The tensor in the eigenframe. 327 D_prime = zeros((3, 3), float64) 328 D_prime[0, 0] = Dx 329 D_prime[1, 1] = Dy 330 D_prime[2, 2] = Dz 331 332 # Rotate a little about the unique axis! 333 twist = zeros((3, 3), float64) 334 axis_angle_to_R(axis, 0.3, twist) 335 D = dot(twist, dot(D_prime, transpose(twist))) 336 337 # The tensor in the PDB frame. 338 D = dot(R, dot(D, transpose(R))) 339 340 # Return the data. 341 return tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R
342 343
344 - def test_back_calc_ellipsoid(self):
345 """Check the back-calculation of relaxation data for the spherical diffusion tensor.""" 346 347 # Reset relax. 348 reset() 349 350 # The diffusion type (used by the script). 351 ds.diff_type = 'ellipsoid' 352 353 # Execute the script. 354 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'ri_back_calc.py') 355 356 # Loop over all spins. 357 for i in range(len(cdp.mol[0].res)): 358 # Alias. 359 spin = cdp.mol[0].res[i].spin[0] 360 361 # Check the values. 362 for ri_id in cdp.ri_ids: 363 self.assertAlmostEqual(spin.ri_data_bc[ri_id], spin.ri_data[ri_id])
364 365
366 - def test_back_calc_sphere(self):
367 """Check the back-calculation of relaxation data for the spherical diffusion tensor.""" 368 369 # Reset relax. 370 reset() 371 372 # The diffusion type (used by the script). 373 ds.diff_type = 'sphere' 374 375 # Execute the script. 376 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'ri_back_calc.py') 377 378 # Loop over all spins. 379 for i in range(len(cdp.mol[0].res)): 380 # Alias. 381 spin = cdp.mol[0].res[i].spin[0] 382 383 # Check the values. 384 for ri_id in cdp.ri_ids: 385 self.assertAlmostEqual(spin.ri_data_bc[ri_id], spin.ri_data[ri_id])
386 387
388 - def test_back_calc_spheroid(self):
389 """Check the back-calculation of relaxation data for the spherical diffusion tensor.""" 390 391 # Reset relax. 392 reset() 393 394 # The diffusion type (used by the script). 395 ds.diff_type = 'spheroid' 396 397 # Execute the script. 398 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'ri_back_calc.py') 399 400 # Loop over all spins. 401 for i in range(len(cdp.mol[0].res)): 402 # Alias. 403 spin = cdp.mol[0].res[i].spin[0] 404 405 # Check the values. 406 for ri_id in cdp.ri_ids: 407 self.assertAlmostEqual(spin.ri_data_bc[ri_id], spin.ri_data[ri_id])
408 409
410 - def test_copy(self):
411 """The user function diffusion_tensor.copy().""" 412 413 # Create three additional data pipes for copying the spherical, spheroidal, and ellipsoidal diffusion data. 414 self.interpreter.pipe.create('sphere2', 'mf') 415 self.interpreter.pipe.create('spheroid2', 'mf') 416 self.interpreter.pipe.create('ellipsoid2', 'mf') 417 418 # Copy the data. 419 self.interpreter.diffusion_tensor.copy('sphere', 'sphere2') 420 self.interpreter.diffusion_tensor.copy('spheroid', 'spheroid2') 421 self.interpreter.diffusion_tensor.copy('ellipsoid', 'ellipsoid2') 422 423 # Get the data pipes. 424 sphere_pipe = get_pipe('sphere') 425 sphere2_pipe = get_pipe('sphere2') 426 427 # Check that this is indeed a copy. 428 self.assertEqual(sphere2_pipe.diff_tensor.tm_sim[4], 9.02e-8) 429 self.assertEqual(sphere2_pipe.diff_tensor.Diso_sim[4], 1/(6*9.02e-8)) 430 sphere_pipe.diff_tensor.set(param='tm', value=8.88e-8, category='sim', sim_index=4) 431 self.assertEqual(sphere_pipe.diff_tensor.tm_sim[4], 8.88e-8) 432 self.assertEqual(sphere_pipe.diff_tensor.Diso_sim[4], 1/(6*8.88e-8)) 433 self.assertEqual(sphere2_pipe.diff_tensor.tm_sim[4], 9.02e-8) 434 self.assertEqual(sphere2_pipe.diff_tensor.Diso_sim[4], 1/(6*9.02e-8))
435 436
437 - def test_delete(self):
438 """The user function diffusion_tensor.delete().""" 439 440 # Delete the data. 441 self.interpreter.pipe.switch('sphere') 442 self.interpreter.diffusion_tensor.delete() 443 self.interpreter.pipe.switch('spheroid') 444 self.interpreter.diffusion_tensor.delete() 445 self.interpreter.pipe.switch('ellipsoid') 446 self.interpreter.diffusion_tensor.delete()
447 448
449 - def test_display(self):
450 """The user function diffusion_tensor.display().""" 451 452 # Display the data. 453 self.interpreter.pipe.switch('sphere') 454 self.interpreter.diffusion_tensor.display() 455 self.interpreter.pipe.switch('spheroid') 456 self.interpreter.diffusion_tensor.display() 457 self.interpreter.pipe.switch('ellipsoid') 458 self.interpreter.diffusion_tensor.display()
459 460
462 """Test the user function structure.create_diff_tensor_pdb() for the ellipsoid.""" 463 464 # First copy the data (a more vigorous copy test!). 465 self.interpreter.pipe.copy('ellipsoid', 'ellipsoid2') 466 self.interpreter.pipe.switch('ellipsoid2') 467 self.interpreter.diffusion_tensor.delete() 468 self.interpreter.diffusion_tensor.copy('ellipsoid', 'ellipsoid2') 469 470 # Create the diffusion tensor objects. 471 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_ellipsoid, scale=1e-05) 472 473 # Open the temp file. 474 file = open(self.tmpfile_ellipsoid) 475 new_data = file.readlines() 476 file.close() 477 478 # Open the real file. 479 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'ellipsoid.pdb') 480 real_data = file.readlines() 481 file.close() 482 483 # Check the data. 484 self.assertEqual(len(real_data), len(new_data)) 485 for i in range(len(real_data)): 486 # Print the PDB line, for debugging. 487 print(real_data[i][0:-1]) 488 489 # Check the line. 490 self.assertEqual(real_data[i], new_data[i])
491 492
494 """Test the user function structure.create_diff_tensor_pdb() for the sphere.""" 495 496 # First copy the data (a more vigorous copy test!). 497 self.interpreter.pipe.copy('sphere', 'sphere2') 498 self.interpreter.pipe.switch('sphere2') 499 self.interpreter.diffusion_tensor.delete() 500 self.interpreter.diffusion_tensor.copy('sphere', 'sphere2') 501 502 # Create the diffusion tensor objects. 503 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_sphere) 504 505 # Open the temp file. 506 file = open(self.tmpfile_sphere) 507 new_data = file.readlines() 508 file.close() 509 510 # Open the real file. 511 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'sphere.pdb') 512 real_data = file.readlines() 513 file.close() 514 515 # Check the data. 516 self.assertEqual(len(real_data), len(new_data)) 517 for i in range(len(real_data)): 518 # Print the PDB line, for debugging. 519 print(real_data[i][0:-1]) 520 521 # Check the line. 522 self.assertEqual(real_data[i], new_data[i])
523 524
526 """Test the user function structure.create_diff_tensor_pdb() for the spheroid.""" 527 528 # First copy the data (a more vigorous copy test!). 529 self.interpreter.pipe.copy('spheroid', 'spheroid2') 530 self.interpreter.pipe.switch('spheroid2') 531 self.interpreter.diffusion_tensor.delete() 532 self.interpreter.diffusion_tensor.copy('spheroid', 'spheroid2') 533 534 # Create the diffusion tensor objects. 535 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_spheroid) 536 537 # Open the temp file. 538 file = open(self.tmpfile_spheroid) 539 new_data = file.readlines() 540 file.close() 541 542 # Open the real file. 543 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'spheroid.pdb') 544 real_data = file.readlines() 545 file.close() 546 547 # Check the data. 548 self.assertEqual(len(real_data), len(new_data)) 549 for i in range(len(real_data)): 550 # Print the PDB line, for debugging. 551 print(real_data[i][0:-1]) 552 553 # Check the line. 554 self.assertEqual(real_data[i], new_data[i])
555 556
558 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 559 560 # Get the ellipsoid data. 561 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 562 563 # Create a new data pipe. 564 self.interpreter.pipe.create('ellipsoid2', 'mf') 565 566 # Tensor initialization. 567 self.interpreter.diffusion_tensor.init((1/(6.0*Diso), Da, Dr, alpha, beta, gamma), param_types=0, angle_units='rad') 568 569 # Check the ellipsoid. 570 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
571 572
574 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 575 576 # Get the ellipsoid data. 577 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 578 579 # Create a new data pipe. 580 self.interpreter.pipe.create('ellipsoid2', 'mf') 581 582 # Tensor initialization. 583 self.interpreter.diffusion_tensor.init((Diso, Da, Dr, alpha, beta, gamma), param_types=1, angle_units='rad') 584 585 # Check the ellipsoid. 586 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
587 588
590 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 591 592 # Get the ellipsoid data. 593 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 594 595 # Create a new data pipe. 596 self.interpreter.pipe.create('ellipsoid2', 'mf') 597 598 # Tensor initialization. 599 self.interpreter.diffusion_tensor.init((Dx, Dy, Dz, alpha, beta, gamma), param_types=2, angle_units='rad') 600 601 # Check the ellipsoid. 602 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
603 604
606 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 607 608 # Get the ellipsoid data. 609 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 610 611 # Create a new data pipe. 612 self.interpreter.pipe.create('ellipsoid2', 'mf') 613 614 # Tensor initialization. 615 self.interpreter.diffusion_tensor.init((D[0, 0], D[1, 1], D[2, 2], D[0, 1], D[0, 2], D[1, 2]), param_types=3) 616 617 # Check the ellipsoid. 618 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
619 620
622 """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 623 624 # Get the spheroid data. 625 Dpar, Dper, theta, phi = 1e7, 4e7, pi/4.0, 0.0 626 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 627 628 # Create a new data pipe. 629 self.interpreter.pipe.create('spheroid2', 'mf') 630 631 # Tensor initialization. 632 self.interpreter.diffusion_tensor.init((D[0, 0], D[1, 1], D[2, 2], D[0, 1], D[0, 2], D[1, 2]), param_types=3) 633 634 # Check the ellipsoid. 635 self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R)
636 637
639 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 0.""" 640 641 # Get the spheroid data. 642 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 643 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 644 645 # Create a new data pipe. 646 self.interpreter.pipe.create('spheroid2', 'mf') 647 648 # Tensor initialization. 649 self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), param_types=0, angle_units='rad') 650 651 # Check the spheroid. 652 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
653 654
656 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 1.""" 657 658 # Get the spheroid data. 659 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 660 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 661 662 # Create a new data pipe. 663 self.interpreter.pipe.create('spheroid2', 'mf') 664 665 # Tensor initialization. 666 self.interpreter.diffusion_tensor.init((Diso, Da, theta, phi), param_types=1, angle_units='rad') 667 668 # Check the spheroid. 669 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
670 671
673 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 1, and angles in deg.""" 674 675 # Get the spheroid data. 676 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 677 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 678 679 # Create a new data pipe. 680 self.interpreter.pipe.create('spheroid2', 'mf') 681 682 # Tensor initialization. 683 self.interpreter.diffusion_tensor.init((Diso, Da, theta/2.0/pi*360.0, phi/2.0/pi*360.0), param_types=1, angle_units='deg') 684 685 # Check the spheroid. 686 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
687 688
690 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 2.""" 691 692 # Get the spheroid data. 693 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 694 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 695 696 # Create a new data pipe. 697 self.interpreter.pipe.create('spheroid2', 'mf') 698 699 # Tensor initialization. 700 self.interpreter.diffusion_tensor.init((tm, Dratio, theta, phi), param_types=2, angle_units='rad') 701 702 # Check the spheroid. 703 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
704 705
707 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 3.""" 708 709 # Get the spheroid data. 710 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 711 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 712 713 # Create a new data pipe. 714 self.interpreter.pipe.create('spheroid2', 'mf') 715 716 # Tensor initialization. 717 self.interpreter.diffusion_tensor.init((Dpar, Dper, theta, phi), param_types=3, angle_units='rad') 718 719 # Check the spheroid. 720 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
721 722
724 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 4.""" 725 726 # Get the spheroid data. 727 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 728 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 729 730 # Create a new data pipe. 731 self.interpreter.pipe.create('spheroid2', 'mf') 732 733 # Tensor initialization. 734 self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 735 736 # Check the spheroid. 737 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
738 739
741 """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 742 743 # Get the spheroid data. 744 Dpar, Dper, theta, phi = 4e7, 2e7, 0.5, 1.0 745 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 746 747 # Create a new data pipe. 748 self.interpreter.pipe.create('spheroid2', 'mf') 749 750 # Tensor initialization. 751 self.interpreter.diffusion_tensor.init((D[0, 0], D[1, 1], D[2, 2], D[0, 1], D[0, 2], D[1, 2]), param_types=3) 752 753 # Check the ellipsoid. 754 self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R)
755 756
758 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 0.""" 759 760 # Get the spheroid data. 761 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 762 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 763 764 # Create a new data pipe. 765 self.interpreter.pipe.create('spheroid2', 'mf') 766 767 # Tensor initialization. 768 self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, angle_units='rad') 769 770 # Check the spheroid. 771 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
772 773
775 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 0.""" 776 777 # Get the spheroid data. 778 Dpar, Dper, theta, phi = 8e7, 8e7, 0.5, 1.0 779 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 780 781 # Create a new data pipe. 782 self.interpreter.pipe.create('spheroid2', 'mf') 783 784 # Tensor initialization. 785 self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, angle_units='rad') 786 787 # Check the spheroid. 788 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
789 790
792 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 1.""" 793 794 # Get the spheroid data. 795 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 796 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 797 798 # Create a new data pipe. 799 self.interpreter.pipe.create('spheroid2', 'mf') 800 801 # Tensor initialization. 802 self.interpreter.diffusion_tensor.init((Diso, Da, theta, phi), param_types=1, angle_units='rad') 803 804 # Check the spheroid. 805 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
806 807
809 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 1, and angles in deg.""" 810 811 # Get the spheroid data. 812 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 813 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 814 815 # Create a new data pipe. 816 self.interpreter.pipe.create('spheroid2', 'mf') 817 818 # Tensor initialization. 819 self.interpreter.diffusion_tensor.init((Diso, Da, theta/2.0/pi*360.0, phi/2.0/pi*360.0), param_types=1, angle_units='deg') 820 821 # Check the spheroid. 822 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
823 824
826 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 2.""" 827 828 # Get the spheroid data. 829 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 830 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 831 832 # Create a new data pipe. 833 self.interpreter.pipe.create('spheroid2', 'mf') 834 835 # Tensor initialization. 836 self.interpreter.diffusion_tensor.init((tm, Dratio, theta, phi), param_types=2, angle_units='rad') 837 838 # Check the spheroid. 839 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
840 841
843 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 3.""" 844 845 # Get the spheroid data. 846 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 847 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 848 849 # Create a new data pipe. 850 self.interpreter.pipe.create('spheroid2', 'mf') 851 852 # Tensor initialization. 853 self.interpreter.diffusion_tensor.init((Dpar, Dper, theta, phi), param_types=3, angle_units='rad') 854 855 # Check the spheroid. 856 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
857 858
860 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 4.""" 861 862 # Get the spheroid data. 863 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 864 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 865 866 # Create a new data pipe. 867 self.interpreter.pipe.create('spheroid2', 'mf') 868 869 # Tensor initialization. 870 self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 871 872 # Check the spheroid. 873 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
874 875
876 - def test_opt_ellipsoid(self):
877 """Check that the ellipsoid diffusion tensor optimisation functions correctly.""" 878 879 # Reset relax. 880 reset() 881 882 # The diffusion type (used by the script). 883 ds.diff_type = 'ellipsoid' 884 885 # Execute the script. 886 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 887 888 # Print out. 889 print(cdp.diff_tensor) 890 891 # The real data. 892 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 893 894 # Check the values. 895 self.assertAlmostEqual(cdp.chi2, 0.0) 896 self.assertEqual(cdp.diff_tensor.fixed, False) 897 self.assertEqual(cdp.diff_tensor.type, 'ellipsoid') 898 899 # Check the ellipsoid. 900 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
901 902
903 - def test_opt_sphere(self):
904 """Check that the sphere diffusion tensor optimisation functions correctly.""" 905 906 # Reset relax. 907 reset() 908 909 # The diffusion type (used by the script). 910 ds.diff_type = 'sphere' 911 912 # Execute the script. 913 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 914 915 # Check the values. 916 self.assertAlmostEqual(cdp.chi2, 0.0) 917 self.assertEqual(cdp.diff_tensor.fixed, False) 918 self.assertEqual(cdp.diff_tensor.type, 'sphere') 919 self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*2e7) * 1e9) 920 self.assertEqual(cdp.diff_tensor.rotation[0, 0], 1.0) 921 self.assertEqual(cdp.diff_tensor.rotation[1, 1], 1.0) 922 self.assertEqual(cdp.diff_tensor.rotation[2, 2], 1.0) 923 self.assertEqual(cdp.diff_tensor.rotation[0, 1], 0.0) 924 self.assertEqual(cdp.diff_tensor.rotation[0, 2], 0.0) 925 self.assertEqual(cdp.diff_tensor.rotation[1, 2], 0.0) 926 self.assertEqual(cdp.diff_tensor.rotation[1, 0], 0.0) 927 self.assertEqual(cdp.diff_tensor.rotation[2, 0], 0.0) 928 self.assertEqual(cdp.diff_tensor.rotation[2, 1], 0.0)
929 930
931 - def test_opt_spheroid(self):
932 """Check that the spheroid diffusion tensor optimisation functions correctly.""" 933 934 # Reset relax. 935 reset() 936 937 # The diffusion type (used by the script). 938 ds.diff_type = 'spheroid' 939 940 # Execute the script. 941 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 942 943 # Check the values. 944 self.assertAlmostEqual(cdp.chi2, 0.0) 945 self.assertEqual(cdp.diff_tensor.fixed, False) 946 self.assertEqual(cdp.diff_tensor.type, 'spheroid') 947 self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*7e7/3.0) * 1e9) 948 self.assertAlmostEqual(cdp.diff_tensor.Da * 1e-7, 1.0) 949 self.assertAlmostEqual(cdp.diff_tensor.theta, 2.0) 950 self.assertAlmostEqual(cdp.diff_tensor.phi, pi-0.5)
951