11 #include "atom_config.h"
12 #include "Hierarchy.h"
15 #include "internal/pdb.h"
22 #include <IMP/internal/utility.h>
23 #include <boost/format.hpp>
25 IMPATOM_BEGIN_NAMESPACE
43 virtual bool get_is_selected(
const std::string& pdb_line)
const=0;
53 return (internal::atom_alt_loc_indicator(pdb_line) ==
' '
54 || internal::atom_alt_loc_indicator(pdb_line)
62 return NonAlternativePDBSelector::get_is_selected(pdb_line)
63 && internal::is_ATOM_rec(pdb_line),out <<
"");
71 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
74 const std::string type = internal::atom_type(pdb_line);
75 return (type[1] ==
'C' && type[2] ==
'A'
76 && type[3] ==
' '),out <<
"");
80 class CBetaPDBSelector:
public NonAlternativePDBSelector {
83 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)){
86 const std::string type = internal::atom_type(pdb_line);
87 return (type[1] ==
'C' && type[2] ==
'B'
88 && type[3] ==
' '),out <<
"");
92 class CPDBSelector:
public NonAlternativePDBSelector {
95 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
98 const std::string type = internal::atom_type(pdb_line);
99 return (type[1] ==
'C' && type[2] ==
' ' && type[3] ==
' '),
105 class NPDBSelector:
public NonAlternativePDBSelector {
108 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
111 const std::string type = internal::atom_type(pdb_line);
112 return (type[1] ==
'N' && type[2] ==
' ' && type[3] ==
' '),
121 return true || pdb_line.empty(),
128 bool get_is_selected(
const std::string &pdb_line)
const {
129 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
132 for(
int i=0; i < (int)chains_.length(); i++) {
133 if(internal::atom_chain_id(pdb_line) == chains_[i])
141 std::string name=
"ChainPDBSelector%1%"):
151 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
154 const std::string res_name
155 = internal::atom_residue_name(pdb_line);
156 return ((res_name[0]==
'H' && res_name[1] ==
'O'
157 && res_name[2]==
'H') ||
158 (res_name[0]==
'D' && res_name[1] ==
'O'
159 && res_name[2]==
'D')),
166 bool is_hydrogen(std::string pdb_line)
const;
169 return is_hydrogen(pdb_line);,
174 class NonWaterNonHydrogenPDBSelector :
public NonAlternativePDBSelector {
177 bool get_is_selected(
const std::string &pdb_line)
const {
178 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
181 return (! ws_->get_is_selected(pdb_line)
182 && ! hs_->get_is_selected(pdb_line));
185 NonWaterNonHydrogenPDBSelector(std::string name):
186 NonAlternativePDBSelector(name),
187 ws_(new WaterPDBSelector()),
188 hs_(new HydrogenPDBSelector()){}
189 NonWaterNonHydrogenPDBSelector():
190 NonAlternativePDBSelector(
"NonWaterPDBSelector%1%"),
191 ws_(new WaterPDBSelector()),
199 bool get_is_selected(
const std::string &pdb_line)
const {
200 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
203 return( ! ws_->get_is_selected(pdb_line));
217 if (!NonAlternativePDBSelector::get_is_selected(pdb_line)) {
220 const std::string type = internal::atom_type(pdb_line);
221 return (type[1] ==
'P' && type[2] ==
' '),
235 bool get_is_selected(
const std::string &pdb_line)
const {
236 return a_->get_is_selected(pdb_line)
237 && b_->get_is_selected(pdb_line);
253 bool get_is_selected(
const std::string &pdb_line)
const {
254 return a_->get_is_selected(pdb_line)
255 || b_->get_is_selected(pdb_line);
271 bool get_is_selected(
const std::string &pdb_line)
const {
272 return !a_->get_is_selected(pdb_line);
275 NotPDBSelector( PDBSelector *a): PDBSelector(
"NotPDBSelector%1%"),
307 IMPATOMEXPORT Hierarchy
read_pdb(base::TextInput input,
322 IMPATOMEXPORT
void read_pdb(base::TextInput input,
329 IMPATOMEXPORT Hierarchy
332 PDBSelector* selector,
333 bool select_first_model =
true
335 ,
bool no_radii=
false
343 IMPATOMEXPORT Hierarchies read_multimodel_pdb(base::TextInput input,
345 PDBSelector* selector);
348 IMPATOMEXPORT Hierarchies read_multimodel_pdb(base::TextInput input,
371 IMPATOMEXPORT
void write_pdb(Hierarchy mhd,
372 base::TextOutput out,
373 unsigned int model=0);
376 IMPATOMEXPORT
void write_pdb(
const Hierarchies &mhd,
378 unsigned int model=0);
382 IMPATOMEXPORT
void write_multimodel_pdb(
399 char res_icode =
' ',
400 double occpancy = 1.00,
401 double tempFactor = 0.00,
411 IMPATOMEXPORT std::string get_pdb_conect_record_string(
int,
int);
424 IMP_MODEL_SAVE(WritePDB, (
const atom::Hierarchies& mh, std::string file_name),
425 atom::Hierarchies mh_;,
430 IMP_LOG(TERSE,
"Writing pdb file " << file_name << std::endl);
435 IMPATOM_END_NAMESPACE