From b394465770740840decf1a0080d3b2bb61ac77a2 Mon Sep 17 00:00:00 2001 From: ansgar <ansgar@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Wed, 28 Apr 2010 02:31:31 +0000 Subject: [PATCH] added generic pointlist -> pointlist superposition git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2123 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/mol/alg/pymod/export_svd_superpose.cc | 5 ++- modules/mol/alg/src/svd_superpose.cc | 35 +++++++++++++++++++ modules/mol/alg/src/svd_superpose.hh | 7 ++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/modules/mol/alg/pymod/export_svd_superpose.cc b/modules/mol/alg/pymod/export_svd_superpose.cc index 435744e52..3acdc6f6b 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 2f770167f..191871a9c 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 80f076278..1b3f5e29a 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, -- GitLab