CHARMMTopology *CHARMMParameters::create_topology(Hierarchy hierarchy) const { IMP_OBJECT_LOG; IMP_NEW(CHARMMTopology, topology, (this)); Hierarchies chains = get_by_type(hierarchy, CHAIN_TYPE); for (Hierarchies::iterator chainit = chains.begin(); chainit != chains.end(); ++chainit) { IMP_NEW(CHARMMSegmentTopology, segment, ()); Hierarchies residues = get_by_type(*chainit, RESIDUE_TYPE); for (Hierarchies::iterator resit = residues.begin(); resit != residues.end(); ++resit) { ResidueType restyp = Residue(*resit).get_residue_type(); try { IMP_NEW(CHARMMResidueTopology, residue, (get_residue_topology(restyp))); segment->add_residue(residue); } catch (base::ValueException) { // If residue type is unknown, add empty topology for this residue IMP_WARN_ONCE( restyp.get_string(), "Residue type " << restyp << " was not found in " "topology library; using empty topology for this residue", warn_context_); IMP_NEW(CHARMMResidueTopology, residue, (restyp)); segment->add_residue(residue); } } topology->add_segment(segment); } // keep clang happy bool dumped = false; IMP_IF_LOG(VERBOSE) { dumped = true; warn_context_.dump_warnings(); } if (!dumped) { warn_context_.clear_warnings(); } // Topology objects are not designed to be added into other containers topology->set_was_used(true); return topology.release(); }
void CHARMMParameters::parse_atom_line(const String& line, ResidueType curr_res_type, CHARMMResidueTopologyBase *residue, bool translate_names_to_pdb) { Strings split_results; boost::split(split_results, line, boost::is_any_of(" \t"), boost::token_compress_on); if(split_results.size() < 4) return; // ATOM line has at least 4 fields CHARMMAtomTopology atom(get_atom_name(split_results[1], residue, translate_names_to_pdb)); atom.set_charmm_type(split_results[2]); atom.set_charge(atof(split_results[3].c_str())); residue->add_atom(atom); AtomType imp_atom_type; std::string imp_atom_name = atom.get_name(); // really need Residue.get_is_protein() and friends here if (curr_res_type.get_index() >= HOH.get_index()) { imp_atom_name = "HET:" + imp_atom_name; } if (AtomType::get_key_exists(imp_atom_name)) { imp_atom_type = AtomType(imp_atom_name); } else { imp_atom_type= add_atom_type(imp_atom_name, get_element_for_type(split_results[2], atom_type_to_element_)); } // save in map if(atom_res_type_2_force_field_atom_type_.find(curr_res_type) == atom_res_type_2_force_field_atom_type_.end()) { atom_res_type_2_force_field_atom_type_[curr_res_type] = AtomTypeMap(); } atom_res_type_2_force_field_atom_type_[curr_res_type].insert( std::make_pair(imp_atom_type, std::make_pair(atom.get_charmm_type(), atom.get_charge()))); }
void Residue::set_residue_type(ResidueType t) { get_particle()->set_value(get_residue_type_key(), t.get_index()); }