9 #ifndef IMPALGEBRA_DISTANCE_H
10 #define IMPALGEBRA_DISTANCE_H
12 #include <IMP/algebra/algebra_config.h>
17 IMPALGEBRA_BEGIN_NAMESPACE
26 template <
class Vector3DsOrXYZs0,
class Vector3DsOrXYZs1>
28 const Vector3DsOrXYZs0& m1,
29 const Vector3DsOrXYZs1& m2) {
30 using algebra::get_vector_geometry;
32 std::distance(m2.begin(), m2.end()),
33 "The input sets of XYZ points "
34 <<
"should be of the same size");
36 typename Vector3DsOrXYZs0::const_iterator it0 = m1.begin();
37 typename Vector3DsOrXYZs1::const_iterator it1 = m2.begin();
38 for (; it0 != m1.end(); ++it0, ++it1) {
42 return std::sqrt(rmsd / m1.size());
46 template <
class Vector3DsOrXYZs0,
class Vector3DsOrXYZs1>
47 inline double get_rmsd(
const Vector3DsOrXYZs0& m1,
const Vector3DsOrXYZs1& m2) {
52 template <
class Vector3DsOrXYZs0,
class Vector3DsOrXYZs1>
53 inline double get_weighted_rmsd_transforming_first(
const Transformation3D& tr,
54 const Vector3DsOrXYZs0& m1,
55 const Vector3DsOrXYZs1& m2,
57 using algebra::get_vector_geometry;
59 std::distance(m2.begin(), m2.end()),
60 "The input sets of XYZ points "
61 <<
"should be of the same size");
63 std::distance(weights.begin(), weights.end()),
64 "The input sets of XYZ points and the weights "
65 <<
"should be of the same size");
68 double weight_sum = 0.0;
69 typename Vector3DsOrXYZs0::const_iterator it0 = m1.begin();
70 typename Vector3DsOrXYZs1::const_iterator it1 = m2.begin();
71 Floats::const_iterator it3 = weights.begin();
72 for (; it0 != m1.end(); ++it0, ++it1, ++it3) {
73 Vector3D tred = tr.get_transformed(get_vector_geometry(*it0));
77 return std::sqrt(rmsd / weight_sum);
82 template <
class Vector3DsOrXYZs0,
class Vector3DsOrXYZs1>
89 IMPALGEBRA_END_NAMESPACE
double get_squared_distance(const VectorD< D > &v1, const VectorD< D > &v2)
Compute the squared distance between two vectors.
double get_weighted_rmsd(const Vector3DsOrXYZs0 &m1, const Vector3DsOrXYZs1 &m2, const Floats &weights)
double get_rmsd(const Vector3DsOrXYZs0 &m1, const Vector3DsOrXYZs1 &m2)
Transformation3D get_identity_transformation_3d()
Return a transformation that does not do anything.
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method.
double get_rmsd_transforming_first(const Transformation3D &tr, const Vector3DsOrXYZs0 &m1, const Vector3DsOrXYZs1 &m2)
Calculate the root mean square deviation between two sets of 3D points.