InteractionGraph get_interaction_graph(ScoringFunctionAdaptor rsi, const ParticlesTemp &ps) { if (ps.empty()) return InteractionGraph(); InteractionGraph ret(ps.size()); Restraints rs = create_decomposition(rsi->create_restraints()); // Model *m= ps[0]->get_model(); boost::unordered_map<ModelObject *, int> map; InteractionGraphVertexName pm = boost::get(boost::vertex_name, ret); DependencyGraph dg = get_dependency_graph(ps[0]->get_model()); DependencyGraphVertexIndex index = IMP::get_vertex_index(dg); /*IMP_IF_LOG(VERBOSE) { IMP_LOG_VERBOSE( "dependency graph is \n"); IMP::internal::show_as_graphviz(dg, std::cout); }*/ for (unsigned int i = 0; i < ps.size(); ++i) { ParticlesTemp t = get_dependent_particles( ps[i], ParticlesTemp(ps.begin(), ps.end()), dg, index); for (unsigned int j = 0; j < t.size(); ++j) { IMP_USAGE_CHECK(map.find(t[j]) == map.end(), "Currently particles which depend on more " << "than one particle " << "from the input set are not supported." << " Particle \"" << t[j]->get_name() << "\" depends on \"" << ps[i]->get_name() << "\" and \"" << ps[map.find(t[j])->second]->get_name() << "\""); map[t[j]] = i; } IMP_IF_LOG(VERBOSE) { IMP_LOG_VERBOSE("Particle \"" << ps[i]->get_name() << "\" controls "); for (unsigned int i = 0; i < t.size(); ++i) { IMP_LOG_VERBOSE("\"" << t[i]->get_name() << "\" "); } IMP_LOG_VERBOSE(std::endl); } pm[i] = ps[i]; } IMP::Restraints all_rs = IMP::get_restraints(rs); for (Restraints::const_iterator it = all_rs.begin(); it != all_rs.end(); ++it) { ModelObjectsTemp pl = (*it)->get_inputs(); add_edges(ps, pl, map, *it, ret); } /* Make sure that composite score states (eg the normalizer for rigid body rotations) don't induce interactions among unconnected particles.*/ ScoreStatesTemp ss = get_required_score_states(rs); for (ScoreStatesTemp::const_iterator it = ss.begin(); it != ss.end(); ++it) { ModelObjectsTemps interactions = (*it)->get_interactions(); for (unsigned int i = 0; i < interactions.size(); ++i) { add_edges(ps, interactions[i], map, *it, ret); } } IMP_INTERNAL_CHECK(boost::num_vertices(ret) == ps.size(), "Wrong number of vertices " << boost::num_vertices(ret) << " vs " << ps.size()); return ret; }
unsigned int MSConnectivityRestraint::add_type( const ParticlesTemp &ps) { if (!sc_ && !ps.empty()) { sc_ = new IMP::internal::StaticListContainer<SingletonContainer>( ps[0]->get_model(), "msconnectivity list"); } ms_get_list(sc_)->add(IMP::internal::get_index(ps)); return particle_matrix_.add_type(ps); }
void read_particles_from_buffer( const base::Vector<char> &buffer, const ParticlesTemp &particles, const FloatKeys &keys) { if (particles.empty() || keys.empty()) { return; } read_particles_from_buffer(&buffer.front(), buffer.size()*sizeof(double), particles, keys); IMP_CHECK_MODEL_PARTICLES(particles[0]->get_model()); }
base::Vector<char> write_particles_to_buffer(const ParticlesTemp &particles, const FloatKeys &keys) { if (particles.empty() || keys.empty()) { return base::Vector<char>(); } unsigned int size= particles.size()*keys.size()*sizeof(double); base::Vector<char> ret(size); write_particles_to_buffer(particles, keys, &ret.front(), size); return ret; }
ParticlePairsTemp get_possible_interactions(const ParticlesTemp &ps, double max_distance, ParticleStatesTable *pst) { if (ps.empty()) return ParticlePairsTemp(); ParticleStatesList psl; ParticlesTemp all= pst->get_particles(); unsigned int max=0; for (unsigned int i=0; i< all.size(); ++i) { psl.push_back( pst->get_particle_states(all[i])); max= std::max(psl[i]->get_number_of_particle_states(), max); } algebra::BoundingBox3Ds bbs(ps.size()); for (unsigned int i=0; i< max; ++i) { for (unsigned int j=0; j< all.size(); ++j) { psl[j]->load_particle_state(std::min(i, psl[j]->get_number_of_particle_states()-1), all[j]); } ps[0]->get_model()->update(); for (unsigned int j=0; j< ps.size(); ++j) { core::XYZ d(ps[j]); bbs[j]+= d.get_coordinates(); } } for (unsigned int j=0; j< ps.size(); ++j) { core::XYZR d(ps[j]); bbs[j]+= d.get_radius() + max_distance; } IMP_NEW(core::GridClosePairsFinder, gcpf, ()); gcpf->set_distance(max_distance); IntPairs ips= gcpf->get_close_pairs(bbs); ParticlePairsTemp ret(ips.size()); for (unsigned int i=0; i< ips.size(); ++i) { ret[i]= ParticlePair(ps[ips[i].first], ps[ips[i].second]); } return ret; }