Hierarchy create_protein(Model *m, std::string name, double resolution, int number_of_residues, int first_residue_index, double volume, bool ismol) { double mass = atom::get_mass_from_number_of_residues(number_of_residues) / 1000; if (volume < 0) { volume = atom::get_volume_from_mass(mass * 1000); } // assume a 20% overlap in the beads to make the protein not too bumpy double overlap_frac = .2; std::pair<int, double> nr = compute_n(volume, resolution, overlap_frac); Hierarchy pd = Hierarchy::setup_particle(new Particle(m)); Ints residues; for (int i = 0; i < number_of_residues; ++i) { residues.push_back(i + first_residue_index); } atom::Fragment::setup_particle(pd, residues); if (ismol) Molecule::setup_particle(pd); pd->set_name(name); for (int i = 0; i < nr.first; ++i) { Particle *pc; if (nr.first > 1) { pc = new Particle(m); std::ostringstream oss; oss << name << "-" << i; pc->set_name(oss.str()); atom::Fragment pcd = atom::Fragment::setup_particle(pc); Ints indexes; for (int j = i * (number_of_residues / nr.first) + first_residue_index; j < (i + 1) * (number_of_residues / nr.first) + first_residue_index; ++j) { indexes.push_back(j); } pcd.set_residue_indexes(indexes); pd.add_child(pcd); } else { pc = pd; } core::XYZR xyzd = core::XYZR::setup_particle(pc); xyzd.set_radius(nr.second); atom::Mass::setup_particle(pc, mass / nr.first); } IMP_INTERNAL_CHECK(pd.get_is_valid(true), "Invalid hierarchy produced " << pd); return pd; }
Hierarchy create_protein(Model *m, std::string name, double resolution, const Ints db) { Hierarchy root = Hierarchy::setup_particle(new Particle(m)); Domain::setup_particle(root, IntRange(db.front(), db.back())); for (unsigned int i = 1; i < db.size(); ++i) { std::ostringstream oss; oss << name << "-" << i - 1; Hierarchy cur = create_protein( m, oss.str(), resolution, db[i] - db[i - 1], db[i - 1], atom::get_volume_from_mass( atom::get_mass_from_number_of_residues(db[i] - db[i - 1])), false); root.add_child(cur); } Molecule::setup_particle(root); root->set_name(name); return root; }