⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 protein.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
/* Copyright 2004Stanford UniversityThis file is part of the DSR PDB Library.The DSR PDB Library is free software; you can redistribute it and/or modifyit under the terms of the GNU Lesser General Public License as published bythe Free Software Foundation; either version 2.1 of the License, or (at youroption) any later version.The DSR PDB Library is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITYor FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General PublicLicense for more details.You should have received a copy of the GNU Lesser General Public Licensealong with the DSR PDB Library; see the file LICENSE.LGPL.  If not, write tothe Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,MA 02110-1301, USA. */#ifndef CGAL_DSR_PDB_PROTEIN_H#define CGAL_DSR_PDB_PROTEIN_H#include <CGAL/PDB/basic.h>#include <CGAL/PDB/Point.h>#include <CGAL/PDB/Atom.h>#include <CGAL/PDB/Residue.h>#include <iostream>#include <vector>#include <iterator>#include <cassert>CGAL_PDB_BEGIN_NAMESPACE  class Model;    //! A class representing a single chain of a protein.    /*!     It probably should be called chain, but it is not :-)  */  class Protein {    friend class Model;  public:    /*!       \example check_protein.cc    */    //! A chemical bond within the protein    typedef std::pair<Atom::Index,Atom::Index> Bond;    /*! Build a protein from a pdb file.      See check_protein.cc for an example of using this to read a      pdb file.      The optional bool controls whether errors (such as unparsable      PDB lines). Set it to false to disable printing errors.    */    Protein(std::istream &in, bool print_errors=false);    //! Default    Protein();    //! Return the chain id    char chain() const;    //! Set the chain id.     void set_chain(char c);        //! An iterator to go through all the residues    typedef std::vector<Residue>::iterator Residues_iterator;    //! Iterate through all the residues    Residues_iterator residues_begin() {      return residues_.begin();    }    //! End iterator through the residues.    Residues_iterator residues_end() {      return residues_.end();    }    //! Iterator for residues in order of addition.    typedef std::vector<Residue>::const_iterator Const_residues_iterator;    //! Begin iterating residues.    Const_residues_iterator residues_begin() const {      return residues_.begin();    }    //! End iterating residues.    Const_residues_iterator residues_end() const {      return residues_.end();    }    unsigned int number_of_residues() const {      return residues_.size();    }    void new_residue(const Residue &res);        //! An iterator to iterate through all the atoms of the protein    class Atoms_iterator;    //! Begin iterating through the atoms    Atoms_iterator atoms_begin();    //! End iterating through the atoms.    Atoms_iterator atoms_end();    //! An iterator to iterate through all the atoms of the protein    class Const_atoms_iterator;    //! Begin iterating through the atoms    Const_atoms_iterator atoms_begin() const;    //! End iterating through the atoms.    Const_atoms_iterator atoms_end() const;    //! This is non-const time.    unsigned int number_of_atoms() const;    //! An iterator to iterate through all the bonds of the protein    class Bonds_iterator;    /*! Begin iterating through all the bonds      \note These bonds are indexed by the atom numbers in the pdb      which will not correspond to the atom sequence numbers in the      atoms_begin() sequence when the PDB atoms do not start from 1 or      have missing residues.  This is a bug (I think) and will be      fixed. However, doing so is slightly complicated as I need to      handle the case of missing residues.    */    Bonds_iterator bonds_begin() const;    //! End iterating through all the bonds.    Bonds_iterator bonds_end() const;    //! This is non-const time.    unsigned int number_of_bonds() const;    //! Return the CGAL::PDB::Residue which contains the atoms with a particular index.    /*!  This operation is currently linear in the number of      residues. Making it logrighmic should be easy, but it isn't      done.    */    const Residue& residue_containing_atom(Atom::Index atom_index) const;    //! Return the CGAL::PDB::Residue which contains the atom witha particular index.    Residue& residue_containing_atom(Atom::Index atom_index);    //! Return the atom which has the pdb index passed.    const Atom& atom(Atom::Index atom_index) const;    //! Return the atom which has the pdb index passed.    void set_atom(Atom::Index atom_index, const Atom &a);    //! Remove the corresponding atom from the protein    void erase_atom(Atom::Index atom_index);    //! Return the spherical_coordinates of the atom relative to its parent.    /*!      Currently the atom must be a Ca, N, or C.    */    Spherical_point spherical_coordinates(Atom::Index atom_index) const;    //! Return the parent of an atom with regards to computing spherical coordinates.    Atom::Index parent_atom(Atom::Index atom_index) const;    //! The sequence of residue types.    std::vector<Residue::Type> sequence() const;    //! Write as part of pdb file.    void write(std::ostream &out) const;    //! Write a pdb file.     /*!      See check_protein.cc for an example of using this to write a     pdb file.    */    void write_pdb(std::ostream &out) const;    //! Dump as human readable.    void dump(std::ostream &out) const;    //! Return the residue with a particular index.    /*!  \note This function has changed. Use the iterators if you      just want to go through the list.    */    const Residue& residue(Residue::Index i) const;    //! Return true if there is a residue with that index    bool has_residue(Residue::Index i) const;    /*const Atom &atom(unsigned int i) const {      for (Const_residues_iterator it = residues_begin(); it != residues_.end(); ++it){	      }      }*/    //! Return whether bonds have been computed for this protein.     bool has_bonds() const {      return residues_[0].has_bonds();    }    //! Set whether the protein has bonds or not.    void set_has_bonds(bool tf) {      for (unsigned int i=0; i< residues_.size(); ++i){	residues_[i].set_has_bonds(tf);      }    }#if 0    //! An interator through the backbone coordinates.    /*!      The value_type is a dsr::Point.     */    class Backbone_coordinates_iterator;    //! Begin iterating through the backbone coordinates.    Backbone_coordinates_iterator backbone_coordinates_begin() const;    //! End iterating through the backbone coordinates.    Backbone_coordinates_iterator backbone_coordinates_end() const;#endif      protected:    void process_line(const char *line);        unsigned int residue_offset_of_atom_index(Atom::Index i) const;    unsigned int residue_offset(Residue::Index i) const;        std::vector<Residue> residues_;    std::vector<std::string> header_;    //static Residue dummy_residue_;    std::map<Residue::Index,	      std::vector<std::pair<char, Residue> > > insert_residues_;     char chain_;  };  //! An iterator through the atoms of a CGAL::PDB::Protein.  class Protein::Atoms_iterator {    friend class Protein;    friend class Protein::Const_atoms_iterator;  public:    //! The value_type is a CGAL::PDB::Atom    typedef Atom value_type;    typedef std::forward_iterator_tag iterator_category;    typedef std::size_t difference_type;    typedef std::iterator_traits<Residue::Atoms_iterator>::reference reference;    typedef std::iterator_traits<Residue::Atoms_iterator>::pointer pointer;    reference operator*() {      return *ait_;    }    pointer operator->() {      return deref(ait_);    }    Atoms_iterator operator++() {      ++ait_;      if (ait_== rit_->atoms_end()) {	++rit_;	if (rit_!= rend_){	  ait_=rit_->atoms_begin();	}      }      return *this;    }        bool operator==(const Atoms_iterator& o) const {      if (rit_ == rend_) return rit_==o.rit_;      else return rit_== o.rit_ && ait_ == o.ait_;    }    bool operator!=(const Atoms_iterator& o) const {      if (rit_== rend_) return rit_!= o.rit_;      else return rit_!= o.rit_ || ait_ != o.ait_;    }    Atoms_iterator(const Atoms_iterator &o) {      operator=(o);    }    Atoms_iterator& operator=(const Atoms_iterator &o) {      rit_= o.rit_;      rend_= o.rend_;      if (rit_!= rend_) {	ait_=o.ait_;      }      return *this;    }  protected:    Atoms_iterator(std::vector<Residue>::iterator b, 		   std::vector<Residue>::iterator e): rit_(b), rend_(e){      if (b != e) {	ait_= rit_->atoms_begin();      }    }    std::vector<Residue>::iterator rit_, rend_;    Residue::Atoms_iterator ait_;  private:    template < typename T >    static pointer deref(const T& t) { return t.operator->(); }    template < typename T >    static pointer deref(T* t) { return t; }  };  //! An iterator through the atoms of a CGAL::PDB::Protein.  class Protein::Const_atoms_iterator {    friend class Protein;  public:    //! The value_type is a CGAL::PDB::Atom    typedef Atom value_type;    typedef std::forward_iterator_tag iterator_category;    typedef std::size_t difference_type;    typedef std::iterator_traits<Residue::Const_atoms_iterator>::reference reference;    typedef std::iterator_traits<Residue::Const_atoms_iterator>::pointer pointer;    reference operator*() const {      return *ait_;    }    pointer operator->() const {      return deref(ait_);    }    Const_atoms_iterator operator++() {      ++ait_;      if (ait_== rit_->atoms_end()) {	++rit_;	if (rit_!= rend_){	  ait_=rit_->atoms_begin();	}      }      return *this;    }        bool operator==(const Const_atoms_iterator& o) const {      if (rit_ == rend_) return rit_==o.rit_;      else return rit_== o.rit_ && ait_ == o.ait_;    }    bool operator!=(const Const_atoms_iterator& o) const {      if (rit_== rend_) return rit_!= o.rit_;      else return rit_!= o.rit_ || ait_ != o.ait_;    }    Const_atoms_iterator(Protein::Atoms_iterator it){      rit_= it.rit_;      rend_= it.rend_;      if (rit_ != rend_) {	ait_= it.ait_;      }    }    Const_atoms_iterator(const Const_atoms_iterator &o) {      operator=(o);    }    Const_atoms_iterator& operator=(const Const_atoms_iterator &o) {      rit_= o.rit_;      rend_= o.rend_;      if (rit_!= rend_) {	ait_=o.ait_;      }      return *this;    }  protected:    Const_atoms_iterator(std::vector<Residue>::const_iterator b, 			 std::vector<Residue>::const_iterator e): rit_(b), rend_(e){      if (b != e) {	ait_= rit_->atoms_begin();      }    }    std::vector<Residue>::const_iterator rit_, rend_;    Residue::Const_atoms_iterator ait_;  private:    template < typename T >    static pointer deref(const T& t) { return t.operator->(); }    template < typename T >    static pointer deref(const T* t) { return t; }  };  //! An iterator through the bonds of a CGAL::PDB::Protein  class Protein::Bonds_iterator {    friend class Protein;  public:    //! The value_type is a CGAL::PDB::Protein::Bond    typedef Bond value_type;    typedef std::forward_iterator_tag iterator_category;    typedef std::size_t difference_type;    typedef const Bond& reference;    typedef const Bond* pointer;        reference operator*() const {      return cur_bond();    }    pointer operator->() const {      return &cur_bond();    }    Bonds_iterator operator++() {      if (between_) {	between_=false;	++rit_;	if (rit_ != rend_) {	  ait_= rit_->bonds_begin();	}      } else {	++ait_;	if (ait_== rit_->bonds_end()) {	  std::vector<Residue>::const_iterator nrit= rit_;	  ++nrit;	  between_=true;	  if (nrit == rend_ 	      || nrit->index().to_index() != rit_->index().to_index()+1	      || !nrit->has_atom(Residue::AL_N) || !rit_->has_atom(Residue::AL_C)){	    operator++();	  }	  	}      }      return *this;    }     bool operator==(const Bonds_iterator& o) const {       if (between_ != o.between_) return false;       if (rit_ == rend_) return rit_==o.rit_;       else return rit_== o.rit_ && ait_ == o.ait_;    }    bool operator!=(const Bonds_iterator& o) const {      return !operator==(o);    }        Bonds_iterator(){}    Bonds_iterator(const Bonds_iterator &o) {      operator=(o);    }    Bonds_iterator &operator=(const Bonds_iterator &o) {      rit_= o.rit_;      rend_= o.rend_;      between_= o.between_;      if (rit_ != rend_) {	ait_= o.ait_;      }      return *this;    }  protected:    Bonds_iterator(std::vector<Residue>::const_iterator b, 		   std::vector<Residue>::const_iterator e): rit_(b), rend_(e), 							    between_(false){      if (b != e) {	ait_= rit_->bonds_begin();      }    }    const Bond &cur_bond() const {      if (between_) {	assert(rit_+1 != rend_);	static Bond b;	b= Bond((rit_)->atom(Residue::AL_C).index(),		(rit_+1)->atom(Residue::AL_N).index());	return b;      } else return *ait_;    }    std::vector<Residue>::const_iterator rit_, rend_;    Residue::Bonds_iterator ait_;    bool between_;  };CGAL_PDB_END_NAMESPACE#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -