Package generic_fns :: Module diffusion_tensor
[hide private]
[frames] | no frames]

Source Code for Module generic_fns.diffusion_tensor

  1  ############################################################################### 
  2  #                                                                             # 
  3  # Copyright (C) 2003, 2004 Edward d'Auvergne                                  # 
  4  #                                                                             # 
  5  # This file is part of the program relax.                                     # 
  6  #                                                                             # 
  7  # relax 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 2 of the License, or           # 
 10  # (at your option) any later version.                                         # 
 11  #                                                                             # 
 12  # relax 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 relax; if not, write to the Free Software                        # 
 19  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # 
 20  #                                                                             # 
 21  ############################################################################### 
 22   
 23  from copy import deepcopy 
 24  from math import cos, pi, sin 
 25  from Numeric import Float64, array 
 26   
 27   
28 -class Diffusion_tensor:
29 - def __init__(self, relax):
30 """Class containing the function for setting up the diffusion tensor.""" 31 32 self.relax = relax
33 34
35 - def anisotropic(self):
36 """Function for setting up fully anisotropic diffusion.""" 37 38 # The diffusion type. 39 self.relax.data.diff[self.run].type = 'aniso' 40 41 # (tm, Da, Dr, alpha, beta, gamma). 42 if self.param_types == 0: 43 # Unpack the tuple. 44 tm, Da, Dr, alpha, beta, gamma = self.params 45 46 # Scaling. 47 tm = tm * self.time_scale 48 Da = Da * self.d_scale 49 Dr = Dr * self.d_scale 50 51 # Diffusion tensor eigenvalues: Diso, Da, Dr, Dx, Dy, Dz. 52 self.relax.data.diff[self.run].Diso = 1.0 / (6.0*tm) 53 self.relax.data.diff[self.run].Da = Da 54 self.relax.data.diff[self.run].Dr = Dr 55 self.relax.data.diff[self.run].Dx = self.relax.data.diff[self.run].Diso - Da + Dr 56 self.relax.data.diff[self.run].Dy = self.relax.data.diff[self.run].Diso - Da - Dr 57 self.relax.data.diff[self.run].Dz = self.relax.data.diff[self.run].Diso + 2.0*Da 58 59 # Global correlation time: tm. 60 self.relax.data.diff[self.run].tm = tm 61 62 # (Diso, Da, Dr, alpha, beta, gamma). 63 elif self.param_types == 1: 64 # Unpack the tuple. 65 Diso, Da, Dr, alpha, beta, gamma = self.params 66 67 # Scaling. 68 Diso = Diso * self.d_scale 69 Da = Da * self.d_scale 70 Dr = Dr * self.d_scale 71 72 # Diffusion tensor eigenvalues: Diso, Da, Dr, Dx, Dy, Dz. 73 self.relax.data.diff[self.run].Diso = Diso 74 self.relax.data.diff[self.run].Da = Da 75 self.relax.data.diff[self.run].Dr = Dr 76 self.relax.data.diff[self.run].Dx = Diso - Da + Dr 77 self.relax.data.diff[self.run].Dy = Diso - Da - Dr 78 self.relax.data.diff[self.run].Dz = Diso + 2.0*Da 79 80 # Global correlation time: tm. 81 self.relax.data.diff[self.run].tm = 1.0 / (6.0*Diso) 82 83 # (Dx, Dy, Dz, alpha, beta, gamma). 84 elif self.param_types == 2: 85 # Unpack the tuple. 86 Dx, Dy, Dz, alpha, beta, gamma = self.params 87 88 # Scaling. 89 Dx = Dx * self.d_scale 90 Dy = Dy * self.d_scale 91 Dz = Dz * self.d_scale 92 93 # Diffusion tensor eigenvalues: Dx, Dy, Dz. 94 self.relax.data.diff[self.run].Dx = Dx 95 self.relax.data.diff[self.run].Dy = Dy 96 self.relax.data.diff[self.run].Dz = Dz 97 self.relax.data.diff[self.run].Diso = (Dx + Dy + Dz) / 3.0 98 self.relax.data.diff[self.run].Da = (Dz - (Dx + Dy)/2.0) / 3.0 99 self.relax.data.diff[self.run].Dr = (Dx - Dy) / 2.0 100 101 # Global correlation time: tm. 102 self.relax.data.diff[self.run].tm = 1.0 / (6.0*self.relax.data.diff[self.run].Diso) 103 104 # Unknown parameter combination. 105 else: 106 raise RelaxUnknownParamCombError, ('param_types', self.param_types) 107 108 # Convert the angles to radians. 109 if self.angle_units == 'deg': 110 alpha = (alpha / 360.0) * 2.0 * pi 111 beta = (beta / 360.0) * 2.0 * pi 112 gamma = (gamma / 360.0) * 2.0 * pi 113 114 # Make sure the angles are within their defined ranges. 115 self.relax.data.diff[self.run].alpha = self.relax.generic.angles.wrap_angles(alpha, 0.0, 2.0*pi) 116 self.relax.data.diff[self.run].beta = self.relax.generic.angles.wrap_angles(beta, 0.0, pi) 117 self.relax.data.diff[self.run].gamma = self.relax.generic.angles.wrap_angles(gamma, 0.0, 2.0*pi)
118 119
120 - def axial(self):
121 """Function for setting up axially symmetric diffusion.""" 122 123 # The diffusion type. 124 self.relax.data.diff[self.run].type = 'axial' 125 126 # Axial diffusion type. 127 allowed_types = [None, 'oblate', 'prolate'] 128 if self.axial_type not in allowed_types: 129 raise RelaxError, "The 'axial_type' argument " + `self.axial_type` + " should be 'oblate', 'prolate', or None." 130 self.relax.data.diff[self.run].axial_type = self.axial_type 131 132 # (tm, Da, theta, phi). 133 if self.param_types == 0: 134 # Unpack the tuple. 135 tm, Da, theta, phi = self.params 136 137 # Scaling. 138 tm = tm * self.time_scale 139 Da = Da * self.d_scale 140 141 # Diffusion tensor eigenvalues: Dpar, Dper, Diso, Dratio. 142 self.relax.data.diff[self.run].Diso = 1.0 / (6.0*tm) 143 self.relax.data.diff[self.run].Da = Da 144 self.relax.data.diff[self.run].Dpar = self.relax.data.diff[self.run].Diso + 2.0*Da 145 self.relax.data.diff[self.run].Dper = self.relax.data.diff[self.run].Diso - Da 146 self.relax.data.diff[self.run].Dratio = self.relax.data.diff[self.run].Dpar / self.relax.data.diff[self.run].Dper 147 148 # Global correlation time: tm. 149 self.relax.data.diff[self.run].tm = tm 150 151 # (tm, Dratio, theta, phi). 152 elif self.param_types == 1: 153 # Unpack the tuple. 154 tm, Dratio, theta, phi = self.params 155 156 # Scaling. 157 tm = tm * self.time_scale 158 159 # Diffusion tensor eigenvalues: Dpar, Dper, Diso, Dratio. 160 self.relax.data.diff[self.run].Diso = 1.0 / (6.0 * tm) 161 self.relax.data.diff[self.run].Dratio = Dratio 162 self.relax.data.diff[self.run].Da = self.relax.data.diff[self.run].Diso * (Dratio - 1.0) / (Dratio + 2.0) 163 self.relax.data.diff[self.run].Dpar = 3.0 * self.relax.data.diff[self.run].Diso * Dratio / (Dratio + 2.0) 164 self.relax.data.diff[self.run].Dper = 3.0 * self.relax.data.diff[self.run].Diso / (Dratio + 2.0) 165 166 # Global correlation time: tm. 167 self.relax.data.diff[self.run].tm = tm 168 169 # (Dpar, Dper, theta, phi). 170 elif self.param_types == 2: 171 # Unpack the tuple. 172 Dpar, Dper, theta, phi = self.params 173 174 # Scaling. 175 Dpar = Dpar * self.d_scale 176 Dper = Dper * self.d_scale 177 178 # Diffusion tensor eigenvalues: Dpar, Dper, Diso, Dratio. 179 self.relax.data.diff[self.run].Dpar = Dpar 180 self.relax.data.diff[self.run].Dper = Dper 181 self.relax.data.diff[self.run].Diso = (Dpar + 2.0*Dper) / 3.0 182 self.relax.data.diff[self.run].Da = (Dpar - Dper) / 3.0 183 self.relax.data.diff[self.run].Dratio = Dpar / Dper 184 185 # Global correlation time: tm. 186 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * self.relax.data.diff[self.run].Diso) 187 188 # (Diso, Da, theta, phi). 189 elif self.param_types == 3: 190 # Unpack the tuple. 191 Diso, Da, theta, phi = self.params 192 193 # Scaling. 194 Diso = Diso * self.d_scale 195 Da = Da * self.d_scale 196 197 # Diffusion tensor eigenvalues: Dpar, Dper, Diso, Dratio. 198 self.relax.data.diff[self.run].Diso = Diso 199 self.relax.data.diff[self.run].Da = Da 200 self.relax.data.diff[self.run].Dpar = Diso + 2.0*Da 201 self.relax.data.diff[self.run].Dper = Diso - Da 202 self.relax.data.diff[self.run].Dratio = self.relax.data.diff[self.run].Dpar / self.relax.data.diff[self.run].Dper 203 204 # Global correlation time: tm. 205 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * self.relax.data.diff[self.run].Diso) 206 207 # (Diso, Dratio, theta, phi). 208 elif self.param_types == 4: 209 # Unpack the tuple. 210 Diso, Dratio, theta, phi = self.params 211 212 # Scaling. 213 Diso = Diso * self.d_scale 214 215 # Diffusion tensor eigenvalues: Dpar, Dper, Diso, Dratio. 216 self.relax.data.diff[self.run].Diso = Diso 217 self.relax.data.diff[self.run].Dratio = Dratio 218 self.relax.data.diff[self.run].Da = Diso * (Dratio - 1.0) / (Dratio + 2.0) 219 self.relax.data.diff[self.run].Dpar = 3.0 * Diso * Dratio / (Dratio + 2.0) 220 self.relax.data.diff[self.run].Dper = 3.0 * Diso / (Dratio + 2.0) 221 222 # Global correlation time: tm. 223 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * Diso) 224 225 # Unknown parameter combination. 226 else: 227 raise RelaxUnknownParamCombError, ('param_types', self.param_types) 228 229 # Convert the angles to radians. 230 if self.angle_units == 'deg': 231 theta = (theta / 360.0) * 2.0 * pi 232 phi = (phi / 360.0) * 2.0 * pi 233 234 # Make sure the angles are within their defined ranges. 235 self.relax.data.diff[self.run].theta = self.relax.generic.angles.wrap_angles(theta, 0.0, pi) 236 self.relax.data.diff[self.run].phi = self.relax.generic.angles.wrap_angles(phi, 0.0, 2.0*pi)
237 238 # Unit symmetry axis vector. 239 #x = cos(self.relax.data.diff[self.run].theta) * sin(self.relax.data.diff[self.run].phi) 240 #y = sin(self.relax.data.diff[self.run].theta) * sin(self.relax.data.diff[self.run].phi) 241 #z = cos(self.relax.data.diff[self.run].phi) 242 #self.relax.data.diff[self.run].axis_unit = array([x, y, z], Float64) 243 244 # Full symmetry axis vector. 245 #self.relax.data.diff[self.run].axis_vect = self.relax.data.diff[self.run].Dpar * self.relax.data.diff[self.run].axis_unit 246 247
248 - def copy(self, run1=None, run2=None):
249 """Function for copying diffusion tensor data from run1 to run2.""" 250 251 # Test if run1 exists. 252 if not run1 in self.relax.data.run_names: 253 raise RelaxNoRunError, run1 254 255 # Test if run2 exists. 256 if not run2 in self.relax.data.run_names: 257 raise RelaxNoRunError, run2 258 259 # Test if run1 contains diffusion tensor data. 260 if not self.relax.data.diff.has_key(run1): 261 raise RelaxNoTensorError, run1 262 263 # Test if run2 contains diffusion tensor data. 264 if self.relax.data.diff.has_key(run2): 265 raise RelaxTensorError, run2 266 267 # Copy the data. 268 self.relax.data.diff[run2] = deepcopy(self.relax.data.diff[run1])
269 270
271 - def data_names(self):
272 """Function for returning a list of names of data structures associated with the sequence.""" 273 274 names = [ 'diff_type', 275 'diff_params' ] 276 277 return names
278 279
280 - def delete(self, run=None):
281 """Function for deleting diffusion tensor data.""" 282 283 # Test if the run exists. 284 if not run in self.relax.data.run_names: 285 raise RelaxNoRunError, run 286 287 # Test if diffusion tensor data for the run exists. 288 if not self.relax.data.diff.has_key(run): 289 raise RelaxNoTensorError, run 290 291 # Delete the diffusion data. 292 del(self.relax.data.diff[run]) 293 294 # Clean up the runs. 295 self.relax.generic.runs.eliminate_unused_runs()
296 297
298 - def display(self, run=None):
299 """Function for displaying the diffusion tensor.""" 300 301 # Test if the run exists. 302 if not run in self.relax.data.run_names: 303 raise RelaxNoRunError, run 304 305 # Test if diffusion tensor data for the run exists. 306 if not self.relax.data.diff.has_key(run): 307 raise RelaxNoTensorError, run 308 309 # Isotropic diffusion. 310 if self.relax.data.diff[run].type == 'iso': 311 # Tensor type. 312 print "Type: Isotropic diffusion" 313 314 # Parameters. 315 print "\nParameters {tm}." 316 print "tm (s): " + `self.relax.data.diff[run].tm` 317 318 # Alternate parameters. 319 print "\nAlternate parameters {Diso}." 320 print "Diso (1/s): " + `self.relax.data.diff[run].Diso` 321 322 # Fixed flag. 323 print "\nFixed: " + `self.relax.data.diff[run].fixed` 324 325 # Anisotropic diffusion. 326 elif self.relax.data.diff[run].type == 'axial': 327 # Tensor type. 328 print "Type: Axially symmetric anisotropic diffusion" 329 330 # Parameters. 331 print "\nParameters {Dpar, Dper, theta, phi}." 332 print "Dpar (1/s): " + `self.relax.data.diff[run].Dpar` 333 print "Dper (1/s): " + `self.relax.data.diff[run].Dper` 334 print "theta (rad): " + `self.relax.data.diff[run].theta` 335 print "phi (rad): " + `self.relax.data.diff[run].phi` 336 337 # Alternate parameters. 338 print "\nAlternate parameters {tm, Dratio, theta, phi}." 339 print "tm (s): " + `self.relax.data.diff[run].tm` 340 print "Dratio: " + `self.relax.data.diff[run].Dratio` 341 print "theta (rad): " + `self.relax.data.diff[run].theta` 342 print "phi (rad): " + `self.relax.data.diff[run].phi` 343 344 # Fixed flag. 345 print "\nFixed: " + `self.relax.data.diff[run].fixed` 346 347 # Anisotropic diffusion. 348 elif self.relax.data.diff[run].type == 'aniso': 349 # Tensor type. 350 print "Type: Anisotropic diffusion" 351 352 # Parameters. 353 print "\nParameters {Dx, Dy, Dz, alpha, beta, gamma}." 354 print "Dx (1/s): " + `self.relax.data.diff[run].Dx` 355 print "Dy (1/s): " + `self.relax.data.diff[run].Dy` 356 print "Dz (1/s): " + `self.relax.data.diff[run].Dz` 357 print "alpha (rad): " + `self.relax.data.diff[run].alpha` 358 print "beta (rad): " + `self.relax.data.diff[run].beta` 359 print "gamma (rad): " + `self.relax.data.diff[run].gamma` 360 361 # Fixed flag. 362 print "\nFixed: " + `self.relax.data.diff[run].fixed`
363 364
365 - def isotropic(self):
366 """Function for setting up isotropic diffusion.""" 367 368 # The diffusion type. 369 self.relax.data.diff[self.run].type = 'iso' 370 371 # tm. 372 if self.param_types == 0: 373 # Correlation times. 374 self.relax.data.diff[self.run].tm = self.params * self.time_scale 375 376 # Diffusion tensor eigenvalues. 377 self.relax.data.diff[self.run].Diso = 6.0 / self.relax.data.diff[self.run].tm 378 379 # Diso 380 elif self.param_types == 1: 381 # Diffusion tensor eigenvalues. 382 self.relax.data.diff[self.run].Diso = self.params * self.d_scale 383 384 # Correlation times. 385 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * self.relax.data.diff[self.run].Diso) 386 387 # Unknown parameter combination. 388 else: 389 raise RelaxUnknownParamCombError, ('param_types', self.param_types)
390 391
392 - def set(self, run=None, params=None, time_scale=1.0, d_scale=1.0, angle_units='deg', param_types=0, axial_type=None, fixed=1):
393 """Function for setting up the diffusion tensor.""" 394 395 # Arguments. 396 self.run = run 397 self.params = params 398 self.time_scale = time_scale 399 self.d_scale = d_scale 400 self.angle_units = angle_units 401 self.param_types = param_types 402 self.axial_type = axial_type 403 404 # Test if the run exists. 405 if not self.run in self.relax.data.run_names: 406 raise RelaxNoRunError, self.run 407 408 # Test if diffusion tensor data corresponding to the run already exists. 409 if self.relax.data.diff.has_key(self.run): 410 raise RelaxTensorError, self.run 411 412 # Check the validity of the angle_units argument. 413 valid_types = ['deg', 'rad'] 414 if not angle_units in valid_types: 415 raise RelaxError, "The diffusion tensor 'angle_units' argument " + `angle_units` + " should be either 'deg' or 'rad'." 416 417 # Add the run to the diffusion tensor data structure. 418 self.relax.data.diff.add_item(self.run) 419 420 # Set the fixed flag. 421 self.relax.data.diff[self.run].fixed = fixed 422 423 # Isotropic diffusion. 424 if type(params) == float: 425 num_params = 1 426 self.isotropic() 427 428 # Axially symmetric anisotropic diffusion. 429 elif (type(params) == tuple or type(params) == list) and len(params) == 4: 430 num_params = 4 431 self.axial() 432 433 # Fully anisotropic diffusion. 434 elif (type(params) == tuple or type(params) == list) and len(params) == 6: 435 num_params = 6 436 self.anisotropic() 437 438 # Unknown. 439 else: 440 raise RelaxError, "The diffusion tensor parameters " + `params` + " are of an unknown type." 441 442 # Test the validity of the parameters. 443 self.test_params(num_params)
444 445
446 - def test_params(self, num_params):
447 """Function for testing the validity of the input parameters.""" 448 449 # tm. 450 if self.relax.data.diff[self.run].tm <= 0.0 or self.relax.data.diff[self.run].tm > 1e-6: 451 raise RelaxError, "The tm value of " + `self.relax.data.diff[self.run].tm` + " should be between zero and 1 microsecond."
452 453 # Da. 454 # if num_params > 1: 455 # if self.relax.data.diff[self.run].Da <= 0.0 or self.relax.data.diff[self.run].tm > 1e-6: 456