IMP
2.2.0
The Integrative Modeling Platform
|
A decorator for a rigid body. More...
#include <IMP/core/rigid_bodies.h>
Public Member Functions | |
RigidBody (const IMP::kernel::ParticleAdaptor &d) | |
RigidBody (::IMP::kernel::Model *m,::IMP::kernel::ParticleIndex id) | |
void | add_member (kernel::ParticleIndexAdaptor p) |
void | add_non_rigid_member (kernel::ParticleIndex pi) |
const kernel::ParticleIndexes & | get_body_member_particle_indexes () const |
algebra::Vector3D | get_coordinates () const |
Get the coordinates of the particle. | |
bool | get_coordinates_are_optimized () const |
kernel::ParticleIndexes | get_member_indexes () const |
const kernel::ParticleIndexes & | get_member_particle_indexes () const |
RigidMembers | get_members () const |
IMP::algebra::ReferenceFrame3D | get_reference_frame () const |
Get the reference frame for the local coordinates. | |
RigidMembers | get_rigid_members () const |
algebra::VectorD< 4 > | get_rotational_derivatives () const |
Get the derivatives of the quaternion. | |
algebra::Vector3D | get_torque () const |
void | normalize_rotation () |
Normalize the quaternion. | |
void | set_coordinates_are_optimized (bool tf) |
void | set_is_rigid_member (kernel::ParticleIndex pi, bool tf) |
void | set_reference_frame (const IMP::algebra::ReferenceFrame3D &tr) |
Set the current reference frame. More... | |
void | set_reference_frame_from_members (const kernel::ParticleIndexes &members) |
void | set_reference_frame_lazy (const IMP::algebra::ReferenceFrame3D &tr) |
Change the reference, delay updating the members until evaluate. More... | |
void | show (std::ostream &out=std::cout) const |
void | update_members () |
Public Member Functions inherited from IMP::core::XYZ | |
XYZ (::IMP::kernel::Model *m,::IMP::kernel::ParticleIndex id) | |
XYZ (const IMP::kernel::ParticleAdaptor &d) | |
void | add_to_derivative (int i, Float v, DerivativeAccumulator &d) |
Add something to the derivative of the ith coordinate. | |
void | add_to_derivatives (const algebra::Vector3D &v, DerivativeAccumulator &d) |
Add something to the derivative of the coordinates. | |
Float | get_coordinate (int i) const |
Get the ith coordinate. | |
const algebra::Vector3D & | get_coordinates () const |
Convert it to a vector. More... | |
bool | get_coordinates_are_optimized () const |
Get whether the coordinates are optimized. More... | |
Float | get_derivative (int i) const |
Get the ith coordinate derivative. | |
algebra::Vector3D | get_derivatives () const |
Get the vector of derivatives. More... | |
algebra::Vector3D | get_vector_to (const XYZ &b) const |
Get the vector from this particle to another. | |
Float | get_x () const |
Float | get_y () const |
Float | get_z () const |
void | set_coordinate (unsigned int i, Float v) |
set the ith coordinate | |
void | set_coordinates (const algebra::Vector3D &v) |
set all coordinates from a vector | |
void | set_coordinates_are_optimized (bool tf) const |
Set whether the coordinates are optimized. | |
void | set_x (Float t) |
void | set_y (Float t) |
void | set_z (Float t) |
void | show (std::ostream &out=std::cout) const |
Public Member Functions inherited from IMP::kernel::Decorator | |
Model * | get_model () const |
Returns the Model containing the particle. | |
Particle * | get_particle () const |
ParticleIndex | get_particle_index () const |
operator Particle * () const | |
operator ParticleIndex () const | |
Particle * | operator-> () const |
Additional Inherited Members | |
Protected Member Functions inherited from IMP::kernel::Decorator | |
Decorator (Model *m, ParticleIndex pi) | |
Decorator (ParticleAdaptor p) | |
A rigid body particle describes a set of particles, known as the members, which move rigidly together. The rigid body is represented as an algebra::ReferenceFrame3D coupled with local coordinates (RigidMember::get_internal_coordinates()) for the members expressed in that reference frame. The global coordinates of the members are accessed, as with other global coordinates, via the XYZ::get_coordinates().
Since the members are simply a set of particles which move together they don't (necessarily) define a shape. For example, the members of the rigid body made from a molecular hierarchy would include particles corresponding to intermediate levels of the hierarchy. As a result, methods that use rigid bodies usually should simply take the list of particles they are interested in and then check for rigid bodies internally.
The initial reference of the rigid body is computed from the coordinates, masses and radii of the particles passed to the constructor, based on diagonalizing the inertial tensor (which is not stored, currently).
RigidBodies can be nested (that is, a RigidBody can have another RigidBody as a member). This can be useful for organizational reasons as well as for accelerating computations since operations are affected by the total number of children contained in the rigid body being operated on. Examples of this include collision detection where if you have multiple representations of geometry at different resolutions it is faster to put each of them in a separate rigid body and then create one rigid body containing all of them.
It is often desirable to randomize the orientation of a rigid body:
Definition at line 75 of file rigid_bodies.h.
void IMP::core::RigidBody::add_member | ( | kernel::ParticleIndexAdaptor | p | ) |
Add a proper member that moves rigidly with this rigid body, properly handling rigid bodies and XYZ particles. Add p to the list of members. If p is a valid RigidBody, it is added as a rigid body member, otherwise it is added as a point member (for which the rotation is not tracked). By default, p is considered a strictly rigid member, in that its local coordinates are not expected to change independetly.
void IMP::core::RigidBody::add_non_rigid_member | ( | kernel::ParticleIndex | pi | ) |
Add a non-rigid member, for which internal coordinates may change independently.
|
static |
Definition at line 157 of file rigid_bodies.h.
const kernel::ParticleIndexes& IMP::core::RigidBody::get_body_member_particle_indexes | ( | ) | const |
Get all members that are themselved decorated as rigid bodies, as model particle indexes
Definition at line 140 of file rigid_bodies.h.
bool IMP::core::RigidBody::get_coordinates_are_optimized | ( | ) | const |
Returns true if the rigid body coordinates are flagged as optimized for Optimizer objects
|
static |
Return true if the particle is a rigid body
Definition at line 183 of file rigid_bodies.h.
kernel::ParticleIndexes IMP::core::RigidBody::get_member_indexes | ( | ) | const |
Get the particle indexes of any member of this rigid body, regardless of whether it is itself a rigid body or not
Definition at line 153 of file rigid_bodies.h.
const kernel::ParticleIndexes& IMP::core::RigidBody::get_member_particle_indexes | ( | ) | const |
Returns a list of all members that are not themselves decoared as rigid bodies, in the form of particle indexes.
Definition at line 127 of file rigid_bodies.h.
RigidMembers IMP::core::RigidBody::get_members | ( | ) | const |
This method does not return non-rigid members.
Definition at line 118 of file rigid_bodies.h.
algebra::Vector3D IMP::core::RigidBody::get_torque | ( | ) | const |
The units are kCal/Mol/Radian
Definition at line 259 of file rigid_bodies.h.
void IMP::core::RigidBody::set_coordinates_are_optimized | ( | bool | tf | ) |
Set whether the rigid body coordinates are flagged as optimized for Optimizer objects
void IMP::core::RigidBody::set_is_rigid_member | ( | kernel::ParticleIndex | pi, |
bool | tf | ||
) |
Set whether a particular member is flagged as a rigid member or as a non-rigid member. This affects the way the rigid body updates the coordinates and / or reference frame of its members.
void IMP::core::RigidBody::set_reference_frame | ( | const IMP::algebra::ReferenceFrame3D & | tr | ) |
All members of the rigid body will have their coordinates updated immediately.
void IMP::core::RigidBody::set_reference_frame_from_members | ( | const kernel::ParticleIndexes & | members | ) |
Update the reference frame of the rigid body based on aligning the current global coordinates of the passed rigid body members onto their old local coordinates. Non-passed members are ignored.
This method is useful for updating the rigid body after new global coordinates were loaded for the members. The members are passed explictily since, typically, some are desired to just move along with the newly loaded rigid body.
void IMP::core::RigidBody::set_reference_frame_lazy | ( | const IMP::algebra::ReferenceFrame3D & | tr | ) |
|
static |
Create a rigid body for pi with the particle indexes ps as its members. The coordinates of pi are set to the center of mass of ps and the rotation of its reference frame is based on the diagnolized intertia tensor of ps.
Definition at line 168 of file rigid_bodies.h.
|
static |
Definition at line 168 of file rigid_bodies.h.
|
static |
Definition at line 174 of file rigid_bodies.h.
|
static |
Create a rigid body with the passed reference frame as its initial position.Setup the particle so that it can be used with this decorator
Definition at line 174 of file rigid_bodies.h.
void IMP::core::RigidBody::update_members | ( | ) |
Update the global coordinates of the members based on their local coordinates and this rigid body's reference frame