Re: r22427 - /trunk/lib/rotating_frame.py

2014-03-07 Thread Troels Emtekær Linnet
Hi Edward.

How should I handle the value.write function?

I was thinking of adding w_eff and Delta_omega as parameters, like these
commits:
r22409 - /trunk/specific_analyses/relax_disp/api.py
http://www.mail-archive.com/relax-commits@gna.org/msg20031.html

r22411 - /trunk/specific_analyses/relax_disp/api.py
http://www.mail-archive.com/relax-commits@gna.org/msg20033.html

If I was about to use the value.write function, how should
I initialize a call to the function to calculate theta, Delta_omega?

Best
Troels



2014-03-07 12:26 GMT+01:00 Edward d'Auvergne edw...@nmr-relax.com:

 Hi Troels,

 One consideration you need to make for the functions of the relax
 library is that these are independent of the relax data store and the
 pipe_control package (used to manipulate the data store) and the
 specific_analyses package.  I.e. you should be able to use all
 functions without the rest of relax, hence it could be distributed
 with other GPL v3+ NMR software.  Here you have used a number of
 pipe_control.mol_res_spin and specific_analyses.relax_disp.disp_data
 functions.  Therefore this indicates that the code would be better
 located in the specific_analyses.relax_disp.disp_data module.  A
 calc_tilt_angle() function in the relax library would essentially need
 to take all its data as arguments (spin-lock field and offset and
 chemical shift) and return the tilt angle.

 The other problem is the storing of theta in the spin containers.
 This should not be done as the user can change the(spin-lock field,
 offset, or chemical shift and hence the tilt angle theta will change.
 It is much better to generate theta when needed by the
 relax_disp.plot_disp_curves user function, and then not store it (so
 it is destroyed automatically by Python).  Such non-permanent
 parameters are used extensively throughout relax, especially in the
 N-state or ensemble analysis code.

 Regards,

 Edward


 On 7 March 2014 11:42,  tlin...@nmr-relax.com wrote:
  Author: tlinnet
  Date: Fri Mar  7 11:42:36 2014
  New Revision: 22427
 
  URL: http://svn.gna.org/viewcvs/relax?rev=22427view=rev
  Log:
  Added lib.rotating_frame module containing functions related to rotating
 frame NMR calculations.
 
  Regarding sr #3124, (https://gna.org/support/index.php?3124) - Grace
 graphs production for R1rho analysis with R2_eff as function of Omega_eff.
 
  Added:
  trunk/lib/rotating_frame.py
 
  Added: trunk/lib/rotating_frame.py
  URL:
 http://svn.gna.org/viewcvs/relax/trunk/lib/rotating_frame.py?rev=22427view=auto
 
 ==
  --- trunk/lib/rotating_frame.py (added)
  +++ trunk/lib/rotating_frame.py Fri Mar  7 11:42:36 2014
  @@ -0,0 +1,77 @@
 
 +###
  +#
   #
  +# Copyright (C) 2014 Troels E. Linnet
   #
  +#
   #
  +# This file is part of the program relax (http://www.nmr-relax.com).
#
  +#
   #
  +# This program is free software: you can redistribute it and/or modify
#
  +# it under the terms of the GNU General Public License as published by
#
  +# the Free Software Foundation, either version 3 of the License, or
   #
  +# (at your option) any later version.
   #
  +#
   #
  +# This program is distributed in the hope that it will be useful,
   #
  +# but WITHOUT ANY WARRANTY; without even the implied warranty of
#
  +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   #
  +# GNU General Public License for more details.
#
  +#
   #
  +# You should have received a copy of the GNU General Public License
   #
  +# along with this program.  If not, see http://www.gnu.org/licenses/.
   #
  +#
   #
 
 +###
  +
  +# Module docstring.
  +Module containing functions related to rotating frame NMR
 calculations.
  +
  +# Python module imports.
  +from os import sep
  +
  +# relax module imports.
  +from pipe_control.mol_res_spin import find_index, get_spin_ids,
 index_molecule, index_residue, return_spin, spin_loop
  +from specific_analyses.relax_disp.disp_data import loop_exp_frq_offset,
 return_offset_data, return_param_key_from_data, return_spin_lock_nu1
  +
  +def calc_tilt_angle():
  +# Get the field count
  +field_count = cdp.spectrometer_frq_count
  +
  +# Get the spin_lock_field points
  +spin_lock_nu1 = return_spin_lock_nu1(ref_flag=False)
  +
  +# Initialize data containers
  +all_spin_ids = get_spin_ids()
  +
  +# Containers for only selected spins
  +cur_spin_ids = []
  +cur_spins = []
  +for curspin_id in all_spin_ids:
  +# Get the spin
  +curspin = return_spin(curspin_id)
  +
  +# Check if is selected
  +if curspin.select == True:
  +cur_spin_ids.append(curspin_id)
  +cur_spins.append(curspin)
  +
  +# The 

Re: r22427 - /trunk/lib/rotating_frame.py

2014-03-07 Thread Edward d'Auvergne
Hi,

I think that the value.write function is not the best for this, as
this data is too complicated.  It does not work for the dispersion
points either.  Nevertheless it can be used.  If you look at were the
value is obtained in the pipe_control.value.write_data() function, you
will see the lines:

# Get the value and error.
value, error = return_value(spin, param, bc=bc)

To see where return_value() comes from, look to the start of the function:

# Get the value and error returning function parameter description
function if required.
if not return_value:
return_value =
specific_analyses.setup.get_specific_fn('return_value',
pipes.get_type())
if not return_data_desc:
return_data_desc =
specific_analyses.setup.get_specific_fn('return_data_desc',
pipes.get_type())

So this is obtaining the function from the analysis specific API.  In
this case, the code is in specific_analyses.relax_disp.api.  Don't
worry about the return_data_desc() function as this defaults to the
descriptions you give in the self.PARAMS data structure.  From the
specific_analyses.relax_disp.api.Relax_disp.__init__() method, you
will see the function aliasing:

# Place methods into the API.
self.data_init = self._data_init_spin
self.model_type = self._model_type_local
self.return_conversion_factor = self._return_no_conversion_factor
self.return_value = self._return_value_general
self.set_param_values = self._set_param_values_spin

So the real function is the _return_value_general() method.  This is
in the specific analysis API common module,
specific_analyses.api_common.  Have a look at that method to
understand what it is doing.

Essentially what you would need to do is to override the method.  So
in specific_analyses.relax_disp.api you would remove the alias and
create a new return_value() method.  For a new method, you start by
copying the stub method in specific_analyses.api_base and the modify
that.  This specific_analyses.api_base module defines the analysis
specific API.

In the new method you would check if the 'param' argument is one of
the 'special' auto-generated parameters.  If so, you make the call to
the specific_analyses.relax_disp.disp_data functions that you need to
obtain the values, and then return them as a dictionary.  If the
parameter is not an auto-generated parameter, then call the API common
self._return_value_general() method (this is so you don't need to
reimplement all of the method).

A different way would be to have something like the
relax_disp.plot_disp_curves, but for writing the dispersion curves to
file.  This already exists in the relax_disp.write_disp_curves, this
creates one file per spin system and can be modified to handle
offsets, tilt angles and omega_eff as well.  Or modifying this
function could be complementary.

This is rather complex!  This is probably your first time working
directly with the analysis specific API, so it might take a little
while to understand it.

Regards,

Edward

On 7 March 2014 13:33, Troels Emtekær Linnet tlin...@nmr-relax.com wrote:
 Hi Edward.

 How should I handle the value.write function?

 I was thinking of adding w_eff and Delta_omega as parameters, like these
 commits:
 r22409 - /trunk/specific_analyses/relax_disp/api.py
 http://www.mail-archive.com/relax-commits@gna.org/msg20031.html

 r22411 - /trunk/specific_analyses/relax_disp/api.py
 http://www.mail-archive.com/relax-commits@gna.org/msg20033.html

 If I was about to use the value.write function, how should
 I initialize a call to the function to calculate theta, Delta_omega?

 Best
 Troels



 2014-03-07 12:26 GMT+01:00 Edward d'Auvergne edw...@nmr-relax.com:

 Hi Troels,

 One consideration you need to make for the functions of the relax
 library is that these are independent of the relax data store and the
 pipe_control package (used to manipulate the data store) and the
 specific_analyses package.  I.e. you should be able to use all
 functions without the rest of relax, hence it could be distributed
 with other GPL v3+ NMR software.  Here you have used a number of
 pipe_control.mol_res_spin and specific_analyses.relax_disp.disp_data
 functions.  Therefore this indicates that the code would be better
 located in the specific_analyses.relax_disp.disp_data module.  A
 calc_tilt_angle() function in the relax library would essentially need
 to take all its data as arguments (spin-lock field and offset and
 chemical shift) and return the tilt angle.

 The other problem is the storing of theta in the spin containers.
 This should not be done as the user can change the(spin-lock field,
 offset, or chemical shift and hence the tilt angle theta will change.
 It is much better to generate theta when needed by the
 relax_disp.plot_disp_curves user function, and then not store it (so
 it is destroyed automatically by Python).  Such non-permanent
 parameters are used extensively throughout relax, especially in the
 N-state or 

Re: r22427 - /trunk/lib/rotating_frame.py

2014-03-07 Thread Edward d'Auvergne
Oh, I forgot to mention the following.  Whenever you are in the
pipe_control modules and you need data from the specific analyses,
then you need to call the methods of the analysis specific API.  This
is the standardised way in relax to access specific data so that the
code, which is mainly user functions, will operate independently of
the analysis type.  This is how the value.write and grace.write user
functions automatically supports all analysis types.

Regards,

Edward



On 7 March 2014 15:48, Edward d'Auvergne edw...@nmr-relax.com wrote:
 Hi,

 I think that the value.write function is not the best for this, as
 this data is too complicated.  It does not work for the dispersion
 points either.  Nevertheless it can be used.  If you look at were the
 value is obtained in the pipe_control.value.write_data() function, you
 will see the lines:

 # Get the value and error.
 value, error = return_value(spin, param, bc=bc)

 To see where return_value() comes from, look to the start of the function:

 # Get the value and error returning function parameter description
 function if required.
 if not return_value:
 return_value =
 specific_analyses.setup.get_specific_fn('return_value',
 pipes.get_type())
 if not return_data_desc:
 return_data_desc =
 specific_analyses.setup.get_specific_fn('return_data_desc',
 pipes.get_type())

 So this is obtaining the function from the analysis specific API.  In
 this case, the code is in specific_analyses.relax_disp.api.  Don't
 worry about the return_data_desc() function as this defaults to the
 descriptions you give in the self.PARAMS data structure.  From the
 specific_analyses.relax_disp.api.Relax_disp.__init__() method, you
 will see the function aliasing:

 # Place methods into the API.
 self.data_init = self._data_init_spin
 self.model_type = self._model_type_local
 self.return_conversion_factor = self._return_no_conversion_factor
 self.return_value = self._return_value_general
 self.set_param_values = self._set_param_values_spin

 So the real function is the _return_value_general() method.  This is
 in the specific analysis API common module,
 specific_analyses.api_common.  Have a look at that method to
 understand what it is doing.

 Essentially what you would need to do is to override the method.  So
 in specific_analyses.relax_disp.api you would remove the alias and
 create a new return_value() method.  For a new method, you start by
 copying the stub method in specific_analyses.api_base and the modify
 that.  This specific_analyses.api_base module defines the analysis
 specific API.

 In the new method you would check if the 'param' argument is one of
 the 'special' auto-generated parameters.  If so, you make the call to
 the specific_analyses.relax_disp.disp_data functions that you need to
 obtain the values, and then return them as a dictionary.  If the
 parameter is not an auto-generated parameter, then call the API common
 self._return_value_general() method (this is so you don't need to
 reimplement all of the method).

 A different way would be to have something like the
 relax_disp.plot_disp_curves, but for writing the dispersion curves to
 file.  This already exists in the relax_disp.write_disp_curves, this
 creates one file per spin system and can be modified to handle
 offsets, tilt angles and omega_eff as well.  Or modifying this
 function could be complementary.

 This is rather complex!  This is probably your first time working
 directly with the analysis specific API, so it might take a little
 while to understand it.

 Regards,

 Edward

 On 7 March 2014 13:33, Troels Emtekær Linnet tlin...@nmr-relax.com wrote:
 Hi Edward.

 How should I handle the value.write function?

 I was thinking of adding w_eff and Delta_omega as parameters, like these
 commits:
 r22409 - /trunk/specific_analyses/relax_disp/api.py
 http://www.mail-archive.com/relax-commits@gna.org/msg20031.html

 r22411 - /trunk/specific_analyses/relax_disp/api.py
 http://www.mail-archive.com/relax-commits@gna.org/msg20033.html

 If I was about to use the value.write function, how should
 I initialize a call to the function to calculate theta, Delta_omega?

 Best
 Troels



 2014-03-07 12:26 GMT+01:00 Edward d'Auvergne edw...@nmr-relax.com:

 Hi Troels,

 One consideration you need to make for the functions of the relax
 library is that these are independent of the relax data store and the
 pipe_control package (used to manipulate the data store) and the
 specific_analyses package.  I.e. you should be able to use all
 functions without the rest of relax, hence it could be distributed
 with other GPL v3+ NMR software.  Here you have used a number of
 pipe_control.mol_res_spin and specific_analyses.relax_disp.disp_data
 functions.  Therefore this indicates that the code would be better
 located in the specific_analyses.relax_disp.disp_data module.  A
 calc_tilt_angle() function in the relax library