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 # Strip out all remark lines. 501 new_data_stripped = [] 502 for line in new_data: 503 if line[:6] != 'REMARK': 504 new_data_stripped.append(line) 505 real_data_stripped = [] 506 for line in real_data: 507 if line[:6] != 'REMARK': 508 real_data_stripped.append(line) 509 510 # Check the data. 511 self.assertEqual(len(real_data_stripped), len(new_data_stripped)) 512 for i in range(len(real_data_stripped)): 513 # Print the PDB line, for debugging. 514 print(real_data_stripped[i][0:-1]) 515 516 # Check the line. 517 self.assertEqual(real_data_stripped[i], new_data_stripped[i])
518 519
521 """Test the user function structure.create_diff_tensor_pdb() for the sphere.""" 522 523 # First copy the data (a more vigorous copy test!). 524 self.interpreter.pipe.copy('sphere', 'sphere2') 525 self.interpreter.pipe.switch('sphere2') 526 self.interpreter.diffusion_tensor.delete() 527 self.interpreter.diffusion_tensor.copy('sphere', 'sphere2') 528 529 # Create the diffusion tensor objects. 530 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_sphere) 531 532 # Open the temp file. 533 file = open(self.tmpfile_sphere) 534 new_data = file.readlines() 535 file.close() 536 537 # Open the real file. 538 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'sphere.pdb') 539 real_data = file.readlines() 540 file.close() 541 542 # Strip out all remark lines. 543 new_data_stripped = [] 544 for line in new_data: 545 if line[:6] != 'REMARK': 546 new_data_stripped.append(line) 547 real_data_stripped = [] 548 for line in real_data: 549 if line[:6] != 'REMARK': 550 real_data_stripped.append(line) 551 552 # Check the data. 553 self.assertEqual(len(real_data_stripped), len(new_data_stripped)) 554 for i in range(len(real_data_stripped)): 555 # Print the PDB line, for debugging. 556 print(real_data_stripped[i][0:-1]) 557 558 # Check the line. 559 self.assertEqual(real_data_stripped[i], new_data_stripped[i])
560 561
563 """Test the user function structure.create_diff_tensor_pdb() for the spheroid.""" 564 565 # First copy the data (a more vigorous copy test!). 566 self.interpreter.pipe.copy('spheroid', 'spheroid2') 567 self.interpreter.pipe.switch('spheroid2') 568 self.interpreter.diffusion_tensor.delete() 569 self.interpreter.diffusion_tensor.copy('spheroid', 'spheroid2') 570 571 # Create the diffusion tensor objects. 572 self.interpreter.structure.create_diff_tensor_pdb(file=self.tmpfile_spheroid) 573 574 # Open the temp file. 575 file = open(self.tmpfile_spheroid) 576 new_data = file.readlines() 577 file.close() 578 579 # Open the real file. 580 file = open(status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'diff_tensors'+sep+'spheroid.pdb') 581 real_data = file.readlines() 582 file.close() 583 584 # Strip out all remark lines. 585 new_data_stripped = [] 586 for line in new_data: 587 if line[:6] != 'REMARK': 588 new_data_stripped.append(line) 589 real_data_stripped = [] 590 for line in real_data: 591 if line[:6] != 'REMARK': 592 real_data_stripped.append(line) 593 594 # Check the data. 595 self.assertEqual(len(real_data_stripped), len(new_data_stripped)) 596 for i in range(len(real_data_stripped)): 597 # Print the PDB line, for debugging. 598 print(real_data_stripped[i][0:-1]) 599 600 # Check the line. 601 self.assertEqual(real_data_stripped[i], new_data_stripped[i])
602 603
605 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 606 607 # Get the ellipsoid data. 608 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 609 610 # Create a new data pipe. 611 self.interpreter.pipe.create('ellipsoid2', 'mf') 612 613 # Tensor initialization. 614 self.interpreter.diffusion_tensor.init((1/(6.0*Diso), Da, Dr, alpha, beta, gamma), param_types=0, angle_units='rad') 615 616 # Check the ellipsoid. 617 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
618 619
621 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 622 623 # Get the ellipsoid data. 624 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 625 626 # Create a new data pipe. 627 self.interpreter.pipe.create('ellipsoid2', 'mf') 628 629 # Tensor initialization. 630 self.interpreter.diffusion_tensor.init((Diso, Da, Dr, alpha, beta, gamma), param_types=1, angle_units='rad') 631 632 # Check the ellipsoid. 633 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
634 635
637 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 638 639 # Get the ellipsoid data. 640 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 641 642 # Create a new data pipe. 643 self.interpreter.pipe.create('ellipsoid2', 'mf') 644 645 # Tensor initialization. 646 self.interpreter.diffusion_tensor.init((Dx, Dy, Dz, alpha, beta, gamma), param_types=2, angle_units='rad') 647 648 # Check the ellipsoid. 649 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
650 651
653 """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 654 655 # Get the ellipsoid data. 656 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 657 658 # Create a new data pipe. 659 self.interpreter.pipe.create('ellipsoid2', 'mf') 660 661 # Tensor initialization. 662 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) 663 664 # Check the ellipsoid. 665 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
666 667
669 """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 670 671 # Get the spheroid data. 672 Dpar, Dper, theta, phi = 1e7, 4e7, pi/4.0, 0.0 673 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 674 675 # Create a new data pipe. 676 self.interpreter.pipe.create('spheroid2', 'mf') 677 678 # Tensor initialization. 679 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) 680 681 # Check the ellipsoid. 682 self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R)
683 684
686 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 0.""" 687 688 # Get the spheroid data. 689 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 690 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 691 692 # Create a new data pipe. 693 self.interpreter.pipe.create('spheroid2', 'mf') 694 695 # Tensor initialization. 696 self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), param_types=0, angle_units='rad') 697 698 # Check the spheroid. 699 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
700 701
703 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 1.""" 704 705 # Get the spheroid data. 706 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 707 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 708 709 # Create a new data pipe. 710 self.interpreter.pipe.create('spheroid2', 'mf') 711 712 # Tensor initialization. 713 self.interpreter.diffusion_tensor.init((Diso, Da, theta, phi), param_types=1, angle_units='rad') 714 715 # Check the spheroid. 716 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
717 718
720 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 1, and angles in deg.""" 721 722 # Get the spheroid data. 723 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 724 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 725 726 # Create a new data pipe. 727 self.interpreter.pipe.create('spheroid2', 'mf') 728 729 # Tensor initialization. 730 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') 731 732 # Check the spheroid. 733 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
734 735
737 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 2.""" 738 739 # Get the spheroid data. 740 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 741 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 742 743 # Create a new data pipe. 744 self.interpreter.pipe.create('spheroid2', 'mf') 745 746 # Tensor initialization. 747 self.interpreter.diffusion_tensor.init((tm, Dratio, theta, phi), param_types=2, angle_units='rad') 748 749 # Check the spheroid. 750 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
751 752
754 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 3.""" 755 756 # Get the spheroid data. 757 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 758 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 759 760 # Create a new data pipe. 761 self.interpreter.pipe.create('spheroid2', 'mf') 762 763 # Tensor initialization. 764 self.interpreter.diffusion_tensor.init((Dpar, Dper, theta, phi), param_types=3, angle_units='rad') 765 766 # Check the spheroid. 767 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
768 769
771 """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 4.""" 772 773 # Get the spheroid data. 774 Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 775 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 776 777 # Create a new data pipe. 778 self.interpreter.pipe.create('spheroid2', 'mf') 779 780 # Tensor initialization. 781 self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 782 783 # Check the spheroid. 784 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate')
785 786
788 """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 789 790 # Get the spheroid data. 791 Dpar, Dper, theta, phi = 4e7, 2e7, 0.5, 1.0 792 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 793 794 # Create a new data pipe. 795 self.interpreter.pipe.create('spheroid2', 'mf') 796 797 # Tensor initialization. 798 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) 799 800 # Check the ellipsoid. 801 self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R)
802 803
805 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 0.""" 806 807 # Get the spheroid data. 808 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 809 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 810 811 # Create a new data pipe. 812 self.interpreter.pipe.create('spheroid2', 'mf') 813 814 # Tensor initialization. 815 self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, angle_units='rad') 816 817 # Check the spheroid. 818 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
819 820
822 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 0.""" 823 824 # Get the spheroid data. 825 Dpar, Dper, theta, phi = 8e7, 8e7, 0.5, 1.0 826 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 827 828 # Create a new data pipe. 829 self.interpreter.pipe.create('spheroid2', 'mf') 830 831 # Tensor initialization. 832 self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, angle_units='rad') 833 834 # Check the spheroid. 835 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
836 837
839 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 1.""" 840 841 # Get the spheroid data. 842 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 843 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 844 845 # Create a new data pipe. 846 self.interpreter.pipe.create('spheroid2', 'mf') 847 848 # Tensor initialization. 849 self.interpreter.diffusion_tensor.init((Diso, Da, theta, phi), param_types=1, angle_units='rad') 850 851 # Check the spheroid. 852 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
853 854
856 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 1, and angles in deg.""" 857 858 # Get the spheroid data. 859 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 860 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 861 862 # Create a new data pipe. 863 self.interpreter.pipe.create('spheroid2', 'mf') 864 865 # Tensor initialization. 866 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') 867 868 # Check the spheroid. 869 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
870 871
873 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 2.""" 874 875 # Get the spheroid data. 876 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 877 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 878 879 # Create a new data pipe. 880 self.interpreter.pipe.create('spheroid2', 'mf') 881 882 # Tensor initialization. 883 self.interpreter.diffusion_tensor.init((tm, Dratio, theta, phi), param_types=2, angle_units='rad') 884 885 # Check the spheroid. 886 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
887 888
890 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 3.""" 891 892 # Get the spheroid data. 893 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 894 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 895 896 # Create a new data pipe. 897 self.interpreter.pipe.create('spheroid2', 'mf') 898 899 # Tensor initialization. 900 self.interpreter.diffusion_tensor.init((Dpar, Dper, theta, phi), param_types=3, angle_units='rad') 901 902 # Check the spheroid. 903 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
904 905
907 """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 4.""" 908 909 # Get the spheroid data. 910 Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 911 tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 912 913 # Create a new data pipe. 914 self.interpreter.pipe.create('spheroid2', 'mf') 915 916 # Tensor initialization. 917 self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 918 919 # Check the spheroid. 920 self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate')
921 922
923 - def test_opt_ellipsoid(self):
924 """Check that the ellipsoid diffusion tensor optimisation functions correctly.""" 925 926 # Reset relax. 927 reset() 928 929 # The diffusion type (used by the script). 930 ds.diff_type = 'ellipsoid' 931 932 # Execute the script. 933 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 934 935 # Print out. 936 print(cdp.diff_tensor) 937 938 # The real data. 939 Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 940 941 # Check the values. 942 self.assertAlmostEqual(cdp.chi2, 0.0) 943 self.assertEqual(cdp.diff_tensor.fixed, False) 944 self.assertEqual(cdp.diff_tensor.type, 'ellipsoid') 945 946 # Check the ellipsoid. 947 self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R)
948 949
950 - def test_opt_sphere(self):
951 """Check that the sphere diffusion tensor optimisation functions correctly.""" 952 953 # Reset relax. 954 reset() 955 956 # The diffusion type (used by the script). 957 ds.diff_type = 'sphere' 958 959 # Execute the script. 960 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 961 962 # Check the values. 963 self.assertAlmostEqual(cdp.chi2, 0.0) 964 self.assertEqual(cdp.diff_tensor.fixed, False) 965 self.assertEqual(cdp.diff_tensor.type, 'sphere') 966 self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*2e7) * 1e9) 967 self.assertEqual(cdp.diff_tensor.rotation[0, 0], 1.0) 968 self.assertEqual(cdp.diff_tensor.rotation[1, 1], 1.0) 969 self.assertEqual(cdp.diff_tensor.rotation[2, 2], 1.0) 970 self.assertEqual(cdp.diff_tensor.rotation[0, 1], 0.0) 971 self.assertEqual(cdp.diff_tensor.rotation[0, 2], 0.0) 972 self.assertEqual(cdp.diff_tensor.rotation[1, 2], 0.0) 973 self.assertEqual(cdp.diff_tensor.rotation[1, 0], 0.0) 974 self.assertEqual(cdp.diff_tensor.rotation[2, 0], 0.0) 975 self.assertEqual(cdp.diff_tensor.rotation[2, 1], 0.0)
976 977
978 - def test_opt_spheroid(self):
979 """Check that the spheroid diffusion tensor optimisation functions correctly.""" 980 981 # Reset relax. 982 reset() 983 984 # The diffusion type (used by the script). 985 ds.diff_type = 'spheroid' 986 987 # Execute the script. 988 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 989 990 # Check the values. 991 self.assertAlmostEqual(cdp.chi2, 0.0) 992 self.assertEqual(cdp.diff_tensor.fixed, False) 993 self.assertEqual(cdp.diff_tensor.type, 'spheroid') 994 self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*7e7/3.0) * 1e9) 995 self.assertAlmostEqual(cdp.diff_tensor.Da * 1e-7, 1.0) 996 self.assertAlmostEqual(cdp.diff_tensor.theta, 2.0) 997 self.assertAlmostEqual(cdp.diff_tensor.phi, pi-0.5)
998