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 Meiboom (1961) 2-site on-resonance skewed population R1rho U{M61 skew<http://wiki.nmr-relax.com/M61_skew>} model. 
 25   
 26  Description 
 27  =========== 
 28   
 29  This module is for the function, gradient and Hessian of the U{M61 skew<http://wiki.nmr-relax.com/M61_skew>} 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                             pA^2.pB.delta_omega^2.kex 
 46      R1rho = R1rho' + -------------------------------------- , 
 47                       kex^2 + pA^2.delta_omega^2 + omega_1^2 
 48   
 49  where 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 = omega_e is the effective field in the rotating frame. 
 50   
 51   
 52  Links 
 53  ===== 
 54   
 55  More information on the M61 skew model can be found in the: 
 56   
 57      - U{relax wiki<http://wiki.nmr-relax.com/M61_skew>}, 
 58      - U{relax manual<http://www.nmr-relax.com/manual/M61_skew_2_site_fast_exchange_R1_model.html>}, 
 59      - U{relaxation dispersion page of the relax website<http://www.nmr-relax.com/analyses/relaxation_dispersion.html#M61_skew>}. 
 60  """ 
 61   
 62   
 63  from numpy import abs, array, isfinite, min, sum 
 64   
 65 -def r1rho_M61b(r1rho_prime=None, pA=None, dw=None, kex=None, spin_lock_fields2=None, back_calc=None, num_points=None): 
  66      """Calculate the R1rho values for the M61 skew model. 
 67   
 68      See the module docstring for details. 
 69   
 70   
 71      @keyword r1rho_prime:       The R1rho_prime parameter value (R1rho with no exchange). 
 72      @type r1rho_prime:          float 
 73      @keyword pA:                The population of state A. 
 74      @type pA:                   float 
 75      @keyword dw:                The chemical exchange difference between states A and B in rad/s. 
 76      @type dw:                   float 
 77      @keyword kex:               The kex parameter value (the exchange rate in rad/s). 
 78      @type kex:                  float 
 79      @keyword spin_lock_fields2: The R1rho spin-lock field strengths squared (in rad^2.s^-2). 
 80      @type spin_lock_fields2:    numpy rank-1 float array 
 81      @keyword back_calc:         The array for holding the back calculated R1rho values.  Each element corresponds to the combination of spin lock field. 
 82      @type back_calc:            numpy rank-1 float array 
 83      @keyword num_points:        The number of points on the dispersion curve, equal to the length of the spin_lock_fields and back_calc arguments. 
 84      @type num_points:           int 
 85      """ 
 86   
 87       
 88      pB = 1.0 - pA 
 89   
 90       
 91      pA2dw2 = pA**2 * dw**2 
 92      kex2_pA2dw2 = kex**2 + pA2dw2 
 93   
 94       
 95      numer = pA2dw2 * pB * kex 
 96   
 97       
 98       
 99      if numer == 0.0: 
100          back_calc[:] = array([r1rho_prime]*num_points) 
101          return 
102   
103       
104      denom = kex2_pA2dw2 + spin_lock_fields2 
105   
106       
107       
108      if min(abs(denom)) == 0: 
109          back_calc[:] = array([1e100]*num_points) 
110          return 
111   
112   
113       
114      R1rho = r1rho_prime + numer / denom 
115   
116       
117       
118      if not isfinite(sum(R1rho)): 
119          R1rho = array([1e100]*num_points) 
120   
121      back_calc[:] = R1rho 
 122