ParticlesTemp CoreCloseBipartitePairContainer ::get_input_particles() const { ParticlesTemp ret= internal::get_input_particles(get_model(), sc_[0], access_pair_filters()); ParticlesTemp ret1= internal::get_input_particles(get_model(), sc_[1], access_pair_filters()); if (covers_[0] != base::get_invalid_index<ParticleIndexTag>()) { ret.push_back(get_model()->get_particle(covers_[0])); ret.push_back(get_model()->get_particle(covers_[1])); } ret.insert(ret.end(), ret1.begin(), ret1.end()); return ret; }
ParticleIndexPairs GridClosePairsFinder::get_close_pairs( Model *m, const ParticleIndexes &ca, const ParticleIndexes &cb) const { IMP_OBJECT_LOG; set_was_used(true); ParticleIndexPairs out; internal::ParticleIndexHelper::fill_close_pairs( internal::ParticleIndexHelper::get_particle_set(ca.begin(), ca.end(), 0), internal::ParticleIndexHelper::get_particle_set(cb.begin(), cb.end(), 1), internal::ParticleIndexTraits(m, get_distance()), internal::ParticleIndexPairSink(m, access_pair_filters(), out)); return out; }
ParticleIndexPairs GridClosePairsFinder::get_close_pairs( Model *m, const ParticleIndexes &c) const { IMP_OBJECT_LOG; set_was_used(true); IMP_LOG_TERSE("Rebuilding NBL with Grid and cutoff " << get_distance() << std::endl); ParticleIndexPairs out; internal::ParticleIndexHelper::fill_close_pairs( internal::ParticleIndexHelper::get_particle_set(c.begin(), c.end(), 0), internal::ParticleIndexTraits(m, get_distance()), internal::ParticleIndexPairSink(m, access_pair_filters(), out)); return out; }
bool QuadraticClosePairsFinder::get_are_close(kernel::Model *m, kernel::ParticleIndex a, kernel::ParticleIndex b) const { return internal::get_are_close(m, access_pair_filters(), a, b, get_distance()); }
void CoreCloseBipartitePairContainer::do_before_evaluate() { IMP_OBJECT_LOG; if (covers_[0]==base::get_invalid_index<ParticleIndexTag>() || algebra::get_distance(get_model()->get_sphere(covers_[0]), get_model()->get_sphere(covers_[1])) < distance_ || reset_) { if (!reset_ && were_close_ && !internal::get_if_moved(get_model(), slack_, xyzrs_[0], rbs_[0], constituents_, rbs_backup_[0], xyzrs_backup_[0]) && !internal::get_if_moved(get_model(), slack_, xyzrs_[1], rbs_[1], constituents_, rbs_backup_[1], xyzrs_backup_[1])){ // all ok } else { // rebuild IMP_LOG(TERSE, "Recomputing bipartite close pairs list." << std::endl); internal::reset_moved(get_model(), xyzrs_[0], rbs_[0], constituents_, rbs_backup_[0], xyzrs_backup_[0]); internal::reset_moved(get_model(), xyzrs_[1], rbs_[1], constituents_, rbs_backup_[1], xyzrs_backup_[1]); ParticleIndexPairs pips; internal::fill_list(get_model(), access_pair_filters(), key_, 2*slack_+distance_, xyzrs_, rbs_, constituents_, pips); reset_=false; update_list(pips); } were_close_=true; } else { ParticleIndexPairs none; update_list(none); } IMP_IF_CHECK(base::USAGE_AND_INTERNAL) { for (unsigned int i=0; i< sc_[0]->get_number_of_particles(); ++i) { XYZR d0(sc_[0]->get_particle(i)); for (unsigned int j=0; j< sc_[1]->get_number_of_particles(); ++j) { XYZR d1(sc_[1]->get_particle(j)); double dist = get_distance(d0, d1); if (dist < .9*distance_) { ParticleIndexPair pip(d0.get_particle_index(), d1.get_particle_index()); bool filtered=false; for (unsigned int i=0; i< get_number_of_pair_filters(); ++i) { if (get_pair_filter(i)->get_value_index(get_model(), pip)) { filtered=true; break; } } IMP_INTERNAL_CHECK(filtered|| std::find(get_access().begin(), get_access().end(), pip) != get_access().end(), "Pair " << pip << " not found in list with coordinates " << d0 << " and " << d1 << " list is " << get_access()); } } } } }