diff --git a/modules/mol/alg/pymod/export_svd_superpose.cc b/modules/mol/alg/pymod/export_svd_superpose.cc index 435744e523ee0ac57c9fac79de5c9804d1d39c7f..3acdc6f6b7d0bef234d00cde96a0e14b76b02a91 100644 --- a/modules/mol/alg/pymod/export_svd_superpose.cc +++ b/modules/mol/alg/pymod/export_svd_superpose.cc @@ -30,6 +30,8 @@ using namespace ost::mol::alg; 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; class_<SuperpositionResult>("SuperpositionResult", init<>()) .def_readwrite("ncycles", &SuperpositionResult::ncycles) .def_readwrite("rmsd", &SuperpositionResult::rmsd) @@ -41,7 +43,8 @@ void export_svdSuperPose() &SuperpositionResult::entity_view2) ; def("SuperposeAtoms", &SuperposeAtoms,(arg("apply_transform")=true)); - def("SuperposeSVD", &SuperposeSVD, (arg("apply_transform")=true)); + def("SuperposeSVD", sup1); + def("SuperposeSVD", sup2); def("CalculateRMSD", &CalculateRMSD, (arg("transformation")=geom::Mat4())); def("IterativeSuperposition", &IterativeSuperposition, (arg("ncycles")=200, arg("dist_thres")=4.0, diff --git a/modules/mol/alg/src/svd_superpose.cc b/modules/mol/alg/src/svd_superpose.cc index 2f770167f236fa5c1a7dc02aef7016c77823fc90..191871a9c888eca76ef2672def7d08e71281523c 100644 --- a/modules/mol/alg/src/svd_superpose.cc +++ b/modules/mol/alg/src/svd_superpose.cc @@ -131,6 +131,8 @@ public: ERVecX Vec); SuperpositionResult Run(const mol::AtomViewList& atoms1, const mol::AtomViewList& atoms2); + SuperpositionResult Run(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2); SuperpositionResult DoSuperposition(); EIGEN_MAKE_ALIGNED_OPERATOR_NEW //needed only if *fixed* sized matrices are //members of classes @@ -295,6 +297,12 @@ SuperpositionResult SuperposerSVD::Run(const mol::AtomViewList& atoms1, return impl_->Run(atoms1, atoms2); } +SuperpositionResult SuperposerSVD::Run(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2) +{ + return impl_->Run(pl1,pl2); +} + SuperpositionResult SuperposerSVDImpl::Run(const mol::AtomViewList& atoms1, const mol::AtomViewList& atoms2) { @@ -315,6 +323,15 @@ SuperpositionResult SuperposerSVDImpl::Run(const mol::AtomViewList& atoms1, return this->DoSuperposition(); } +SuperpositionResult SuperposerSVDImpl::Run(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2) +{ + for (unsigned int counter=0; counter<pl1.size();++counter) { + atoms1_.row(counter)=ERVec3(SuperposerSVDImpl::Vec3ToEigenVec(pl1[counter])); + atoms2_.row(counter)=ERVec3(SuperposerSVDImpl::Vec3ToEigenVec(pl2[counter])); + } + return this->DoSuperposition(); +} SuperpositionResult SuperposeAtoms(const mol::AtomViewList& atoms1, @@ -370,6 +387,24 @@ SuperpositionResult SuperposeSVD(const mol::EntityView& ev1, return res; } +SuperpositionResult SuperposeSVD(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2) +{ + if (pl1.size()!=pl2.size()){ + throw std::runtime_error("pointlist lengths not equal"); + } + if ((pl1.size()<3)){ + throw std::runtime_error("three or more points required"); + } + SuperposerSVD sp(pl1.size(), true); + SuperpositionResult res=sp.Run(pl1, pl2); + res.entity_view1=EntityView(); + res.entity_view2=EntityView(); + res.ncycles=1; + res.rmsd=0.0; + return res; +} + SuperpositionResult IterativeSuperposition(mol::EntityView& ev1, mol::EntityView& ev2, int ncycles, diff --git a/modules/mol/alg/src/svd_superpose.hh b/modules/mol/alg/src/svd_superpose.hh index 80f0762785df0d71bbd90a588c14ed79f30f37e1..1b3f5e29a156cb77b4f62437e86e3124a38d17ca 100644 --- a/modules/mol/alg/src/svd_superpose.hh +++ b/modules/mol/alg/src/svd_superpose.hh @@ -59,6 +59,9 @@ public: SuperpositionResult Run(const mol::AtomViewList& atoms1, const mol::AtomViewList& atoms2); + SuperpositionResult Run(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2); + private: SuperposerSVDImpl* impl_; }; @@ -72,6 +75,10 @@ SuperpositionResult DLLEXPORT_OST_MOL_ALG SuperposeSVD(const mol::EntityView& ev const mol::EntityView& ev2, bool apply_transform); +/// \brief superposes two pointlists +SuperpositionResult DLLEXPORT_OST_MOL_ALG SuperposeSVD(const std::vector<geom::Vec3>& pl1, + const std::vector<geom::Vec3>& pl2); + /// \brief iterative superposition SuperpositionResult DLLEXPORT_OST_MOL_ALG IterativeSuperposition(mol::EntityView& ev1, mol::EntityView& ev2,