void destroy(Hierarchy d) { ParticlesTemp all; //core::Hierarchy h=d; core::gather(d, True(), std::back_inserter(all)); for (unsigned int i=0; i< all.size(); ++i) { if (Bonded::particle_is_instance(all[i])) { Bonded b(all[i]); while (b.get_number_of_bonds() > 0) { destroy_bond(b.get_bond(b.get_number_of_bonds()-1)); } } Hierarchy hc(all[i]); while (hc.get_number_of_children() > 0) { hc.remove_child(hc.get_child(hc.get_number_of_children()-1)); } } // If this Hierarchy has a parent, remove the relationship Hierarchy parent = d.get_parent(); if (parent) { parent.remove_child(d); } for (unsigned int i=0; i< all.size(); ++i) { all[i]->get_model()->remove_particle(all[i]); } }
Hierarchy create_fragment(const Hierarchies &ps) { IMP_USAGE_CHECK(!ps.empty(), "Need some particles"); Hierarchy parent = ps[0].get_parent(); unsigned int index = ps[0].get_child_index(); IMP_IF_CHECK(USAGE) { for (unsigned int i = 0; i < ps.size(); ++i) { IMP_USAGE_CHECK(ps[i].get_parent() == parent, "Parents don't match"); } } kernel::Particle *fp = new kernel::Particle(parent.get_particle()->get_model()); Hierarchy fd = Fragment::setup_particle(fp); for (unsigned int i = 0; i < ps.size(); ++i) { parent.remove_child(ps[i]); fd.add_child(ps[i]); } parent.add_child_at(fd, index); return fd; }