Author: bugman Date: Tue Aug 27 14:49:36 2013 New Revision: 20699 URL: http://svn.gna.org/viewcvs/relax?rev=20699&view=rev Log: The dispersion specific code is now assembling the R1 data and passing it to the target function. The new specific_analyses.relax_disp.disp_data.return_r1_data() function creates a data structure holding all the R1 data. This is used in the off-resonance R1rho experiments. 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=20699&r1=20698&r2=20699&view=diff ============================================================================== --- branches/relax_disp/specific_analyses/relax_disp/api.py (original) +++ branches/relax_disp/specific_analyses/relax_disp/api.py Tue Aug 27 14:49:36 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_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.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_r1_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,11 +129,14 @@ # 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) + # The offset and R1 data for R1rho off-resonance models. + chemical_shifts, offsets, tilt_angles, r1 = None, None, None, None + if spin.model in [MODEL_DPL94, MODEL_TP02]: + chemical_shifts, offsets, tilt_angles = return_offset_data(spins=[spin], spin_ids=[spin_id], fields=fields, field_count=field_count) + r1 = return_r1_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), chemical_shifts=chemical_shifts, spin_lock_offsets=offsets, tilt_angles=tilt_angles, 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, r1=r1, 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) @@ -1165,8 +1168,11 @@ # 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) + # The offset and R1 data for R1rho off-resonance models. + chemical_shifts, offsets, tilt_angles, r1 = None, None, None, None + if spins[0].model in [MODEL_DPL94, MODEL_TP02]: + chemical_shifts, offsets, tilt_angles = return_offset_data(spins=spins, spin_ids=spin_ids, fields=fields, field_count=field_count) + r1 = return_r1_data(spins=spins, spin_ids=spin_ids, fields=fields, field_count=field_count, sim_index=sim_index) # Create the initial parameter vector. param_vector = assemble_param_vector(spins=spins) @@ -1199,7 +1205,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), chemical_shifts=chemical_shifts, spin_lock_offsets=offsets, tilt_angles=tilt_angles, 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, r1=r1, 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=20699&r1=20698&r2=20699&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 14:49:36 2013 @@ -912,6 +912,51 @@ return "%s_%s" % (frq/1e6, point) +def return_r1_data(spins=None, spin_ids=None, fields=None, field_count=None, sim_index=None): + """Return the R1 data structures for off-resonance R1rho experiments. + + @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 + @keyword sim_index: The index of the simulation to return the R1 data of. This should be None if the normal data is required. + @type sim_index: None or int + @return: The R1 relaxation data. + @rtype: numpy rank-2 float array + """ + + # The spin count. + spin_num = len(spins) + + # Initialise the data structure. + r1 = zeros((spin_num, field_count), float64) + + # Loop over the Rx IDs. + for ri_id in cdp.ri_ids: + # Only use R1 data. + if cdp.ri_type[ri_id] != 'R1': + continue + + # The frequency. + frq = cdp.spectrometer_frq[ri_id] + frq_index = return_index_from_frq(frq) + + # Spin loop. + for spin_index in range(spin_num): + # Store the data. + if sim_index != None: + r1[spin_index, frq_index] = spins[spin_index].ri_data_sim[ri_id][sim_index] + else: + r1[spin_index, frq_index] = spins[spin_index].ri_data[ri_id] + + # Return the data. + return r1 + + def return_r2eff_arrays(spins=None, spin_ids=None, fields=None, field_count=None, sim_index=None): """Return numpy arrays of the R2eff/R1rho values and errors.