Hierarchy get_previous_residue(Residue rd) { // only handle simple case so far Hierarchy p = rd.get_parent(); Chain c = p.get_as_chain(); Hierarchy r = get_residue(c, rd.get_index() - 1); return r; }
Hierarchy get_next_residue(Residue rd) { // only handle simple case so far Hierarchy p = rd.get_parent(); /*if (!p.get_as_chain()) { IMP_NOT_IMPLEMENTED("get_next_residue() only handles the simple case" << " so far. Complain about it."); }*/ IMP_USAGE_CHECK(Chain::get_is_setup(p), "Parent of residue must be a chain. It is not."); Hierarchy r = get_residue(Chain(p), rd.get_index() + 1); return r; }
void CHARMMSegmentTopology::apply_default_patches(const CHARMMParameters *ff) { if (get_number_of_residues() == 0) return; CHARMMResidueTopology *first = get_residue(0); CHARMMResidueTopology *last = get_residue(get_number_of_residues() - 1); if (first->get_default_first_patch() != "") { ff->get_patch(first->get_default_first_patch())->apply(first); } if (last->get_default_last_patch() != "") { // If chain contains only a single residue, allow both the first and last // patch to be applied to it if (get_number_of_residues() == 1 && first->get_default_first_patch() != "") { first->set_patched(false); } ff->get_patch(last->get_default_last_patch())->apply(last); } }
void get_atom_2_residue_map(const IMP::Particles& atom_particles, const IMP::Particles& residue_particles, std::vector<int>& atom_2_residue_map) { atom_2_residue_map.resize(atom_particles.size()); unsigned int residue_index=0; for(unsigned int atom_index=0; atom_index<atom_particles.size(); ) { if(get_residue(IMP::atom::Atom(atom_particles[atom_index])).get_particle() == residue_particles[residue_index]) { atom_2_residue_map[atom_index] = residue_index; atom_index++; } else { residue_index++; } } }
void write_pdb(const ParticlesTemp& ps, TextOutput out) { IMP_FUNCTION_LOG; int last_index = 0; bool use_input_index = true; for (unsigned int i = 0; i < ps.size(); ++i) { if (Atom(ps[i]).get_input_index() != last_index + 1) { use_input_index = false; break; } else { ++last_index; } } for (unsigned int i = 0; i < ps.size(); ++i) { if (Atom::get_is_setup(ps[i])) { Atom ad(ps[i]); Residue rd = get_residue(ad); // really dumb and slow, fix later char chain; Chain c = get_chain(rd); if (c) { chain = c.get_id()[0]; } else { chain = ' '; } int inum = i+1; if (i>=99999) inum=99999; out.get_stream() << get_pdb_string( core::XYZ(ps[i]).get_coordinates(), use_input_index ? ad.get_input_index() : static_cast<int>(inum), ad.get_atom_type(), rd.get_residue_type(), chain, rd.get_index(), rd.get_insertion_code(), ad.get_occupancy(), ad.get_temperature_factor(), ad.get_element()); if (!out) { IMP_THROW("Error writing to file in write_pdb", IOException); } } else if (Residue::get_is_setup(ps[i])) { // if C-alpha residue is available Residue rd = IMP::atom::Residue(ps[i]); // comment 1 by SJ - TODO: How to retrieve the correct chain information without an hierarchy? char chain; Chain c = get_chain(rd); if (c) { chain = c.get_id()[0]; } else { chain = ' '; } // comment 2 by SJ - TODO: The C-alpha residues are not sorted yet. We need to sort the residues similarly to what PMI does. out.get_stream() << get_pdb_string( core::XYZ(ps[i]).get_coordinates(), static_cast<int>(i + 1), IMP::atom::AT_CA, rd.get_residue_type(), chain, rd.get_index(), ' ', 1.0, IMP::core::XYZR(ps[i]).get_radius()); } else { // if a coarse-grained BEAD is available Ints resindexes = IMP::atom::Fragment(ps[i]).get_residue_indexes(); int resindex = (int)resindexes.front() + (int)(resindexes.size()/2); // comment 1 by SJ - TODO: How to retrieve the correct chain information without an hierarchy? char chain = ' '; // comment 3 by SJ - TODO: The BEADs are not sorted yet. We need to sort the residues similarly to what PMI does. // comment 4 by SJ - TODO: currently IMP does not allow "BEA" as a residue name, while PMI allows it. Thus "UNK" was used instead. out.get_stream() << get_pdb_string( core::XYZ(ps[i]).get_coordinates(), static_cast<int>(i + 1), IMP::atom::AT_CA, IMP::atom::UNK, chain, (int)resindex, ' ', 1.0, IMP::core::XYZR(ps[i]).get_radius()); } } }
void CHARMMParameters::read_topology_file(base::TextInput input_file, bool translate_names_to_pdb) { IMP_OBJECT_LOG; const String MASS_LINE = "MASS"; const String DEFA_LINE = "DEFA"; const String PATC_LINE = "PATC"; const String RESI_LINE = "RESI"; const String PRES_LINE = "PRES"; const String ATOM_LINE = "ATOM"; const String DELE_LINE = "DELE"; const String BOND_LINE = "BOND"; const String BOND_LINE2 = "DOUBLE"; const String ANGLE_LINE = "ANGL"; const String ANGLE_LINE2 = "THET"; const String DIHEDRAL_LINE = "DIHE"; const String DIHEDRAL_LINE2 = "PHI"; const String IMPROPER_LINE = "IMPR"; const String IMPROPER_LINE2 = "IMPH"; const String IC_LINE = "IC"; std::string first_patch = "", last_patch = ""; Pointer<CHARMMIdealResidueTopology> residue; Pointer<CHARMMPatch> patch; ResidueType curr_res_type; while (!input_file.get_stream().eof()) { String line; getline(input_file.get_stream(), line); boost::trim(line); // remove all spaces // skip comments or empty lines if (line[0] == '!' || line[0] == '*' || line.length() == 0) continue; // read residue line if(line.substr(0, RESI_LINE.length()) == RESI_LINE) { if (residue) { add_residue_topology(residue.release()); } else if (patch) { add_patch(patch.release()); } curr_res_type = parse_residue_line(line, translate_names_to_pdb); ResidueType rt(curr_res_type.get_string()); residue = new CHARMMIdealResidueTopology(rt); residue->set_default_first_patch(first_patch); residue->set_default_last_patch(last_patch); // handle patch residues } else if (line.substr(0, PRES_LINE.length()) == PRES_LINE) { if (residue) { add_residue_topology(residue.release()); } else if (patch) { add_patch(patch.release()); } Strings split_results; boost::split(split_results, line, boost::is_any_of(" \t"), boost::token_compress_on); if (split_results.size() < 3) { IMP_THROW("Invalid PRES line: " << line, ValueException); } patch = new CHARMMPatch(get_residue_name(split_results[1], translate_names_to_pdb)); // handle MASS line } else if (line.substr(0, MASS_LINE.length()) == MASS_LINE) { parse_mass_line(line, atom_type_to_element_); // handle DEFA line } else if (line.substr(0, DEFA_LINE.length()) == DEFA_LINE) { parse_patch_line(line, first_patch, last_patch, translate_names_to_pdb); // handle PATC line } else if (line.substr(0, PATC_LINE.length()) == PATC_LINE && residue) { std::string first = residue->get_default_first_patch(); std::string last = residue->get_default_last_patch(); parse_patch_line(line, first, last, translate_names_to_pdb); residue->set_default_first_patch(first); residue->set_default_last_patch(last); // read DELE line } else if (line.substr(0, DELE_LINE.length()) == DELE_LINE && patch) { parse_dele_line(line, patch, translate_names_to_pdb); // read atom line } else if (line.substr(0, ATOM_LINE.length()) == ATOM_LINE && (residue || patch)) { parse_atom_line(line, curr_res_type, get_residue(residue, patch), translate_names_to_pdb); // read bond line } else if ((line.substr(0, BOND_LINE.length()) == BOND_LINE || line.substr(0, BOND_LINE2.length()) == BOND_LINE2) && (residue || patch)) { parse_bond_line(line, curr_res_type, get_residue(residue, patch), translate_names_to_pdb); // read angle line } else if ((line.substr(0, ANGLE_LINE.length()) == ANGLE_LINE || line.substr(0, ANGLE_LINE2.length()) == ANGLE_LINE2) && (residue || patch)) { parse_angle_line(line, get_residue(residue, patch), translate_names_to_pdb); // read dihedral line } else if ((line.substr(0, DIHEDRAL_LINE.length()) == DIHEDRAL_LINE || line.substr(0, DIHEDRAL_LINE2.length()) == DIHEDRAL_LINE2) && (residue || patch)) { parse_dihedral_line(line, get_residue(residue, patch), translate_names_to_pdb); // read improper line } else if ((line.substr(0, IMPROPER_LINE.length()) == IMPROPER_LINE || line.substr(0, IMPROPER_LINE2.length()) == IMPROPER_LINE2) && (residue || patch)) { parse_improper_line(line, get_residue(residue, patch), translate_names_to_pdb); // read internal coordinate line } else if (line.substr(0, IC_LINE.length()) == IC_LINE && (residue || patch)) { parse_internal_coordinate_line(line, get_residue(residue, patch), translate_names_to_pdb); } } if (residue) { add_residue_topology(residue); } else if (patch) { add_patch(patch); } }