IMPATOM_BEGIN_INTERNAL_NAMESPACE Particle* atom_particle(Model* m, const std::string& atom_type, Element element, bool is_hetatm, int atom_index, int residue_index, double x, double y, double z, double occupancy, double temp_factor) { AtomType atom_name; std::string string_name = atom_type; // determine AtomType if (is_hetatm) { string_name = "HET:" + string_name; if (!get_atom_type_exists(string_name)) { atom_name = add_atom_type(string_name, element); } else { atom_name = AtomType(string_name); } } else { // ATOM line boost::trim(string_name); if (string_name.empty()) { string_name = "UNK"; } if (!AtomType::get_key_exists(string_name)) { IMP_LOG_VERBOSE("ATOM record type not found: \"" << string_name << "\" in PDB file " << std::endl); atom_name = add_atom_type(string_name, element); } else { atom_name = AtomType(string_name); } } // new particle Particle* p = new Particle(m); p->add_attribute(get_pdb_index_key(), atom_index); algebra::Vector3D v(x, y, z); // atom decorator Atom d = Atom::setup_particle(p, atom_name); std::ostringstream oss; oss << "Atom " + atom_name.get_string() << " of residue " << residue_index; p->set_name(oss.str()); core::XYZ::setup_particle(p, v).set_coordinates_are_optimized(true); d.set_input_index(atom_index); d.set_occupancy(occupancy); d.set_temperature_factor(temp_factor); d.set_element(element); // check if the element matches Element e2 = get_element_for_atom_type(atom_name); if (element != e2) { IMP_LOG_VERBOSE( "AtomType element and PDB line elements don't match. AtomType " << e2 << " vs. determined from PDB " << element << std::endl); } return p; }
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()))); }