Apply a harmonic to the distance between two particles.
The source code is as follows:
#ifndef IMP_EXAMPLE_SYSTEM_LOCAL_EXAMPLE_PAIR_SCORE_H
#define IMP_EXAMPLE_SYSTEM_LOCAL_EXAMPLE_PAIR_SCORE_H
#include "example_system_local_config.h"
IMPEXAMPLESYSTEMLOCAL_BEGIN_NAMESPACE
class IMPEXAMPLESYSTEMLOCALEXPORT ExamplePairScore : public PairScore
{
double x0_, k_;
public:
ExamplePairScore(double x0, double k);
};
IMPEXAMPLESYSTEMLOCAL_END_NAMESPACE
#endif
#include <boost/lambda/lambda.hpp>
IMPEXAMPLE_BEGIN_NAMESPACE
ExamplePairScore::ExamplePairScore(double x0, double k): x0_(x0), k_(k) {}
Float ExamplePairScore::evaluate(
const ParticlePair &p,
DerivativeAccumulator *da) const
{
core::XYZ d0(p[0]);
core::XYZ d1(p[1]);
double diff = (d0.get_coordinates()-d1.get_coordinates()).get_magnitude()-x0_;
IMP_LOG(VERBOSE,
"The distance off from x0 is " << diff << std::endl);
double score= .5*k_*square(diff);
if (da) {
algebra::Vector3D delta= d0.get_coordinates()-d1.get_coordinates();
algebra::Vector3D udelta= delta.get_unit_vector();
double dv= k_*diff;
d0.add_to_derivatives(udelta*dv, *da);
d1.add_to_derivatives(-udelta*dv, *da);
}
return score;
}
ParticlesTemp ExamplePairScore::get_input_particles(Particle *p) const {
return ParticlesTemp(1,p);
}
ContainersTemp ExamplePairScore::get_input_containers(Particle *) const {
return ContainersTemp();
}
void ExamplePairScore::do_show(std::ostream &out) const {
out << "x0=" << x0_ << " and k=" << k_ << std::endl;
}
IMPEXAMPLE_END_NAMESPACE
Public Member Functions |
|
| ExamplePairScore (double x0, double k) |
|
| PairScore (std::string name="PairScore %1%") |
| Restraints | create_current_decomposition (const ParticlePair &vt) const |
| virtual double | evaluate (const ParticlePair &vt, DerivativeAccumulator *da) const =0 |
| | Compute the score and the derivative if needed.
|
| virtual double | evaluate (const ParticlePairsTemp &o, DerivativeAccumulator *da) const |
| virtual double | evaluate_if_good_index (Model *m, const ParticleIndexPair &vt, DerivativeAccumulator *da, double max) const |
| | Compute the score and the derivative if needed.
|
| virtual double | evaluate_if_good_indexes (Model *m, const ParticleIndexPairs &o, DerivativeAccumulator *da, double max) const |
| virtual double | evaluate_index (Model *m, const ParticleIndexPair &vt, DerivativeAccumulator *da) const |
| | Compute the score and the derivative if needed.
|
| virtual double | evaluate_indexes (Model *m, const ParticleIndexPairs &o, DerivativeAccumulator *da) const |
| virtual ContainersTemp | get_input_containers (Particle *p) const =0 |
| virtual ParticlesTemp | get_input_particles (Particle *p) const =0 |
|
std::size_t | __hash__ () const |
| virtual std::string | get_type_name () const =0 |
| | Return a string identifying the type of the object.
|
| virtual IMP::base::VersionInfo | get_version_info () const =0 |
| | Get information about the module and version of the object.
|
| void | set_check_level (CheckLevel l) |
| void | set_log_level (LogLevel l) |
| | Set the logging level used in this object.
|
| void | set_was_used (bool tf) const |
|
void | show (std::ostream &out=std::cout) const |
|
const std::string & | get_name () const |
|
void | set_name (std::string name) |