Package lib :: Package dispersion :: Module m61
[hide private]
[frames] | no frames]

Source Code for Module lib.dispersion.m61

  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