diff --git a/modules/mol/base/pymod/__init__.py b/modules/mol/base/pymod/__init__.py index 6431ae0ce891d8e3b8fdbc2dd1ff42c60e90d046..a473f7ae467faff11c759f9f48627018cf665d8a 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 5589268afbb64498a74255cc797cda97f4d7bfdf..bed54377ec626890bae0de10ec69ae032ecf64e5 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 4dcabf68bdc7ef09818a3f9a42fae7886c031dee..b4bea4c8e8267214f27c3794884ebb3978c9c62b 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 dfa3c85304e38e1e63da5cbac085220b7e063fed..8f7f78c9ec0196cb9619ec0dda0c85b77b7ebfb3 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);