| 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 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 # Python module imports.
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 # Catch divide with zeros (to avoid pointless mathematical operations).
91 if kex == 0.0:
92 back_calc[:] = array([r20]*num_points)
93 return
94
95 # Catch zeros (to avoid pointless mathematical operations).
96 # This will result in no exchange, returning flat lines.
97 if phi_ex == 0.0:
98 back_calc[:] = array([r20]*num_points)
99 return
100
101 # Repetitive calculations (to speed up calculations).
102 rex = phi_ex / kex
103 kex_4 = 4.0 / kex
104
105 # Calculate R2eff.
106 R2eff = r20 + rex * (1.0 - kex_4 * cpmg_frqs * tanh(kex / (4.0 * cpmg_frqs)))
107
108 # Catch errors, taking a sum over array is the fastest way to check for
109 # +/- inf (infinity) and nan (not a number).
110 if not isfinite(sum(R2eff)):
111 R2eff = array([1e100]*num_points)
112
113 back_calc[:] = R2eff
114
| Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Thu Jul 3 13:39:03 2014 | http://epydoc.sourceforge.net |