From bfc47bd7ce9f54bdc6ace1d7db55f9a178dde73c Mon Sep 17 00:00:00 2001 From: Marco Biasini <marco.biasini@unibas.ch> Date: Mon, 7 Feb 2011 20:36:54 +0100 Subject: [PATCH] added MergeCoordGroup function --- modules/mol/base/pymod/__init__.py | 16 +++++++++++++++- modules/mol/base/pymod/export_coord_group.cc | 2 ++ modules/mol/base/src/coord_group.cc | 15 +++++++++++++++ modules/mol/base/src/coord_group.hh | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/modules/mol/base/pymod/__init__.py b/modules/mol/base/pymod/__init__.py index 6431ae0ce..a473f7ae4 100644 --- a/modules/mol/base/pymod/__init__.py +++ b/modules/mol/base/pymod/__init__.py @@ -18,4 +18,18 @@ #------------------------------------------------------------------------------ from _mol import * import ost.geom as _geom -from ost.mol import alg \ No newline at end of file +from ost.mol import alg + + +def MergeCoordGroups(*coord_groups): + """ + Merge several separate coord groups into one. The coord groups must have the + same number of atoms. In case no coord group is supplied, None will be + returned. + """ + if len(coord_groups)==0: + return None + cg=CreateCoordGroup(coord_groups[0].atoms) + for coord_group in coord_groups: + cg.AddFrames(coord_group) + return cg \ No newline at end of file diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc index 5589268af..bed54377e 100644 --- a/modules/mol/base/pymod/export_coord_group.cc +++ b/modules/mol/base/pymod/export_coord_group.cc @@ -46,11 +46,13 @@ void export_CoordGroup() .def("IsValid",&CoordGroupHandle::IsValid) .def("GetEntity",&CoordGroupHandle::GetEntity) .def("GetAtomCount",&CoordGroupHandle::GetAtomCount) + .def("AddFrames", &CoordGroupHandle::AddFrames) .def("GetFrameCount",&CoordGroupHandle::GetFrameCount) .def("SetFramePositions",&CoordGroupHandle::SetFramePositions) .def("SetAtomPos",&CoordGroupHandle::SetAtomPos) .def("GetAtomPos",&CoordGroupHandle::GetAtomPos) .def("CopyFrame",&CoordGroupHandle::CopyFrame) + .add_property("atoms", &CoordGroupHandle::GetAtomList) .def("IsValid", &CoordGroupHandle::IsValid) .def("Capture", capture1) .def("Capture", capture2) diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc index 4dcabf68b..b4bea4c8e 100644 --- a/modules/mol/base/src/coord_group.cc +++ b/modules/mol/base/src/coord_group.cc @@ -93,6 +93,21 @@ void CoordGroupHandle::AddFrame(const std::vector<geom::Vec3>& clist) } } +void CoordGroupHandle::AddFrames(const CoordGroupHandle& cg) +{ + this->CheckValidity(); + if (source_->IsMutable()) { + if (cg.GetAtomCount()!=this->GetAtomCount()) { + throw IntegrityError("Atom number don't match"); + } + for (size_t i=0; i<cg.GetFrameCount(); ++i) { + source_->AddFrame(*cg.GetFrame(i)); + } + } else { + throw IntegrityError("Can't add frame to immutable CoordGroup"); + } +} + void CoordGroupHandle::CheckValidity() const { if (!source_) { diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh index dfa3c8530..8f7f78c9e 100644 --- a/modules/mol/base/src/coord_group.hh +++ b/modules/mol/base/src/coord_group.hh @@ -67,6 +67,7 @@ public: /// \brief add frame void AddFrame(const std::vector<geom::Vec3>& clist); + void AddFrames(const CoordGroupHandle& cg); /// \brief set an indidivial atom position in the given frame void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos); -- GitLab