IMP logo
IMP Reference Guide  2.14.0
The Integrative Modeling Platform
core/Gaussian.h
Go to the documentation of this file.
1 /**
2  * \file IMP/core/Gaussian.h
3  * \brief Decorator to hold Gaussian3D
4  *
5  * Copyright 2007-2020 IMP Inventors. All rights reserved.
6  *
7  */
8 
9 #ifndef IMPCORE_GAUSSIAN_H
10 #define IMPCORE_GAUSSIAN_H
11 
12 #include <IMP/Object.h>
13 #include <IMP/core/core_config.h>
14 #include <IMP/algebra/Gaussian3D.h>
15 #include <IMP/Particle.h>
16 #include <IMP/Model.h>
17 #include <IMP/Decorator.h>
18 #include <IMP/decorator_macros.h>
19 #include <IMP/exception.h>
20 #include <IMP/core/rigid_bodies.h>
21 #include "internal/rigid_bodies.h"
22 #include <Eigen/Dense>
23 
24 IMPCORE_BEGIN_NAMESPACE
25 
26 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
27 
28 /** little class to store an Eigen::Matrix3d */
29 class IMPCOREEXPORT Matrix3D : public IMP::Object{
30  Eigen::Matrix3d mat_;
31  public:
32  Matrix3D(Eigen::Matrix3d mat,
33  std::string name="Matrix3DDensityMap%1%"):Object(name),mat_(mat){ }
34  Eigen::Matrix3d get_mat() const {return mat_;}
35 };
36 
37 #endif
38 
39 /** A decorator for a particle storing a Gaussian. */
40 class IMPCOREEXPORT Gaussian : public RigidBody {
41  // define variance and covariance keys
42  static void do_setup_particle(Model *m, ParticleIndex pi);
43  static void do_setup_particle(Model *m, ParticleIndex pi,
44  const algebra::Gaussian3D &g);
45 
46  public:
50 
51  static ObjectKey get_local_covariance_key();
52  static ObjectKey get_global_covariance_key();
53  static bool get_is_setup(Model *m, ParticleIndex pi) {
54  return m->get_has_attribute(get_local_covariance_key(), pi);
55  }
56 
57 
58  //! retrieve local covariance (as diagonal matrix)
59  Eigen::Matrix3d get_local_covariance() const {
60  /* Kind of evil, but dynamic_cast fails randomly here
61  on our RHEL 5 systems */
62  Matrix3D* local
63  = (Matrix3D*)get_model()->get_attribute(get_local_covariance_key(),
65  return local->get_mat();
66  }
67 
68  //! retrieve local variances as Vector3D
70  return algebra::Vector3D(get_local_covariance().diagonal()[0],
71  get_local_covariance().diagonal()[1],
72  get_local_covariance().diagonal()[2]);
73  }
74 
75  //! retrieve global covariance
76  Eigen::Matrix3d get_global_covariance() {
77  ObjectKey k = get_global_covariance_key();
79  if (!get_model()->get_has_attribute(k, pi)) {
80  update_global_covariance();
81  }
82  Matrix3D* global = (Matrix3D*)get_model()->get_attribute(k, pi);
83  return global->get_mat();
84  };
85 
86  //! create Gaussian3D from these attributes
88  return algebra::Gaussian3D(get_reference_frame(),get_variances());
89 }
90 
91  //! Get the covariance attributes from a Gaussian3D object
92  void set_gaussian(const algebra::Gaussian3D &g);
93 
94  //! set the local-frame covariance.
95  void set_local_covariance(const Eigen::Vector3d covar) {
96  IMP_NEW(Matrix3D,local,(covar.asDiagonal()));
97  get_model()->set_attribute(get_local_covariance_key(),
99  local);
100  local->set_was_used(true);
101  // Force recalculation of global covariance on next access
103  }
104 
105  //! equivalent to set_local_covariance, used for backwards compatibility
107  set_local_covariance(Eigen::Vector3d(v.get_data()));
108  }
109 
110  //! set the global-frame covariance. does NOT update local frame!
111  void set_global_covariance(Eigen::Matrix3d covar){
112  IMP_NEW(Matrix3D,global,(covar));
113  ObjectKey k = get_global_covariance_key();
115  if (!get_model()->get_has_attribute(k, pi)) {
116  get_model()->add_cache_attribute(k, pi, global);
117  } else {
118  get_model()->set_attribute(k, pi, global);
119  }
120  global->set_was_used(true);
121  }
122 
123  //! update the global covariance
124  void update_global_covariance();
125 
126 
127  ////! Evaluate the Gaussian at a point?
128  //Float get_probability_at_point(const algebra::Vector3D &point) const;
129 };
130 IMP_DECORATORS(Gaussian, Gaussians, Particles);
131 
132 IMPCORE_END_NAMESPACE
133 
134 #endif /* IMPCORE_GAUSSIAN_H */
The base class for decorators.
void add_cache_attribute(TypeKey attribute_key, ParticleIndex particle, Type value)
ParticleIndex get_particle_index() const
Returns the particle index decorated by this decorator.
Definition: Decorator.h:188
#define IMP_DECORATOR_SETUP_1(Name, FirstArgumentType, first_argument_name)
Model * get_model() const
Returns the Model containing the particle.
Definition: Decorator.h:191
Storage of a model, its restraints, constraints and particles.
Exception definitions and assertions.
void set_global_covariance(Eigen::Matrix3d covar)
set the global-frame covariance. does NOT update local frame!
#define IMP_NEW(Typename, varname, args)
Declare a ref counted pointer to a new object.
Definition: object_macros.h:64
void clear_particle_caches(ParticleIndex pi)
Clear all the cache attributes of a given particle.
Class for storing model, its restraints, constraints, and particles.
Definition: Model.h:72
A Gaussian distribution in 3D.
Definition: Gaussian3D.h:24
Common base class for heavy weight IMP objects.
Definition: Object.h:106
Eigen::Matrix3d get_global_covariance()
retrieve global covariance
Definition: core/Gaussian.h:76
functionality for defining rigid bodies
Various general useful macros for IMP.
void set_attribute(TypeKey attribute_key, ParticleIndex particle, Type value)
set the value of particle attribute with the specified key
#define IMP_DECORATOR_SETUP_0(Name)
Classes to handle individual model particles. (Note that implementation of inline functions is in int...
A shared base class to help in debugging and things.
#define IMP_DECORATOR_METHODS(Name, Parent)
VectorD< 3 > Vector3D
Definition: VectorD.h:421
void set_local_covariance(const Eigen::Vector3d covar)
set the local-frame covariance.
Definition: core/Gaussian.h:95
#define IMP_DECORATORS(Name, PluralName, Parent)
Define the types for storing sets of decorators.
Gaussian shape.
algebra::Gaussian3D get_gaussian() const
create Gaussian3D from these attributes
Definition: core/Gaussian.h:87
bool get_has_attribute(TypeKey attribute_key, ParticleIndex particle) const
return true if particle has attribute with the specified key
A decorator for a rigid body.
Definition: rigid_bodies.h:82
void set_variances(const algebra::Vector3D v)
equivalent to set_local_covariance, used for backwards compatibility
Type get_attribute(TypeKey attribute_key, ParticleIndex particle)
get the value of the particle attribute with the specified key
algebra::Vector3D get_variances() const
retrieve local variances as Vector3D
Definition: core/Gaussian.h:69
Eigen::Matrix3d get_local_covariance() const
retrieve local covariance (as diagonal matrix)
Definition: core/Gaussian.h:59
IMP::algebra::ReferenceFrame3D get_reference_frame() const
Definition: rigid_bodies.h:207