1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 """The Luz and Meiboom (1963) 2-site fast exchange U{LM63<http://wiki.nmr-relax.com/LM63>} model.
25
26 Description
27 ===========
28
29 This module is for the function, gradient and Hessian of the U{LM63<http://wiki.nmr-relax.com/LM63>} model.
30
31
32 References
33 ==========
34
35 The model is named after the reference:
36
37 - Luz, S. and Meiboom S., (1963) Nuclear Magnetic Resonance study of protolysis of trimethylammonium ion in aqueous solution - order of reaction with respect to solvent, I{J. Chem. Phys.}, B{39}, 366-370 (U{DOI: 10.1063/1.1734254<http://dx.doi.org/10.1063/1.1734254>}).
38
39
40 Equations
41 =========
42
43 The equation used is::
44
45 phi_ex / 4 * nu_cpmg / kex \ \
46 R2eff = R20 + ------ * | 1 - ----------- * tanh | ----------- | | ,
47 kex \ kex \ 4 * nu_cpmg / /
48
49 where::
50
51 phi_ex = pA * pB * delta_omega^2 ,
52
53 kex is the chemical exchange rate constant, pA and pB are the populations of states A and B, and delta_omega is the chemical shift difference between the two states.
54
55
56 Links
57 =====
58
59 More information on the LM63 model can be found in the:
60
61 - U{relax wiki<http://wiki.nmr-relax.com/LM63>},
62 - U{relax manual<http://www.nmr-relax.com/manual/LM63_2_site_fast_exchange_CPMG_model.html>},
63 - U{relaxation dispersion page of the relax website<http://www.nmr-relax.com/analyses/relaxation_dispersion.html#LM63>}.
64 """
65
66
67 from numpy import array, isfinite, sum, tanh
68
69
70 -def r2eff_LM63(r20=None, phi_ex=None, kex=None, cpmg_frqs=None, back_calc=None, num_points=None):
71 """Calculate the R2eff values for the LM63 model.
72
73 See the module docstring for details.
74
75
76 @keyword r20: The R20 parameter value (R2 with no exchange).
77 @type r20: 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 cpmg_frqs: The CPMG nu1 frequencies.
83 @type cpmg_frqs: numpy rank-1 float array
84 @keyword back_calc: The array for holding the back calculated R2eff values. Each element corresponds to one of the CPMG nu1 frequencies.
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 cpmg_frqs and back_calc arguments.
87 @type num_points: int
88 """
89
90
91 if kex == 0.0:
92 back_calc[:] = array([r20]*num_points)
93 return
94
95
96
97 if phi_ex == 0.0:
98 back_calc[:] = array([r20]*num_points)
99 return
100
101
102 rex = phi_ex / kex
103 kex_4 = 4.0 / kex
104
105
106 R2eff = r20 + rex * (1.0 - kex_4 * cpmg_frqs * tanh(kex / (4.0 * cpmg_frqs)))
107
108
109
110 if not isfinite(sum(R2eff)):
111 R2eff = array([1e100]*num_points)
112
113 back_calc[:] = R2eff
114