From 7e55657fce168fd6a030046fac5c62dd204aa45a Mon Sep 17 00:00:00 2001 From: ansgar <ansgar@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Sat, 27 Mar 2010 18:43:45 +0000 Subject: [PATCH] added atom pos access in CoordGroup git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1895 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/mol/base/pymod/export_coord_group.cc | 2 ++ modules/mol/base/src/coord_group.cc | 12 +++++++ modules/mol/base/src/coord_group.hh | 8 ++++- modules/mol/base/src/coord_source.cc | 33 +++++++++++++++++--- modules/mol/base/src/coord_source.hh | 8 ++++- modules/mol/base/src/in_mem_coord_source.cc | 2 +- modules/mol/base/src/in_mem_coord_source.hh | 2 +- 7 files changed, 59 insertions(+), 8 deletions(-) diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc index 979fc5528..28059f82b 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 e6fbd4641..6675b5499 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 04bffc41a..3b038e37b 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 b1e54ecee..a8d95ff1a 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 c9e84102e..bc54b88a7 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 48182f4eb..98417d159 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 ebae59274..08388f313 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); -- GitLab