| Trees | Indices | Help |
|
|---|
|
|
1 ###############################################################################
2 # #
3 # Copyright (C) 2009 Sebastien Morin #
4 # Copyright (C) 2013-2014 Edward d'Auvergne #
5 # #
6 # This file is part of the program relax (http://www.nmr-relax.com). #
7 # #
8 # This program is free software: you can redistribute it and/or modify #
9 # it under the terms of the GNU General Public License as published by #
10 # the Free Software Foundation, either version 3 of the License, or #
11 # (at your option) any later version. #
12 # #
13 # This program is distributed in the hope that it will be useful, #
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
16 # GNU General Public License for more details. #
17 # #
18 # You should have received a copy of the GNU General Public License #
19 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 # #
21 ###############################################################################
22
23 # Module docstring.
24 """The Meiboom (1961) 2-site fast exchange R1rho U{M61<http://wiki.nmr-relax.com/M61>} model.
25
26 Description
27 ===========
28
29 This module is for the function, gradient and Hessian of the U{M61<http://wiki.nmr-relax.com/M61>} model.
30
31
32 References
33 ==========
34
35 The model is named after the reference:
36
37 - Meiboom S. (1961). Nuclear magnetic resonance study of the proton transfer in water. I{J. Chem. Phys.}, B{34}, 375-388. (U{DOI: 10.1063/1.1700960<http://dx.doi.org/10.1063/1.1700960>}).
38
39
40 Equations
41 =========
42
43 The equation used is::
44
45 phi_ex * kex
46 R1rho = R1rho' + ----------------- ,
47 kex^2 + omega_1^2
48
49 where::
50
51 phi_ex = pA * pB * delta_omega^2 ,
52
53 R1rho' is the R1rho value in the absence of exchange, kex is the chemical exchange rate constant, pA and pB are the populations of states A and B, delta_omega is the chemical shift difference between the two states, and omega_1 is the spin-lock field strength.
54
55
56 Links
57 =====
58
59 More information on the M61 model can be found in the:
60
61 - U{relax wiki<http://wiki.nmr-relax.com/M61>},
62 - U{relax manual<http://www.nmr-relax.com/manual/M61_2_site_fast_exchange_R1_model.html>},
63 - U{relaxation dispersion page of the relax website<http://www.nmr-relax.com/analyses/relaxation_dispersion.html#M61>}.
64 """
65
66 # Python module imports.
67 from numpy import abs, array, isfinite, min, sum
68
69
70 -def r1rho_M61(r1rho_prime=None, phi_ex=None, kex=None, spin_lock_fields2=None, back_calc=None, num_points=None):
71 """Calculate the R2eff values for the M61 model.
72
73 See the module docstring for details.
74
75
76 @keyword r1rho_prime: The R1rho_prime parameter value (R1rho with no exchange).
77 @type r1rho_prime: float
78 @keyword phi_ex: The phi_ex parameter value (pA * pB * delta_omega^2).
79 @type phi_ex: float
80 @keyword kex: The kex parameter value (the exchange rate in rad/s).
81 @type kex: float
82 @keyword spin_lock_fields2: The R1rho spin-lock field strengths squared (in rad^2.s^-2).
83 @type spin_lock_fields2: numpy rank-1 float array
84 @keyword back_calc: The array for holding the back calculated R1rho values. Each element corresponds to the combination of spin lock field.
85 @type back_calc: numpy rank-1 float array
86 @keyword num_points: The number of points on the dispersion curve, equal to the length of the spin_lock_fields and back_calc arguments.
87 @type num_points: int
88 """
89
90 # Repetitive calculations (to speed up calculations).
91 kex2 = kex**2
92
93 # The numerator.
94 numer = phi_ex * kex
95
96 # Catch zeros (to avoid pointless mathematical operations).
97 # This will result in no exchange, returning flat lines.
98 if numer == 0.0:
99 back_calc[:] = array([r1rho_prime]*num_points)
100 return
101
102 # Denominator.
103 denom = kex2 + spin_lock_fields2
104
105 # Catch math domain error of dividing with 0.
106 # This is when denom=0.
107 if min(abs(denom)) == 0:
108 back_calc[:] = array([1e100]*num_points)
109 return
110
111 # R1rho calculation.
112 R1rho = r1rho_prime + numer / denom
113
114 # Catch errors, taking a sum over array is the fastest way to check for
115 # +/- inf (infinity) and nan (not a number).
116 if not isfinite(sum(R1rho)):
117 R1rho = array([1e100]*num_points)
118
119 back_calc[:] = R1rho
120
| Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Thu Jul 3 13:39:02 2014 | http://epydoc.sourceforge.net |