1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 """The Meiboom (1961) 2-site fast exchange R1rho U{M61<http://wiki.nmr-relax.com/M61>} model.
26
27 Description
28 ===========
29
30 This module is for the function, gradient and Hessian of the U{M61<http://wiki.nmr-relax.com/M61>} model.
31
32
33 References
34 ==========
35
36 The model is named after the reference:
37
38 - 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>}).
39
40
41 Equations
42 =========
43
44 The equation used is::
45
46 phi_ex * kex
47 R1rho = R1rho' + ----------------- ,
48 kex^2 + omega_1^2
49
50 where::
51
52 phi_ex = pA * pB * delta_omega^2 ,
53
54 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.
55
56
57 Links
58 =====
59
60 More information on the M61 model can be found in the:
61
62 - U{relax wiki<http://wiki.nmr-relax.com/M61>},
63 - U{relax manual<http://www.nmr-relax.com/manual/The_M61_2_site_fast_exchange_R1_rho_model.html>},
64 - U{relaxation dispersion page of the relax website<http://www.nmr-relax.com/analyses/relaxation_dispersion.html#M61>}.
65 """
66
67
68 from numpy import any, isfinite, min, sum
69 from numpy.ma import fix_invalid, masked_where
70
71
72 -def r1rho_M61(r1rho_prime=None, phi_ex=None, kex=None, spin_lock_fields2=None, back_calc=None):
73 """Calculate the R2eff values for the M61 model.
74
75 See the module docstring for details.
76
77
78 @keyword r1rho_prime: The R1rho_prime parameter value (R1rho with no exchange).
79 @type r1rho_prime: numpy float array of rank [NE][NS][NM][NO][ND]
80 @keyword phi_ex: The phi_ex parameter value (pA * pB * delta_omega^2).
81 @type phi_ex: numpy float array of rank [NE][NS][NM][NO][ND]
82 @keyword kex: The kex parameter value (the exchange rate in rad/s).
83 @type kex: float
84 @keyword spin_lock_fields2: The R1rho spin-lock field strengths squared (in rad^2.s^-2).
85 @type spin_lock_fields2: numpy float array of rank [NE][NS][NM][NO][ND]
86 @keyword back_calc: The array for holding the back calculated R1rho values. Each element corresponds to the combination of spin lock field.
87 @type back_calc: numpy float array of rank [NE][NS][NM][NO][ND]
88 """
89
90
91 t_numer_zero = False
92 t_denom_zero = False
93
94
95 kex2 = kex**2
96
97
98 numer = phi_ex * kex
99
100
101
102 if min(numer) == 0.0:
103 t_numer_zero = True
104 mask_numer_zero = masked_where(numer == 0.0, numer)
105
106
107 denom = kex2 + spin_lock_fields2
108
109
110
111 mask_denom_zero = denom == 0.0
112 if any(mask_denom_zero):
113 t_denom_zero = True
114 denom[mask_denom_zero] = 1.0
115
116
117 back_calc[:] = r1rho_prime + numer / denom
118
119
120
121 if t_numer_zero:
122 back_calc[mask_numer_zero.mask] = r1rho_prime[mask_numer_zero.mask]
123
124
125 if t_denom_zero:
126 back_calc[mask_denom_zero] = 1e100
127
128
129
130 if not isfinite(sum(back_calc)):
131
132 fix_invalid(back_calc, copy=False, fill_value=1e100)
133