00001
00002
00003
00004
00005
00006
00007 #ifndef IMPSAXS_UTILITY_H
00008 #define IMPSAXS_UTILITY_H
00009
00010 #include "saxs_config.h"
00011 #include "FormFactorTable.h"
00012 #include <IMP/exception.h>
00013 #include <IMP/core/XYZ.h>
00014
00015 IMPSAXS_BEGIN_NAMESPACE
00016
00017 inline Float sinc(Float value) {
00018 if(std::abs(value) < 1.0e-16) return 1.0;
00019 return std::sin(value)/value;
00020 }
00021
00022 inline void copy_coordinates(const Particles& particles,
00023 std::vector<algebra::VectorD<3> >& coordinates) {
00024
00025 coordinates.resize(particles.size());
00026 for (unsigned int i=0; i<particles.size(); i++) {
00027 coordinates[i] = core::XYZ(particles[i]).get_coordinates();
00028 }
00029 }
00030
00031 inline void copy_data(const Particles& particles,
00032 FormFactorTable* ff_table,
00033 std::vector<algebra::VectorD<3> >& coordinates,
00034 Floats& form_factors) {
00035
00036 coordinates.resize(particles.size());
00037 form_factors.resize(particles.size());
00038 for (unsigned int i=0; i<particles.size(); i++) {
00039 coordinates[i] = core::XYZ(particles[i]).get_coordinates();
00040 form_factors[i] = ff_table->get_form_factor(particles[i]);
00041 }
00042 }
00043
00044
00045 inline Float compute_max_distance(const Particles& particles) {
00046 Float max_dist2 = 0;
00047 std::vector<algebra::VectorD<3> > coordinates(particles.size());
00048 copy_coordinates(particles, coordinates);
00049 for (unsigned int i = 0; i < coordinates.size(); i++) {
00050 for (unsigned int j = i + 1; j < coordinates.size(); j++) {
00051 Float dist2 = get_squared_distance(coordinates[i], coordinates[j]);
00052 if(dist2 > max_dist2)
00053 max_dist2 = dist2;
00054 }
00055 }
00056 return sqrt(max_dist2);
00057 }
00058
00059
00060
00061 inline Float compute_max_distance(const Particles& particles1,
00062 const Particles& particles2) {
00063 Float max_dist2 = 0;
00064 std::vector<algebra::VectorD<3> > coordinates1(particles1.size());
00065 std::vector<algebra::VectorD<3> > coordinates2(particles2.size());
00066 for (unsigned int i = 0; i < particles1.size(); i++) {
00067 coordinates1[i]
00068 = core::XYZ::decorate_particle(particles1[i]).get_coordinates();
00069 }
00070 for (unsigned int i = 0; i < particles2.size(); i++) {
00071 coordinates2[i]
00072 = core::XYZ::decorate_particle(particles2[i]).get_coordinates();
00073 }
00074 for (unsigned int i = 0; i < coordinates1.size(); i++) {
00075 for (unsigned int j = i + 1; j < coordinates2.size(); j++) {
00076 Float dist2 = get_squared_distance(coordinates1[i], coordinates2[j]);
00077 if(dist2 > max_dist2)
00078 max_dist2 = dist2;
00079 }
00080 }
00081 return sqrt(max_dist2);
00082 }
00083
00084
00085 inline Float radius_of_gyration(const Particles& particles) {
00086 algebra::VectorD<3> centroid(0.0, 0.0, 0.0);
00087 std::vector<algebra::VectorD<3> > coordinates(particles.size());
00088 for (unsigned int i = 0; i < particles.size(); i++) {
00089 coordinates[i]
00090 = core::XYZ::decorate_particle(particles[i]).get_coordinates();
00091 centroid += coordinates[i];
00092 }
00093 centroid /= particles.size();
00094 Float rg = 0;
00095 for (unsigned int i = 0; i < particles.size(); i++) {
00096 rg += get_squared_distance(coordinates[i], centroid);
00097 }
00098 rg /= particles.size();
00099 return sqrt(rg);
00100 }
00101
00102 IMPSAXS_END_NAMESPACE
00103
00104 #endif