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