Author: bugman Date: Fri Jul 19 08:18:25 2013 New Revision: 20404 URL: http://svn.gna.org/viewcvs/relax?rev=20404&view=rev Log: All of the numeric dispersion models are now much more robust. The real part of the magnetization vector for the A state could, for some parameter combinations, be either negative or NaN. These situations are now caught, and the R2eff value set to a very large number. Modified: branches/relax_disp/lib/dispersion/ns_2site_3d.py branches/relax_disp/lib/dispersion/ns_2site_expanded.py branches/relax_disp/lib/dispersion/ns_2site_star.py Modified: branches/relax_disp/lib/dispersion/ns_2site_3d.py URL: http://svn.gna.org/viewcvs/relax/branches/relax_disp/lib/dispersion/ns_2site_3d.py?rev=20404&r1=20403&r2=20404&view=diff ============================================================================== --- branches/relax_disp/lib/dispersion/ns_2site_3d.py (original) +++ branches/relax_disp/lib/dispersion/ns_2site_3d.py Fri Jul 19 08:18:25 2013 @@ -40,6 +40,7 @@ # relax module imports. from lib.dispersion.ns_matrices import rcpmg_3d +from lib.float import isNaN def r2eff_ns_2site_3D(r180x=None, M0=None, r10a=0.0, r10b=0.0, r20a=None, r20b=None, pA=None, pB=None, dw=None, k_AB=None, k_BA=None, inv_tcpmg=None, tcp=None, back_calc=None, num_points=None, power=None): @@ -101,7 +102,7 @@ # The next lines calculate the R2eff using a two-point approximation, i.e. assuming that the decay is mono-exponential. Mx = fabs(Mint[1] / pA) - if Mx == 0.0: + if Mx <= 0.0 or isNaN(Mx): back_calc[i] = 1e99 else: back_calc[i]= -inv_tcpmg * log(Mx) Modified: branches/relax_disp/lib/dispersion/ns_2site_expanded.py URL: http://svn.gna.org/viewcvs/relax/branches/relax_disp/lib/dispersion/ns_2site_expanded.py?rev=20404&r1=20403&r2=20404&view=diff ============================================================================== --- branches/relax_disp/lib/dispersion/ns_2site_expanded.py (original) +++ branches/relax_disp/lib/dispersion/ns_2site_expanded.py Fri Jul 19 08:18:25 2013 @@ -38,6 +38,9 @@ from numpy.linalg import matrix_power if dep_check.scipy_module: from scipy.linalg import expm + +# relax module imports. +from lib.float import isNaN def r2eff_ns_2site_expanded(r20=None, pA=None, dw=None, k_AB=None, k_BA=None, relax_time=None, inv_relax_time=None, tcp=None, back_calc=None, num_points=None, num_cpmg=None): @@ -136,7 +139,7 @@ # Calculate the R2eff using a two-point approximation, i.e. assuming that the decay is mono-exponential, and store it for each dispersion point. for i in range(num_points): - if Mx[i] == 0.0: + if Mx[i] <= 0.0 or isNaN(Mx[i]): back_calc[i] = 1e99 else: back_calc[i]= -inv_relax_time * log(Mx[i]) Modified: branches/relax_disp/lib/dispersion/ns_2site_star.py URL: http://svn.gna.org/viewcvs/relax/branches/relax_disp/lib/dispersion/ns_2site_star.py?rev=20404&r1=20403&r2=20404&view=diff ============================================================================== --- branches/relax_disp/lib/dispersion/ns_2site_star.py (original) +++ branches/relax_disp/lib/dispersion/ns_2site_star.py Fri Jul 19 08:18:25 2013 @@ -38,6 +38,9 @@ from numpy.linalg import matrix_power if dep_check.scipy_module: from scipy.linalg import expm + +# relax module imports. +from lib.float import isNaN def r2eff_ns_2site_star(Rr=None, Rex=None, RCS=None, R=None, M0=None, r20a=None, r20b=None, dw=None, inv_tcpmg=None, tcp=None, back_calc=None, num_points=None, power=None): @@ -104,7 +107,7 @@ # The next lines calculate the R2eff using a two-point approximation, i.e. assuming that the decay is mono-exponential. Mx = Moft[0].real / M0[0] - if Mx == 0.0: + if Mx <= 0.0 or isNaN(Mx): back_calc[i] = 1e99 else: back_calc[i]= -inv_tcpmg * log(Mx)