IMP logo
IMP Reference Guide  2.14.0
The Integrative Modeling Platform
Diffusion.h
Go to the documentation of this file.
1 /**
2  * \file IMP/atom/Diffusion.h
3  * \brief A decorator for a diffusing particle.
4  *
5  * Copyright 2007-2020 IMP Inventors. All rights reserved.
6  *
7  */
8 
9 #ifndef IMPATOM_DIFFUSION_H
10 #define IMPATOM_DIFFUSION_H
11 
12 #include <IMP/atom/atom_config.h>
13 
14 #include <IMP/core/XYZR.h>
15 #include <IMP/algebra/Vector3D.h>
16 #include <IMP/internal/constants.h>
17 
18 #include <vector>
19 #include <limits>
20 
21 IMPATOM_BEGIN_NAMESPACE
22 
23 //! A decorator for a diffusing particle with a diffusion coefficient.
24 /** \ingroup helper
25  \ingroup decorators
26  \see BrownianDynamics
27  \unstable{Diffusion} The name really should be fixed.
28 
29  Diffusion is used to decorate diffusing particle with a diffusion
30  coefficient D. D is assumed to be in units of \f$A^2/fs\f$.
31 
32  \see RigidBodyDiffusion
33  */
34 class IMPATOMEXPORT Diffusion : public IMP::core::XYZ {
35  static void do_setup_particle(Model *m, ParticleIndex pi,
36  Float D) {
37  IMP_USAGE_CHECK(XYZ::get_is_setup(m, pi),
38  "Particle must already be an XYZ particle");
39  m->add_attribute(get_diffusion_coefficient_key(), pi, D);
40  }
41  static void do_setup_particle(Model *m, ParticleIndex pi,
42  const algebra::Vector3D &v, Float D) {
43  XYZ::setup_particle(m, pi, v);
44  do_setup_particle(m, pi, D);
45  }
46  static void do_setup_particle(Model *m, ParticleIndex pi);
47 
48  public:
52  /** Assume particle is already a core::XYZR particle. */
54 
55  //! Return true if the particle is an instance of an Diffusion
56  static bool get_is_setup(Model *m, ParticleIndex p) {
57  return m->get_has_attribute(get_diffusion_coefficient_key(), p);
58  }
59  //! set diffusion coefficient in \f$A^2/fs\f$
60  void set_diffusion_coefficient(double d) {
61  get_particle()->set_value(get_diffusion_coefficient_key(), d);
62 
63  }
64  //! get diffusion coefficient in \f$A^2/fs\f$
65  double get_diffusion_coefficient() const {
66  return get_model()->get_attribute(get_diffusion_coefficient_key(),
68  }
69  //! Get the D key
70  static FloatKey get_diffusion_coefficient_key();
71 };
72 
73 IMPATOMEXPORT double get_diffusion_coefficient_from_cm2_per_second(double din);
74 
75 IMP_DECORATORS(Diffusion, Diffusions, core::XYZs);
76 
77 /** A rigid body that is diffusing, so it also has a rotation diffusion
78  coefficient. The units on the rotational coefficient are
79  \f$radians^2/fs\f$.*/
80 class IMPATOMEXPORT RigidBodyDiffusion : public Diffusion {
81  static void do_setup_particle(Model *m, ParticleIndex pi);
82 
83  public:
85  /** All diffusion coefficients are determined from the radius */
87 
88  //! returns the rotational diffusion coefficient in \f$radians^2/fs\f$
90  return get_model()->get_attribute
91  (get_rotational_diffusion_coefficient_key(),
93  }
94 
95 
96  //! sets the rotational diffusion coefficient in \f$radians^2/fs\f$
97  void set_rotational_diffusion_coefficient(double d) const {
98  return get_particle()->set_value(get_rotational_diffusion_coefficient_key(),
99  d);
100  }
101 
102  //! Return true if the particle is an instance of an Diffusion
103  static bool get_is_setup(Model *m, ParticleIndex p) {
104  return m->get_has_attribute(get_rotational_diffusion_coefficient_key(), p);
105  }
106 
107  //! Get the D key
108  static FloatKey get_rotational_diffusion_coefficient_key();
109 };
110 
111 IMP_DECORATORS(RigidBodyDiffusion, RigidBodyDiffusions, Diffusions);
112 
113 IMPATOM_END_NAMESPACE
114 
115 #endif /* IMPATOM_DIFFUSION_H */
ParticleIndex get_particle_index() const
Returns the particle index decorated by this decorator.
Definition: Decorator.h:188
static bool get_is_setup(Model *m, ParticleIndex p)
Return true if the particle is an instance of an Diffusion.
Definition: Diffusion.h:103
#define IMP_DECORATOR_SETUP_1(Name, FirstArgumentType, first_argument_name)
Model * get_model() const
Returns the Model containing the particle.
Definition: Decorator.h:191
static XYZ setup_particle(Model *m, ParticleIndex pi)
Definition: XYZ.h:51
double get_diffusion_coefficient() const
get diffusion coefficient in
Definition: Diffusion.h:65
Class for storing model, its restraints, constraints, and particles.
Definition: Model.h:72
void set_rotational_diffusion_coefficient(double d) const
sets the rotational diffusion coefficient in
Definition: Diffusion.h:97
void set_diffusion_coefficient(double d)
set diffusion coefficient in
Definition: Diffusion.h:60
void add_attribute(TypeKey attribute_key, ParticleIndex particle, Type value)
add particle atribute with the specied key and initial value
#define IMP_DECORATOR_SETUP_2(Name, FirstArgumentType, first_argument_name,SecondArgumentType, second_argument_name)
A decorator for a particle with x,y,z coordinates.
Definition: XYZ.h:30
#define IMP_DECORATOR_SETUP_0(Name)
static bool get_is_setup(Model *m, ParticleIndex p)
Return true if the particle is an instance of an Diffusion.
Definition: Diffusion.h:56
Particle * get_particle() const
Returns the particle decorated by this decorator.
Definition: Decorator.h:171
#define IMP_DECORATOR_METHODS(Name, Parent)
VectorD< 3 > Vector3D
Definition: VectorD.h:421
double get_rotational_diffusion_coefficient() const
returns the rotational diffusion coefficient in
Definition: Diffusion.h:89
double Float
Basic floating-point value (could be float, double...)
Definition: types.h:20
Simple 3D vector class.
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method.
Definition: check_macros.h:168
#define IMP_DECORATORS(Name, PluralName, Parent)
Define the types for storing sets of decorators.
bool get_has_attribute(TypeKey attribute_key, ParticleIndex particle) const
return true if particle has attribute with the specified key
A decorator for a diffusing particle with a diffusion coefficient.
Definition: Diffusion.h:34
Type get_attribute(TypeKey attribute_key, ParticleIndex particle)
get the value of the particle attribute with the specified key
Decorator for a sphere-like particle.