1   
   2   
   3   
   4   
   5   
   6   
   7   
   8   
   9   
  10   
  11   
  12   
  13   
  14   
  15   
  16   
  17   
  18   
  19   
  20   
  21   
  22   
  23  from math import pi 
  24  from numpy import array, dot, float64, transpose, zeros 
  25  from os import sep 
  26   
  27   
  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   
  40      """Class for testing various aspects specific to the diffusion tensor.""" 
  41   
  43          """Function for initialising a spherical, spheroidal, and ellipsoidal diffusion tensor.""" 
  44   
  45           
  46          status = Status() 
  47   
  48           
  49          self.interpreter.pipe.create('sphere', 'mf') 
  50          self.interpreter.pipe.create('spheroid', 'mf') 
  51          self.interpreter.pipe.create('ellipsoid', 'mf') 
  52   
  53           
  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           
  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           
  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           
  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           
  84          cdp.diff_tensor.set(param='tm', value=9.00e-8, category='sim', sim_index=0) 
  85   
  86   
  87           
  88          self.interpreter.pipe.switch('spheroid') 
  89   
  90           
  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           
  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           
 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           
 114          self.interpreter.pipe.switch('ellipsoid') 
 115   
 116           
 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           
 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   
 138          """Reset the relax data storage object.""" 
 139   
 140           
 141          reset() 
 142   
 143           
 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           
 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           
 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           
 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           
 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           
 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           
 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           
 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               
 213              proj1 = dot(vect, dot(cdp.diff_tensor.tensor, vect))  
 214              proj2 = dot(vect, dot(D, vect))  
 215   
 216               
 217              self.assertAlmostEqual(proj1, proj2) 
 218   
 219           
 220          if spheroid_type: 
 221              self.assertEqual(spheroid_type, cdp.diff_tensor.spheroid_type) 
  222   
 223   
 225          """Check if the ellipsoid in the cdp has the same values as given spheroid.""" 
 226   
 227           
 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           
 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           
 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           
 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               
 256              proj1 = dot(vect, dot(cdp.diff_tensor.tensor, vect))  
 257              proj2 = dot(vect, dot(D, vect))  
 258   
 259               
 260              print("\nVector: %s" % vect) 
 261              print("Real proj:     %s" % proj1) 
 262              print("Proj in relax: %s" % proj2) 
 263   
 264               
 265              self.assertAlmostEqual(proj1, proj2) 
  266   
 267   
 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           
 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           
 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           
 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           
 294          R = zeros((3, 3), float64) 
 295          euler_to_R_zyz(gamma, beta, alpha, R) 
 296          R = transpose(R) 
 297   
 298           
 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           
 306          Diso = (Dpar + 2*Dper) / 3.0 
 307          tm = 1.0/(6.0 * Diso) 
 308          Da = Dpar - Dper 
 309          Dratio = Dpar / Dper 
 310   
 311           
 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           
 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           
 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           
 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           
 338          D = dot(R, dot(D, transpose(R))) 
 339   
 340           
 341          return tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R 
  342   
 343   
 345          """Check the back-calculation of relaxation data for the spherical diffusion tensor.""" 
 346   
 347           
 348          reset() 
 349   
 350           
 351          ds.diff_dir = 'ellipsoid' 
 352          ds.diff_type = 'ellipsoid' 
 353   
 354           
 355          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'ri_back_calc.py') 
 356   
 357           
 358          for i in range(len(cdp.mol[0].res)): 
 359               
 360              spin = cdp.mol[0].res[i].spin[0] 
 361   
 362               
 363              for ri_id in cdp.ri_ids: 
 364                  self.assertAlmostEqual(spin.ri_data_bc[ri_id], spin.ri_data[ri_id]) 
  365   
 366   
 368          """Check the back-calculation of relaxation data for the spherical diffusion tensor.""" 
 369   
 370           
 371          reset() 
 372   
 373           
 374          ds.diff_dir = 'sphere' 
 375          ds.diff_type = 'sphere' 
 376   
 377           
 378          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'ri_back_calc.py') 
 379   
 380           
 381          for i in range(len(cdp.mol[0].res)): 
 382               
 383              spin = cdp.mol[0].res[i].spin[0] 
 384   
 385               
 386              for ri_id in cdp.ri_ids: 
 387                  self.assertAlmostEqual(spin.ri_data_bc[ri_id], spin.ri_data[ri_id]) 
  388   
 389   
 391          """Check the back-calculation of relaxation data for the spherical diffusion tensor.""" 
 392   
 393           
 394          reset() 
 395   
 396           
 397          ds.diff_dir = 'spheroid_prolate' 
 398          ds.diff_type = 'spheroid' 
 399   
 400           
 401          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'ri_back_calc.py') 
 402   
 403           
 404          for i in range(len(cdp.mol[0].res)): 
 405               
 406              spin = cdp.mol[0].res[i].spin[0] 
 407   
 408               
 409              for ri_id in cdp.ri_ids: 
 410                  self.assertAlmostEqual(spin.ri_data_bc[ri_id], spin.ri_data[ri_id]) 
  411   
 412   
 428   
 429   
 431          """The user function diffusion_tensor.copy().""" 
 432   
 433           
 434          self.interpreter.pipe.create('sphere2', 'mf') 
 435          self.interpreter.pipe.create('spheroid2', 'mf') 
 436          self.interpreter.pipe.create('ellipsoid2', 'mf') 
 437   
 438           
 439          self.interpreter.diffusion_tensor.copy('sphere', 'sphere2') 
 440          self.interpreter.diffusion_tensor.copy('spheroid', 'spheroid2') 
 441          self.interpreter.diffusion_tensor.copy('ellipsoid', 'ellipsoid2') 
 442   
 443           
 444          sphere_pipe = get_pipe('sphere') 
 445          sphere2_pipe = get_pipe('sphere2') 
 446   
 447           
 448          self.assertEqual(sphere2_pipe.diff_tensor.tm_sim[4], 9.02e-8) 
 449          self.assertEqual(sphere2_pipe.diff_tensor.Diso_sim[4], 1/(6*9.02e-8)) 
 450          sphere_pipe.diff_tensor.set(param='tm', value=8.88e-8, category='sim', sim_index=4) 
 451          self.assertEqual(sphere_pipe.diff_tensor.tm_sim[4], 8.88e-8) 
 452          self.assertEqual(sphere_pipe.diff_tensor.Diso_sim[4], 1/(6*8.88e-8)) 
 453          self.assertEqual(sphere2_pipe.diff_tensor.tm_sim[4], 9.02e-8) 
 454          self.assertEqual(sphere2_pipe.diff_tensor.Diso_sim[4], 1/(6*9.02e-8)) 
  455   
 456   
 467   
 468   
 479   
 480   
 521   
 522   
 563   
 564   
 605   
 606   
 608          """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 
 609   
 610           
 611          Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 
 612   
 613           
 614          self.interpreter.pipe.create('ellipsoid2', 'mf') 
 615   
 616           
 617          self.interpreter.diffusion_tensor.init((1/(6.0*Diso), Da, Dr, alpha, beta, gamma), param_types=0, angle_units='rad') 
 618   
 619           
 620          self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R) 
  621   
 622   
 624          """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 
 625   
 626           
 627          Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 
 628   
 629           
 630          self.interpreter.pipe.create('ellipsoid2', 'mf') 
 631   
 632           
 633          self.interpreter.diffusion_tensor.init((Diso, Da, Dr, alpha, beta, gamma), param_types=1, angle_units='rad') 
 634   
 635           
 636          self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R) 
  637   
 638   
 640          """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 
 641   
 642           
 643          Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 
 644   
 645           
 646          self.interpreter.pipe.create('ellipsoid2', 'mf') 
 647   
 648           
 649          self.interpreter.diffusion_tensor.init((Dx, Dy, Dz, alpha, beta, gamma), param_types=2, angle_units='rad') 
 650   
 651           
 652          self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R) 
  653   
 654   
 656          """Test the initialisation of the ellipsoid diffusion tensor using parameter set 0.""" 
 657   
 658           
 659          Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 
 660   
 661           
 662          self.interpreter.pipe.create('ellipsoid2', 'mf') 
 663   
 664           
 665          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) 
 666   
 667           
 668          self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R) 
  669   
 670   
 672          """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 
 673   
 674           
 675          Dpar, Dper, theta, phi = 1e7, 4e7, pi/4.0, 0.0 
 676          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 677   
 678           
 679          self.interpreter.pipe.create('spheroid2', 'mf') 
 680   
 681           
 682          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) 
 683   
 684           
 685          self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R) 
  686   
 687   
 689          """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 0.""" 
 690   
 691           
 692          Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 
 693          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 694   
 695           
 696          self.interpreter.pipe.create('spheroid2', 'mf') 
 697   
 698           
 699          self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), param_types=0, angle_units='rad') 
 700   
 701           
 702          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate') 
  703   
 704   
 706          """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 1.""" 
 707   
 708           
 709          Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 
 710          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 711   
 712           
 713          self.interpreter.pipe.create('spheroid2', 'mf') 
 714   
 715           
 716          self.interpreter.diffusion_tensor.init((Diso, Da, theta, phi), param_types=1, angle_units='rad') 
 717   
 718           
 719          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate') 
  720   
 721   
 723          """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 1, and angles in deg.""" 
 724   
 725           
 726          Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 
 727          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 728   
 729           
 730          self.interpreter.pipe.create('spheroid2', 'mf') 
 731   
 732           
 733          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') 
 734   
 735           
 736          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate') 
  737   
 738   
 740          """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 2.""" 
 741   
 742           
 743          Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 
 744          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 745   
 746           
 747          self.interpreter.pipe.create('spheroid2', 'mf') 
 748   
 749           
 750          self.interpreter.diffusion_tensor.init((tm, Dratio, theta, phi), param_types=2, angle_units='rad') 
 751   
 752           
 753          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate') 
  754   
 755   
 757          """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 3.""" 
 758   
 759           
 760          Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 
 761          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 762   
 763           
 764          self.interpreter.pipe.create('spheroid2', 'mf') 
 765   
 766           
 767          self.interpreter.diffusion_tensor.init((Dpar, Dper, theta, phi), param_types=3, angle_units='rad') 
 768   
 769           
 770          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate') 
  771   
 772   
 774          """Test the initialisation of the oblate spheroid diffusion tensor using parameter set 4.""" 
 775   
 776           
 777          Dpar, Dper, theta, phi = 1e7, 4e7, 0.5, 1.0 
 778          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 779   
 780           
 781          self.interpreter.pipe.create('spheroid2', 'mf') 
 782   
 783           
 784          self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 
 785   
 786           
 787          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='oblate') 
  788   
 789   
 791          """Test the initialisation of the spheroid diffusion tensor using parameter set 4.""" 
 792   
 793           
 794          Dpar, Dper, theta, phi = 4e7, 2e7, 0.5, 1.0 
 795          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 796   
 797           
 798          self.interpreter.pipe.create('spheroid2', 'mf') 
 799   
 800           
 801          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) 
 802   
 803           
 804          self.check_spheroid_as_ellipsoid(tm, Dx, Dy, Dz, Diso, Da, D, D_prime, R) 
  805   
 806   
 808          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 0.""" 
 809   
 810           
 811          Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 
 812          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 813   
 814           
 815          self.interpreter.pipe.create('spheroid2', 'mf') 
 816   
 817           
 818          self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, angle_units='rad') 
 819   
 820           
 821          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  822   
 823   
 825          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 0.""" 
 826   
 827           
 828          Dpar, Dper, theta, phi = 8e7, 8e7, 0.5, 1.0 
 829          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 830   
 831           
 832          self.interpreter.pipe.create('spheroid2', 'mf') 
 833   
 834           
 835          self.interpreter.diffusion_tensor.init((tm, Da, theta, phi), spheroid_type='prolate', param_types=0, angle_units='rad') 
 836   
 837           
 838          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  839   
 840   
 842          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 1.""" 
 843   
 844           
 845          Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 
 846          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 847   
 848           
 849          self.interpreter.pipe.create('spheroid2', 'mf') 
 850   
 851           
 852          self.interpreter.diffusion_tensor.init((Diso, Da, theta, phi), param_types=1, angle_units='rad') 
 853   
 854           
 855          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  856   
 857   
 859          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 1, and angles in deg.""" 
 860   
 861           
 862          Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 
 863          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 864   
 865           
 866          self.interpreter.pipe.create('spheroid2', 'mf') 
 867   
 868           
 869          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') 
 870   
 871           
 872          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  873   
 874   
 876          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 2.""" 
 877   
 878           
 879          Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 
 880          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 881   
 882           
 883          self.interpreter.pipe.create('spheroid2', 'mf') 
 884   
 885           
 886          self.interpreter.diffusion_tensor.init((tm, Dratio, theta, phi), param_types=2, angle_units='rad') 
 887   
 888           
 889          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  890   
 891   
 893          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 3.""" 
 894   
 895           
 896          Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 
 897          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 898   
 899           
 900          self.interpreter.pipe.create('spheroid2', 'mf') 
 901   
 902           
 903          self.interpreter.diffusion_tensor.init((Dpar, Dper, theta, phi), param_types=3, angle_units='rad') 
 904   
 905           
 906          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  907   
 908   
 910          """Test the initialisation of the prolate spheroid diffusion tensor using parameter set 4.""" 
 911   
 912           
 913          Dpar, Dper, theta, phi = 8e7, 4e7, 0.5, 1.0 
 914          tm, Dx, Dy, Dz, Diso, Da, Dratio, D, D_prime, R = self.get_spheroid(Dpar=Dpar, Dper=Dper, theta=theta, phi=phi) 
 915   
 916           
 917          self.interpreter.pipe.create('spheroid2', 'mf') 
 918   
 919           
 920          self.interpreter.diffusion_tensor.init((Diso, Dratio, theta, phi), param_types=4, angle_units='rad') 
 921   
 922           
 923          self.check_spheroid(tm, Dpar, Dper, Diso, Da, Dratio, theta, phi, D, D_prime, R, spheroid_type='prolate') 
  924   
 925   
 927          """Check that the ellipsoid diffusion tensor optimisation functions correctly.""" 
 928   
 929           
 930          reset() 
 931   
 932           
 933          ds.diff_dir = 'ellipsoid' 
 934          ds.diff_type = 'ellipsoid' 
 935   
 936           
 937          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 
 938   
 939           
 940          print(cdp.diff_tensor) 
 941   
 942           
 943          Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R = self.get_ellipsoid() 
 944   
 945           
 946          self.assertAlmostEqual(cdp.chi2, 0.0) 
 947          self.assertEqual(cdp.diff_tensor.fixed, False) 
 948          self.assertEqual(cdp.diff_tensor.type, 'ellipsoid') 
 949   
 950           
 951          self.check_ellipsoid(Dx, Dy, Dz, Diso, Da, Dr, alpha, beta, gamma, D, D_prime, R) 
  952   
 953   
 955          """Check that the sphere diffusion tensor optimisation functions correctly.""" 
 956   
 957           
 958          reset() 
 959   
 960           
 961          ds.diff_dir = 'sphere' 
 962          ds.diff_type = 'sphere' 
 963   
 964           
 965          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 
 966   
 967           
 968          self.assertAlmostEqual(cdp.chi2, 0.0) 
 969          self.assertEqual(cdp.diff_tensor.fixed, False) 
 970          self.assertEqual(cdp.diff_tensor.type, 'sphere') 
 971          self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*2e7) * 1e9) 
 972          self.assertEqual(cdp.diff_tensor.rotation[0, 0], 1.0) 
 973          self.assertEqual(cdp.diff_tensor.rotation[1, 1], 1.0) 
 974          self.assertEqual(cdp.diff_tensor.rotation[2, 2], 1.0) 
 975          self.assertEqual(cdp.diff_tensor.rotation[0, 1], 0.0) 
 976          self.assertEqual(cdp.diff_tensor.rotation[0, 2], 0.0) 
 977          self.assertEqual(cdp.diff_tensor.rotation[1, 2], 0.0) 
 978          self.assertEqual(cdp.diff_tensor.rotation[1, 0], 0.0) 
 979          self.assertEqual(cdp.diff_tensor.rotation[2, 0], 0.0) 
 980          self.assertEqual(cdp.diff_tensor.rotation[2, 1], 0.0) 
  981   
 982   
 984          """Check that the spheroid diffusion tensor optimisation functions correctly.""" 
 985   
 986           
 987          reset() 
 988   
 989           
 990          ds.diff_dir = 'spheroid_prolate' 
 991          ds.diff_type = 'spheroid' 
 992   
 993           
 994          self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 
 995   
 996           
 997          self.assertAlmostEqual(cdp.chi2, 0.0) 
 998          self.assertEqual(cdp.diff_tensor.fixed, False) 
 999          self.assertEqual(cdp.diff_tensor.type, 'spheroid') 
1000          self.assertAlmostEqual(cdp.diff_tensor.tm * 1e9, 1.0/(6.0*7e7/3.0) * 1e9) 
1001          self.assertAlmostEqual(cdp.diff_tensor.Da * 1e-7, 1.0) 
1002          self.assertAlmostEqual(cdp.diff_tensor.theta, 2.0) 
1003          self.assertAlmostEqual(cdp.diff_tensor.phi, pi-0.5) 
  1004