1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from copy import deepcopy
24 from math import cos, pi, sin
25 from Numeric import Float64, array
26
27
30 """Class containing the function for setting up the diffusion tensor."""
31
32 self.relax = relax
33
34
36 """Function for setting up fully anisotropic diffusion."""
37
38
39 self.relax.data.diff[self.run].type = 'aniso'
40
41
42 if self.param_types == 0:
43
44 tm, Da, Dr, alpha, beta, gamma = self.params
45
46
47 tm = tm * self.time_scale
48 Da = Da * self.d_scale
49 Dr = Dr * self.d_scale
50
51
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
60 self.relax.data.diff[self.run].tm = tm
61
62
63 elif self.param_types == 1:
64
65 Diso, Da, Dr, alpha, beta, gamma = self.params
66
67
68 Diso = Diso * self.d_scale
69 Da = Da * self.d_scale
70 Dr = Dr * self.d_scale
71
72
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
81 self.relax.data.diff[self.run].tm = 1.0 / (6.0*Diso)
82
83
84 elif self.param_types == 2:
85
86 Dx, Dy, Dz, alpha, beta, gamma = self.params
87
88
89 Dx = Dx * self.d_scale
90 Dy = Dy * self.d_scale
91 Dz = Dz * self.d_scale
92
93
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
102 self.relax.data.diff[self.run].tm = 1.0 / (6.0*self.relax.data.diff[self.run].Diso)
103
104
105 else:
106 raise RelaxUnknownParamCombError, ('param_types', self.param_types)
107
108
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
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
121 """Function for setting up axially symmetric diffusion."""
122
123
124 self.relax.data.diff[self.run].type = 'axial'
125
126
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
133 if self.param_types == 0:
134
135 tm, Da, theta, phi = self.params
136
137
138 tm = tm * self.time_scale
139 Da = Da * self.d_scale
140
141
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
149 self.relax.data.diff[self.run].tm = tm
150
151
152 elif self.param_types == 1:
153
154 tm, Dratio, theta, phi = self.params
155
156
157 tm = tm * self.time_scale
158
159
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
167 self.relax.data.diff[self.run].tm = tm
168
169
170 elif self.param_types == 2:
171
172 Dpar, Dper, theta, phi = self.params
173
174
175 Dpar = Dpar * self.d_scale
176 Dper = Dper * self.d_scale
177
178
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
186 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * self.relax.data.diff[self.run].Diso)
187
188
189 elif self.param_types == 3:
190
191 Diso, Da, theta, phi = self.params
192
193
194 Diso = Diso * self.d_scale
195 Da = Da * self.d_scale
196
197
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
205 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * self.relax.data.diff[self.run].Diso)
206
207
208 elif self.param_types == 4:
209
210 Diso, Dratio, theta, phi = self.params
211
212
213 Diso = Diso * self.d_scale
214
215
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
223 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * Diso)
224
225
226 else:
227 raise RelaxUnknownParamCombError, ('param_types', self.param_types)
228
229
230 if self.angle_units == 'deg':
231 theta = (theta / 360.0) * 2.0 * pi
232 phi = (phi / 360.0) * 2.0 * pi
233
234
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
239
240
241
242
243
244
245
246
247
248 - def copy(self, run1=None, run2=None):
249 """Function for copying diffusion tensor data from run1 to run2."""
250
251
252 if not run1 in self.relax.data.run_names:
253 raise RelaxNoRunError, run1
254
255
256 if not run2 in self.relax.data.run_names:
257 raise RelaxNoRunError, run2
258
259
260 if not self.relax.data.diff.has_key(run1):
261 raise RelaxNoTensorError, run1
262
263
264 if self.relax.data.diff.has_key(run2):
265 raise RelaxTensorError, run2
266
267
268 self.relax.data.diff[run2] = deepcopy(self.relax.data.diff[run1])
269
270
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
296
297
299 """Function for displaying the diffusion tensor."""
300
301
302 if not run in self.relax.data.run_names:
303 raise RelaxNoRunError, run
304
305
306 if not self.relax.data.diff.has_key(run):
307 raise RelaxNoTensorError, run
308
309
310 if self.relax.data.diff[run].type == 'iso':
311
312 print "Type: Isotropic diffusion"
313
314
315 print "\nParameters {tm}."
316 print "tm (s): " + `self.relax.data.diff[run].tm`
317
318
319 print "\nAlternate parameters {Diso}."
320 print "Diso (1/s): " + `self.relax.data.diff[run].Diso`
321
322
323 print "\nFixed: " + `self.relax.data.diff[run].fixed`
324
325
326 elif self.relax.data.diff[run].type == 'axial':
327
328 print "Type: Axially symmetric anisotropic diffusion"
329
330
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
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
345 print "\nFixed: " + `self.relax.data.diff[run].fixed`
346
347
348 elif self.relax.data.diff[run].type == 'aniso':
349
350 print "Type: Anisotropic diffusion"
351
352
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
362 print "\nFixed: " + `self.relax.data.diff[run].fixed`
363
364
366 """Function for setting up isotropic diffusion."""
367
368
369 self.relax.data.diff[self.run].type = 'iso'
370
371
372 if self.param_types == 0:
373
374 self.relax.data.diff[self.run].tm = self.params * self.time_scale
375
376
377 self.relax.data.diff[self.run].Diso = 6.0 / self.relax.data.diff[self.run].tm
378
379
380 elif self.param_types == 1:
381
382 self.relax.data.diff[self.run].Diso = self.params * self.d_scale
383
384
385 self.relax.data.diff[self.run].tm = 1.0 / (6.0 * self.relax.data.diff[self.run].Diso)
386
387
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
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
405 if not self.run in self.relax.data.run_names:
406 raise RelaxNoRunError, self.run
407
408
409 if self.relax.data.diff.has_key(self.run):
410 raise RelaxTensorError, self.run
411
412
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
418 self.relax.data.diff.add_item(self.run)
419
420
421 self.relax.data.diff[self.run].fixed = fixed
422
423
424 if type(params) == float:
425 num_params = 1
426 self.isotropic()
427
428
429 elif (type(params) == tuple or type(params) == list) and len(params) == 4:
430 num_params = 4
431 self.axial()
432
433
434 elif (type(params) == tuple or type(params) == list) and len(params) == 6:
435 num_params = 6
436 self.anisotropic()
437
438
439 else:
440 raise RelaxError, "The diffusion tensor parameters " + `params` + " are of an unknown type."
441
442
443 self.test_params(num_params)
444
445
447 """Function for testing the validity of the input parameters."""
448
449
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
454
455
456