Hierarchy create_simplified_along_backbone(Chain in, const IntRanges& residue_segments, bool keep_detailed) { IMP_USAGE_CHECK(in.get_is_valid(true), "Chain " << in << " is not valid."); if (in.get_number_of_children() ==0 || residue_segments.empty()) { IMP_LOG_TERSE( "Nothing to simplify in " << (in? in->get_name(): "nullptr") << " with " << residue_segments.size() << " segments.\n"); return Hierarchy(); } for (unsigned int i=0; i< residue_segments.size(); ++i) { IMP_USAGE_CHECK(residue_segments[i].first < residue_segments[i].second, "Residue intervals must be non-empty"); } IMP_IF_LOG(VERBOSE) { for (unsigned int i=0; i < residue_segments.size(); ++i) { IMP_LOG_VERBOSE( "[" << residue_segments[i].first << "..." << residue_segments[i].second << ") "); } IMP_LOG_VERBOSE( std::endl); } unsigned int cur_segment=0; Hierarchies cur; Hierarchy root=create_clone_one(in); for (unsigned int i=0; i< in.get_number_of_children(); ++i) { Hierarchy child=in.get_child(i); int index= Residue(child).get_index(); IMP_LOG_VERBOSE( "Processing residue " << index << " with range " << residue_segments[cur_segment].first << " " << residue_segments[cur_segment].second << std::endl); if (index >= residue_segments[cur_segment].first && index < residue_segments[cur_segment].second) { } else if (!cur.empty()) { IMP_LOG_VERBOSE( "Added particle for " << residue_segments[cur_segment].first << "..." << residue_segments[cur_segment].second << std::endl); Hierarchy cur_approx=create_approximation_of_residues(cur); root.add_child(cur_approx); if (keep_detailed) { for (unsigned int j=0; j< cur.size(); ++j) { cur[j].get_parent().remove_child(cur[j]); cur_approx.add_child(cur[j]); } } cur.clear(); ++cur_segment; } cur.push_back(child); } if (!cur.empty()) { root.add_child(create_approximation_of_residues(cur)); } /*#ifdef IMP_ATOM_USE_IMP_CGAL double ov= get_volume(in); double cv= get_volume(root); double scale=1; ParticlesTemp rt= get_by_type(root, XYZR_TYPE); Floats radii(rt.size()); for (unsigned int i=0; i< rt.size(); ++i) { core::XYZR d(rt[i]); radii[i]=d.get_radius(); } do { show(root); double f= ov/cv*scale; scale*=.95; IMP_LOG_TERSE( "Bumping radius by " << f << std::endl); for (unsigned int i=0; i< rt.size(); ++i) { core::XYZR d(rt[i]); d.set_radius(radii[i]*f); } double nv=get_volume(root); IMP_LOG_TERSE( "Got volume " << nv << " " << ov << std::endl); if (nv < ov) { break; } } while (true); #else #endif*/ IMP_INTERNAL_CHECK(root.get_is_valid(true), "Invalid hierarchy produced " << root); return root; }
int _test_intranges(const IntRanges &ips) { return ips.size(); }