IMP  2.0.1
The Integrative Modeling Platform
LennardJonesPairScore.h
Go to the documentation of this file.
1 /**
2  * \file IMP/atom/LennardJonesPairScore.h
3  * \brief Lennard-Jones score between a pair of particles.
4  *
5  * Copyright 2007-2013 IMP Inventors. All rights reserved.
6  */
7 
8 #ifndef IMPATOM_LENNARD_JONES_PAIR_SCORE_H
9 #define IMPATOM_LENNARD_JONES_PAIR_SCORE_H
10 
11 #include <IMP/atom/atom_config.h>
12 #include <IMP/generic.h>
13 #include <IMP/PairScore.h>
14 #include <IMP/Pointer.h>
15 #include <IMP/atom/LennardJones.h>
17 
18 IMPATOM_BEGIN_NAMESPACE
19 
20 //! Lennard-Jones score between a pair of particles.
21 /** The two particles in the pair must be LennardJones particles.
22  The form of the potential is \f[
23  -\epsilon \left[ w_{rep} \left(\frac{r_{min}}{r}\right)^{12}
24  - 2 w_{att} \left(\frac{r_{min}}{r}\right)^{6}\right]
25  \f] where \f$\epsilon\f$ is the depth of the well between the
26  two particles, \f$r_{min}\f$ the sum of the particles' radii, \f$r\f$
27  the interparticle distance, and \f$w_{rep}\f$ and \f$w_{att}\f$ the
28  weights on the repulsive and attractive parts of the potential respectively;
29  both weights are 1.0 by default.
30 
31  The well depth is the geometric mean of the individual particles' well
32  depths (as extracted by LennardJones::get_well_depth).
33 
34  Note that because this score uses radii and well depths set in the particles
35  themselves, the strength of the interaction cannot be changed for a
36  particular pair of atoms (as is done in the CHARMM forcefield with the
37  rarely-used NBFIX directive, for example). If the well depth or radius of
38  a single particle is modifed, that will affect its interaction with all
39  particles.
40  */
41 class IMPATOMEXPORT LennardJonesPairScore : public PairScore
42 {
43  IMP::OwnerPointer<SmoothingFunction> smoothing_function_;
44  double repulsive_weight_, attractive_weight_;
45 
46  // Calculate A, B factors from particle well depths and radii
47  // It may be appropriate to cache these for speed since the particle
48  // attributes rarely change and square roots are expensive
49  inline void get_factors(const LennardJones &lj0, const LennardJones &lj1,
50  double &A, double &B) const {
51  double well_depth = std::sqrt(lj0.get_well_depth() * lj1.get_well_depth());
52  double rmin = lj0.get_radius() + lj1.get_radius();
53  // probably faster than pow(rmin, 6) on systems that don't
54  // have pow(double, int)
55  double rmin6 = rmin * rmin * rmin * rmin * rmin * rmin;
56  double rmin12 = rmin6 * rmin6;
57 
58  A = well_depth * rmin12 * repulsive_weight_;
59  B = 2.0 * well_depth * rmin6 * attractive_weight_;
60  }
61 
62 public:
64  : smoothing_function_(f), repulsive_weight_(1.0), attractive_weight_(1.0) {}
65 
66  void set_repulsive_weight(double repulsive_weight) {
67  repulsive_weight_ = repulsive_weight;
68  }
69 
70  double get_repulsive_weight() const { return repulsive_weight_; }
71 
72  void set_attractive_weight(double attractive_weight) {
73  attractive_weight_ = attractive_weight;
74  }
75 
76  double get_attractive_weight() const { return attractive_weight_; }
77 
79 };
80 
82 
83 IMPATOM_END_NAMESPACE
84 
85 #endif /* IMPATOM_LENNARD_JONES_PAIR_SCORE_H */