mailRe: r25189 - /trunk/test_suite/system_tests/relax_disp.py


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

Header


Content

Posted by Edward d'Auvergne on August 22, 2014 - 08:23:
Hi Troels,

Just so you know, the grid search is not used in the Monte Carlo
simulations.  The starting position for this method is always the real
optimised parameters.  So unfortunately this will not be of benefit
for your speed aims.

Regards,

Edward


On 21 August 2014 22:57,  <tlinnet@xxxxxxxxxxxxx> wrote:
Author: tlinnet
Date: Thu Aug 21 22:57:45 2014
New Revision: 25189

URL: http://svn.gna.org/viewcvs/relax?rev=25189&view=rev
Log:
Modified intermediate systemtest:
Relax_disp.test_bug_9999_slow_r1rho_r2eff_error_with_mc

to see if the initial Grid Search for 'i0' and 'R2eff' estimation can be 
skipped.

This is done by converting the exponential curve, to a linear curve, and 
calculate
the best parameters by a line of best fit by least squares.

This seems like a promising method as an initial estimator of 'i0' and 
'r2eff'.

For 500 to 2000 Monte-Carlo simulations, this could have an influence on 
the timings,
as all grid searchs could be skipped.

Modified:
    trunk/test_suite/system_tests/relax_disp.py

Modified: trunk/test_suite/system_tests/relax_disp.py
URL: 
http://svn.gna.org/viewcvs/relax/trunk/test_suite/system_tests/relax_disp.py?rev=25189&r1=25188&r2=25189&view=diff
==============================================================================
--- trunk/test_suite/system_tests/relax_disp.py (original)
+++ trunk/test_suite/system_tests/relax_disp.py Thu Aug 21 22:57:45 2014
@@ -23,7 +23,7 @@

 # Python module imports.
 from os import F_OK, access, getcwd, path, sep
-from numpy import array, median
+from numpy import array, exp, median, log, sum
 import re, math
 from tempfile import mkdtemp

@@ -35,7 +35,7 @@
 from lib.io import get_file_path
 from pipe_control.mol_res_spin import generate_spin_string, return_spin, 
spin_loop
 from specific_analyses.relax_disp.checks import check_missing_r1
-from specific_analyses.relax_disp.data import generate_r20_key, 
get_curve_type, has_exponential_exp_type, has_r1rho_exp_type, loop_exp_frq, 
loop_exp_frq_offset_point, loop_exp_frq_offset_point_time, 
return_grace_file_name_ini, return_param_key_from_data
+from specific_analyses.relax_disp.data import average_intensity, 
generate_r20_key, get_curve_type, has_exponential_exp_type, 
has_r1rho_exp_type, loop_exp_frq, loop_exp_frq_offset_point, 
loop_exp_frq_offset_point_time, loop_time, return_grace_file_name_ini, 
return_param_key_from_data
 from specific_analyses.relax_disp.data import INTERPOLATE_DISP, 
INTERPOLATE_OFFSET, X_AXIS_DISP, X_AXIS_W_EFF, X_AXIS_THETA, 
Y_AXIS_R2_R1RHO, Y_AXIS_R2_EFF
 from specific_analyses.relax_disp.model import models_info, nesting_param
 from specific_analyses.relax_disp.variables import EXP_TYPE_CPMG_DQ, 
EXP_TYPE_CPMG_MQ, EXP_TYPE_CPMG_PROTON_MQ, EXP_TYPE_CPMG_PROTON_SQ, 
EXP_TYPE_CPMG_SQ, EXP_TYPE_CPMG_ZQ, EXP_TYPE_LIST, EXP_TYPE_R1RHO, 
MODEL_B14_FULL, MODEL_CR72, MODEL_CR72_FULL, MODEL_DPL94, MODEL_IT99, 
MODEL_LIST_ANALYTIC_CPMG, MODEL_LIST_FULL, MODEL_LIST_NUMERIC_CPMG, 
MODEL_LM63, MODEL_M61, MODEL_M61B, MODEL_MP05, MODEL_NOREX, 
MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_EXPANDED, 
MODEL_NS_CPMG_2SITE_STAR_FULL, MODEL_NS_R1RHO_2SITE, MODEL_NS_R1RHO_3SITE, 
MODEL_NS_R1RHO_3SITE_LINEAR, MODEL_PARAMS, MODEL_R2EFF, MODEL_TP02, 
MODEL_TAP03
@@ -158,8 +158,8 @@

         # Now loop over the experiments, to set the variables in relax.
         exp_ids = []
-        for exp in exps:
-            sfrq, time_T2, ncycs, r2eff_errs = exp
+        for exp_i in exps:
+            sfrq, time_T2, ncycs, r2eff_errs = exp_i
             exp_id = 'CPMG_%3.1f' % (sfrq/1E6)
             exp_ids.append(exp_id)

@@ -193,8 +193,8 @@
         # Now read data in.
         for exp_type, frq, ei, mi in loop_exp_frq(return_indices=True):
             exp_id = exp_ids[mi]
-            exp = exps[mi]
-            sfrq, time_T2, ncycs, r2eff_errs = exp
+            exp_i = exps[mi]
+            sfrq, time_T2, ncycs, r2eff_errs = exp_i

             # Then loop over the spins.
             for res_name, res_num, spin_name, params in spins:
@@ -1363,26 +1363,15 @@
         # Read data.
         self.interpreter.results.read(prev_data_path + sep + 'results')

-        # Get initial offset, point, time
-        for exp_type, frq, offset, point, time, ei, mi, oi, di, ti in 
loop_exp_frq_offset_point_time(return_indices=True):
-            offset_i = offset
-            point_i = point
-            time_i = time
-            break
-
         # Now count number
-        graph_nr = 0
-        for exp_type, frq, offset, point, time, ei, mi, oi, di, ti in 
loop_exp_frq_offset_point_time(return_indices=True):
-            print(exp_type, frq, offset, point, time)
-
-            # If different, count 1 graph.
-            if offset != offset_i or point != point_i:
-                offset_i = offset
-                point_i = point
-                graph_nr += 1
-                print("Graph %i complete\n" % graph_nr)
-
-        print(graph_nr + 1)
+        graph_nr = 1
+        for exp_type, frq, offset, point in 
loop_exp_frq_offset_point(return_indices=False):
+            print("\nGraph nr %i" % graph_nr)
+            for time in loop_time(exp_type=exp_type, frq=frq, 
offset=offset, point=point):
+                print(exp_type, frq, offset, point, time)
+            graph_nr += 1
+
+        ## Possibly do an error analysis.

         # Check if intensity errors have already been calculated by the 
user.
         precalc = True
@@ -1425,13 +1414,111 @@
         model = 'R2eff'
         self.interpreter.relax_disp.select_model(model)

+        for spin, spin_id in spin_loop(return_id=True, skip_desel=True):
+            #delattr(spin, 'r2eff')
+            #delattr(spin, 'r2eff_err')
+            #delattr(spin, 'i0')
+            #delattr(spin, 'i0_err')
+            setattr(spin, 'r2eff', {})
+            setattr(spin, 'r2eff_err', {})
+            setattr(spin, 'i0', {})
+            setattr(spin, 'i0_err', {})
+
         # Do Grid Search
-        self.interpreter.minimise.grid_search(lower=None, upper=None, 
inc=11, constraints=True, verbosity=1)
+        self.interpreter.minimise.grid_search(lower=None, upper=None, 
inc=21, constraints=True, verbosity=1)
+
+        # Start dic.
+        my_dic = {}
+
+        # Loop over each spectrometer frequency and dispersion point.
+        for cur_spin, mol_name, resi, resn, spin_id in 
spin_loop(full_info=True, return_id=True, skip_desel=True):
+            # Add key to dic.
+            my_dic[spin_id] = {}
+
+            # Generate spin string.
+            spin_string = generate_spin_string(spin=cur_spin, 
mol_name=mol_name, res_num=resi, res_name=resn)
+
+            # Loop over the parameters.
+            #print("Grid optimised parameters for spin: %s" % 
(spin_string))
+
+            for exp_type, frq, offset, point in 
loop_exp_frq_offset_point():
+                # Generate the param_key.
+                param_key = return_param_key_from_data(exp_type=exp_type, 
frq=frq, offset=offset, point=point)
+
+                # Add key to dic.
+                my_dic[spin_id][param_key] = {}
+
+                # Get the value.
+                R2eff_value = getattr(cur_spin, 'r2eff')[param_key]
+                i0_value = getattr(cur_spin, 'i0')[param_key]
+
+                # Save to dic.
+                my_dic[spin_id][param_key]['R2eff_value_grid'] = 
R2eff_value
+                my_dic[spin_id][param_key]['i0_value_grid'] = i0_value
+
+                ## Now try do a line of best fit by least squares.
+                # The peak intensities, errors and times.
+                values = []
+                errors = []
+                times = []
+                for time in loop_time(exp_type=exp_type, frq=frq, 
offset=offset, point=point):
+                    values.append(average_intensity(spin=cur_spin, 
exp_type=exp_type, frq=frq, offset=offset, point=point, time=time, 
sim_index=None))
+                    errors.append(average_intensity(spin=cur_spin, 
exp_type=exp_type, frq=frq, offset=offset, point=point, time=time, 
error=True))
+                    times.append(time)
+
+                # y= A exp(x * k)
+                # w[i] = ln(y[i])
+                # int[i] = i0 * exp( - times[i] * r2eff);
+                w = log(array(values))
+                x = - array(times)
+                n = len(times)
+
+                b = (sum(x*w) - 1./n * sum(x) * sum(w) ) / ( sum(x**2) - 
1./n * (sum(x))**2 )
+                a = 1./n * sum(w) - b * 1./n * sum(x)
+                R2eff_est = b
+                i0_est = exp(a)
+
+                my_dic[spin_id][param_key]['R2eff_est'] = R2eff_est
+                my_dic[spin_id][param_key]['i0_est'] = i0_est
+
+                # Print value.
+                #print("%-10s %-6s %-6s %3.1f : %3.1f" % ("Parameter:", 
'R2eff', "Value : Estimated:", R2eff_value, R2eff_est))
+                #print("%-10s %-6s %-6s %3.1f : %3.1f" % ("Parameter:", 
'i0', "Value: Estimated:", i0_value, i0_est))
+

         # Do minimisation.
-        set_func_tol = 1e-11
-        set_max_iter = 10000
+        set_func_tol = 1e-25
+        set_max_iter = int(1e7)
         self.interpreter.minimise.execute(min_algor='simplex', 
func_tol=set_func_tol, max_iter=set_max_iter, constraints=True, 
scaling=True, verbosity=1)
+
+        # Loop over each spectrometer frequency and dispersion point.
+        for cur_spin, mol_name, resi, resn, spin_id in 
spin_loop(full_info=True, return_id=True, skip_desel=True):
+            # Generate spin string.
+            spin_string = generate_spin_string(spin=cur_spin, 
mol_name=mol_name, res_num=resi, res_name=resn)
+
+            # Loop over the parameters.
+            print("Optimised parameters for spin: %s" % (spin_string))
+
+            for exp_type, frq, offset, point in 
loop_exp_frq_offset_point():
+                # Generate the param_key.
+                param_key = return_param_key_from_data(exp_type=exp_type, 
frq=frq, offset=offset, point=point)
+
+                # Get the value.
+                R2eff_value = getattr(cur_spin, 'r2eff')[param_key]
+                i0_value = getattr(cur_spin, 'i0')[param_key]
+
+                # Extract from dic.
+                R2eff_value_grid = 
my_dic[spin_id][param_key]['R2eff_value_grid']
+                i0_value_grid = my_dic[spin_id][param_key]['i0_value_grid']
+                R2eff_est = my_dic[spin_id][param_key]['R2eff_est']
+                i0_est = my_dic[spin_id][param_key]['i0_est']
+
+                # Print value.
+                #print("%-10s %-6s %-6s %3.1f : %3.1f" % ("Parameter:", 
'R2eff', "Value : Estimated:", R2eff_value, R2eff_est))
+                #print("%-10s %-6s %-6s %3.1f : %3.1f" % ("Parameter:", 
'i0', "Value: Estimated:", i0_value, i0_est))
+
+                print("%-10s %-6s %-6s %3.1f : %3.1f: %3.1f" % 
("Parameter:", 'R2eff', "Grid : Min : Estimated:", R2eff_value_grid, 
R2eff_value, R2eff_est))
+                print("%-10s %-6s %-6s %3.1f : %3.1f: %3.1f" % 
("Parameter:", 'i0', "Grid : Min : Estimated:", i0_value_grid, i0_value, 
i0_est))


     def test_check_missing_r1(self):


_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-commits mailing list
relax-commits@xxxxxxx

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-commits



Related Messages


Powered by MHonArc, Updated Fri Aug 22 11:40:15 2014