Exemple #1
0
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);
  }
}
Exemple #2
0
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;
}