00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef ESBTL_COARSE_GRAIN_H
00036 #define ESBTL_COARSE_GRAIN_H
00037
00038 #include <ESBTL/molecular_system.h>
00039
00040 namespace ESBTL{
00041
00046 template <class Atom,class Point>
00047 class Coarse_atom: public Point{
00048 typedef typename Atom::System::Residue Residue;
00049
00050 std::list<const Atom*> atoms_;
00051 unsigned index_;
00052 const Residue* residue_;
00053
00054 public:
00055 typedef Point Point_3;
00056
00058 void add(const Atom& atom){atoms_.push_back(&atom);}
00059
00060 Coarse_atom(const Point_3& p,unsigned i,const Residue& res):Point_3(p),index_(i),residue_(&res){}
00061 Coarse_atom(unsigned i,const Residue& res):Point_3(),index_(i),residue_(&res){}
00062
00063 Coarse_atom():Point_3(),index_(0),residue_(NULL){}
00064 Coarse_atom(float x,float y,float z):Point_3(x,y,z),index_(0),residue_(NULL){}
00065
00066 const Residue& residue() const {return *residue_;}
00067
00068 unsigned index() const {return index_;}
00069 };
00070
00076 template <class Residue,class Chain,class Coarse_atom_>
00077 class Coarse_residue:public Residue{
00078 std::vector<Coarse_atom_> coarse_atoms_container;
00079 typedef Coarse_residue<Residue,Chain,Coarse_atom_> Self;
00080 public:
00081 typedef std::vector<Coarse_atom_> Coarse_atom_container;
00082 typedef Coarse_atom_ Coarse_atom;
00083 typedef typename Residue::Atom Atom;
00084
00085 template<class Line_format>
00086 Coarse_residue(const Line_format& line_format, const std::string& line,const Chain& ch):
00087 Residue(line_format,line,ch){}
00088 Coarse_residue(const std::string& resname,int index,char insc,const Chain& ch):
00089 Residue(resname,index,insc,ch){}
00090
00091
00097 template <class Coarse_creator>
00098 int create_coarse_atoms(const Coarse_creator& creator){
00099 return creator(*this,std::back_inserter(coarse_atoms_container));
00100 }
00101
00107 void add_coarse_atom(const typename Residue::Atom::Point_3& pt,unsigned i=0){
00108 this->coarse_atoms_container.push_back(Coarse_atom(pt,i,*this));
00109 }
00110
00111 const Coarse_atom get_coarse_atom(unsigned i) const {
00112 return coarse_atoms_container[i];
00113 }
00114
00115
00116
00117
00118
00119
00120
00122 typedef internal::Atoms_iterator_from_residue<Self,true> Atoms_const_iterator;
00124 typedef internal::Atoms_iterator_from_residue<Self,false> Atoms_iterator;
00125
00127 Atoms_iterator atoms_begin() {return Atoms_iterator(this->atom_container_.begin(),this->atom_container_.end());}
00129 Atoms_iterator atoms_end() {return Atoms_iterator(this->atom_container_.end());}
00130
00132 Atoms_const_iterator atoms_begin() const {return Atoms_const_iterator(this->atom_container_.begin(),this->atom_container_.end());}
00134 Atoms_const_iterator atoms_end() const {return Atoms_const_iterator(this->atom_container_.end());}
00135
00137 typedef typename std::vector<Coarse_atom_>::const_iterator Coarse_atom_const_iterator;
00139 typedef typename std::vector<Coarse_atom_>::iterator Coarse_atom_iterator;
00141 Coarse_atom_const_iterator coarse_atoms_begin() const {return coarse_atoms_container.begin();}
00143 Coarse_atom_const_iterator coarse_atoms_end() const {return coarse_atoms_container.end();}
00145 Coarse_atom_iterator coarse_atoms_begin() {return coarse_atoms_container.begin();}
00147 Coarse_atom_iterator coarse_atoms_end() {return coarse_atoms_container.end();}
00148
00149 using Residue::dereference;
00150 static const Coarse_atom& dereference(Coarse_atom_const_iterator it){ return *it;};
00151 static Coarse_atom& dereference(Coarse_atom_iterator it){ return *it;};
00152 };
00153
00154
00168 template<class Input_iterator,class System>
00169 void insert_coarse_atoms(Input_iterator first,Input_iterator last,System& system,int modelid=1,char chainid='Z',std::string resname="SOL",int starting_res_index=1){
00170 typename System::Model& model=system.get_or_create_model(modelid);
00171 typename System::Chain& chain=model.get_or_create_chain(chainid);
00172 int res_index=starting_res_index-1;
00173 char insc=' ';
00174 for (Input_iterator it=first; it!=last;++it){
00175 typename System::Residue& residue=chain.get_or_create_residue(resname,++res_index,insc);
00176 residue.add_coarse_atom(*it,0);
00177 }
00178 }
00179
00180
00185 template <class Model>
00186 struct Coarse_atoms_iterators{
00187 typedef internal::Coarse_atom_from_model<Model,true> const_iterator;
00188 typedef internal::Coarse_atom_from_model<Model,false> iterator;
00189 };
00190
00193 template <class Model>
00194 typename Coarse_atoms_iterators<Model>::const_iterator coarse_atoms_begin(const Model& model){
00195 return typename Coarse_atoms_iterators<Model>::const_iterator(model);
00196 }
00197
00200 template <class Model>
00201 typename Coarse_atoms_iterators<Model>::const_iterator coarse_atoms_end(const Model& model){
00202 return typename Coarse_atoms_iterators<Model>::const_iterator(model,true);
00203 }
00204
00207 template <class Model>
00208 typename Coarse_atoms_iterators<Model>::iterator coarse_atoms_begin(Model& model){
00209 return typename Coarse_atoms_iterators<Model>::iterator(model);
00210 }
00211
00214 template <class Model>
00215 typename Coarse_atoms_iterators<Model>::iterator coarse_atoms_end(Model& model){
00216 return typename Coarse_atoms_iterators<Model>::iterator(model,true);
00217 }
00218
00224 struct System_items_with_coarse_grain{
00225 template <class System,class Point_3>
00226 struct Model_wrapper{
00227 typedef Molecular_model<System> Type;
00228 };
00229
00230 template <class System,class Point_3>
00231 struct Chain_wrapper{
00232 typedef Molecular_chain<System> Type;
00233 };
00234
00235 template <class System,class Point_3>
00236 struct Atom_wrapper{
00237 typedef Molecular_atom<System,Point_3> Type;
00238 };
00239
00240 template <class System,class Point_3>
00241 class Residue_wrapper{
00242 typedef Molecular_residue<System> Residue;
00243 typedef Molecular_atom<System,Point_3> Atom;
00244 typedef Molecular_chain<System> Chain;
00245 public:
00246 typedef Coarse_residue<Residue,Chain,Coarse_atom<Atom,Point_3> > Type;
00247 };
00248
00249 };
00250
00251 }
00252
00253 #endif //ESBTL_COARSE_GRAIN_H