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