void do_all_fitting(const std::string param_filename, const std::string chimera_filename) { std::string protein_filename,surface_filename; std::string density_filename; std::string output_filename; float spacing,resolution,dens_threshold; int cn_symm_deg,dn_symm_deg; int num_sols_to_fit; internal::Parameters params(param_filename.c_str()); num_sols_to_fit=params.get_number_of_solution_to_fit(); output_filename=params.get_output_filename(); protein_filename = params.get_unit_pdb_fn(); density_filename = params.get_density_map_filename(); resolution=params.get_density_map_resolution(); spacing=params.get_density_map_spacing(); dens_threshold=params.get_density_map_threshold(); cn_symm_deg=params.get_cn_symm(); dn_symm_deg=params.get_dn_symm(); algebra::Vector3D origin = params.get_density_origin(); std::string symm_ref_output = output_filename; symm_ref_output+=".symm.ref"; std::cout<<"============= parameters ============"<<std::endl; std::cout<<"parameters filename : " << param_filename <<std::endl; std::cout<<"density filename : " << density_filename <<std::endl; std::cout<<"resolution : " << resolution <<std::endl; std::cout<<"spacing : " << spacing <<std::endl; std::cout<<"threshold : " << dens_threshold <<std::endl; std::cout<<"symmetry degree (cn,dn): " << cn_symm_deg<<"," <<dn_symm_deg <<std::endl; std::cout<<"number of solutions to fit : " << num_sols_to_fit <<std::endl; std::cout<<"origin : (" << origin[0] << "," << origin[1] <<"," << origin[2] << ")" << std::endl; std::cout<<"output filename : " <<output_filename<<std::endl; std::cout<<"====================================="<<std::endl; //load the density base::PointerMember<em::DensityMap> dmap = em::read_map(density_filename, new em::MRCReaderWriter()); dmap->get_header_writable()->set_resolution(resolution); dmap->update_voxel_size(spacing); algebra::Vector3D v = dmap->get_origin(); dmap->set_origin(origin[0], origin[1], origin[2]); CnSymmAxisDetector symm_map(cn_symm_deg, dmap, dens_threshold, 0.0); params.set_density_non_symm_axis_length( symm_map.get_non_symmetry_axis_length()* symm_map.get_non_symmetry_axis_length()/4); //generate the assemblies std::cout<<"======= Sampling symmetric assemblies"<<std::endl; multifit::FittingSolutionRecords recs = build_symmetric_assemblies(params); multifit::write_fitting_solutions("intermediate_asmb_sols.out",recs); // multifit::FittingSolutionRecords recs // = multifit::read_fitting_solutions("intermediate_asmb_sols.out"); // multifit::FittingSolutionRecords pca_pruned_asmb_sols = // prune_by_pca(param_filename,recs,2); // std::cout<<"======= Write pruned intermediate assemblies"<<std::endl; // multifit::write_fitting_solutions("pruned_intermediate_asmb_sols.out", // pca_pruned_asmb_sols); //load the protein IMP_NEW(kernel::Model, mdl, ()); atom::Hierarchy asmb; atom::Hierarchies mhs; //atom::CAlphaPDBSelector sel; for (int i=0;i<1;i++){//dn_symm_deg;i++) { for (int j=0;j<cn_symm_deg;j++) { atom::Hierarchy h = atom::read_pdb(protein_filename,mdl); atom::Chain c= atom::get_chain(atom::Residue( atom::get_residue(atom::Atom(core::get_leaves(h)[0])))); c.set_id(char(65+i*cn_symm_deg+j)); atom::setup_as_rigid_body(h); mhs.push_back(h); }} multifit::FittingSolutionRecords fitted_recs = fit_models_to_density( dmap,mhs, recs,params,num_sols_to_fit,false); std::sort(fitted_recs.begin(), fitted_recs.end(), sort_by_cc()); std::fstream out; int i=0; for(multifit::FittingSolutionRecords::iterator it = fitted_recs.begin(); it != fitted_recs.end(); it++){ it->show(); std::stringstream ss; ss<<params.get_solution_model_filename()<<"."<<i++<<".pdb"; transform_cn_assembly(mhs,it->get_dock_transformation()); for(unsigned int j=0;j<mhs.size();j++){ core::transform(core::RigidBody(mhs[j]), it->get_fit_transformation()); } atom::write_pdb(mhs,ss.str()); for(unsigned int j=0;j<mhs.size();j++){ core::transform(core::RigidBody(mhs[j]), it->get_fit_transformation().get_inverse()); } it->set_solution_filename(ss.str()); transform_cn_assembly(mhs, it->get_dock_transformation().get_inverse()); } multifit::write_fitting_solutions(output_filename.c_str(),fitted_recs); write_in_symmref_format(fitted_recs, symm_ref_output); if (chimera_filename != "") { write_in_chimera_format(fitted_recs, chimera_filename); } }
IMPCNMULTIFIT_BEGIN_NAMESPACE Floats get_rmsd_for_models(const std::string param_filename, const std::string trans_filename, const std::string ref_filename, int start_model, int end_model) { std::string protein_filename, surface_filename; int cn_symm_deg; std::cout << "============= parameters ============" << std::endl; std::cout << "params filename : " << param_filename << std::endl; std::cout << "trans filename : " << trans_filename << std::endl; std::cout << "ref filename : " << ref_filename << std::endl; std::cout << "start index to rmsd : " << start_model << std::endl; std::cout << "end index to rmsd : " << end_model << std::endl; std::cout << "=====================================" << std::endl; internal::Parameters params(param_filename.c_str()); protein_filename = params.get_unit_pdb_fn(); cn_symm_deg = params.get_cn_symm(); IMP_NEW(Model, mdl, ()); atom::Hierarchy asmb_ref; atom::Hierarchies mhs; // read the monomer core::XYZs model_xyzs; for (int i = 0; i < cn_symm_deg; i++) { atom::Hierarchy h = atom::read_pdb(protein_filename, mdl, new atom::CAlphaPDBSelector()); atom::Chain c = atom::get_chain( atom::Residue(atom::get_residue(atom::Atom(core::get_leaves(h)[0])))); c.set_id(std::string(1, char(65 + i))); atom::add_radii(h); atom::create_rigid_body(h); mhs.push_back(h); Particles leaves = core::get_leaves(h); for (Particles::iterator it = leaves.begin(); it != leaves.end(); it++) { model_xyzs.push_back(core::XYZ(*it)); } } // read the transformations multifit::FittingSolutionRecords recs = multifit::read_fitting_solutions(trans_filename.c_str()); // read the reference structure asmb_ref = atom::read_pdb(ref_filename, mdl, new atom::CAlphaPDBSelector()); atom::Hierarchies ref_chains = atom::Hierarchies(atom::get_by_type(asmb_ref, atom::CHAIN_TYPE)); std::cout << "number of records:" << recs.size() << std::endl; Floats rmsd; std::ofstream out; out.open("rmsd.output"); if (end_model < 0 || end_model >= static_cast<int>(recs.size())) { end_model = recs.size() - 1; } for (int i = start_model; i >= 0 && i <= end_model; ++i) { algebra::Transformation3D t1 = recs[i].get_dock_transformation(); algebra::Transformation3D t2 = recs[i].get_fit_transformation(); algebra::Transformation3D t2_inv = t1.get_inverse(); transform_cn_assembly(mhs, t1); for (unsigned int j = 0; j < model_xyzs.size(); j++) { model_xyzs[j] .set_coordinates(t2.get_transformed(model_xyzs[j].get_coordinates())); } std::cout << mhs.size() << "," << ref_chains.size() << std::endl; Float cn_rmsd = get_cn_rmsd(mhs, ref_chains); out << " trans:" << i << " rmsd: " << cn_rmsd << " cc: " << 1. - recs[i].get_fitting_score() << std::endl; rmsd.push_back(cn_rmsd); for (unsigned int j = 0; j < model_xyzs.size(); j++) { model_xyzs[j].set_coordinates( t2_inv.get_transformed(model_xyzs[j].get_coordinates())); } /* std::stringstream ss; ss<<"asmb_"<<i<<".pdb"; atom::write_pdb(mhs,ss.str());*/ transform_cn_assembly(mhs, t1.get_inverse()); } out.close(); return rmsd; }