diff --git a/modules/mol/alg/src/svd_superpose.cc b/modules/mol/alg/src/svd_superpose.cc index a383ea56b4494cd0a4bad9c91d109a8c3364f86c..38dd51202d87327646b1989f996b8bf8166d4bc7 100644 --- a/modules/mol/alg/src/svd_superpose.cc +++ b/modules/mol/alg/src/svd_superpose.cc @@ -266,19 +266,20 @@ SuperpositionResult MeanSquareMinimizerImpl::MinimizeOnce() const{ SuperpositionResult MeanSquareMinimizerImpl::IterativeMinimize(int max_cycles, Real distance_threshold) const{ + EMat4 transformation_matrix_old; EMat4 transformation_matrix; EMatX transformed_atoms; - EMatX subset1; - EMatX subset2; + EMatX subset1 = atoms1_; + EMatX subset2 = atoms2_; SuperpositionResult res; EMat4 diff; std::vector<int> matching_indices; - EMat4 identity_matrix = EMat4::Identity(); //do initial superposition res = this->Minimize(atoms1_, atoms2_); transformation_matrix = Mat4ToEigenMat4(res.transformation); + transformation_matrix_old = transformation_matrix; //note, that the initial superposition is the first cycle... int cycles=1; @@ -302,12 +303,15 @@ SuperpositionResult MeanSquareMinimizerImpl::IterativeMinimize(int max_cycles, R res = this->Minimize(subset1,subset2); transformation_matrix = Mat4ToEigenMat4(res.transformation); - diff = transformation_matrix-identity_matrix; + diff = transformation_matrix_old-transformation_matrix; if(diff.cwise().abs().sum()<0.0001){ + ++cycles; break; } + transformation_matrix_old = transformation_matrix; + } res.rmsd_superposed_atoms = calc_rmsd_for_ematx(subset1, subset2, transformation_matrix); @@ -479,7 +483,9 @@ SuperpositionResult IterativeSuperposeSVD(const mol::EntityView& ev, AtomViewList atoms_ref = ev_ref.GetAtomList(); MeanSquareMinimizer msm = MeanSquareMinimizer::FromAtomLists(atoms, atoms_ref); + SuperpositionResult result = msm.IterativeMinimize(max_cycles, distance_threshold); + result.rmsd = calc_rmsd_for_atom_lists(atoms, atoms_ref, result.transformation); if (apply_transform) { mol::AtomView jv=atoms.front();