00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IMPATOM_PDB_H
00009 #define IMPATOM_PDB_H
00010
00011 #include "atom_config.h"
00012 #include "Hierarchy.h"
00013 #include "Atom.h"
00014 #include "element.h"
00015 #include "internal/pdb.h"
00016 #include "atom_macros.h"
00017 #include <IMP/file.h>
00018 #include <IMP/Model.h>
00019 #include <IMP/Particle.h>
00020 #include <IMP/FailureHandler.h>
00021 #include <IMP/OptimizerState.h>
00022 #include <IMP/internal/utility.h>
00023 #include <boost/format.hpp>
00024
00025 IMPATOM_BEGIN_NAMESPACE
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 class IMPATOMEXPORT PDBSelector: public Object {
00040 public:
00041
00042 virtual bool get_is_selected(const std::string& pdb_line) const=0;
00043 virtual ~PDBSelector();
00044 };
00045
00046 IMP_OBJECTS(PDBSelector, PDBSelectors);
00047
00048
00049 class NonAlternativePDBSelector : public PDBSelector {
00050 public:
00051 IMP_PDB_SELECTOR(NonAlternativePDBSelector,
00052 return (internal::atom_alt_loc_indicator(pdb_line) == ' '
00053 || internal::atom_alt_loc_indicator(pdb_line)
00054 == 'A'),out << "");
00055 };
00056
00057
00058 class ATOMPDBSelector: public NonAlternativePDBSelector {
00059 public:
00060 IMP_PDB_SELECTOR(ATOMPDBSelector,
00061 return NonAlternativePDBSelector::get_is_selected(pdb_line)
00062 && internal::is_ATOM_rec(pdb_line),out << "");
00063 };
00064
00065
00066
00067 class CAlphaPDBSelector : public NonAlternativePDBSelector {
00068 public:
00069 IMP_PDB_SELECTOR(CAlphaPDBSelector,
00070 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00071 return false;
00072 }
00073 const std::string type = internal::atom_type(pdb_line);
00074 return (type[1] == 'C' && type[2] == 'A'
00075 && type[3] == ' '),out << "");
00076 };
00077
00078
00079 class CBetaPDBSelector: public NonAlternativePDBSelector {
00080 public:
00081 IMP_PDB_SELECTOR(CBetaPDBSelector,
00082 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)){
00083 return false;
00084 }
00085 const std::string type = internal::atom_type(pdb_line);
00086 return (type[1] == 'C' && type[2] == 'B'
00087 && type[3] == ' '),out << "");
00088 };
00089
00090
00091 class CPDBSelector: public NonAlternativePDBSelector {
00092 public:
00093 IMP_PDB_SELECTOR(CPDBSelector,
00094 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00095 return false;
00096 }
00097 const std::string type = internal::atom_type(pdb_line);
00098 return (type[1] == 'C' && type[2] == ' ' && type[3] == ' '),
00099 out << ""
00100 );
00101 };
00102
00103
00104 class NPDBSelector: public NonAlternativePDBSelector {
00105 public:
00106 IMP_PDB_SELECTOR(NPDBSelector,
00107 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00108 return false;
00109 }
00110 const std::string type = internal::atom_type(pdb_line);
00111 return (type[1] == 'N' && type[2] == ' ' && type[3] == ' '),
00112 out << ""
00113 );
00114 };
00115
00116
00117 class AllPDBSelector : public PDBSelector {
00118 public:
00119 IMP_PDB_SELECTOR(AllPDBSelector, return true || pdb_line.empty(),
00120 out << "");
00121 };
00122
00123
00124 class ChainPDBSelector : public NonAlternativePDBSelector {
00125 public:
00126 IMP_PDB_SELECTOR(ChainPDBSelector,
00127 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00128 return false;
00129 }
00130 for(int i=0; i < (int)chains_.length(); i++) {
00131 if(internal::atom_chain_id(pdb_line) == chains_[i])
00132 return true;
00133 }
00134 return false,out << chains_);
00135
00136 ChainPDBSelector(const std::string &chains): chains_(chains) {}
00137 private:
00138 std::string chains_;
00139 };
00140
00141
00142 class WaterPDBSelector : public NonAlternativePDBSelector {
00143 public:
00144 IMP_PDB_SELECTOR(WaterPDBSelector,
00145 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00146 return false;
00147 }
00148 const std::string res_name
00149 = internal::atom_residue_name(pdb_line);
00150 return ((res_name[0]=='H' && res_name[1] =='O'
00151 && res_name[2]=='H') ||
00152 (res_name[0]=='D' && res_name[1] =='O'
00153 && res_name[2]=='D')),
00154 out << ""
00155 );
00156 };
00157
00158
00159 class HydrogenPDBSelector : public NonAlternativePDBSelector {
00160 bool is_hydrogen(std::string pdb_line) const {
00161 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00162 return false;
00163 }
00164 std::string elem = internal::atom_element(pdb_line);
00165 boost::trim(elem);
00166
00167
00168
00169
00170
00171
00172 if(elem.length() == 1 && elem[0]=='H') return true;
00173
00174 if(elem.length() == 2 && elem[0]=='H' &&
00175 (elem[1]=='E' || elem[1]=='e' || elem[1]=='O'
00176 || elem[1]=='o' ||
00177 elem[1]=='F' || elem[1]=='f' || elem[1]=='G'
00178 || elem[1]=='g'))
00179 return false;
00180
00181
00182
00183 std::string atom_name = internal::atom_type(pdb_line);
00184 return (
00185 ((atom_name[0] == ' ' || isdigit(atom_name[0])) &&
00186 (atom_name[1] == 'H' || atom_name[1] == 'D')) ||
00187
00188 (atom_name[0] == 'H' || atom_name[0] == 'D'));
00189 }
00190 public:
00191 IMP_PDB_SELECTOR(HydrogenPDBSelector,
00192 return is_hydrogen(pdb_line);,
00193 out << "");
00194 };
00195
00196
00197 class NonWaterNonHydrogenPDBSelector : public NonAlternativePDBSelector {
00198 IMP::internal::OwnerPointer<PDBSelector> ws_, hs_;
00199 public:
00200 NonWaterNonHydrogenPDBSelector(): ws_(new WaterPDBSelector()),
00201 hs_(new HydrogenPDBSelector()){}
00202 IMP_PDB_SELECTOR(NonWaterNonHydrogenPDBSelector,
00203 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00204 return false;
00205 }
00206 return (! ws_->get_is_selected(pdb_line)
00207 && ! hs_->get_is_selected(pdb_line)),
00208 out << "");
00209 };
00210
00211
00212 class NonWaterPDBSelector : public NonAlternativePDBSelector {
00213 IMP::internal::OwnerPointer<PDBSelector> ws_;
00214 public:
00215 NonWaterPDBSelector(): ws_(new WaterPDBSelector()){}
00216 IMP_PDB_SELECTOR(NonWaterPDBSelector,
00217 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00218 return false;
00219 }
00220 return( ! ws_->get_is_selected(pdb_line)),
00221 out << *ws_);
00222 };
00223
00224
00225 class PPDBSelector : public NonAlternativePDBSelector {
00226 public:
00227 IMP_PDB_SELECTOR(PPDBSelector,
00228 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
00229 return false;
00230 }
00231 const std::string type = internal::atom_type(pdb_line);
00232 return (type[1] == 'P' && type[2] == ' '),
00233 out << "");
00234 };
00235
00236
00237
00238
00239
00240
00241
00242
00243 class AndPDBSelector: public PDBSelector {
00244 const IMP::internal::OwnerPointer<PDBSelector> a_, b_;
00245 public:
00246 IMP_PDB_SELECTOR(AndPDBSelector,
00247 return a_->get_is_selected(pdb_line)
00248 && b_->get_is_selected(pdb_line),
00249 out << *a_ << " and " << *b_);
00250 AndPDBSelector( PDBSelector *a, PDBSelector *b): a_(a), b_(b){}
00251 };
00252
00253
00254
00255
00256
00257
00258
00259 class OrPDBSelector: public PDBSelector {
00260 const IMP::internal::OwnerPointer<PDBSelector> a_, b_;
00261 public:
00262 IMP_PDB_SELECTOR(OrPDBSelector,
00263 return a_->get_is_selected(pdb_line)
00264 || b_->get_is_selected(pdb_line),
00265 out << *a_ << " or " << *b_);
00266 OrPDBSelector( PDBSelector *a, PDBSelector *b): a_(a), b_(b){}
00267 };
00268
00269
00270
00271
00272
00273
00274
00275 class NotPDBSelector: public PDBSelector {
00276 const IMP::internal::OwnerPointer<PDBSelector> a_;
00277 public:
00278 IMP_PDB_SELECTOR(NotPDBSelector,
00279 return !a_->get_is_selected(pdb_line),
00280 out << "not " << *a_);
00281 NotPDBSelector( PDBSelector *a): a_(a){}
00282 };
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 IMPATOMEXPORT Hierarchy read_pdb(TextInput in,
00313 Model* model);
00314
00315
00316
00317 IMPATOMEXPORT Hierarchy
00318 read_pdb(TextInput in,
00319 Model* model,
00320 PDBSelector* selector,
00321 bool select_first_model = true
00322 #ifndef IMP_DOXYGEN
00323 , bool no_radii=false
00324 #endif
00325 );
00326
00327
00328
00329
00330
00331 IMPATOMEXPORT Hierarchies read_multimodel_pdb(TextInput in,
00332 Model *model,
00333 PDBSelector* selector);
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355 IMPATOMEXPORT void write_pdb(Hierarchy mhd,
00356 TextOutput out);
00357
00358
00359 IMPATOMEXPORT void write_pdb(const Hierarchies &mhd,
00360 TextOutput out);
00361
00362
00363
00364 IMPATOMEXPORT void write_multimodel_pdb(
00365 const Hierarchies& mhd, TextOutput out);
00366
00367
00368
00369
00370 #ifndef IMP_DOXYGEN
00371
00372
00373
00374
00375 IMPATOMEXPORT std::string get_pdb_string(const algebra::VectorD<3>& v,
00376 int index = -1,
00377 AtomType at = AT_C,
00378 ResidueType rt = atom::ALA,
00379 char chain = ' ',
00380 int res_index = 1,
00381 char res_icode = ' ',
00382 double occpancy = 1.00,
00383 double tempFactor = 0.00,
00384 Element e = C);
00385
00386
00387
00388
00389
00390
00391
00392
00393 IMPATOMEXPORT std::string get_pdb_conect_record_string(int,int);
00394 #endif
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 IMP_MODEL_SAVE(WritePDB, (const atom::Hierarchies& mh, std::string file_name),
00409 atom::Hierarchies mh_;,
00410 mh_=mh;,
00411 ,
00412 {
00413 IMP_LOG(TERSE, "Writing pdb file " << file_name << std::endl);
00414 atom::write_pdb(mh_,file_name);
00415 });
00416
00417
00418 IMPATOM_END_NAMESPACE
00419
00420 #endif