A small correction, the target function switching code should have been: if model == MODEL_DPL94: if r1_fit: self.func = self.func_DPL94_fit_r1 else: self.func = self.func_DPL94
Regards, Edward On 20 August 2014 17:34, Edward d'Auvergne <edw...@nmr-relax.com> wrote: > It's a thin wall that needs to be broken. For the backend of the > relax_disp.select_model, we shouldn't do anything. We make the > decision at the point of the grid_search() and minimise() API methods > if we should prefix the model parameter lists with R1. As > grid_search() calls minimise(), then we do this once in minimise(). > Even better would be in the > specific_analyses.relax_disp.optimisation.Disp_minimise_command class > just after the R1 data is assembled. > > We could create a new function called > specific_analyses.relax_disp.data.r1_optimisation() which decides if > R1 values are to be optimised. This can be easily extended in the > future by someone else to handle CPMG data as well. This function > returns True or False and this can be stored as the self.r1_fit flag > in Disp_minimise_command. If self.r1_fit is True, we can then call > specific_analyses.relax_disp.parameters.prefix_r1() which adds the > required R1 parameters to the spin container 'param' list. Then when > setting up the target function class in Disp_minimise_command.run(), > the self.r1_fit flag is sent in. The target function class __init__() > method then uses the r1_fit flag to choose which target function > method will be aliased to self.func by adding an extra set of if > statements. I.e. change: > > if model == MODEL_DPL94: > self.func = self.func_DPL94 > if model == MODEL_DPL94_FIT_R1: > self.func = self.func_DPL94_fit_r1 > > To: > > if model == MODEL_DPL94: > if r1_fit: > self.func = self.func_DPL94 > else: > self.func = self.func_DPL94_fit_r1 > > The specific_analyses.relax_disp.data.r1_optimisation() function can > be called at any time that the R1 data is accessed, for example the > unpacking of the parameter values (though in this case the r1_fit flag > could be passed into the Disp_result_command to avoid this call). > That's pretty much it. I don't think anything else is required. Am I > missing something important? > > Cheers, > > Edawrd > > On 20 August 2014 17:14, Troels Emtekær Linnet <tlin...@nmr-relax.com> wrote: >> Heh. >> >> I think I tried the solution you suggested. >> >> But I think you will run into several problems, that the parameters is >> no longer setup correct. >> >> The issuing of: >> relax_disp.select_model(model=MODEL) >> >> does "alot" of stuff. >> >> The problems starts about the initialisation of the dispersion class. >> >> One hits a wall of problems, which I surely cannot recommend. >> >> Best >> Troels >> >> >> 2014-08-20 17:07 GMT+02:00 Edward d'Auvergne <edw...@nmr-relax.com>: >>> Hi, >>> >>> Not loading the R1 data and then fitting it is good, especially if it >>> is automatic. As long as a RelaxWarning is printed out to inform the >>> user. The target function switching is much simpler than the model >>> name translation. For example simply send in a r1_fit flag to the >>> target function __init__() method and then add some more if statements >>> to the end of that method. It would make it even more automatic from >>> the perspective of the user. >>> >>> As I said, you've already done the hard part. The infrastructure you >>> added is there now for handling this. You have implemented all >>> required target functions and associated functions for handling the R1 >>> fitting. The changes we are discussing are trivial in comparison. >>> >>> Regards, >>> >>> Edward >>> >>> >>> >>> On 20 August 2014 16:56, Troels Emtekær Linnet <tlin...@nmr-relax.com> >>> wrote: >>>> Hi Edward. >>>> >>>> I actually think it is a quite elegant solution, that if one does not >>>> load R1 data, then the R1 parameter is fitted. >>>> >>>> I think it is a better solution than the previous suggestion. >>>> >>>> It involves less coding, and the logic is sound. >>>> >>>> And the system is still "open" for weird stuff, whereby you by >>>> scripting can analyse with and without fitting R1 in same analyses. >>>> >>>> I think this is best. >>>> >>>> But in the end. Potato, tomato. >>>> If this solution prevents any further implementation, then this could >>>> also be done. >>>> >>>> Best >>>> Troels >>>> >>>> >>>> 2014-08-20 16:48 GMT+02:00 Edward d'Auvergne <edw...@nmr-relax.com>: >>>>> An easy system test would be to load a set of CPMG data and a set of >>>>> R1rho data, and then see if this can be analysed assuming no exchange >>>>> via the 'No Rex' models. There are no other models for this yet, but >>>>> it would show what is missing. You've added the infrastructure which >>>>> is the hardest part. What remains to allow this is actually not much >>>>> at all now that the infrastructure is in place. Just a bit of gluing >>>>> code. >>>>> >>>>> On a related note, what is your opinion on the suggestions you made in >>>>> sr #3135 at https://gna.org/support/?3135#comment0 "Optimisation of >>>>> the R1 relaxation rate for the off-resonance R1rho relaxation >>>>> dispersion models."? Namely that we let the user choose if R1 values >>>>> are optimised or not for off-resonance data, whether or not R1 values >>>>> were loaded. So then the '* R1 fit' models are merged into the >>>>> non-fitted models, and the target function switching occurs without >>>>> the user knowing. You should note that the target function switching >>>>> is far simpler than the current model name translation system. It >>>>> just requires a few more if statements at the end of the target >>>>> function __init__() method to alias the correct self.func_*() method. >>>>> >>>>> Regards, >>>>> >>>>> Edward >>>>> >>>>> >>>>> On 20 August 2014 16:36, Troels Emtekær Linnet <tlin...@nmr-relax.com> >>>>> wrote: >>>>>> Hi Edward. >>>>>> >>>>>> I think I in the start tried following this path. >>>>>> >>>>>> But I realised with all the "R1 fit" models, that the very important, >>>>>> relax_disp.select_model(model) >>>>>> >>>>>> setup all information for this model. >>>>>> >>>>>> As this was also a new model implementation, I also wanted the >>>>>> flexibility to be able to select the desired model, and >>>>>> be able to compare. >>>>>> >>>>>> I would suggest that this functionality is not digged further down the >>>>>> code, before more experience is collected. >>>>>> >>>>>> Best >>>>>> Troels >>>>>> >>>>>> >>>>>> >>>>>> 2014-08-20 16:22 GMT+02:00 Edward d'Auvergne <edw...@nmr-relax.com>: >>>>>>> Hi, >>>>>>> >>>>>>> What would be even more powerful would be to shift this functionality >>>>>>> even deeper down and merging the 'No Rex' and 'No Rex R1rho off res' >>>>>>> models into one, just as the 'R2eff' model covers both the exponential >>>>>>> curve-fitting via minimisation and the two-point approximation by >>>>>>> calculation. Rather than switching the model name for the user, the >>>>>>> target function can be switched. The 'No Rex R1 fit' model could then >>>>>>> be created (by simply renaming 'No Rex R1rho off res R1 fit') and this >>>>>>> would then eventually handle CPMG data as well. >>>>>>> >>>>>>> The reason for this is simple. In the future, certain interested >>>>>>> parties (you probably know who) plans on developing a combined CPMG >>>>>>> and R1rho model and on analysing this data together. This will need a >>>>>>> 'No Rex' model for statistical comparisons. The splitting of 'No Rex' >>>>>>> into two models as is currently coded is incompatible with this. A >>>>>>> 'No Rex' model which has a loop over experiment types "for ei in >>>>>>> range(self.NE):" switching to the different functionality would be a >>>>>>> better solution. >>>>>>> >>>>>>> Regards, >>>>>>> >>>>>>> Edward >>>>>>> >>>>>>> >>>>>>> On 20 August 2014 16:09, <tlin...@nmr-relax.com> wrote: >>>>>>>> Author: tlinnet >>>>>>>> Date: Wed Aug 20 16:09:40 2014 >>>>>>>> New Revision: 25100 >>>>>>>> >>>>>>>> URL: http://svn.gna.org/viewcvs/relax?rev=25100&view=rev >>>>>>>> Log: >>>>>>>> Made the GUI selection of models for relaxation dispersion more simple. >>>>>>>> >>>>>>>> After the implementation of a function which will translate the >>>>>>>> models, the >>>>>>>> 'No Rex' model will be converted to the 'No Rex' model for R1rho >>>>>>>> off-resonance. >>>>>>>> >>>>>>>> Also the corresponding 'R1 fit' model will be chosen istead, if R1 >>>>>>>> data has not been loaded. >>>>>>>> >>>>>>>> This makes the model selection easier in the GUI interface. >>>>>>>> >>>>>>>> Modified: >>>>>>>> trunk/gui/analyses/auto_relax_disp.py >>>>>>>> >>>>>>>> Modified: trunk/gui/analyses/auto_relax_disp.py >>>>>>>> URL: >>>>>>>> http://svn.gna.org/viewcvs/relax/trunk/gui/analyses/auto_relax_disp.py?rev=25100&r1=25099&r2=25100&view=diff >>>>>>>> ============================================================================== >>>>>>>> --- trunk/gui/analyses/auto_relax_disp.py (original) >>>>>>>> +++ trunk/gui/analyses/auto_relax_disp.py Wed Aug 20 16:09:40 >>>>>>>> 2014 >>>>>>>> @@ -715,8 +715,8 @@ >>>>>>>> MODEL_R2EFF, >>>>>>>> None, >>>>>>>> MODEL_NOREX, >>>>>>>> - MODEL_NOREX_R1RHO, >>>>>>>> - MODEL_NOREX_R1RHO_FIT_R1, >>>>>>>> +# MODEL_NOREX_R1RHO, >>>>>>>> +# MODEL_NOREX_R1RHO_FIT_R1, >>>>>>>> None, >>>>>>>> MODEL_LM63, >>>>>>>> MODEL_LM63_3SITE, >>>>>>>> @@ -735,15 +735,15 @@ >>>>>>>> MODEL_M61, >>>>>>>> MODEL_M61B, >>>>>>>> MODEL_DPL94, >>>>>>>> - MODEL_DPL94_FIT_R1, >>>>>>>> +# MODEL_DPL94_FIT_R1, >>>>>>>> MODEL_TP02, >>>>>>>> - MODEL_TP02_FIT_R1, >>>>>>>> +# MODEL_TP02_FIT_R1, >>>>>>>> MODEL_TAP03, >>>>>>>> - MODEL_TAP03_FIT_R1, >>>>>>>> +# MODEL_TAP03_FIT_R1, >>>>>>>> MODEL_MP05, >>>>>>>> - MODEL_MP05_FIT_R1, >>>>>>>> +# MODEL_MP05_FIT_R1, >>>>>>>> MODEL_NS_R1RHO_2SITE, >>>>>>>> - MODEL_NS_R1RHO_2SITE_FIT_R1, >>>>>>>> +# MODEL_NS_R1RHO_2SITE_FIT_R1, >>>>>>>> MODEL_NS_R1RHO_3SITE_LINEAR, >>>>>>>> MODEL_NS_R1RHO_3SITE, >>>>>>>> None, >>>>>>>> @@ -756,8 +756,8 @@ >>>>>>>> "{%s/%s, %s}" % (r2eff, r1rho, i0), >>>>>>>> None, >>>>>>>> "{%s, ...}" % (r2), >>>>>>>> - "{%s, ...}" % (r2), >>>>>>>> - "{%s, %s, ...}" % (r1, r2), >>>>>>>> +# "{%s, ...}" % (r2), >>>>>>>> +# "{%s, %s, ...}" % (r1, r2), >>>>>>>> None, >>>>>>>> "{%s, ..., %s, %s}" % (r2, phi_ex, kex), >>>>>>>> "{%s, ..., %s, kB, %s, kC}" % (r2, phi_exB, phi_exC), >>>>>>>> @@ -776,15 +776,15 @@ >>>>>>>> "{%s, ..., %s, %s}" % (r1rho_prime, phi_ex, kex), >>>>>>>> "{%s, ..., pA, %s, %s}" % (r1rho_prime, dw, kex), >>>>>>>> "{%s, ..., %s, %s}" % (r1rho_prime, phi_ex, kex), >>>>>>>> - "{%s, %s, ..., %s, %s}" % (r1, r1rho_prime, phi_ex, kex), >>>>>>>> +# "{%s, %s, ..., %s, %s}" % (r1, r1rho_prime, phi_ex, kex), >>>>>>>> "{%s, ..., pA, %s, %s}" % (r1rho_prime, dw, kex), >>>>>>>> - "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> +# "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> "{%s, ..., pA, %s, %s}" % (r1rho_prime, dw, kex), >>>>>>>> - "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> +# "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> "{%s, ..., pA, %s, %s}" % (r1rho_prime, dw, kex), >>>>>>>> - "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> +# "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> "{%s, ..., pA, %s, %s}" % (r1rho_prime, dw, kex), >>>>>>>> - "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> +# "{%s, %s, ..., pA, %s, %s}" % (r1, r1rho_prime, dw, kex), >>>>>>>> "{%s, ..., pA, %s, %s, pB, %s, %s}" % (r1rho_prime, dw_AB, >>>>>>>> kAB, dw_BC, kBC), >>>>>>>> "{%s, ..., pA, %s, %s, pB, %s, %s, %s}" % (r1rho_prime, >>>>>>>> dw_AB, kAB, dw_BC, kBC, kAC), >>>>>>>> None, >>>>>>>> @@ -797,8 +797,8 @@ >>>>>>>> "The base model for determining the %s/%s values and errors >>>>>>>> for all other models." % (r2eff, r1rho), >>>>>>>> None, >>>>>>>> "The model for no chemical exchange relaxation.", >>>>>>>> - "The model for no chemical exchange being present, for >>>>>>>> off-resonance R1rho-type experiments. R1rho = R1 * cos(theta)^2 + >>>>>>>> r1rho_prime * sin(theta)^2.", >>>>>>>> - "The model for no chemical exchange being present, for >>>>>>>> off-resonance R1rho-type experiments whereby R1 is fit. R1rho = R1 * >>>>>>>> cos(theta)^2 + r1rho_prime * sin(theta)^2.", >>>>>>>> +# "The model for no chemical exchange being present, for >>>>>>>> off-resonance R1rho-type experiments. R1rho = R1 * cos(theta)^2 + >>>>>>>> r1rho_prime * sin(theta)^2.", >>>>>>>> +# "The model for no chemical exchange being present, for >>>>>>>> off-resonance R1rho-type experiments whereby R1 is fit. R1rho = R1 * >>>>>>>> cos(theta)^2 + r1rho_prime * sin(theta)^2.", >>>>>>>> None, >>>>>>>> "The original Luz and Meiboom (1963) 2-site fast exchange >>>>>>>> equation.", >>>>>>>> "The original Luz and Meiboom (1963) 3-site fast exchange >>>>>>>> equation.", >>>>>>>> @@ -817,15 +817,15 @@ >>>>>>>> "The Meiboom (1961) 2-site fast exchange equation.", >>>>>>>> "The Meiboom (1961) 2-site equation for all time scales with >>>>>>>> pA >> pB.", >>>>>>>> "The Davis, Perlman and London (1994) 2-site fast exchange >>>>>>>> equation.", >>>>>>>> - "The Davis, Perlman and London (1994) 2-site fast exchange >>>>>>>> equation, whereby R1 is fit.", >>>>>>>> +# "The Davis, Perlman and London (1994) 2-site fast exchange >>>>>>>> equation, whereby R1 is fit.", >>>>>>>> "The Trott and Palmer (2002) 2-site equation for all time >>>>>>>> scales.", >>>>>>>> - "The Trott and Palmer (2002) 2-site equation for all time >>>>>>>> scales, whereby R1 is fit.", >>>>>>>> +# "The Trott and Palmer (2002) 2-site equation for all time >>>>>>>> scales, whereby R1 is fit.", >>>>>>>> "The Trott, Abergel and Palmer (2003) off-resonance 2-site >>>>>>>> equation for all time scales.", >>>>>>>> - "The Trott, Abergel and Palmer (2003) off-resonance 2-site >>>>>>>> equation for all time scales, whereby R1 is fit.", >>>>>>>> +# "The Trott, Abergel and Palmer (2003) off-resonance 2-site >>>>>>>> equation for all time scales, whereby R1 is fit.", >>>>>>>> "The Miloushev and Palmer (2005) off-resonance 2-site >>>>>>>> equation for all time scales.", >>>>>>>> - "The Miloushev and Palmer (2005) off-resonance 2-site >>>>>>>> equation for all time scales, whereby R1 is fit.", >>>>>>>> +# "The Miloushev and Palmer (2005) off-resonance 2-site >>>>>>>> equation for all time scales, whereby R1 is fit.", >>>>>>>> "The 2-site numerical solution using 3D magnetisation >>>>>>>> vectors.", >>>>>>>> - "The 2-site numerical solution using 3D magnetisation >>>>>>>> vectors, whereby R1 is fit.", >>>>>>>> +# "The 2-site numerical solution using 3D magnetisation >>>>>>>> vectors, whereby R1 is fit.", >>>>>>>> "The 3-site linearised numerical solution using 3D >>>>>>>> magnetisation vectors.", >>>>>>>> "The 3-site numerical solution using 3D magnetisation >>>>>>>> vectors.", >>>>>>>> None, >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> relax (http://www.nmr-relax.com) >>>>>>>> >>>>>>>> This is the relax-commits mailing list >>>>>>>> relax-comm...@gna.org >>>>>>>> >>>>>>>> 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 >>>>>>> >>>>>>> _______________________________________________ >>>>>>> relax (http://www.nmr-relax.com) >>>>>>> >>>>>>> This is the relax-devel mailing list >>>>>>> relax-devel@gna.org >>>>>>> >>>>>>> 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 relax-devel@gna.org 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