diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc index 979fc552806fb52fd778f11d0893f9ee2d61f45e..28059f82b23db3226ee243dcb856ad8e179d3566 100644 --- a/modules/mol/base/pymod/export_coord_group.cc +++ b/modules/mol/base/pymod/export_coord_group.cc @@ -48,6 +48,8 @@ void export_CoordGroup() .def("GetAtomCount",&CoordGroupHandle::GetAtomCount) .def("GetFrameCount",&CoordGroupHandle::GetFrameCount) .def("SetFramePositions",&CoordGroupHandle::SetFramePositions) + .def("SetAtomPos",&CoordGroupHandle::SetAtomPos) + .def("GetAtomPos",&CoordGroupHandle::GetAtomPos) .def("CopyFrame",&CoordGroupHandle::CopyFrame) .def("IsValid", &CoordGroupHandle::IsValid) .def("Capture", capture1) diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc index e6fbd4641b9b1bae5d33f2433b05ed346d8b7f5d..6675b5499bbacd193dddf51bda764dff67f29196 100644 --- a/modules/mol/base/src/coord_group.cc +++ b/modules/mol/base/src/coord_group.cc @@ -100,6 +100,18 @@ void CoordGroupHandle::CheckValidity() const } } +void CoordGroupHandle::SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos) +{ + this->CheckValidity(); + source_->SetAtomPos(frame,atom,pos); +} + +geom::Vec3 CoordGroupHandle::GetAtomPos(uint frame, AtomHandle atom) const +{ + this->CheckValidity(); + return source_->GetAtomPos(frame,atom); +} + CoordFramePtr CoordGroupHandle::GetFrame(uint frame) const { this->CheckValidity(); diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh index 04bffc41a97ed392bbe6b30060a7ff51be9ca1a0..3b038e37b37af79ddc1d73eb2b1babbccebf988d 100644 --- a/modules/mol/base/src/coord_group.hh +++ b/modules/mol/base/src/coord_group.hh @@ -55,7 +55,7 @@ public: /// \brief assign positions to the given frame - order and count must match /// initial atomlist void SetFramePositions(uint frame, const std::vector<geom::Vec3>& clist); - + /// \brief copy atom positions of given frame to stored atoms in entity void CopyFrame(uint frame); @@ -68,6 +68,12 @@ public: /// \brief add frame void AddFrame(const std::vector<geom::Vec3>& clist); + /// \brief set an indidivial atom position in the given frame + void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos); + + /// \brief retrieve an indidivial atom position in the given frame + geom::Vec3 GetAtomPos(uint frame, AtomHandle atom) const; + /// \brief check for handle validity bool IsValid() const; diff --git a/modules/mol/base/src/coord_source.cc b/modules/mol/base/src/coord_source.cc index b1e54ecee67ff4f4b6af0ff660eaf4015f58cf42..a8d95ff1a9828a56663539407aa7df11ccf7b546 100644 --- a/modules/mol/base/src/coord_source.cc +++ b/modules/mol/base/src/coord_source.cc @@ -31,11 +31,17 @@ namespace ost { namespace mol { CoordSource::CoordSource(const AtomHandleList& atoms): - atoms_(atoms), mutable_(false) + atoms_(atoms), + entity_(), + mutable_(false), + atom_dict_() { if (!atoms_.empty()) { entity_=atoms_.front().GetEntity(); } + for(uint n=0;n<atoms_.size();++n) { + atom_dict_[atoms_[n].GetHashCode()]=n; + } } @@ -105,8 +111,6 @@ CoordSourcePtr CoordSource::Extract(int start, int stop, int step) return in_mem_source; } - - EntityHandle CoordSource::GetEntity() const { return entity_; @@ -132,4 +136,25 @@ const AtomHandleList& CoordSource::GetAtomList() const return atoms_; } -}} +void CoordSource::SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos) +{ + if(!atom.IsValid()) return; + std::map<long,uint>::iterator it = atom_dict_.find(atom.GetHashCode()); + if(it!=atom_dict_.end()) { + CoordFrame& fp=*(GetFrame(frame)); + fp[it->second]=pos; + } +} + +geom::Vec3 CoordSource::GetAtomPos(uint frame, AtomHandle atom) const +{ + if(!atom.IsValid()) return geom::Vec3(); + std::map<long,uint>::const_iterator it = atom_dict_.find(atom.GetHashCode()); + if(it!=atom_dict_.end()) { + const CoordFrame& fp=*(GetFrame(frame)); + return fp[it->second]; + } + return geom::Vec3(); +} + +}} // ns diff --git a/modules/mol/base/src/coord_source.hh b/modules/mol/base/src/coord_source.hh index c9e84102ef54f93f4ae55fb8350825b145533347..bc54b88a7925a1c4ed7a1821190a2fffb1775c6d 100644 --- a/modules/mol/base/src/coord_source.hh +++ b/modules/mol/base/src/coord_source.hh @@ -49,13 +49,18 @@ public: virtual uint GetFrameCount()=0; - virtual CoordFramePtr GetFrame(uint frame_id)=0; + virtual CoordFramePtr GetFrame(uint frame_id) const = 0; int GetAtomCount() const; EntityHandle GetEntity() const; const AtomHandleList& GetAtomList() const; + + void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos); + + geom::Vec3 GetAtomPos(uint frame, AtomHandle atom) const; + /// \brief assign the coordinates in the given frame to the atoms void CopyFrame(uint frame); bool IsMutable() const; @@ -70,6 +75,7 @@ private: AtomHandleList atoms_; EntityHandle entity_; bool mutable_; + std::map<long,uint> atom_dict_; }; }} diff --git a/modules/mol/base/src/in_mem_coord_source.cc b/modules/mol/base/src/in_mem_coord_source.cc index 48182f4ebd734f5931ff6fa35a9a65a8e2a722c9..98417d1594aa55ba4f26a0a9cfaa208c1fe2ad3f 100644 --- a/modules/mol/base/src/in_mem_coord_source.cc +++ b/modules/mol/base/src/in_mem_coord_source.cc @@ -14,7 +14,7 @@ uint InMemCoordSource::GetFrameCount() return frames_.size(); } -CoordFramePtr InMemCoordSource::GetFrame(uint frame_id) +CoordFramePtr InMemCoordSource::GetFrame(uint frame_id) const { return frame_id>=frames_.size() ? CoordFramePtr() : frames_[frame_id]; diff --git a/modules/mol/base/src/in_mem_coord_source.hh b/modules/mol/base/src/in_mem_coord_source.hh index ebae59274f0f486451080f88175fc6280dd4421b..08388f313fe51a179ac4295ef9c62689b307486c 100644 --- a/modules/mol/base/src/in_mem_coord_source.hh +++ b/modules/mol/base/src/in_mem_coord_source.hh @@ -40,7 +40,7 @@ public: virtual uint GetFrameCount(); - virtual CoordFramePtr GetFrame(uint frame_id); + virtual CoordFramePtr GetFrame(uint frame_id) const; void AddFrame(const CoordFramePtr& frame); virtual void AddFrame(const std::vector<geom::Vec3>& coords);