Author: bugman Date: Tue Aug 27 11:08:44 2013 New Revision: 20694 URL: http://svn.gna.org/viewcvs/relax?rev=20694&view=rev Log: The dispersion specific optimisation code is now assembling chemical shift related data. The specific_analyses.relax_disp.disp_data.return_offset_data() function has been written to return structures for the chemical shifts, offsets, and tilt angles. These are then used by the optimisation functions by passing them into the target function code. Modified: branches/relax_disp/specific_analyses/relax_disp/api.py branches/relax_disp/specific_analyses/relax_disp/disp_data.py Modified: branches/relax_disp/specific_analyses/relax_disp/api.py URL: http://svn.gna.org/viewcvs/relax/branches/relax_disp/specific_analyses/relax_disp/api.py?rev=20694&r1=20693&r2=20694&view=diff ============================================================================== --- branches/relax_disp/specific_analyses/relax_disp/api.py (original) +++ branches/relax_disp/specific_analyses/relax_disp/api.py Tue Aug 27 11:08:44 2013 @@ -46,7 +46,7 @@ from pipe_control.mol_res_spin import exists_mol_res_spin_data, return_spin, spin_loop from specific_analyses.api_base import API_base from specific_analyses.api_common import API_common -from specific_analyses.relax_disp.disp_data import average_intensity, find_intensity_keys, loop_cluster, loop_frq, loop_frq_point, loop_frq_point_key, loop_frq_point_time, loop_point, loop_time, relax_time, return_cpmg_frqs, return_index_from_disp_point, return_index_from_frq, return_key_from_disp_point_index, return_param_key_from_data, return_r2eff_arrays, return_spin_lock_nu1, return_value_from_frq_index, spin_ids_to_containers +from specific_analyses.relax_disp.disp_data import average_intensity, find_intensity_keys, loop_cluster, loop_frq, loop_frq_point, loop_frq_point_key, loop_frq_point_time, loop_point, loop_time, relax_time, return_cpmg_frqs, return_index_from_disp_point, return_index_from_frq, return_key_from_disp_point_index, return_offset_data, return_param_key_from_data, return_r2eff_arrays, return_spin_lock_nu1, return_value_from_frq_index, spin_ids_to_containers from specific_analyses.relax_disp.parameters import assemble_param_vector, assemble_scaling_matrix, disassemble_param_vector, linear_constraints, loop_parameters, param_conversion, param_index_to_param_info, param_num from specific_analyses.relax_disp.variables import CPMG_EXP, FIXED_TIME_EXP, MODEL_LIST_FULL, MODEL_LM63, MODEL_LM63_3SITE, MODEL_CR72, MODEL_CR72_FULL, MODEL_DPL94, MODEL_IT99, MODEL_M61, MODEL_M61B, MODEL_NOREX, MODEL_NS_2SITE_3D, MODEL_NS_2SITE_3D_FULL, MODEL_NS_2SITE_EXPANDED, MODEL_NS_2SITE_STAR, MODEL_NS_2SITE_STAR_FULL, MODEL_R2EFF, MODEL_TP02, MODEL_TSMFK01, R1RHO_EXP, VAR_TIME_EXP from target_functions.relax_disp import Dispersion @@ -129,8 +129,11 @@ # Initialise the data structures for the target function. values, errors, missing, frqs = return_r2eff_arrays(spins=[spin], spin_ids=[spin_id], fields=fields, field_count=field_count) + # The offset data. + chemical_shifts, offsets, tilt_angles = return_offset_data(spins=[spin], spin_ids=[spin_id], fields=fields, field_count=field_count) + # Initialise the relaxation dispersion fit functions. - model = Dispersion(model=spin.model, num_params=param_num(spins=[spin]), num_spins=1, num_frq=field_count, num_disp_points=cdp.dispersion_points, values=values, errors=errors, missing=missing, frqs=frqs, cpmg_frqs=return_cpmg_frqs(ref_flag=False), spin_lock_nu1=return_spin_lock_nu1(ref_flag=False), relax_time=cdp.relax_time_list[0], scaling_matrix=scaling_matrix) + model = Dispersion(model=spin.model, num_params=param_num(spins=[spin]), num_spins=1, num_frq=field_count, num_disp_points=cdp.dispersion_points, values=values, errors=errors, missing=missing, frqs=frqs, cpmg_frqs=return_cpmg_frqs(ref_flag=False), spin_lock_nu1=return_spin_lock_nu1(ref_flag=False), chemical_shifts=chemical_shifts, spin_lock_offsets=offsets, tilt_angles=tilt_angles, relax_time=cdp.relax_time_list[0], scaling_matrix=scaling_matrix) # Make a single function call. This will cause back calculation and the data will be stored in the class instance. model.func(param_vector) @@ -1162,6 +1165,9 @@ # The R2eff/R1rho data. values, errors, missing, frqs = return_r2eff_arrays(spins=spins, spin_ids=spin_ids, fields=fields, field_count=field_count, sim_index=sim_index) + # The offset data. + chemical_shifts, offsets, tilt_angles = return_offset_data(spins=spins, spin_ids=spin_ids, fields=fields, field_count=field_count) + # Create the initial parameter vector. param_vector = assemble_param_vector(spins=spins) @@ -1193,7 +1199,7 @@ print("Unconstrained grid search size: %s (constraints may decrease this size).\n" % grid_size) # Initialise the function to minimise. - model = Dispersion(model=spins[0].model, num_params=param_num(spins=spins), num_spins=len(spins), num_frq=field_count, num_disp_points=cdp.dispersion_points, values=values, errors=errors, missing=missing, frqs=frqs, cpmg_frqs=return_cpmg_frqs(ref_flag=False), spin_lock_nu1=return_spin_lock_nu1(ref_flag=False), relax_time=cdp.relax_time_list[0], scaling_matrix=scaling_matrix) + model = Dispersion(model=spins[0].model, num_params=param_num(spins=spins), num_spins=len(spins), num_frq=field_count, num_disp_points=cdp.dispersion_points, values=values, errors=errors, missing=missing, frqs=frqs, cpmg_frqs=return_cpmg_frqs(ref_flag=False), spin_lock_nu1=return_spin_lock_nu1(ref_flag=False), chemical_shifts=chemical_shifts, spin_lock_offsets=offsets, tilt_angles=tilt_angles, relax_time=cdp.relax_time_list[0], scaling_matrix=scaling_matrix) # Grid search. if search('^[Gg]rid', min_algor): Modified: branches/relax_disp/specific_analyses/relax_disp/disp_data.py URL: http://svn.gna.org/viewcvs/relax/branches/relax_disp/specific_analyses/relax_disp/disp_data.py?rev=20694&r1=20693&r2=20694&view=diff ============================================================================== --- branches/relax_disp/specific_analyses/relax_disp/disp_data.py (original) +++ branches/relax_disp/specific_analyses/relax_disp/disp_data.py Tue Aug 27 11:08:44 2013 @@ -33,7 +33,7 @@ """ # Python module imports. -from math import pi, sqrt +from math import atan, pi, sqrt from numpy import float64, int32, ones, zeros # relax module imports. @@ -812,6 +812,87 @@ return key +def return_offset_data(spins=None, spin_ids=None, fields=None, field_count=None): + """Return numpy arrays of the chemical shifts, offsets and tilt angles. + + @keyword spins: The list of spin containers in the cluster. + @type spins: list of SpinContainer instances + @keyword spin_ids: The list of spin IDs for the cluster. + @type spin_ids: list of str + @keyword fields: The list of spectrometer field strengths. + @type fields: list of float + @keyword field_count: The number of spectrometer field strengths. This may not be equal to the length of the fields list as the user may not have set the field strength. + @type field_count: int + @return: The numpy array structures of the chemical shifts in rad/s, spin-lock offsets in rad/s, and rotating frame tilt angles. For each structure, the first dimension corresponds to the spins of a spin block, the second to the spectrometer field strength, and the third is the dispersion points. For the chemical shift structure, the third dimension is omitted. + @rtype: numpy rank-2 float array, numpy rank-3 float array, numpy rank-3 float array + """ + + # The spin count. + spin_num = len(spins) + + # Initialise the data structures for the target function. + shifts = zeros((spin_num, field_count), float64) + offsets = zeros((spin_num, field_count, cdp.dispersion_points), float64) + theta = zeros((spin_num, field_count, cdp.dispersion_points), float64) + + # Assemble the shift data. + data_flag = False + for spin_index in range(spin_num): + # Alias the spin. + spin = spins[spin_index] + + # No data. + if not hasattr(spin, 'chemical_shift'): + continue + data_flag = True + + # Loop over the spectrometer frequencies. + for frq in loop_frq(): + # The index. + frq_index = return_index_from_frq(frq) + + # Convert the shift from ppm to rad/s and store it. + shifts[spin_index, frq_index] = spin.chemical_shift * 2.0 * pi * frq / g1H * return_gyromagnetic_ratio(spin.isotope) * 1e-6 + + # No shift data for the spin cluster. + if not data_flag: + return None, None, None + + # Make sure offset data exists. + if not hasattr(cdp, 'spin_lock_offset'): + raise RelaxError("The spin-lock offsets have not been set.") + + # Loop over all spectrum IDs. + for id in cdp.spectrum_ids: + # The data. + frq = cdp.spectrometer_frq[id] + point = cdp.spin_lock_nu1[id] + + # Skip reference spectra. + if point == None: + continue + + # The indices. + frq_index = return_index_from_frq(frq) + disp_pt_index = return_index_from_disp_point(point) + + # Loop over the spins. + for spin_index in range(spin_num): + # Alias the spin. + spin = spins[spin_index] + + # Store the offset in rad/s. + offsets[spin_index, frq_index, disp_pt_index] = cdp.spin_lock_offset[id] * 2.0 * pi * frq / g1H * return_gyromagnetic_ratio(spin.isotope) * 1e-6 + + # Calculate the tilt angle. + omega1 = point * 2.0 * pi + Delta_omega = shifts[spin_index, frq_index] - offsets[spin_index, frq_index, disp_pt_index] + theta[spin_index, frq_index, disp_pt_index] = atan(omega1 / Delta_omega) + + # Return the structures. + return shifts, offsets, theta + + def return_param_key_from_data(frq=None, point=None): """Generate the unique key from the spectrometer frequency and dispersion point.