diff --git a/modules/mol/alg/pymod/export_svd_superpose.cc b/modules/mol/alg/pymod/export_svd_superpose.cc index 9c4087021f959a7906384d77dda7e6ca9a104541..d5f942fe756731899f62c9d3ffd0d5a570355040 100644 --- a/modules/mol/alg/pymod/export_svd_superpose.cc +++ b/modules/mol/alg/pymod/export_svd_superpose.cc @@ -36,6 +36,8 @@ void export_svdSuperPose() { SuperpositionResult (*sup1)(const mol::EntityView&,const mol::EntityView&,bool) = SuperposeSVD; SuperpositionResult (*sup2)(const std::vector<geom::Vec3>&,const std::vector<geom::Vec3>& ) = SuperposeSVD; + SuperpositionResult (*sup3)(const mol::EntityView&,const mol::EntityView&, int, Real, bool) = IterativeSuperposeSVD; + SuperpositionResult (*sup4)(const std::vector<geom::Vec3>&,const std::vector<geom::Vec3>&, int, Real) = IterativeSuperposeSVD; class_<SuperpositionResult>("SuperpositionResult", init<>()) .def_readwrite("ncycles", &SuperpositionResult::ncycles) .def_readwrite("rmsd", &SuperpositionResult::rmsd) @@ -51,7 +53,8 @@ void export_svdSuperPose() def("SuperposeAtoms", &SuperposeAtoms,(arg("apply_transform")=true)); def("SuperposeSVD", sup1, (arg("apply_transform")=true)); def("SuperposeSVD", sup2, (arg("apply_transform")=true)); - def("IterativeSuperposeSVD", &IterativeSuperposeSVD,(arg("max_iterations")=5, arg("distance_threshold")=3.0,arg("apply_transform")=true)); + def("IterativeSuperposeSVD", sup3,(arg("max_iterations")=5, arg("distance_threshold")=3.0,arg("apply_transform")=true)); + def("IterativeSuperposeSVD", sup4,(arg("max_iterations")=5, arg("distance_threshold")=3.0)); def("CalculateRMSD", &CalculateRMSD, (arg("transformation")=geom::Mat4())); } diff --git a/modules/mol/alg/src/svd_superpose.cc b/modules/mol/alg/src/svd_superpose.cc index 38dd51202d87327646b1989f996b8bf8166d4bc7..c5279eb35a62e6ed8f079db85c795bcb31a667c6 100644 --- a/modules/mol/alg/src/svd_superpose.cc +++ b/modules/mol/alg/src/svd_superpose.cc @@ -498,5 +498,16 @@ SuperpositionResult IterativeSuperposeSVD(const mol::EntityView& ev, return result; } +SuperpositionResult DLLEXPORT_OST_MOL_ALG IterativeSuperposeSVD(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2, + int max_cycles, + Real distance_threshold){ + + MeanSquareMinimizer msm = MeanSquareMinimizer::FromPointLists(pl1, pl2); + SuperpositionResult result = msm.IterativeMinimize(max_cycles, distance_threshold); + result.rmsd = calc_rmsd_for_point_lists(pl1, pl2, result.transformation); + return result; +} + }}} //ns diff --git a/modules/mol/alg/src/svd_superpose.hh b/modules/mol/alg/src/svd_superpose.hh index bdbaf505de02ef8ab6928f268ba9fd63de0d74ee..28ee7a0d4fea5312de3937416f6af63e6410a870 100644 --- a/modules/mol/alg/src/svd_superpose.hh +++ b/modules/mol/alg/src/svd_superpose.hh @@ -102,6 +102,14 @@ SuperpositionResult DLLEXPORT_OST_MOL_ALG IterativeSuperposeSVD(const mol::Entit Real distance_threshold, bool apply_transform); +/// \brief iterative superposition of two point lists +SuperpositionResult DLLEXPORT_OST_MOL_ALG IterativeSuperposeSVD(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2, + int max_cycles, + Real distance_threshold); + + + /// \brief calculates RMSD for two entity view Real DLLEXPORT_OST_MOL_ALG CalculateRMSD(const mol::EntityView& ev1, const mol::EntityView& ev2,