Hi, If you have the time and would like to implement this, such a change must be done for the entire specific API. It cannot be just for the relaxation dispersion analysis. The API change must be complete - otherwise the changes will not be accepted as that will result in huge amounts of maintenance work for me in the future, much more than the effort of making the API consistent for all analyses. Though if you set up one analysis type, the rest should be easy (half don't perform minimisation, so the grid limits are not defined). The best way to implement this would be:
- Create a new svn branch from the trunk for the developments. - Add the self._grid_lower and self._grid_upper objects and corresponding arguments to specific_analyses.parameter_objects. - Go into specific_analyses, and run 'grep lower.append */*' to see all the places this needs changing. - Shift all of these hard coded values into the specific parameter_object modules. - Import the parameter_object singleton into the modules requiring the default bounds. - Replace all the hard coded values with the parameter_object.grid_lower() and parameter_object.grid_upper() function calls. Note the places where the limits are dynamically changed - these must remain. - Make sure the test suite passes. - Ask for the branch to be merged back. The API function grid_lower() should not be added, as these methods are really designed for use outside of the specific API. If you wish to do this, feel free. Regards, Edward On 28 May 2014 15:00, Troels Emtekær Linnet <[email protected]> wrote: > Hi Ed. > > I would like to collect the grid seach lower and upper bounds into the table > of > specific_analysis/relax_disp/parameter_object.py > > This is to make one place, where such details are collected. > > And the lower and upper bounds can be extracted for unit tests, and > for example dx.map more easily. > > I have worked it out for lower bounds of pA, and tested it. > > --- a/specific_analyses/api_base.py > +++ b/specific_analyses/api_base.py > @@ -314,6 +314,22 @@ class API_base(object): > raise RelaxImplementError('grid_search') > > > + def grid_lower(self, param): > + """Return the default lower bounds of paramater for the grid search. > + > + This basic method will first search for a global parameter > and, if not found, then a spin parameter. > + > + > + @param param: The specific analysis parameter. > + @type param: str > + @return: The default value. > + @rtype: float > + """ > + > + # Return the value. > + return self._PARAMS.grid_lower(param) > + > + > def has_errors(self): > """Test if errors exist for the current data pipe. > > diff --git a/specific_analyses/parameter_object.py > b/specific_analyses/parameter_object.py > index b626a83..8e7abab 100644 > --- a/specific_analyses/parameter_object.py > +++ b/specific_analyses/parameter_object.py > @@ -54,6 +54,7 @@ class Param_list(object): > self._scope = {} > self._string = {} > self._defaults = {} > + self._grid_lowers = {} > self._units = {} > self._desc = {} > self._py_types = {} > @@ -92,7 +93,7 @@ class Param_list(object): > return cls._instance > > > - def _add(self, name, scope=None, string=None, default=None, > units=None, desc=None, py_type=None, set='all', conv_factor=None, > grace_string=None, err=False, sim=False): > + def _add(self, name, scope=None, string=None, default=None, > grid_lower=None, units=None, desc=None, py_type=None, set='all', > conv_factor=None, grace_string=None, err=False, sim=False): > """Add a parameter to the list. > > @param name: The name of the parameter. This will > be used as the variable name. > @@ -103,6 +104,8 @@ class Param_list(object): > @type string: None or str > @keyword default: The default value of the parameter. > @type default: anything > + @keyword grid_lower: The default lower bounds of the grid search. > + @type grid_lower: float > @keyword units: A string representing the parameters units. > @type units: None or str > @keyword desc: The text description of the parameter. > @@ -134,6 +137,7 @@ class Param_list(object): > self._names.append(name) > self._scope[name] = scope > self._defaults[name] = default > + self._grid_lowers[name] = grid_lower > self._units[name] = units > self._desc[name] = desc > self._py_types[name] = py_type > @@ -540,6 +544,22 @@ class Param_list(object): > return self._grace_string[name] > > > + def grid_lower(self, name): > + """Return the default lower bounds of paramater for the grid search. > + > + @param name: The name of the parameter. > + @type name: str > + @return: The default value. > + @rtype: None or str > + """ > + > + # Parameter check. > + self.check_param(name) > + > + # Return the default value. > + return self._grid_lowers[name] > + > + > def is_spin_param(self, name): > """Determine whether the given parameter is spin specific. > > diff --git a/specific_analyses/relax_disp/optimisation.py > b/specific_analyses/relax_disp/optimisation.py > index a92922e..82bd364 100644 > --- a/specific_analyses/relax_disp/optimisation.py > +++ b/specific_analyses/relax_disp/optimisation.py > @@ -38,6 +38,7 @@ from lib.errors import RelaxError > from lib.text.sectioning import subsection > from multi import Memo, Result_command, Slave_command > from pipe_control.mol_res_spin import spin_loop > +from specific_analyses.api import return_api > from specific_analyses.relax_disp.checks import check_disp_points, > check_exp_type, check_exp_type_fixed_time > from specific_analyses.relax_disp.data import average_intensity, > count_spins, find_intensity_keys, has_exponential_exp_type, > has_proton_mmq_cpmg, loop_exp, loop_exp_frq_offset_point, > loop_exp_frq_offset_point_time, loop_frq, loop_offset, loop_time, > pack_back_calc_r2eff, return_cpmg_frqs, return_offset_data, > return_param_key_from_data, return_r1_data, return_r2eff_arrays, > return_spin_lock_nu1 > from specific_analyses.relax_disp.parameters import > assemble_param_vector, assemble_scaling_matrix, > disassemble_param_vector, linear_constraints, loop_parameters, > param_conversion, param_num > @@ -296,6 +297,9 @@ def grid_search_setup(spins=None, spin_ids=None, > param_vector=None, lower=None, > elif isinstance(inc, int): > inc = [inc]*n > > + # The specific analysis API object. > + api = return_api() > + > # Set up the default bounds. > if not lower: > # Init. > @@ -357,7 +361,9 @@ def grid_search_setup(spins=None, spin_ids=None, > param_vector=None, lower=None, > if spins[si].model == MODEL_M61B: > lower.append(0.85) > else: > - lower.append(0.5) > + #lower.append(0.5) > + lower.append(api.grid_lower('pA')) > + #lower.append(api.default_value('pA')) > upper.append(1.0) > > # The population of state B (for 3-site exchange). > diff --git a/specific_analyses/relax_disp/parameter_object.py > b/specific_analyses/relax_disp/parameter_object.py > index 936d2b1..21dfe99 100644 > --- a/specific_analyses/relax_disp/parameter_object.py > +++ b/specific_analyses/relax_disp/parameter_object.py > @@ -61,7 +61,7 @@ class Relax_disp_params(Param_list): > self._add('r2', scope='spin', default=10.0, desc='The > transversal relaxation rate', set='params', py_type=dict, > grace_string='\\qR\\s2\\N\\Q (rad.s\\S-1\\N)', err=True, sim=True) > self._add('r2a', scope='spin', default=10.0, desc='The > transversal relaxation rate for state A in the absence of exchange', > set='params', py_type=dict, grace_string='\\qR\\s2,A\\N\\Q > (rad.s\\S-1\\N)', err=True, sim=True) > self._add('r2b', scope='spin', default=10.0, desc='The > transversal relaxation rate for state B in the absence of exchange', > set='params', py_type=dict, grace_string='\\qR\\s2,B\\N\\Q > (rad.s\\S-1\\N)', err=True, sim=True) > - self._add('pA', scope='spin', default=0.90, desc='The > population for state A', set='params', py_type=float, > grace_string='\\qp\\sA\\N\\Q', err=True, sim=True) > + self._add('pA', scope='spin', default=0.90, grid_lower=0.6, > desc='The population for state A', set='params', py_type=float, > grace_string='\\qp\\sA\\N\\Q', err=True, sim=True) > self._add('pB', scope='spin', default=0.5, desc='The > population for state B', set='params', py_type=float, > grace_string='\\qp\\sB\\N\\Q', err=True, sim=True) > self._add('pC', scope='spin', default=0.5, desc='The > population for state C', set='params', py_type=float, > grace_string='\\qp\\sC\\N\\Q', err=True, sim=True) > self._add('phi_ex', scope='spin', default=5.0, desc='The > phi_ex = pA.pB.dw**2 value (ppm^2)', set='params', py_type=float, > grace_string='\\xF\\B\\sex\\N = \\q > p\\sA\\N.p\\sB\\N.\\xDw\\B\\S2\\N\\Q (ppm\\S2\\N)', err=True, > sim=True) > > Best > Troels > > _______________________________________________ > relax (http://www.nmr-relax.com) > > This is the relax-devel mailing list > [email protected] > > 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-devel _______________________________________________ relax (http://www.nmr-relax.com) This is the relax-devel mailing list [email protected] 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-devel

