mailr20694 - in /branches/relax_disp/specific_analyses/relax_disp: api.py disp_data.py


Others Months | Index by Date | Thread Index
>>   [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Header


Content

Posted by edward on August 27, 2013 - 11:08:
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.
 




Related Messages


Powered by MHonArc, Updated Tue Aug 27 11:20:01 2013