Author: bugman Date: Fri Sep 10 15:32:46 2010 New Revision: 11542 URL: http://svn.gna.org/viewcvs/relax?rev=11542&view=rev Log: This change is related to the task #6397 (https://gna.org/task/?6397). kada _at_ chemi _dot_ muni _dot_ cz https://mail.gna.org/public/relax-devel/2010-07/msg00029.html https://gna.org/task/download.php?file_id=9687 This patch includes change in __init__ function of class Mf in a file maths_fns/mf.py. Function was modified in order to handle data for more interactions. Also documentation string was updated according to the changes of function arguments. Modified: branches/cst/maths_fns/mf.py Modified: branches/cst/maths_fns/mf.py URL: http://svn.gna.org/viewcvs/relax/branches/cst/maths_fns/mf.py?rev=11542&r1=11541&r2=11542&view=diff ============================================================================== --- branches/cst/maths_fns/mf.py (original) +++ branches/cst/maths_fns/mf.py Fri Sep 10 15:32:46 2010 @@ -39,7 +39,7 @@ class Mf: - def __init__(self, init_params=None, model_type=None, diff_type=None, diff_params=None, scaling_matrix=None, num_spins=None, equations=None, param_types=None, param_values=None, relax_data=None, errors=None, bond_length=None, csa=None, num_frq=0, frq=None, num_ri=None, remap_table=None, noe_r1_table=None, ri_labels=None, gx=0, gh=0, h_bar=0, mu0=0, num_params=None, vectors=None): + def __init__(self, init_params=None, model_type=None, diff_type=None, diff_params=None, scaling_matrix=None, num_spins=None, equations=None, param_types=None, param_values=None, relax_data=None, errors=None, num_interactions=None, interactions=None, internuclei_distance=None, csa=None, num_frq=0, frq=None, num_ri=None, remap_table=None, noe_r1_table=None, ri_labels=None, gx=0, gh=0, gratio_ext=0, h_bar=0, mu0=0, num_params=None, unit_vector=None): """The model-free minimisation class. This class should be initialised before every calculation. @@ -56,9 +56,18 @@ errors: An array containing the experimental errors. - bond_length: The fixed bond length in meters. - - csa: The fixed CSA value. + interactions: An array containing the types of interactions (either dipole-dipole or CSA). + + gratio_ext: An array containing the gyromagnetic ratios of interacting nuclei (None is included + in case of CSA interaction) + + internuclei_distance: An array containing the fixed internuclei_distances in meters. + (None is included in case of CSA interaction) + + csa: An array containing the fixed CSA value. (None is included in case of dipole-dipole + interaction) + + unit_vector: An array containing the fixed unit eigenvectors of interactions diff_type: The diffusion tensor string which should be either 'sphere', 'spheroid', or 'ellipsoid'. @@ -244,98 +253,107 @@ # Total number of ri. self.total_num_ri = self.total_num_ri + num_ri[i] + self.data.append([]) + # The ratio of gyromagnetic ratios. g_ratio = gh[i] / gx[i] - # Append the class instance Data to the data array. - self.data.append(Data()) - - # Number of indices. - self.data[i].num_indices = self.diff_data.num_indices - - # Calculate the five frequencies per field strength which cause R1, R2, and NOE relaxation. - self.data[i].frq_list = zeros((num_frq[i], 5), float64) - self.data[i].frq_list_ext = zeros((num_frq[i], 5, self.diff_data.num_indices), float64) - self.data[i].frq_sqrd_list_ext = zeros((num_frq[i], 5, self.diff_data.num_indices), float64) - for j in xrange(num_frq[i]): - frqH = 2.0 * pi * frq[i][j] - frqX = frqH / g_ratio - self.data[i].frq_list[j, 1] = frqX - self.data[i].frq_list[j, 2] = frqH - frqX - self.data[i].frq_list[j, 3] = frqH - self.data[i].frq_list[j, 4] = frqH + frqX - self.data[i].frq_sqrd_list = self.data[i].frq_list ** 2 - for j in xrange(self.diff_data.num_indices): - self.data[i].frq_list_ext[:,:, j] = self.data[i].frq_list - self.data[i].frq_sqrd_list_ext[:,:, j] = self.data[i].frq_sqrd_list - - # Store supplied data in self.data - self.data[i].gh = gh[i] - self.data[i].gx = gx[i] - self.data[i].g_ratio = g_ratio - self.data[i].h_bar = h_bar - self.data[i].mu0 = mu0 - self.data[i].equations = equations[i] - self.data[i].param_types = param_types[i] - self.data[i].relax_data = relax_data[i] - self.data[i].errors = errors[i] - self.data[i].bond_length = bond_length[i] - self.data[i].csa = csa[i] - self.data[i].num_ri = num_ri[i] - self.data[i].num_frq = num_frq[i] - self.data[i].frq = frq[i] - self.data[i].remap_table = remap_table[i] - self.data[i].noe_r1_table = noe_r1_table[i] - self.data[i].ri_labels = ri_labels[i] - self.data[i].num_params = num_params[i] - self.data[i].xh_unit_vector = vectors[i] - - # Parameter values for minimising solely the diffusion tensor parameters. - if self.model_type == 'diff': - self.data[i].param_values = param_values[i] - - # Indices for constructing the global generic model-free gradient and Hessian kite. - if i == 0: - self.data[i].start_index = self.diff_data.num_params - else: - self.data[i].start_index = self.data[i-1].end_index - self.data[i].end_index = self.data[i].start_index + self.data[i].num_params - - # Total number of parameters. - if self.model_type == 'mf' or self.model_type == 'local_tm': - self.data[i].total_num_params = self.data[i].num_params - elif self.model_type == 'diff': - self.data[i].total_num_params = self.diff_data.num_params - else: - self.data[i].total_num_params = self.data[i].num_params + self.diff_data.num_params - - # Initialise the residue specific data. - self.init_res_data(self.data[i], self.diff_data) - - # Setup the residue specific equations. - if not self.setup_equations(self.data[i]): - raise RelaxError("The model-free equations could not be setup.") - - # Diffusion tensor parameters. - if self.model_type == 'local_tm': - self.diff_data.params = self.params[0:1] - elif self.model_type == 'diff' or self.model_type == 'all': - self.diff_data.params = self.params[0:self.diff_end_index] - - # Calculate the correlation times ti. - self.diff_data.calc_ti(self.data[i], self.diff_data) - - # ti spectral density components. - self.data[i].w_ti_sqrd = self.data[i].frq_sqrd_list_ext * self.data[i].ti ** 2 - self.data[i].fact_ti = 1.0 / (1.0 + self.data[i].w_ti_sqrd) - - # Initialise the R1 data class. This is used only if an NOE data set is collected but the R1 data of the same frequency has not. - missing_r1 = 0 - for j in xrange(self.data[i].num_ri): - if self.data[i].ri_labels[j] == 'NOE' and self.data[i].noe_r1_table[j] == None: - missing_r1 = 1 - if missing_r1: - self.init_res_r1_data(self.data[i]) + + # loop over interactions + for j in xrange(self.num_interactions[i]): + self.data[i].append(Data()) + self.data[i][j].interactions=interactions[i][j] + self.data[i][j].internuclei_distance=internuclei_distance[i][j] + self.data[i][j].gratio_ext=gratio_ext[i][j] + self.data[i][j].csa=csa[i][j] + self.data[i][j].unit_vector=unit_vector[i][j] + + # Number of indices. + self.data[i][j].num_indices = self.diff_data.num_indices + + # Calculate the five frequencies per field strength which cause R1, R2, and NOE relaxation. + self.data[i][j].frq_list = zeros((num_frq[i], 5), float64) + self.data[i][j].frq_list_ext = zeros((num_frq[i], 5, self.diff_data.num_indices), float64) + self.data[i][j].frq_sqrd_list_ext = zeros((num_frq[i], 5, self.diff_data.num_indices), float64) + for k in xrange(num_frq[i]): + frqH = 2.0 * pi * frq[i][k] + frqX = frqH / g_ratio + frqY = frqH * gratio_ext[i][j] / gh[i] + self.data[i][j].frq_list[k, 1] = frqX + self.data[i][j].frq_list[k, 2] = frqY - frqX + self.data[i][j].frq_list[k, 3] = frqY + self.data[i][j].frq_list[k, 4] = frqY + frqX + self.data[i][j].frq_sqrd_list = self.data[i].frq_list ** 2 + for k in xrange(self.diff_data.num_indices): + self.data[i][j].frq_list_ext[:,:, k] = self.data[i][j].frq_list + self.data[i][j].frq_sqrd_list_ext[:,:, k] = self.data[i][j].frq_sqrd_list + + + + # Store supplied data in self.data + self.data[i][j].gh = gh[i] + self.data[i][j].gx = gx[i] + self.data[i][j].g_ratio = g_ratio + self.data[i][j].h_bar = h_bar + self.data[i][j].mu0 = mu0 + self.data[i][j].equations = equations[i] + self.data[i][j].param_types = param_types[i] + self.data[i][j].relax_data = relax_data[i] + self.data[i][j].errors = errors[i] + self.data[i][j].num_ri = num_ri[i] + self.data[i][j].num_frq = num_frq[i] + self.data[i][j].frq = frq[i] + self.data[i][j].remap_table = remap_table[i] + self.data[i][j].noe_r1_table = noe_r1_table[i] + self.data[i][j].ri_labels = ri_labels[i] + self.data[i][j].num_params = num_params[i] + + # Parameter values for minimising solely the diffusion tensor parameters. + if self.model_type == 'diff': + self.data[i][j].param_values = param_values[i] + + # Indices for constructing the global generic model-free gradient and Hessian kite. + if i == 0: + self.data[i][j].start_index = self.diff_data.num_params + else: + self.data[i][j].start_index = self.data[i-1][0].end_index + self.data[i][j].end_index = self.data[i][j].start_index + self.data[i][j].num_params + + # Total number of parameters. + if self.model_type == 'mf' or self.model_type == 'local_tm': + self.data[i][j].total_num_params = self.data[i][j].num_params + elif self.model_type == 'diff': + self.data[i][j].total_num_params = self.diff_data.num_params + else: + self.data[i][j].total_num_params = self.data[i][j].num_params + self.diff_data.num_params + + # Initialise the residue specific data. + self.init_res_data(self.data[i][j], self.diff_data) + + # Setup the residue specific equations. + if not self.setup_equations(self.data[i][j]): + raise RelaxError("The model-free equations could not be setup.") + + # Diffusion tensor parameters. + if self.model_type == 'local_tm': + self.diff_data.params = self.params[0:1] + elif self.model_type == 'diff' or self.model_type == 'all': + self.diff_data.params = self.params[0:self.diff_end_index] + + # Calculate the correlation times ti. + self.diff_data.calc_ti(self.data[i][j], self.diff_data) + + # ti spectral density components. + self.data[i][j].w_ti_sqrd = self.data[i][j].frq_sqrd_list_ext * self.data[i][j].ti ** 2 + self.data[i][j].fact_ti = 1.0 / (1.0 + self.data[i][j].w_ti_sqrd) + + # Initialise the R1 data class. This is used only if an NOE data set is collected but the R1 data of the same frequency has not. + missing_r1 = 0 + for k in xrange(self.data[i][j].num_ri): + if self.data[i][j].ri_labels[k] == 'NOE' and self.data[i][j].noe_r1_table[k] == None: + missing_r1 = 1 + if missing_r1: + self.init_res_r1_data(self.data[i][j]) # Scaling initialisation. if self.scaling_matrix != None: