11 #include "core_config.h"
12 #include "../macros.h"
13 #include "internal/dihedral_helpers.h"
21 IMPCORE_BEGIN_NAMESPACE
36 static FloatKey get_coordinate_key(
unsigned int i) {
38 return IMP::internal::xyzr_keys[i];
47 p->add_attribute(get_coordinate_key(0),v[0]);
48 p->add_attribute(get_coordinate_key(1),v[1]);
49 p->add_attribute(get_coordinate_key(2),v[2]);
57 void set_coordinate(
unsigned int i,
Float v) {
58 get_model()->get_sphere(get_particle_index())[i]=v;
62 get_model()->get_sphere(get_particle_index())[0]=v[0];
63 get_model()->get_sphere(get_particle_index())[1]=v[1];
64 get_model()->get_sphere(get_particle_index())[2]=v[2];
68 Float get_coordinate(
int i)
const {
69 return get_model()->get_sphere(get_particle_index())[i];
72 Float get_derivative(
int i)
const {
73 return get_derivatives()[i];
76 void add_to_derivative(
int i,
Float v,
78 get_particle()->add_to_derivative(get_coordinate_key(i), v, d);
83 get_model()->add_to_coordinate_derivatives(get_particle_index(),
89 bool get_coordinates_are_optimized()
const {
90 return get_particle()->get_is_optimized(get_coordinate_key(0))
91 &&
get_particle()->get_is_optimized(get_coordinate_key(1))
92 &&
get_particle()->get_is_optimized(get_coordinate_key(2));
95 void set_coordinates_are_optimized(
bool tf)
const {
97 get_particle()->set_is_optimized(get_coordinate_key(1), tf);
98 get_particle()->set_is_optimized(get_coordinate_key(2), tf);
110 return get_model()->get_sphere(get_particle_index()).get_center();
117 return get_model()->get_coordinate_derivatives(get_particle_index());
122 && p->has_attribute(get_coordinate_key(0))
123 && p->has_attribute(get_coordinate_key(1)))
124 || (!p->has_attribute(get_coordinate_key(2))
125 && !p->has_attribute(get_coordinate_key(0))
126 && !p->has_attribute(get_coordinate_key(1))),
127 "Particle expected to either have all of x,y,z or none.");
128 return p->has_attribute(get_coordinate_key(2));
132 return m->get_has_attribute(get_coordinate_key(2), pi);
138 static const FloatKeys& get_xyz_keys();
153 inline double get_dihedral(XYZ a, XYZ b, XYZ c, XYZ d) {
154 return internal::dihedral(a, b, c, d,
nullptr,
nullptr,
nullptr,
nullptr);
169 d.set_coordinates(v);
175 IMPCORE_END_NAMESPACE
188 inline void set_vector_d_geometry(Particle *p,
const algebra::Vector3D &v) {
189 core::XYZ(p).set_coordinates(v);