Author: tlinnet Date: Mon Jun 16 19:01:30 2014 New Revision: 23986 URL: http://svn.gna.org/viewcvs/relax?rev=23986&view=rev Log: Replaced the temporary structure self.frqs_a to self.frqs, which works for all target functions. Task #7807 (https://gna.org/task/index.php?7807): Speed-up of dispersion models for Clustered analysis. Modified: branches/disp_spin_speed/target_functions/relax_disp.py Modified: branches/disp_spin_speed/target_functions/relax_disp.py URL: http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/target_functions/relax_disp.py?rev=23986&r1=23985&r2=23986&view=diff ============================================================================== --- branches/disp_spin_speed/target_functions/relax_disp.py (original) +++ branches/disp_spin_speed/target_functions/relax_disp.py Mon Jun 16 19:01:30 2014 @@ -165,6 +165,21 @@ if r1 == None: raise RelaxError("R1 relaxation rates must be supplied for the '%s' R1rho off-resonance dispersion model." % model) + ### Initialise higher order numpy structures. + # Define the shape of all the numpy arrays. + self.numpy_array_shape = list( asarray(values).shape ) + + # Set the dimensions to paramater. + # The total numbers of experiments, number of spins, number of magnetic field strength, number of offsets, maximum number of dispersion point. + self.NE = self.numpy_array_shape[0] + self.NS = self.numpy_array_shape[1] + self.NM = self.numpy_array_shape[2] + self.NO = self.numpy_array_shape[3] + self.ND = self.numpy_array_shape[4] + + # Create special numpy structures. + self.no_nd_struct = ones([self.NO, self.ND], float64) + # Store the arguments. self.model = model self.num_params = num_params @@ -174,7 +189,7 @@ self.values = values self.errors = errors self.missing = missing - self.frqs = frqs + self.frqs = multiply.outer( asarray(frqs).reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) self.frqs_H = frqs_H self.cpmg_frqs = cpmg_frqs self.spin_lock_nu1 = spin_lock_nu1 @@ -448,10 +463,6 @@ # Setup special numpy array structures, for higher dimensional computation. if model in test_models + [MODEL_NOREX]: - if model in test_models: - # Extract the frequencies to numpy array. - self.frqs_a = multiply.outer( asarray(self.frqs).reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) - if model in MODEL_LIST_CPMG_FULL: self.cpmg_frqs_a = deepcopy(ones_a) self.phi_ex_struct = deepcopy(zeros_a) @@ -550,7 +561,7 @@ """ # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20A and R20B to per experiment, spin and frequency. self.r20a_struct[:] = multiply.outer( R20A.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -589,7 +600,7 @@ """ # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20A and R20B to per experiment, spin and frequency. self.r20a_struct[:] = multiply.outer( R20A.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -628,7 +639,7 @@ """ # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20A and R20B to per experiment, spin and frequency. self.r20a_struct[:] = multiply.outer( R20A.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -667,7 +678,7 @@ """ # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20A and R20B to per experiment, spin and frequency. self.r20a_struct[:] = multiply.outer( R20A.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -749,8 +760,8 @@ r20_index = mi + ei*self.num_frq + si*self.num_frq*self.num_exp # Convert dw from ppm to rad/s. - dw_AB_frq = dw_AB[si] * self.frqs[ei][si][mi] - dw_AC_frq = dw_AC[si] * self.frqs[ei][si][mi] + dw_AB_frq = dw_AB[si] * self.frqs[ei][si][mi][0][0] + dw_AC_frq = dw_AC[si] * self.frqs[ei][si][mi][0][0] dwH_AB_frq = dwH_AB[si] * self.frqs_H[ei][si][mi] dwH_AC_frq = dwH_AC[si] * self.frqs_H[ei][si][mi] @@ -1028,7 +1039,7 @@ kex = params[self.end_index[1]] # Convert phi_ex from ppm^2 to (rad/s)^2. Use the out argument, to pass directly to structure. - multiply( multiply.outer( phi_ex.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a*self.frqs_a, out=self.phi_ex_struct ) + multiply( multiply.outer( phi_ex.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs*self.frqs, out=self.phi_ex_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1068,7 +1079,7 @@ tex = params[self.end_index[2]] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1163,7 +1174,7 @@ kex = params[self.end_index[1]] # Convert phi_ex from ppm^2 to (rad/s)^2. Use the out argument, to pass directly to structure. - multiply( multiply.outer( phi_ex.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a*self.frqs_a, out=self.phi_ex_struct ) + multiply( multiply.outer( phi_ex.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs*self.frqs, out=self.phi_ex_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1202,7 +1213,7 @@ kex = params[self.end_index[1]] # Convert phi_ex from ppm^2 to (rad/s)^2. Use the out argument, to pass directly to structure. - multiply( multiply.outer( phi_ex.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a*self.frqs_a, out=self.phi_ex_struct ) + multiply( multiply.outer( phi_ex.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs*self.frqs, out=self.phi_ex_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1242,7 +1253,7 @@ kex = params[self.end_index[1]+1] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1282,7 +1293,7 @@ kex = params[self.end_index[1]+1] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1340,7 +1351,7 @@ r20_index = mi + ei*self.num_frq + si*self.num_frq*self.num_exp # Convert dw from ppm to rad/s. - dw_frq = dw[si] * self.frqs[ei][si][mi] + dw_frq = dw[si] * self.frqs[ei][si][mi][0][0] dwH_frq = dwH[si] * self.frqs_H[ei][si][mi] # Alias the dw frequency combinations. @@ -1471,7 +1482,7 @@ kex = params[self.end_index[1]+1] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20A and R20B to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1584,7 +1595,7 @@ r20_index = mi + ei*self.num_frq + si*self.num_frq*self.num_exp # Convert dw from ppm to rad/s. - dw_frq = dw[si] * self.frqs[ei][si][mi] + dw_frq = dw[si] * self.frqs[ei][si][mi][0][0] dwH_frq = dwH[si] * self.frqs_H[ei][si][mi] # Alias the dw frequency combinations. @@ -1803,7 +1814,7 @@ kex = params[self.end_index[1]+1] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1843,7 +1854,7 @@ kex = params[self.end_index[1]+1] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20 to per experiment, spin and frequency. self.r20_struct[:] = multiply.outer( R20.reshape(self.NE, self.NS, self.NM), self.no_nd_struct ) @@ -1883,7 +1894,7 @@ k_AB = params[self.end_index[1]] # Convert dw from ppm to rad/s. Use the out argument, to pass directly to structure. - multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs_a, out=self.dw_struct ) + multiply( multiply.outer( dw.reshape(self.NE, self.NS), self.nm_no_nd_struct ), self.frqs, out=self.dw_struct ) # Reshape R20A and R20B to per experiment, spin and frequency. self.r20a_struct[:] = multiply.outer( R20A.reshape(self.NE, self.NS, self.NM), self.no_nd_struct )