00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMPCORE_XYZ_R_H
00010 #define IMPCORE_XYZ_R_H
00011
00012 #include "XYZ.h"
00013 #include <IMP/algebra/Sphere3D.h>
00014
00015 #include <limits>
00016
00017 IMPCORE_BEGIN_NAMESPACE
00018
00019
00020
00021
00022
00023
00024
00025 class IMPCOREEXPORT XYZR: public XYZ
00026 {
00027 public:
00028 IMP_DECORATOR_TRAITS(XYZR, XYZ, FloatKey,
00029 radius_key, get_default_radius_key());
00030
00031
00032
00033
00034
00035
00036 static XYZR setup_particle(Particle *p,
00037 FloatKey radius_key= get_default_radius_key()) {
00038 if (!XYZ::particle_is_instance(p)) {
00039 XYZ::setup_particle(p);
00040 }
00041 p->add_attribute(radius_key, 0, false);
00042 return XYZR(p, radius_key);
00043 }
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 static XYZR setup_particle(Particle *p,
00054 Float radius,
00055 FloatKey radius_key= get_default_radius_key()) {
00056 p->add_attribute(radius_key, radius, false);
00057 return XYZR(p, radius_key);
00058 }
00059
00060
00061
00062
00063
00064
00065
00066 static XYZR setup_particle(Particle *p,
00067 const algebra::SphereD<3> &s,
00068 FloatKey radius_key= get_default_radius_key()) {
00069 XYZ::setup_particle(p, s.get_center());
00070 p->add_attribute(radius_key, s.get_radius(), false);
00071 return XYZR(p, radius_key);
00072 }
00073
00074
00075 static bool particle_is_instance(Particle *p,
00076 FloatKey radius_key= get_default_radius_key()) {
00077 return p->has_attribute(radius_key);
00078 }
00079 IMP_DECORATOR_GET_SET(radius, get_radius_key(), Float, Float);
00080
00081
00082
00083 algebra::SphereD<3> get_sphere() const {
00084 return algebra::SphereD<3>(get_coordinates(), get_radius());
00085 }
00086
00087
00088 void set_sphere(const algebra::SphereD<3> &s) {
00089 set_coordinates(s.get_center());
00090 set_radius(s.get_radius());
00091 }
00092
00093 static FloatKey get_default_radius_key() {
00094 return IMP::internal::xyzr_keys[3];
00095 }
00096 void add_to_radius_derivative(double v,
00097 DerivativeAccumulator &d) {
00098 get_particle()->add_to_derivative(get_radius_key(), v, d);
00099 }
00100 };
00101
00102 IMP_OUTPUT_OPERATOR(XYZR);
00103
00104 IMP_DECORATORS(XYZR, XYZs);
00105
00106
00107
00108
00109
00110
00111
00112
00113 inline double get_distance(XYZR a, XYZR b) {
00114 return IMP::algebra::get_distance(a.get_sphere(), b.get_sphere());
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 IMPCOREEXPORT void set_enclosing_sphere(XYZR b,
00130 const XYZsTemp &v,
00131 double slack=0);
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 IMPCOREEXPORT void set_enclosing_radius(XYZR b,
00142 const XYZsTemp &v);
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 IMPCOREEXPORT algebra::SphereD<3> get_enclosing_sphere(const XYZsTemp& v,
00153 FloatKey rk=XYZR::get_default_radius_key());
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 IMPCOREEXPORT XYZRs create_xyzr_particles(Model *m,
00167 unsigned int num,
00168 Float radius,
00169 Float box_side=10);
00170
00171
00172 inline const algebra::SphereD<3> get_geometry(XYZR d) {return d.get_sphere();}
00173
00174 inline const algebra::SphereD<3>& get_geometry(const algebra::SphereD<3> &v) {
00175 return v;
00176 }
00177
00178 inline void set_geometry(XYZR d, const algebra::SphereD<3> &v) {
00179 d.set_sphere(v);
00180 }
00181
00182 inline void set_geometry(algebra::SphereD<3> &vbase,
00183 const algebra::SphereD<3> &v) {vbase=v;}
00184
00185 IMPCORE_END_NAMESPACE
00186
00187 #endif