00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMPATOM_DIFFUSION_H
00010 #define IMPATOM_DIFFUSION_H
00011
00012 #include "atom_config.h"
00013
00014 #include <IMP/core/XYZ.h>
00015 #include <IMP/algebra/Vector3D.h>
00016 #include <IMP/internal/constants.h>
00017
00018 #include <vector>
00019 #include <limits>
00020
00021 IMPATOM_BEGIN_NAMESPACE
00022
00023
00024
00025
00026
00027
00028
00029 class IMPATOMEXPORT Diffusion:
00030 public IMP::core::XYZ
00031 {
00032 public:
00033 IMP_DECORATOR(Diffusion, IMP::core::XYZ);
00034
00035
00036
00037
00038 static Diffusion setup_particle(Particle *p,
00039 const algebra::VectorD<3> &v,
00040 Float D) {
00041 XYZ::setup_particle(p, v);
00042 p->add_attribute(get_D_key(), D);
00043 return Diffusion(p);
00044 }
00045
00046
00047
00048
00049
00050 static Diffusion setup_particle(Particle *p,
00051 Float D=0) {
00052 IMP_USAGE_CHECK(XYZ::particle_is_instance(p),
00053 "Particle must already be an XYZ particle");
00054 p->add_attribute(get_D_key(), D);
00055 return Diffusion(p);
00056 }
00057
00058 IMP_DECORATOR_GET_SET(D_in_cm2_per_second, get_D_key(), Float, Float);
00059
00060
00061
00062
00063 void set_D_from_radius_in_angstroms(Float r);
00064
00065
00066
00067
00068 void set_D_from_radius_in_angstroms(Float r, Float t);
00069
00070
00071 static bool particle_is_instance(Particle *p) {
00072 return XYZ::particle_is_instance(p)
00073 && p->has_attribute(get_D_key());
00074 }
00075
00076 #ifndef SWIG
00077 #ifndef IMP_DOXYGEN
00078 unit::SquareCentimeterPerSecond get_D() const {
00079 return
00080 unit::SquareCentimeterPerSecond(get_particle()->get_value(get_D_key()));
00081 }
00082
00083 void set_D(unit::SquareCentimeterPerSecond D) {
00084 set_D_in_cm2_per_second(D.get_value());
00085 }
00086
00087 static unit::SquareCentimeterPerSecond D_from_r(unit::Angstrom radius,
00088 unit::Kelvin t
00089 #ifndef _MSC_VER
00090
00091 = IMP::internal::DEFAULT_TEMPERATURE
00092 #endif
00093 );
00094
00095 unit::Angstrom
00096 get_sigma(unit::Femtosecond dt) const {
00097 return sqrt(2.0*dt*get_D());
00098 }
00099 void set_D_from_radius(unit::Angstrom radius,
00100 unit::Kelvin t
00101 #ifndef _MSC_VER
00102
00103 = IMP::internal::DEFAULT_TEMPERATURE
00104 #endif
00105 ) {
00106 set_D_from_radius_in_angstroms(unit::strip_units(radius),
00107 unit::strip_units(t));
00108 }
00109 #endif
00110 #endif
00111
00112
00113 static FloatKey get_D_key();
00114 };
00115
00116 IMP_OUTPUT_OPERATOR(Diffusion);
00117
00118
00119 IMP_DECORATORS(Diffusion, core::XYZs);
00120
00121
00122
00123
00124
00125 IMPATOM_END_NAMESPACE
00126
00127 #endif