8 #ifndef IMPCORE_RIGID_BODIES_H
9 #define IMPCORE_RIGID_BODIES_H
11 #include "core_config.h"
12 #include "internal/rigid_bodies.h"
24 IMPCORE_BEGIN_NAMESPACE
26 IMP_DECORATORS_DECL(RigidMember, RigidMembers);
81 void add_member_internal(
Particle *p,
84 static void teardown_constraints(
Particle *p);
89 RigidMembers get_members()
const;
94 const ParticleIndexes& get_member_particle_indexes()
const {
95 static ParticleIndexes empty;
96 if (
get_model()->get_has_attribute(internal::rigid_body_data().members_,
97 get_particle_index())) {
98 return get_model()->get_attribute(internal::rigid_body_data().members_,
99 get_particle_index());
105 const ParticleIndexes& get_body_member_particle_indexes()
const {
106 static ParticleIndexes empty;
108 ->get_has_attribute(internal::rigid_body_data().body_members_,
109 get_particle_index())) {
111 ->get_attribute(internal::rigid_body_data().body_members_,
112 get_particle_index());
130 const ParticlesTemp &ps);
138 static void teardown_particle(
RigidBody rb);
144 return internal::get_has_required_attributes_for_body(p->get_model(),
150 return internal::get_has_required_attributes_for_body(m, pi);
156 return XYZ::get_coordinates();
162 v(
get_particle()->get_value(internal::rigid_body_data().quaternion_[0]),
163 get_particle()->get_value(internal::rigid_body_data().quaternion_[1]),
164 get_particle()->get_value(internal::rigid_body_data().quaternion_[2]),
165 get_particle()->get_value(internal::rigid_body_data().quaternion_[3]));
167 "Rotation is not a unit vector: " << v);
197 const algebra::Vector3D &local_location,
198 DerivativeAccumulator &da);
201 const algebra::Vector3D &global_derivative,
202 const algebra::Vector3D &local_location,
203 const algebra::Rotation3D &rot,
204 DerivativeAccumulator &da);
207 algebra::Vector3D get_torque()
const {
208 algebra::Vector3D ret;
209 for (
unsigned int i=0; i< 3; ++i) {
212 ->get_derivative(internal::rigid_body_data().torque_[i]);
224 void normalize_rotation();
227 void update_members();
232 unsigned int get_number_of_members()
const {
233 return get_body_member_particle_indexes().size()
234 + get_member_particle_indexes().size();
264 return get_model()->get_internal_coordinates(get_particle_index());
269 get_model()->get_internal_coordinates(get_particle_index())=v;
270 get_rigid_body().get_particle()->clear_caches();
273 void set_internal_transformation(
const algebra::Transformation3D& v) {
275 get_particle()->has_attribute(internal::rigid_body_data().lquaternion_[0]),
276 "Can only set the internal transformation if member is"
277 <<
" a rigid body itself.");
278 set_internal_coordinates(v.get_translation());
280 get_particle()->set_value(internal::rigid_body_data().lquaternion_[0],
281 v.get_rotation().get_quaternion()[0]);
282 get_particle()->set_value(internal::rigid_body_data().lquaternion_[1],
283 v.get_rotation().get_quaternion()[1]);
284 get_particle()->set_value(internal::rigid_body_data().lquaternion_[2],
285 v.get_rotation().get_quaternion()[2]);
286 get_particle()->set_value(internal::rigid_body_data().lquaternion_[3],
287 v.get_rotation().get_quaternion()[3]);
288 get_rigid_body().get_particle()->clear_caches();
293 get_particle()->has_attribute(internal::rigid_body_data().lquaternion_[0]),
294 "Can only set the internal transformation if member is a "
295 <<
"rigid body itself.");
297 =
get_model()->get_internal_coordinates(get_particle_index());
299 rot(
get_particle()->get_value(internal::rigid_body_data()
313 XYZ::set_coordinates(center);
329 return internal::get_has_required_attributes_for_member(m, p);
335 class IMPCOREEXPORT RigidMembersRefiner:
public Refiner {
337 RigidMembersRefiner(std::string name=
"RigidMembersRefiner%d"):Refiner(name){}
342 IMPCOREEXPORT RigidMembersRefiner* get_rigid_members_refiner();
354 inline void transform(RigidBody a,
const algebra::Transformation3D&tr) {
360 IMPCOREEXPORT algebra::ReferenceFrame3D
370 bool no_members=
false);
373 IMP_DECORATORS_DEF(RigidMember,RigidMembers);
376 IMPCORE_END_NAMESPACE