Author: tlinnet Date: Fri May 2 14:47:08 2014 New Revision: 22929 URL: http://svn.gna.org/viewcvs/relax?rev=22929&view=rev Log: Implemented synthetic CPMG systemtest. sr #3154: (https://gna.org/support/?3154) Implementation of Baldwin (2014) B14 model - 2-site exact solution model for all time scales. "This follows the tutorial for adding relaxation dispersion models at: http://wiki.nmr-relax.com/Tutorial_for_adding_relaxation_dispersion_models_to_relax#Adding_the_model_to_the_list" The B14 model is explained in: http://wiki.nmr-relax.com/B14. 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=22929&r1=22928&r2=22929&view=diff ============================================================================== --- trunk/test_suite/system_tests/relax_disp.py (original) +++ trunk/test_suite/system_tests/relax_disp.py Fri May 2 14:47:08 2014 @@ -639,6 +639,125 @@ relax_disp.Relax_disp.opt_max_iterations = 1000 relax_disp.Relax_disp(pipe_name='origin - relax_disp (Sun Feb 23 19:36:51 2014)', pipe_bundle='relax_disp (Sun Feb 23 19:36:51 2014)', results_dir=self.tmpdir, models=['R2eff', 'No Rex'], grid_inc=11, mc_sim_num=2, modsel='AIC', pre_run_dir=pre_run_dir, insignificance=1.0, numeric_only=True, mc_sim_all_models=False, eliminate=True) + + def test_cpmg_synthetic(self): + """Test synthetic cpmg data. + + This script will produce synthetic CPMG R2eff values according to the selected model, and the fit the selected model. + """ + + # Reset. + #self.interpreter.reset() + + ## Set Experiments. + model = "CR72" + # Exp 1 + sfrq_1 = 599.8908617*1E6 + r20_key_1 = generate_r20_key(exp_type=EXP_TYPE_CPMG_SQ, frq=sfrq_1) + time_T2_1 = 0.06 + ncycs_1 = [2, 4, 8, 10, 20, 30, 40, 60] + exp_1 = [sfrq_1, time_T2_1, ncycs_1] + + sfrq_2 = 499.8908617*1E6 + r20_key_2 = generate_r20_key(exp_type=EXP_TYPE_CPMG_SQ, frq=sfrq_2) + time_T2_2 = 0.05 + ncycs_2 = [2, 4, 8, 10, 30, 35, 40, 50] + exp_2 = [sfrq_2, time_T2_2, ncycs_2] + + # Collect all exps + exps = [exp_1, exp_2] + + spins = [ + ['Ala', 1, 'N', {'r2': {r20_key_1:2, r20_key_2:2}, 'kex': 1000, 'pA': 0.99, 'dw': 2} ] + ] + + # Collect the data to be used. + ds.data = [model, spins, exps] + + # The tmp directory. None is the local directory. + ds.tmpdir = ds.tmpdir + + # The results directory. None is the local directory. + #ds.resdir = None + ds.resdir = ds.tmpdir + + # Do set_grid_r20_from_min_r2eff ?. + ds.set_grid_r20_from_min_r2eff = True + + # Remove insignificant level. + ds.insignificance = 0.0 + + # The grid search size (the number of increments per dimension). + ds.GRID_INC = 8 + + # The function tolerance. This is used to terminate minimisation once the function value between iterations is less than the tolerance. + # The default value is 1e-25. + ds.set_func_tol = 1e-9 + + # The maximum number of iterations. + # The default value is 1e7. + ds.set_max_iter = 1000 + + # The verbosity level. + ds.verbosity = 1 + + # The rel_change WARNING level. + ds.rel_change = 0.05 + + # The plot_curves. + ds.plot_curves = False + + # The set r2eff err. + ds.r2eff_err = 0.1 + + # The print result info. + ds.print_res = False + + # Execute the script. + self.interpreter.run(script_file=status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'relax_disp'+sep+'cpmg_synthetic.py') + + cur_spins = ds.data[1] + # Compare results. + for i in range(len(cur_spins)): + res_name, res_num, spin_name, params = cur_spins[i] + cur_spin_id = ":%i@%s"%(res_num, spin_name) + cur_spin = return_spin(cur_spin_id) + + grid_params = ds.grid_results[i][3] + min_params = ds.min_results[i][3] + # Now read the parameters. + print("For spin: '%s'"%cur_spin_id) + for mo_param in cur_spin.params: + # The R2 is a dictionary, depending on spectrometer frequency. + if isinstance(getattr(cur_spin, mo_param), dict): + grid_r2 = grid_params[mo_param] + min_r2 = min_params[mo_param] + set_r2 = params[mo_param] + for key, val in set_r2.items(): + grid_r2_frq = grid_r2[key] + min_r2_frq = min_r2[key] + set_r2_frq = set_r2[key] + frq = float(key.split(EXP_TYPE_CPMG_SQ+' - ')[-1].split('MHz')[0]) + rel_change = math.sqrt( (min_r2_frq - set_r2_frq)**2/(min_r2_frq)**2 ) + print("%s %s %s %s %.1f GRID=%.3f MIN=%.3f SET=%.3f RELC=%.3f"%(cur_spin.model, res_name, cur_spin_id, mo_param, frq, grid_r2_frq, min_r2_frq, set_r2_frq, rel_change) ) + if rel_change > ds.rel_change: + print("WARNING: rel change level is above %.2f, and is %.4f."%(ds.rel_change, rel_change)) + print("###################################") + + ## Make test on R2. + self.assertAlmostEqual(set_r2_frq, min_r2_frq, 6) + else: + grid_val = grid_params[mo_param] + min_val = min_params[mo_param] + set_val = params[mo_param] + rel_change = math.sqrt( (min_val - set_val)**2/(min_val)**2 ) + print("%s %s %s %s GRID=%.3f MIN=%.3f SET=%.3f RELC=%.3f"%(cur_spin.model, res_name, cur_spin_id, mo_param, grid_val, min_val, set_val, rel_change) ) + if rel_change > ds.rel_change: + print("WARNING: rel change level is above %.2f, and is %.4f."%(ds.rel_change, rel_change)) + print("###################################") + + ## Make test on parameters. + self.assertAlmostEqual(set_val, min_val, 10) def test_curve_type_cpmg_fixed_time(self): """Test the curve type detection using the Dr. Flemming Hansen's CPMG fixed time test data."""