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
411 """Catch U{bug #21561<https://web.archive.org/web/https://gna.org/bugs/?21561>} reported by Martin Ballaschk, the failure of the diffusion tensor PDB creation when Monte Carlo simulations are not present.""" 412 413 # Create a data pipe. 414 self.interpreter.pipe.create('diff PDB', 'mf') 415 416 # Initialise a diffusion tensor. 417 self.interpreter.diffusion_tensor.init((2e-8, 1.3, 60, 290), spheroid_type='prolate', param_types=2, fixed=True) 418 419 # Load a random protein structure. 420 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 421 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path) 422 423 # Generate the tensor PDB without MC sims. 424 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_spheroid)
425 426
427 - def test_copy(self):
428 """The user function diffusion_tensor.copy().""" 429 430 # Create three additional data pipes for copying the spherical, spheroidal, and ellipsoidal diffusion data. 431 self.interpreter.pipe.create('sphere2', 'mf') 432 self.interpreter.pipe.create('spheroid2', 'mf') 433 self.interpreter.pipe.create('ellipsoid2', 'mf') 434 435 # Copy the data. 436 self.interpreter.diffusion_tensor.copy('sphere', 'sphere2') 437 self.interpreter.diffusion_tensor.copy('spheroid', 'spheroid2') 438 self.interpreter.diffusion_tensor.copy('ellipsoid', 'ellipsoid2') 439 440 # Get the data pipes. 441 sphere_pipe = get_pipe('sphere') 442 sphere2_pipe = get_pipe('sphere2') 443 444 # Check that this is indeed a copy. 445 self.assertEqual(sphere2_pipe.diff_tensor.tm_sim[4], 9.02e-8) 446 self.assertEqual(sphere2_pipe.diff_tensor.Diso_sim[4], 1/(6*9.02e-8)) 447 sphere_pipe.diff_tensor.set(param='tm', value=8.88e-8, category='sim', sim_index=4) 448 self.assertEqual(sphere_pipe.diff_tensor.tm_sim[4], 8.88e-8) 449 self.assertEqual(sphere_pipe.diff_tensor.Diso_sim[4], 1/(6*8.88e-8)) 450 self.assertEqual(sphere2_pipe.diff_tensor.tm_sim[4], 9.02e-8) 451 self.assertEqual(sphere2_pipe.diff_tensor.Diso_sim[4], 1/(6*9.02e-8))
452 453
454 - def test_delete(self):
455 """The user function diffusion_tensor.delete().""" 456 457 # Delete the data. 458 self.interpreter.pipe.switch('sphere') 459 self.interpreter.diffusion_tensor.delete() 460 self.interpreter.pipe.switch('spheroid') 461 self.interpreter.diffusion_tensor.delete() 462 self.interpreter.pipe.switch('ellipsoid') 463 self.interpreter.diffusion_tensor.delete()
464 465
466 - def test_display(self):
467 """The user function diffusion_tensor.display().""" 468 469 # Display the data. 470 self.interpreter.pipe.switch('sphere') 471 self.interpreter.diffusion_tensor.display() 472 self.interpreter.pipe.switch('spheroid') 473 self.interpreter.diffusion_tensor.display() 474 self.interpreter.pipe.switch('ellipsoid') 475 self.interpreter.diffusion_tensor.display()
476 477
479 """Test the user function structure.create_diff_tensor_pdb() for the ellipsoid.""" 480 481 # First copy the data (a more vigorous copy test!). 482 self.interpreter.pipe.copy('ellipsoid', 'ellipsoid2') 483 self.interpreter.pipe.switch('ellipsoid2') 484 self.interpreter.diffusion_tensor.delete() 485 self.interpreter.diffusion_tensor.copy('ellipsoid', 'ellipsoid2') 486 487 # Create the diffusion tensor objects. 488 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_ellipsoid, scale=1e-05) 489 490 # Open the temp file. 491 file = open(self.tmpfile_ellipsoid) 492 new_data = file.readlines() 493 file.close() 494 495 # Open the real file. 496 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'ellipsoid.pdb') 497 real_data = file.readlines() 498 file.close() 499 500 # Check the data. 501 self.assertEqual(len(real_data), len(new_data)) 502 for i in range(len(real_data)): 503 # Print the PDB line, for debugging. 504 print(real_data[i][0:-1]) 505 506 # Check the line. 507 self.assertEqual(real_data[i], new_data[i])
508 509
511 """Test the user function structure.create_diff_tensor_pdb() for the sphere.""" 512 513 # First copy the data (a more vigorous copy test!). 514 self.interpreter.pipe.copy('sphere', 'sphere2') 515 self.interpreter.pipe.switch('sphere2') 516 self.interpreter.diffusion_tensor.delete() 517 self.interpreter.diffusion_tensor.copy('sphere', 'sphere2') 518 519 # Create the diffusion tensor objects. 520 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_sphere) 521 522 # Open the temp file. 523 file = open(self.tmpfile_sphere) 524 new_data = file.readlines() 525 file.close() 526 527 # Open the real file. 528 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'sphere.pdb') 529 real_data = file.readlines() 530 file.close() 531 532 # Check the data. 533 self.assertEqual(len(real_data), len(new_data)) 534 for i in range(len(real_data)): 535 # Print the PDB line, for debugging. 536 print(real_data[i][0:-1]) 537 538 # Check the line. 539 self.assertEqual(real_data[i], new_data[i])
540 541
543 """Test the user function structure.create_diff_tensor_pdb() for the spheroid.""" 544 545 # First copy the data (a more vigorous copy test!). 546 self.interpreter.pipe.copy('spheroid', 'spheroid2') 547 self.interpreter.pipe.switch('spheroid2') 548 self.interpreter.diffusion_tensor.delete() 549 self.interpreter.diffusion_tensor.copy('spheroid', 'spheroid2') 550 551 # Create the diffusion tensor objects. 552 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_spheroid) 553 554 # Open the temp file. 555 file = open(self.tmpfile_spheroid) 556 new_data = file.readlines() 557 file.close() 558 559 # Open the real file. 560 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'spheroid.pdb') 561 real_data = file.readlines() 562 file.close() 563 564 # Check the data. 565 self.assertEqual(len(real_data), len(new_data)) 566 for i in range(len(real_data)): 567 # Print the PDB line, for debugging. 568 print(real_data[i][0:-1]) 569 570 # Check the line. 571 self.assertEqual(real_data[i], new_data[i])
572 573
575 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 576 577 # Get the ellipsoid data. 578 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 579 580 # Create a new data pipe. 581 self.interpreter.pipe.create('ellipsoid2', 'mf') 582 583 # Tensor initialization. 584 self.interpreter.diffusion_tensor.init((1/(6.0*Diso), Da, Dr, alpha, beta, gamma), param_types=0, angle_units='rad') 585 586 # Check the ellipsoid. 587 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
588 589
591 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 592 593 # Get the ellipsoid data. 594 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 595 596 # Create a new data pipe. 597 self.interpreter.pipe.create('ellipsoid2', 'mf') 598 599 # Tensor initialization. 600 self.interpreter.diffusion_tensor.init((Diso, Da, Dr, alpha, beta, gamma), param_types=1, angle_units='rad') 601 602 # Check the ellipsoid. 603 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
604 605
607 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 608 609 # Get the ellipsoid data. 610 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 611 612 # Create a new data pipe. 613 self.interpreter.pipe.create('ellipsoid2', 'mf') 614 615 # Tensor initialization. 616 self.interpreter.diffusion_tensor.init((Dx, Dy, Dz, alpha, beta, gamma), param_types=2, angle_units='rad') 617 618 # Check the ellipsoid. 619 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
620 621
623 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 624 625 # Get the ellipsoid data. 626 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 627 628 # Create a new data pipe. 629 self.interpreter.pipe.create('ellipsoid2', '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_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
636 637
639 """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 640 641 # Get the spheroid data. 642 Dpar, Dper, theta, phi = 1e7, 4e7, pi/4.0, 0.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((D[0, 0], D[1, 1], D[2, 2], D[0, 1], D[0, 2], D[1, 2]), param_types=3) 650 651 # Check the ellipsoid. 652 self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R)
653 654
656 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 0.""" 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((tm, Da, theta, phi), param_types=0, 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.""" 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, phi), param_types=1, angle_units='rad') 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 1, and angles in deg.""" 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((Diso, Da, theta/2.0/pi*360.0, phi/2.0/pi*360.0), param_types=1, angle_units='deg') 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 2.""" 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((tm, Dratio, theta, phi), param_types=2, 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 3.""" 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((Dpar, Dper, theta, phi), param_types=3, 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 oblate spheroid diffusion tensor using parameter set 4.""" 742 743 # Get the spheroid data. 744 Dpar, Dper, theta, phi = 1e7, 4e7, 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((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 752 753 # Check the spheroid. 754 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
755 756
758 """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 759 760 # Get the spheroid data. 761 Dpar, Dper, theta, phi = 4e7, 2e7, 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((D[0, 0], D[1, 1], D[2, 2], D[0, 1], D[0, 2], D[1, 2]), param_types=3) 769 770 # Check the ellipsoid. 771 self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R)
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, 4e7, 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 0.""" 793 794 # Get the spheroid data. 795 Dpar, Dper, theta, phi = 8e7, 8e7, 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((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, 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.""" 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, phi), param_types=1, angle_units='rad') 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 1, and angles in deg.""" 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((Diso, Da, theta/2.0/pi*360.0, phi/2.0/pi*360.0), param_types=1, angle_units='deg') 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 2.""" 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((tm, Dratio, theta, phi), param_types=2, 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 3.""" 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((Dpar, Dper, theta, phi), param_types=3, 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
877 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 4.""" 878 879 # Get the spheroid data. 880 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 881 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 882 883 # Create a new data pipe. 884 self.interpreter.pipe.create('spheroid2', 'mf') 885 886 # Tensor initialization. 887 self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 888 889 # Check the spheroid. 890 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
891 892
893 - def test_opt_ellipsoid(self):
894 """Check that the ellipsoid diffusion tensor optimisation functions correctly.""" 895 896 # Reset relax. 897 reset() 898 899 # The diffusion type (used by the script). 900 ds.diff_type = 'ellipsoid' 901 902 # Execute the script. 903 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 904 905 # Print out. 906 print(cdp.diff_tensor) 907 908 # The real data. 909 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 910 911 # Check the values. 912 self.assertAlmostEqual(cdp.chi2, 0.0) 913 self.assertEqual(cdp.diff_tensor.fixed, False) 914 self.assertEqual(cdp.diff_tensor.type, 'ellipsoid') 915 916 # Check the ellipsoid. 917 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
918 919
920 - def test_opt_sphere(self):
921 """Check that the sphere diffusion tensor optimisation functions correctly.""" 922 923 # Reset relax. 924 reset() 925 926 # The diffusion type (used by the script). 927 ds.diff_type = 'sphere' 928 929 # Execute the script. 930 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 931 932 # Check the values. 933 self.assertAlmostEqual(cdp.chi2, 0.0) 934 self.assertEqual(cdp.diff_tensor.fixed, False) 935 self.assertEqual(cdp.diff_tensor.type, 'sphere') 936 self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*2e7) * 1e9) 937 self.assertEqual(cdp.diff_tensor.rotation[0, 0], 1.0) 938 self.assertEqual(cdp.diff_tensor.rotation[1, 1], 1.0) 939 self.assertEqual(cdp.diff_tensor.rotation[2, 2], 1.0) 940 self.assertEqual(cdp.diff_tensor.rotation[0, 1], 0.0) 941 self.assertEqual(cdp.diff_tensor.rotation[0, 2], 0.0) 942 self.assertEqual(cdp.diff_tensor.rotation[1, 2], 0.0) 943 self.assertEqual(cdp.diff_tensor.rotation[1, 0], 0.0) 944 self.assertEqual(cdp.diff_tensor.rotation[2, 0], 0.0) 945 self.assertEqual(cdp.diff_tensor.rotation[2, 1], 0.0)
946 947
948 - def test_opt_spheroid(self):
949 """Check that the spheroid diffusion tensor optimisation functions correctly.""" 950 951 # Reset relax. 952 reset() 953 954 # The diffusion type (used by the script). 955 ds.diff_type = 'spheroid' 956 957 # Execute the script. 958 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 959 960 # Check the values. 961 self.assertAlmostEqual(cdp.chi2, 0.0) 962 self.assertEqual(cdp.diff_tensor.fixed, False) 963 self.assertEqual(cdp.diff_tensor.type, 'spheroid') 964 self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*7e7/3.0) * 1e9) 965 self.assertAlmostEqual(cdp.diff_tensor.Da * 1e-7, 1.0) 966 self.assertAlmostEqual(cdp.diff_tensor.theta, 2.0) 967 self.assertAlmostEqual(cdp.diff_tensor.phi, pi-0.5)
968