From 661b7cf3cdde38f8c46e853d905f6f21bd6b81b7 Mon Sep 17 00:00:00 2001
From: Niklaus Johner <nij2003@med.cornell.edu>
Date: Wed, 11 Apr 2012 12:06:32 -0400
Subject: [PATCH] Added the necessary functions to add frames with periodic
 boundary conditions to a CoordGroup.

---
 modules/mol/base/pymod/export_coord_group.cc |  5 ++++-
 modules/mol/base/src/coord_group.cc          | 12 +++++++++++-
 modules/mol/base/src/coord_group.hh          |  3 ++-
 modules/mol/base/src/coord_source.hh         |  1 +
 modules/mol/base/src/in_mem_coord_source.cc  |  6 ++++++
 modules/mol/base/src/in_mem_coord_source.hh  |  1 +
 6 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc
index fa3a06132..4ada5f884 100644
--- a/modules/mol/base/pymod/export_coord_group.cc
+++ b/modules/mol/base/pymod/export_coord_group.cc
@@ -38,6 +38,8 @@ namespace {
 
   void (CoordGroupHandle::*capture1)()=&CoordGroupHandle::Capture;
   void (CoordGroupHandle::*capture2)(uint)=&CoordGroupHandle::Capture;
+  void (CoordGroupHandle::*add_frame1)(const geom::Vec3List&)=&CoordGroupHandle::AddFrame;
+  void (CoordGroupHandle::*add_frame2)(const geom::Vec3List&,const geom::Vec3&,const geom::Vec3&)=&CoordGroupHandle::AddFrame;
 }
 
 void export_CoordGroup()
@@ -47,7 +49,8 @@ void export_CoordGroup()
     .def("GetEntity",&CoordGroupHandle::GetEntity)
     .def("GetAtomCount",&CoordGroupHandle::GetAtomCount)
     .def("AddFrames", &CoordGroupHandle::AddFrames)
-    .def("AddFrame", &CoordGroupHandle::AddFrame)
+    .def("AddFrame", add_frame1)
+    .def("AddFrame", add_frame2)
     .def("GetFrameCount",&CoordGroupHandle::GetFrameCount)
     .def("GetFramePositions",&CoordGroupHandle::GetFramePositions)
     .def("SetFramePositions",&CoordGroupHandle::SetFramePositions)
diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc
index 127c82463..949199240 100644
--- a/modules/mol/base/src/coord_group.cc
+++ b/modules/mol/base/src/coord_group.cc
@@ -103,6 +103,16 @@ CoordGroupHandle::operator bool() const
   }
 }
 
+  void CoordGroupHandle::AddFrame(const geom::Vec3List& clist, const geom::Vec3& cell_size, const geom::Vec3& cell_angles)
+{
+  this->CheckValidity();
+  if (source_->IsMutable()) {
+    source_->AddFrame(clist,cell_size,cell_angles);    
+  } else {
+    throw IntegrityError("Can't add frame to immutable CoordGroup");
+  }
+}
+
 void CoordGroupHandle::AddFrames(const CoordGroupHandle& cg)
 {
   this->CheckValidity();
@@ -142,7 +152,7 @@ CoordFramePtr CoordGroupHandle::GetFrame(uint frame) const
   this->CheckValidity();
   return source_->GetFrame(frame);
 }
-
+  
 AtomHandleList CoordGroupHandle::GetAtomList() const
 {
   this->CheckValidity();
diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh
index 22a829dd6..8aa907f4f 100644
--- a/modules/mol/base/src/coord_group.hh
+++ b/modules/mol/base/src/coord_group.hh
@@ -69,7 +69,8 @@ public:
   /// \brief add frame 
   //void AddFrame(const std::vector<geom::Vec3>& clist);
   void AddFrame(const geom::Vec3List& clist);
-
+  void AddFrame(const geom::Vec3List& clist,const geom::Vec3& cell_size,const geom::Vec3& cell_angles);
+  
   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);
diff --git a/modules/mol/base/src/coord_source.hh b/modules/mol/base/src/coord_source.hh
index 604817535..fec0d9946 100644
--- a/modules/mol/base/src/coord_source.hh
+++ b/modules/mol/base/src/coord_source.hh
@@ -70,6 +70,7 @@ public:
   void Capture(uint f);
   
   virtual void AddFrame(const std::vector<geom::Vec3>& coords) = 0;
+  virtual void AddFrame(const std::vector<geom::Vec3>& coords,const geom::Vec3& cell_size,const geom::Vec3& cell_angles) = 0;
   virtual void InsertFrame(int pos, const std::vector<geom::Vec3>& coords) = 0;
 protected:
   void SetMutable(bool flag);
diff --git a/modules/mol/base/src/in_mem_coord_source.cc b/modules/mol/base/src/in_mem_coord_source.cc
index 1690c1104..ea01db894 100644
--- a/modules/mol/base/src/in_mem_coord_source.cc
+++ b/modules/mol/base/src/in_mem_coord_source.cc
@@ -30,6 +30,12 @@ void InMemCoordSource::AddFrame(const std::vector<geom::Vec3>& coords)
   frames_.push_back(fp);
 }
 
+void InMemCoordSource::AddFrame(const std::vector<geom::Vec3>& coords,const geom::Vec3& cell_size,const geom::Vec3& cell_angles)
+{
+  CoordFramePtr fp(new CoordFrame(coords,cell_size,cell_angles));
+  frames_.push_back(fp);
+}
+  
 void InMemCoordSource::InsertFrame(int pos, const std::vector<geom::Vec3>& coords)
 {
   CoordFrameList::iterator it = frames_.begin();
diff --git a/modules/mol/base/src/in_mem_coord_source.hh b/modules/mol/base/src/in_mem_coord_source.hh
index dc032ebbe..0984791aa 100644
--- a/modules/mol/base/src/in_mem_coord_source.hh
+++ b/modules/mol/base/src/in_mem_coord_source.hh
@@ -44,6 +44,7 @@ public:
   
   void AddFrame(const CoordFramePtr& frame);
   virtual void AddFrame(const std::vector<geom::Vec3>& coords);
+  virtual void AddFrame(const std::vector<geom::Vec3>& coords,const geom::Vec3& cell_size,const geom::Vec3& cell_angles);
   virtual void InsertFrame(int pos, const std::vector<geom::Vec3>& coords);
   
 private:
-- 
GitLab