Hi Troels, This is just a small formatting fix - the '=' need spaces ' = ' when not a function argument. And the reverse for a function argument, with 'dw == 0.0' as 'dw==0.0'. Just a standard Python, and relax, convention.
Cheers, Edward On 15 June 2014 15:15, <[email protected]> wrote: > Author: tlinnet > Date: Sun Jun 15 15:15:11 2014 > New Revision: 23957 > > URL: http://svn.gna.org/viewcvs/relax?rev=23957&view=rev > Log: > Moved the bulk operation of model CPMG 2site 3d into the lib file. > > This is to keep the API clean. > > Task #7807 (https://gna.org/task/index.php?7807): Speed-up of dispersion > models for Clustered analysis. > > Modified: > branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py > > Modified: branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py > URL: > http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py?rev=23957&r1=23956&r2=23957&view=diff > ============================================================================== > --- branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py (original) > +++ branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py Sun Jun 15 > 15:15:11 2014 > @@ -54,9 +54,9 @@ > """ > > # Python module imports. > -from numpy import dot, fabs, isfinite, log, min, ones, ndarray > -from numpy.ma import fix_invalid, masked_less_equal, masked_where > -import numpy as np > +from numpy import dot, fabs, isfinite, log, min, sum > +from numpy.ma import fix_invalid, masked_where > + > > # relax module imports. > from lib.dispersion.ns_matrices import rcpmg_3d > @@ -64,7 +64,7 @@ > from lib.linear_algebra.matrix_exponential import matrix_exponential > > > -def r2eff_ns_cpmg_2site_3D(r180x=None, M0=None, r10a=0.0, r10b=0.0, > r20a=None, r20b=None, pA=None, dw=None, kex=None, inv_tcpmg=None, tcp=None, > back_calc=None, num_points=None, power=None): > +def r2eff_ns_cpmg_2site_3D(r180x=None, M0=None, r10a=0.0, r10b=0.0, > r20a=None, r20b=None, pA=None, dw=None, dw_orig=None, kex=None, > inv_tcpmg=None, tcp=None, back_calc=None, num_points=None, power=None): > """The 2-site numerical solution to the Bloch-McConnell equation. > > This function calculates and stores the R2eff values. > @@ -79,43 +79,41 @@ > @keyword r10b: The R1 value for state B. > @type r10b: float > @keyword r20a: The R2 value for state A in the absence of > exchange. > - @type r20a: float > + @type r20a: numpy float array of rank [NE][NS][[NM][NO][ND] > @keyword r20b: The R2 value for state B in the absence of > exchange. > - @type r20b: float > + @type r20b: numpy float array of rank [NE][NS][[NM][NO][ND] > @keyword pA: The population of state A. > @type pA: float > @keyword dw: The chemical exchange difference between states > A and B in rad/s. > - @type dw: float > + @type dw: numpy float array of rank [NE][NS][[NM][NO][ND] > + @keyword dw_orig: The chemical exchange difference between states > A and B in ppm. This is only for faster checking of zero value, which result > in no exchange. > + @type dw_orig: numpy float array of rank-1 > @keyword kex: The kex parameter value (the exchange rate in > rad/s). > @type kex: float > @keyword inv_tcpmg: The inverse of the total duration of the CPMG > element (in inverse seconds). > - @type inv_tcpmg: float > + @type inv_tcpmg: numpy float array of rank [NE][NS][[NM][NO][ND] > @keyword tcp: The tau_CPMG times (1 / 4.nu1). > - @type tcp: numpy rank-1 float array > + @type tcp: numpy float array of rank [NE][NS][[NM][NO][ND] > @keyword back_calc: The array for holding the back calculated R2eff > values. Each element corresponds to one of the CPMG nu1 frequencies. > - @type back_calc: numpy rank-1 float array > + @type back_calc: numpy float array of rank [NE][NS][[NM][NO][ND] > @keyword num_points: The number of points on the dispersion curve, > equal to the length of the tcp and back_calc arguments. > - @type num_points: int > + @type num_points: numpy int array of rank [NE][NS][[NM][NO][ND] > @keyword power: The matrix exponential power array. > - @type power: numpy int16, rank-1 array > + @type power: numpy int array of rank [NE][NS][[NM][NO][ND] > """ > - > - # This is temporary hack between rank 1 and multi rank. > - dw_a = ones([num_points]) * dw > - r20a_a = ones([num_points]) * r20a > > # Flag to tell if values should be replaced if math function is violated. > t_dw_zero = False > > # Catch parameter values that will result in no exchange, returning flat > R2eff = R20 lines (when kex = 0.0, k_AB = 0.0). > if pA == 1.0 or kex == 0.0: > - back_calc[:] = r20a_a > + back_calc[:] = r20a > return > > # Test if dw is zero. Wait for replacement, since this is spin specific. > - if min(fabs(dw_a)) == 0.0: > + if min(fabs(dw_orig)) == 0.0: > t_dw_zero = True > - mask_dw_zero = masked_where(dw_a == 0.0, dw_a) > + mask_dw_zero = masked_where(dw == 0.0, dw) > > # Once off parameter conversions. > pB = 1.0 - pA > @@ -126,40 +124,58 @@ > M0[1] = pA > M0[4] = pB > > - # The matrix R that contains all the contributions to the evolution, > i.e. relaxation, exchange and chemical shift evolution. > - R = rcpmg_3d(R1A=r10a, R1B=r10b, R2A=r20a, R2B=r20b, pA=pA, pB=pB, > dw=dw, k_AB=k_AB, k_BA=k_BA) > + # Extract the total numbers of experiments, number of spins, number of > magnetic field strength, number of offsets, maximum number of dispersion > point. > + NE, NS, NM, NO, ND = back_calc.shape > > - # Loop over the time points, back calculating the R2eff values. > - for i in range(num_points): > - # Initial magnetisation. > - Mint = M0.reshape(7, 1) > + # Loop over the spins > + for si in range(NS): > + # Loop over the spectrometer frequencies. > + for mi in range(NM): > > - # This matrix is a propagator that will evolve the magnetization > with the matrix R for a delay tcp. > - Rexpo = matrix_exponential(R*tcp[i]) > + # Extract the values from the higher dimensional arrays. > + R2A_si_mi=r20a[0][si][mi][0][0] > + R2B_si_mi=r20b[0][si][mi][0][0] > + dw_si_mi = dw[0][si][mi][0][0] > + num_points_si_mi = int(num_points[0][si][mi][0][0]) > > - # Temp matrix. > - t_mat = > Rexpo.dot(r180x).dot(Rexpo).dot(Rexpo).dot(r180x).dot(Rexpo).dot(Rexpo).dot(r180x).dot(Rexpo).dot(Rexpo).dot(r180x).dot(Rexpo) > + # The matrix R that contains all the contributions to the > evolution, i.e. relaxation, exchange and chemical shift evolution. > + R = rcpmg_3d(R1A=r10a, R1B=r10b, R2A=R2A_si_mi, R2B=R2B_si_mi, > pA=pA, pB=pB, dw=dw_si_mi, k_AB=k_AB, k_BA=k_BA) > > - # Loop over the CPMG elements, propagating the magnetisation. > - for j in range(power[i]/2): > - Mint = t_mat.dot(Mint) > + # Loop over the time points, back calculating the R2eff values. > + for di in range(num_points_si_mi): > + # Extract the values from the higher dimensional arrays. > + tcp_si_mi_di = tcp[0][si][mi][0][di] > + inv_tcpmg_si_mi_di = inv_tcpmg[0][si][mi][0][di] > + power_si_mi_di = int(power[0][si][mi][0][di]) > + r20a_si_mi_di = r20a[0][si][mi][0][di] > > - # The next lines calculate the R2eff using a two-point > approximation, i.e. assuming that the decay is mono-exponential. > - Mx = Mint[1][0] / pA > - if Mx <= 0.0 or isNaN(Mx): > - back_calc[i] = r20a > - else: > - back_calc[i]= -inv_tcpmg * log(Mx) > + # Initial magnetisation. > + Mint = M0 > + > + # This matrix is a propagator that will evolve the > magnetization with the matrix R for a delay tcp. > + Rexpo = matrix_exponential(R*tcp_si_mi_di) > + > + # Temp matrix. > + t_mat = > Rexpo.dot(r180x).dot(Rexpo).dot(Rexpo).dot(r180x).dot(Rexpo).dot(Rexpo).dot(r180x).dot(Rexpo).dot(Rexpo).dot(r180x).dot(Rexpo) > + > + # Loop over the CPMG elements, propagating the magnetisation. > + for j in range(power_si_mi_di/2): > + Mint = t_mat.dot(Mint) > + > + # The next lines calculate the R2eff using a two-point > approximation, i.e. assuming that the decay is mono-exponential. > + Mx = Mint[1] / pA > + #print back_calc[0][si][mi][0] > + #print lkhj > + > + if Mx <= 0.0 or isNaN(Mx): > + back_calc[0][si][mi][0][di] = r20a_si_mi_di > + else: > + back_calc[0][si][mi][0][di] = - inv_tcpmg_si_mi_di * > log(Mx) > > # Replace data in array. > # If dw is zero. > if t_dw_zero: > - back_calc[mask_dw_zero.mask] = r20a_a[mask_dw_zero.mask] > - > - # If Mx is less than 0.0 > - if min(Mx) <= 0.0: > - mask_min_mx = masked_less_equal(Mx, 0.0) > - back_calc[mask_min_mx.mask] = r20a_a[mask_min_mx.mask] > + back_calc[mask_dw_zero.mask] = r20a[mask_dw_zero.mask] > > # Catch errors, taking a sum over array is the fastest way to check for > # +/- inf (infinity) and nan (not a number). > > > _______________________________________________ > relax (http://www.nmr-relax.com) > > This is the relax-commits mailing list > [email protected] > > To unsubscribe from this list, get a password > reminder, or change your subscription options, > visit the list information page at > https://mail.gna.org/listinfo/relax-commits _______________________________________________ relax (http://www.nmr-relax.com) This is the relax-devel mailing list [email protected] To unsubscribe from this list, get a password reminder, or change your subscription options, visit the list information page at https://mail.gna.org/listinfo/relax-devel

