ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/math/RMSD.cpp
Revision: 1335
Committed: Fri Apr 3 17:44:57 2009 UTC (16 years, 1 month ago) by gezelter
Original Path: trunk/src/math/RMSD.cpp
File size: 1636 byte(s)
Log Message:
Beginning import of SVD and RMSD code to handle orientational restraints of
flexible molecules.  Work in progress, doesn't compile yet.

File Contents

# Content
1 #include "math/RMSD.hpp"
2 #include "math/SVD.hpp"
3
4 using namespace oopse;
5 using namespace JAMA;
6
7 RealType RMSD::calculate_rmsd(std::vector<Vector3d> mov,
8 Vector3d mov_com,
9 Vector3d mov_to_ref,
10 RotMat3x3d U) {
11
12 assert(mov.size() == ref_.size());
13 int n;
14 int n_vec = ref_.size();
15
16 /* calculate the centre of mass */
17 mov_com = V3Zero;
18
19 for (n=0; n < n_vec; n++) {
20 mov_com += mov[n];
21 }
22
23 mov_com /= (RealType)n_vec;
24
25 mov_to_ref = ref_com - mov_com;
26
27 /* shift mov to center of mass */
28
29 for (n=0; n < n_vec; n++) {
30 mov[n] -= mov_com;
31 }
32
33 /* initialize */
34 Mat3x3d R = Mat3x3d(0.0);
35 RealType E0 = 0.0;
36
37 for (n=0; n < n_vec; n++) {
38
39 /*
40 * E0 = 1/2 * sum(over n): y(n)*y(n) + x(n)*x(n)
41 */
42 E0 += dot(mov[n], mov[n]) + dot(ref_[n], ref_[n]);
43
44 /*
45 * correlation matrix R:
46 * R(i,j) = sum(over n): y(n,i) * x(n,j)
47 * where x(n) and y(n) are two vector sets
48 */
49
50 R += outProduct(mov[n], ref_[n]);
51
52 }
53 E0 *= 0.5;
54
55 RectMatrix<RealType, n_vec, 3> v;
56 Vector3d s;
57 Mat3x3d w;
58
59 SVD<RealType, n_vec, 3> svd = SVD<RealType, n_vec, 3>(R);
60 svd.getU(v);
61 svd.getSingularValues(s);
62 svd.getV(w);
63
64 int is_reflection = (v.determinant() * w.determinant()) < 0.0;
65 if (is_reflection)
66 s(2) = -s(2);
67
68 RealType rmsd_sq = (E0 - 2.0 * s.sum() )/ (RealType)n_vec;
69 rmsd_sq = max(rmsd_sq,0.0);
70 RealType rmsd = sqrt(rmsd_sq);
71 return rmsd;
72 }
73
74
75 RotMat3x3d RMSD::optimal_superposition(std::vector<Vector3d> mov) {
76 }
77