IMP  2.2.1
The Integrative Modeling Platform
MultipleBinormalRestraint.h
Go to the documentation of this file.
1 /**
2  * \file IMP/modeller/MultipleBinormalRestraint.h
3  * \brief Modeller-style multiple binormal (phi/psi) restraint.
4  *
5  * Copyright 2007-2014 IMP Inventors. All rights reserved.
6  *
7  */
8 
9 #ifndef IMPMODELLER_MULTIPLE_BINORMAL_RESTRAINT_H
10 #define IMPMODELLER_MULTIPLE_BINORMAL_RESTRAINT_H
11 
12 #include <IMP/modeller/modeller_config.h>
13 
14 #include <IMP/kernel/Restraint.h>
15 #include <IMP/kernel/Particle.h>
17 #include <IMP/generic.h>
18 
19 IMPMODELLER_BEGIN_NAMESPACE
20 
21 class BinormalTerm;
22 
23 //! Modeller-style multiple binormal (phi/psi) restraint.
24 /** This implements a multiple binormal restraint on the two dihedral angles
25  between the two quads of kernel::Particles passed to the restraint, by
26  implementing
27  equation A.76 in the
28  \external{http://salilab.org/modeller/9v7/manual/node441.html,
29  Modeller manual}.
30  The two angles are typically the phi and psi dihedrals of a residue.
31  */
32 class IMPMODELLEREXPORT MultipleBinormalRestraint : public kernel::Restraint {
33  std::vector<BinormalTerm> terms_;
34  kernel::ParticleQuad q1_, q2_;
35 
36  public:
37  //! Create the multiple binormal restraint.
38  /** After creating the restraint, call add_term one or more times to add
39  BinormalTerms to the restraint.
40  \param[in] q1 First quad of particles.
41  \param[in] q2 Second quad of particles.
42  */
44  const kernel::ParticleQuad &q2);
45 
46  //! Add a single BinormalTerm to the restraint.
47  void add_term(const BinormalTerm &term) { terms_.push_back(term); }
48 
49  virtual double unprotected_evaluate(IMP::kernel::DerivativeAccumulator *accum)
50  const IMP_OVERRIDE;
51  virtual IMP::kernel::ModelObjectsTemp do_get_inputs() const IMP_OVERRIDE;
53 };
54 
55 //! A single binormal term in a MultipleBinormalRestraint.
56 class BinormalTerm {
57  double correlation_, weight_;
58  std::pair<double, double> means_, stdevs_;
59 
60  double evaluate(const double dihedral[2], double &sin1, double &sin2,
61  double &cos1, double &cos2, double &rho) const;
62 
63  public:
64  BinormalTerm()
65  : correlation_(-1), weight_(-1), means_(-1, -1), stdevs_(-1, -1) {}
66  friend class MultipleBinormalRestraint;
67 
68  void set_correlation(double correlation) { correlation_ = correlation; }
69  void set_weight(double weight) { weight_ = weight; }
70  void set_means(FloatPair means) { means_ = means; }
71  void set_standard_deviations(FloatPair stdevs) { stdevs_ = stdevs; }
72  IMP_SHOWABLE_INLINE(BinormalTerm, {
73  out << "correlation: " << correlation_ << "; weight: " << weight_
74  << "; means: " << means_.first << ", " << means_.second
75  << "; standard deviations: " << stdevs_.first << ", " << stdevs_.second;
76  });
77 };
79 
80 IMPMODELLER_END_NAMESPACE
81 
82 #endif /* IMPMODELLER_MULTIPLE_BINORMAL_RESTRAINT_H */
Class for adding derivatives from restraints to the model.
std::pair< double, double > FloatPair
A generic pair of floats.
Definition: base/types.h:27
#define IMP_VALUES(Name, PluralName)
Define the type for storing sets of values.
#define IMP_SHOWABLE_INLINE(Name, how_to_show)
Declare the methods needed by an object that can be printed.
A single binormal term in a MultipleBinormalRestraint.
Abstract base class for all restraints.
void add_term(const BinormalTerm &term)
Add a single BinormalTerm to the restraint.
A restraint is a term in an IMP ScoringFunction.
#define IMP_OBJECT_METHODS(Name)
Define the basic things needed by any Object.
Classes to handle individual model particles.
Classes to handle individual model particles.
Modeller-style multiple binormal (phi/psi) restraint.
virtual ModelObjectsTemp do_get_inputs() const =0
Import IMP/kernel/generic.h in the namespace.