8 #ifndef IMPSCORE_FUNCTOR_OPEN_CUBIC_SPLINE_H 
    9 #define IMPSCORE_FUNCTOR_OPEN_CUBIC_SPLINE_H 
   11 #include <IMP/score_functor/score_functor_config.h> 
   13 #include "internal/RawOpenCubicSpline.h" 
   14 IMPSCOREFUNCTOR_BEGIN_NAMESPACE
 
   25   double inverse_spacing_;
 
   26   internal::RawOpenCubicSpline spline_;
 
   42         inverse_spacing_(1.0 / spacing_),
 
   43         spline_(values, spacing_, inverse_spacing_),
 
   45         maxrange_(minrange_ + spacing_ * (values.size() - 1)),
 
   48                     "The spacing between values must be positive.");
 
   49     IMP_USAGE_CHECK(values.size() >= 1, 
"You must provide at least one value.");
 
   52   template <
unsigned int D>
 
   53   double get_score(
Model *,
 
   55                    double distance)
 const {
 
   57     if (distance < minrange_ || distance > maxrange_) {
 
   59         if (distance < minrange_)
 
   60           return spline_.get_first();
 
   62           return spline_.get_last();
 
   64         IMP_THROW(
"Value " << distance << 
" out of range [" << minrange_ << 
", " 
   68     return spline_.evaluate(distance - minrange_, spacing_, inverse_spacing_);
 
   70   template <
unsigned int D>
 
   72       Model *, 
const Array<D, ParticleIndex> &,
 
   73       double distance)
 const {
 
   75     if (distance < minrange_ || distance > maxrange_) {
 
   77         if (distance < minrange_)
 
   78           return std::make_pair(spline_.get_first(), 0.0);
 
   80           return std::make_pair(spline_.get_last(), 0.0);
 
   82         IMP_THROW(
"Value " << distance << 
" out of range [" << minrange_ << 
", " 
   83                   << maxrange_ << 
"] for open cubic spline", ValueException);
 
   86     return spline_.evaluate_with_derivative(distance - minrange_, spacing_,
 
   89   template <
unsigned int D>
 
   90   double get_maximum_range(
 
   91       Model *, 
const Array<D, ParticleIndex> &)
 const {
 
   92     if (!extend_ || spline_.get_last() == 0)
 
   95       return std::numeric_limits<double>::max();
 
   97   template <
unsigned int D>
 
   98   bool get_is_trivially_zero(Model *,
 
   99                              const Array<D, ParticleIndex> &,
 
  100                              double squared_distance)
 const {
 
  101     if (!extend_ || spline_.get_last() == 0) {
 
  102       return squared_distance > algebra::get_squared(maxrange_);
 
  108 IMPSCOREFUNCTOR_END_NAMESPACE
 
A class to store a fixed array of same-typed values. 
 
Class for storing model, its restraints, constraints, and particles. 
 
OpenCubicSpline(const Floats &values, Float minrange, Float spacing, bool extend=false)
Constructor. 
 
A Score on the distance between a pair of particles. 
 
std::pair< double, double > DerivativePair
A pair representing a function value with its first derivative. 
 
Open cubic spline function. 
 
#define IMP_THROW(message, exception_name)
Throw an exception with a message. 
 
double Float
Basic floating-point value (could be float, double...) 
 
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method. 
 
A functor for computing a distance based score for D particles. 
 
An exception for an invalid value being passed to IMP.