I checked in a truncated harmonic (IMP.core.TruncatedHarmonicBound, TruncatedHarmonicLowerBound, TruncatedHarmonicUpperBound) for people to look at. It currently uses Frido's function, but can be easily changed to something else. I deliberately kept the documentation vague on the details of the internal function as I am not sure we want the exact nature to be important (at least until we come up with a function which we have a strong justification for). Anyway, let me know if you have comments.
On Jan 8, 2009, at 11:11 AM, Friedrich Foerster wrote:
> > > On Thu, Jan 8, 2009 at 7:58 PM, Daniel Russel drussel@gmail.com > wrote: > Having such a general function in IMP would be very nice (I was > using a non-smooth truncated harmonic before). Such a function > should not be dependent on the parameter tuning (since the > parameters would simply be passes by a user). > > Davide, if you have a version of your code which allows the user to > pass in the threshold and cutoff, we can put a version into core for > people to look at as a starting point. Otherwise, it would only take > me a few minutes to throw something together. > > It sounds like we would like something like: > > class TruncatedHarmonicLowerBound { > /** threshold > center, capped_value > .5*k*(center-threshold)^2 */ > TruncatedHarmonicLowerBound(Float center, Float k, Float > threshold, Float capped_value) > } > that'd be great. for me that'd help a lot > > If we use Frido's smooth function, capped_value could default to > k*(threshold-center)^2, i.e. 2x the value at the threshold to give > it space to go smoothly to the value. And we could have Upper and > symmetric versions too (as that is little more code). > also fine with me. > for the specific function: i just came up with 2-x^(-2) > spontaneously. i'd also be happy with another solution (morse, > fermi, ...) if that is advantageous. if anyone has a probabilistic > reasoning for a specific function, that'd be nice. > > thanks > > frido > > > On Jan 8, 2009, at 3:44 AM, Davide Baú wrote: > >> It's the exp() function of the standard cmath. >> Performance is indeed another thing to be improved. >> >> Davide >> >> >> >> On Thu, Jan 8, 2009 at 12:37 PM, Friedrich Foerster <foerster@biochem.mpg.de >> > wrote: >> thanks. >> >> just for info: isn't the exp() a bit slow, or are you using some >> dodgy macro? >> >> best >> >> frido >> >> >> On Jan 8, 2009, at 12:05 PM, Davide Baú wrote: >> >> Hi Frido, >> >> these are the methods I implemented so far in a new class Morse.h. >> >> The first one returns a constant score if feature is greater then >> threshold. At the moment the returned score is the Harmonic >> potential calculated when feature >= threshold (i.e. when feature >> is >= threshold, the returned score will always be >> Harmonic::evaluate(threshold) ). >> The second one implements the Morse potential as described by Marc. >> >> These methods are still in a development phase since there are some >> parameters which need to be better defined, such as the threshold >> to be applied and the parameters that define the Morse potential. >> >> Regards, >> Davide >> >> >> // 1. a function that is a Harmonic for x<std and constant for x>std >> /** If the feature is greater than or equal to the threshold, the >> score is constant. >> \param[in] feature Value of feature being tested. >> \return Score >> */ >> virtual Float evaluate(Float feature) const { >> Float k = Harmonic::get_k(); >> Float mean = Harmonic::get_mean(); >> Float threshold = 1.0 * mean + XYZRDecorator::get_radius(); >> if ( feature <= threshold ) { >> return Harmonic::evaluate(feature); >> } else { >> return evaluate_with_derivative(threshold, k).first; >> } >> } >> >> >> // 2. a function that is a Harmonic for x<std and asymptotically >> approaches a constant value for x-> inf: >> /** If the feature is greater than or equal to the threshold, >> apply the Morse potential. >> \param[in] feature Value of feature being tested. >> \return Score >> */ >> virtual Float evaluate(Float feature) const { >> Float mean = Harmonic::get_mean(); >> Float k = Harmonic::get_k(); >> Float threshold = 1.0 * mean + XYZRDecorator::get_radius(); >> >> // MORSE POTENTIAL PARAMETERS >> Float var = 1.0/k; >> Float alpha = 2.0; >> Float De = 40.0; >> Float beta = 1.0; >> Float swf = 0.0; >> >> if ( feature <= threshold ) { >> return Harmonic::evaluate(feature); >> } else { >> swf = beta * pow( ( 1.0 - exp( - sqrt( alpha/De ) * ( feature >> - threshold )/2.0 ) ), 2 ); // MORSE POTENTIAL >> return swf; >> } >> } >> >> >> >> >> >> On Thu, Jan 8, 2009 at 10:20 AM, Marc A. Marti-Renom >> mmarti@cipf.es wrote: >> Hi Frido, >> >> Indeed we are also in need of similar stuff. Davide Bau (a postdoc >> in my lab and also in the IMP-Dev list) has already implemented a >> sort of a MORSE potential in IMP restraints, which is not what you >> ask but may be similar. I implemented many many many years ago >> something similar in CHARMM (http://sgu.bioinfo.cipf.es/martirenom/Thesis/pdf/Thesis.pdf >> , Chapter 4 page 86). >> >> Unfortunately, we are NOT yet ready to commit the changes in the >> code to the SVN since we are in the middle of production phase (ie, >> making models) thus would prefer not to update IMP. But I am sure >> we could do soon. >> >> Davide, any comments? :-) >> >> m >> >> ------- >> Marc A. Marti-Renom, Head of the Structural Genomics Unit >> Bioinformatics & Genomics Department, Prince Felipe Research Center >> Avda. Autopista del Saler, 16 , 46012 Valencia, Spain >> Tel +34 96 328 96 80 (ext. 1015) Fax +34 96 328 97 01 >> email mmarti@cipf.es web http://sgu.bioinfo.cipf.es >> >> *** Consider the environment. Print responsibly. *** >> >> On Jan 8, 2009, at 10:00 AM, Friedrich Foerster wrote: >> >> hi all, >> >> when dealing with experimental restraints i often feel that >> harmonic restraints are somewhat unsatisfactory: >> experimental data can be wrong and thus there is not necessarily a >> solution that fulfills all restraints (score=0). in those cases, a >> model with a lower score is not necessarily any more correct than a >> higher scoring one. thus, i think it'd be good to have an >> additional scoring function that levels off if the feature exceeds >> a certain value. for example, i'd suggest the following two >> functions alternatively to Harmonic: >> 1. a function that is a Harmonic for x<std and constant for x>std >> 2. a function that is a Harmonic for x<std and asymptotically >> approaches a constant value for x-> inf: >> e.g.: f=x^2 for x<1 and f=2-x^-2 for x>1 (would even be >> continuous in 1st derivative) >> >> is anyone else also interested in something like that? >> any better suggestions? >> is any IMP core expert interested and willing to code that >> (including analogous functions for Upper and Lower Harmonic)? >> probably i'd be one of the slowest and clumsiest persons in doing >> that... >> >> thanks >> >> frido >> >> >> -- >> >> Friedrich Foerster >> Max-Planck Institut fuer Biochemie >> Am Klopferspitz 18 >> D-82152 Martinsried >> >> Tel: +49 89 8578 2651 >> Fax: +49 89 8578 2641 >> >> foerster@biochem.mpg.de >> >> www.tomotronic.org >> >> >> >> >> >> >> _______________________________________________ >> IMP-dev mailing list >> IMP-dev@salilab.org >> https://salilab.org/mailman/listinfo/imp-dev >> >> >> >> _______________________________________________ >> IMP-dev mailing list >> IMP-dev@salilab.org >> https://salilab.org/mailman/listinfo/imp-dev >> >> >> _______________________________________________ >> IMP-dev mailing list >> IMP-dev@salilab.org >> https://salilab.org/mailman/listinfo/imp-dev >> >> -- >> >> Friedrich Foerster >> Max-Planck Institut fuer Biochemie >> Am Klopferspitz 18 >> D-82152 Martinsried >> >> Tel: +49 89 8578 2651 >> Fax: +49 89 8578 2641 >> >> foerster@biochem.mpg.de >> >> www.tomotronic.org >> >> >> >> >> >> >> _______________________________________________ >> IMP-dev mailing list >> IMP-dev@salilab.org >> https://salilab.org/mailman/listinfo/imp-dev >> >> >> ___________ >> Carpe diem. >> >> Chi non ride non è una persona seria. >> Who does not laugh is not a serious person. >> >> "Di solito non sono un uomo religioso, ma se tu sei lassu', >> salvami, Superman!" >> > Homer Simpson >> _______________________________________________ >> IMP-dev mailing list >> IMP-dev@salilab.org >> https://salilab.org/mailman/listinfo/imp-dev > > > _______________________________________________ > IMP-dev mailing list > IMP-dev@salilab.org > https://salilab.org/mailman/listinfo/imp-dev > > > _______________________________________________ > IMP-dev mailing list > IMP-dev@salilab.org > https://salilab.org/mailman/listinfo/imp-dev