def __init__(self,
              pdb_hierarchy,
              xray_structure,
              fmodel,
              params,
              cif_objects=(),
              out=sys.stdout,
              output_model=None,
              output_map_coeffs=None,
              prefix=None,
              write_files=True,
              reset_segid=True,
              verbose=True):
     if (write_files):
         assert ((prefix is not None)
                 or (not None in [output_model, output_map_coeffs]))
     if (params.build_hydrogens is Auto):
         params.build_hydrogens = xray_structure.hd_selection().count(
             True) > 0
     make_sub_header("Filling in partial sidechains", out=out)
     prefilter_callback = prefilter(fmodel=fmodel, out=out)
     n_atoms_start = xray_structure.sites_cart().size()
     self.n_extended = extend_protein_model(
         pdb_hierarchy=pdb_hierarchy,
         add_hydrogens=params.build_hydrogens,
         mon_lib_srv=mmtbx.monomer_library.server.server())
     print("  %d sidechains extended." % self.n_extended, file=out)
     if (self.n_extended > 0) and (not params.skip_rsr):
         pdb_hierarchy, xray_structure = refit_residues(
             pdb_hierarchy=pdb_hierarchy,
             cif_objects=cif_objects,
             fmodel=fmodel,
             use_rotamers=params.use_rotamers,
             anneal=params.anneal_residues,
             out=out)
     else:
         xray_structure = pdb_hierarchy.extract_xray_structure(
             crystal_symmetry=xray_structure)
     fmodel.update_xray_structure(xray_structure, update_f_calc=True)
     n_atoms_end = xray_structure.sites_cart().size()
     self.r_work = fmodel.r_work()
     self.r_free = fmodel.r_free()
     self.n_new_atoms = n_atoms_end - n_atoms_start
     self.pdb_file = self.map_file = None
     if reset_segid:
         for atom in pdb_hierarchy.atoms():
             atom.segid = ""
     if (write_files):
         if (output_model is None):
             output_model = prefix + "_extended.pdb"
         f = open(output_model, "w")
         f.write(pdb_hierarchy.as_pdb_string(fmodel.xray_structure))
         f.close()
         self.pdb_file = output_model
         print("  wrote new model to %s" % output_model, file=out)
         if (output_map_coeffs is None):
             output_map_coeffs = prefix + "_maps.mtz"
         from mmtbx.maps.utils import get_maps_from_fmodel
         import iotbx.map_tools
         two_fofc_map, fofc_map = get_maps_from_fmodel(fmodel)
         iotbx.map_tools.write_map_coeffs(fwt_coeffs=two_fofc_map,
                                          delfwt_coeffs=fofc_map,
                                          file_name=output_map_coeffs)
         print("  wrote map coefficients to %s" % output_map_coeffs,
               file=out)
         self.map_file = output_map_coeffs
Example #2
0
def build_cycle (pdb_hierarchy,
    fmodel,
    geometry_restraints_manager,
    params,
    selection=None,
    cif_objects=(),
    nproc=Auto,
    out=sys.stdout,
    verbose=False,
    debug=None,
    i_cycle=0) :
  from mmtbx import restraints
  from scitbx.array_family import flex
  t_start = time.time()
  hd_sel = fmodel.xray_structure.hd_selection()
  n_hydrogen = hd_sel.count(True)
  if (n_hydrogen > 0) and (True) : #params.building.delete_hydrogens) :
    print >> out, "WARNING: %d hydrogen atoms will be removed!" % n_hydrogen
    non_hd_sel = ~hd_sel
    # XXX it's better to do this in-place for the hierarchy, because calling
    # pdb_hierarchy.select(non_hd_sel) will not remove parent-child
    # relationships involving hydrogens, which causes problems when running
    # the MolProbity validation.
    pdb_hierarchy.remove_hd(reset_i_seq=True)
    xray_structure = fmodel.xray_structure.select(non_hd_sel)
    assert (pdb_hierarchy.atoms_size() == xray_structure.scatterers().size())
    fmodel.update_xray_structure(xray_structure)
    geometry_restraints_manager = geometry_restraints_manager.select(non_hd_sel)
  pdb_atoms = pdb_hierarchy.atoms()
  segids = pdb_atoms.extract_segid().strip()
  if (not segids.all_eq("")) :
    print >> out, "WARNING: resetting segids to blank"
    for i_seq, atom in enumerate(pdb_atoms) :
      atom.segid = ""
      sc = fmodel.xray_structure.scatterers()[i_seq]
      sc.label = atom.id_str()
  if isinstance(selection, str) :
    sele_cache = pdb_hierarchy.atom_selection_cache()
    selection = sele_cache.selection(selection)
  make_header("Build cycle %d" % (i_cycle+1), out=out)
  fmodel.info().show_rfactors_targets_scales_overall(out=out)
  if (debug > 0) :
    from mmtbx.maps.utils import get_maps_from_fmodel
    from iotbx.map_tools import write_map_coeffs
    two_fofc, fofc = get_maps_from_fmodel(fmodel,
      exclude_free_r_reflections=True)
    write_map_coeffs(
      fwt_coeffs=two_fofc,
      delfwt_coeffs=fofc,
      file_name="cycle_%d_start.mtz" % (i_cycle+1))
  candidate_residues = alt_confs.filter_before_build(
    pdb_hierarchy=pdb_hierarchy,
    fmodel=fmodel,
    geometry_restraints_manager=geometry_restraints_manager,
    selection=selection,
    params=params.prefilter,
    verbose=verbose,
    log=out)
  t1 = time.time()
  print >> out, "filtering: %.3fs" % (t1-t_start)
  restraints_manager = restraints.manager(
    geometry=geometry_restraints_manager,
    normalization=True)
  make_sub_header("Finding alternate conformations", out=out)
  building_trials = find_all_alternates(
    residues=candidate_residues,
    pdb_hierarchy=pdb_hierarchy,
    restraints_manager=restraints_manager,
    fmodel=fmodel,
    params=params.residue_fitting,
    nproc=params.nproc,
    verbose=verbose,
    debug=debug,
    log=out).results
  t2 = time.time()
  print >> out, "  building: %.3fs" % (t2-t1)
  make_sub_header("Scoring and assembling alternates", out=out)
  n_alternates = process_results(
    pdb_hierarchy=pdb_hierarchy,
    fmodel=fmodel,
    residues_in=candidate_residues,
    building_trials=building_trials,
    params=params.residue_fitting,
    verbose=verbose,
    log=out)
  if (n_alternates > 0) :
    print >> out, ""
    print >> out, "  %d disordered residues built" % n_alternates
    n_split = alt_confs.spread_alternates(pdb_hierarchy,
      new_occupancy=params.residue_fitting.expected_occupancy,
      split_all_adjacent=True,
      log=out)
    assert (n_split > 0)
    print >> out, "  %d adjacent residues split" % n_split
  else :
    print >> out, "No alternates built this round."
  t3 = time.time()
  print >> out, "  assembly: %.3fs" % (t3-t2)
  if (not params.cleanup.rsr_after_build) :
    if (n_alternates > 0) :
      print >> out, "Skipping final RSR step (rsr_after_build=False)."
    else :
      print >> out, "No refinement needs to be performed."
  else :
    make_sub_header("Real-space refinement", out=out)
    print >> out, ""
    pdb_hierarchy = real_space_refine(
      pdb_hierarchy=pdb_hierarchy,
      fmodel=fmodel,
      cif_objects=cif_objects,
      params=params,
      nproc=params.nproc,
      remediate=True,
      out=out)
    t4 = time.time()
    print >> out, ""
    print >> out, "RSR: %.3fs" % (t4-t3)
  fmodel.info().show_targets(out=out, text="Rebuilt model")
  t_end = time.time()
  alt_confs.finalize_model(
    pdb_hierarchy=pdb_hierarchy,
    xray_structure=pdb_hierarchy.extract_xray_structure(
      crystal_symmetry=fmodel.xray_structure),
    set_b_iso=params.cleanup.set_b_iso,
    convert_to_isotropic=params.cleanup.convert_to_isotropic,
    selection="altloc A or altloc B")
  t_end = time.time()
  print >> out, "Total runtime for cycle: %.3fs" % (t_end-t_start)
  return pdb_hierarchy, n_alternates
Example #3
0
def build_cycle(pdb_hierarchy,
                fmodel,
                geometry_restraints_manager,
                params,
                selection=None,
                cif_objects=(),
                nproc=Auto,
                out=sys.stdout,
                verbose=False,
                debug=None,
                i_cycle=0):
    from mmtbx import restraints
    from scitbx.array_family import flex
    t_start = time.time()
    hd_sel = fmodel.xray_structure.hd_selection()
    n_hydrogen = hd_sel.count(True)
    if (n_hydrogen > 0) and (True):  #params.building.delete_hydrogens):
        print("WARNING: %d hydrogen atoms will be removed!" % n_hydrogen,
              file=out)
        non_hd_sel = ~hd_sel
        # XXX it's better to do this in-place for the hierarchy, because calling
        # pdb_hierarchy.select(non_hd_sel) will not remove parent-child
        # relationships involving hydrogens, which causes problems when running
        # the MolProbity validation.
        pdb_hierarchy.remove_hd(reset_i_seq=True)
        xray_structure = fmodel.xray_structure.select(non_hd_sel)
        assert (
            pdb_hierarchy.atoms_size() == xray_structure.scatterers().size())
        fmodel.update_xray_structure(xray_structure)
        geometry_restraints_manager = geometry_restraints_manager.select(
            non_hd_sel)
    pdb_atoms = pdb_hierarchy.atoms()
    segids = pdb_atoms.extract_segid().strip()
    if (not segids.all_eq("")):
        print("WARNING: resetting segids to blank", file=out)
        for i_seq, atom in enumerate(pdb_atoms):
            atom.segid = ""
            sc = fmodel.xray_structure.scatterers()[i_seq]
            sc.label = atom.id_str()
    if isinstance(selection, str):
        sele_cache = pdb_hierarchy.atom_selection_cache()
        selection = sele_cache.selection(selection)
    make_header("Build cycle %d" % (i_cycle + 1), out=out)
    fmodel.info().show_rfactors_targets_scales_overall(out=out)
    if (debug > 0):
        from mmtbx.maps.utils import get_maps_from_fmodel
        from iotbx.map_tools import write_map_coeffs
        two_fofc, fofc = get_maps_from_fmodel(fmodel,
                                              exclude_free_r_reflections=True)
        write_map_coeffs(fwt_coeffs=two_fofc,
                         delfwt_coeffs=fofc,
                         file_name="cycle_%d_start.mtz" % (i_cycle + 1))
    candidate_residues = alt_confs.filter_before_build(
        pdb_hierarchy=pdb_hierarchy,
        fmodel=fmodel,
        geometry_restraints_manager=geometry_restraints_manager,
        selection=selection,
        params=params.prefilter,
        verbose=verbose,
        log=out)
    t1 = time.time()
    print("filtering: %.3fs" % (t1 - t_start), file=out)
    restraints_manager = restraints.manager(
        geometry=geometry_restraints_manager, normalization=True)
    make_sub_header("Finding alternate conformations", out=out)
    building_trials = find_all_alternates(
        residues=candidate_residues,
        pdb_hierarchy=pdb_hierarchy,
        restraints_manager=restraints_manager,
        fmodel=fmodel,
        params=params.residue_fitting,
        nproc=params.nproc,
        verbose=verbose,
        debug=debug,
        log=out).results
    t2 = time.time()
    print("  building: %.3fs" % (t2 - t1), file=out)
    make_sub_header("Scoring and assembling alternates", out=out)
    n_alternates = process_results(pdb_hierarchy=pdb_hierarchy,
                                   fmodel=fmodel,
                                   residues_in=candidate_residues,
                                   building_trials=building_trials,
                                   params=params.residue_fitting,
                                   verbose=verbose,
                                   log=out)
    if (n_alternates > 0):
        print("", file=out)
        print("  %d disordered residues built" % n_alternates, file=out)
        n_split = alt_confs.spread_alternates(
            pdb_hierarchy,
            new_occupancy=params.residue_fitting.expected_occupancy,
            split_all_adjacent=True,
            log=out)
        assert (n_split > 0)
        print("  %d adjacent residues split" % n_split, file=out)
    else:
        print("No alternates built this round.", file=out)
    t3 = time.time()
    print("  assembly: %.3fs" % (t3 - t2), file=out)
    if (not params.cleanup.rsr_after_build):
        if (n_alternates > 0):
            print("Skipping final RSR step (rsr_after_build=False).", file=out)
        else:
            print("No refinement needs to be performed.", file=out)
    else:
        make_sub_header("Real-space refinement", out=out)
        print("", file=out)
        pdb_hierarchy = real_space_refine(pdb_hierarchy=pdb_hierarchy,
                                          fmodel=fmodel,
                                          cif_objects=cif_objects,
                                          params=params,
                                          nproc=params.nproc,
                                          remediate=True,
                                          out=out)
        t4 = time.time()
        print("", file=out)
        print("RSR: %.3fs" % (t4 - t3), file=out)
    fmodel.info().show_targets(out=out, text="Rebuilt model")
    t_end = time.time()
    alt_confs.finalize_model(
        pdb_hierarchy=pdb_hierarchy,
        xray_structure=pdb_hierarchy.extract_xray_structure(
            crystal_symmetry=fmodel.xray_structure),
        set_b_iso=params.cleanup.set_b_iso,
        convert_to_isotropic=params.cleanup.convert_to_isotropic,
        selection="altloc A or altloc B")
    t_end = time.time()
    print("Total runtime for cycle: %.3fs" % (t_end - t_start), file=out)
    return pdb_hierarchy, n_alternates
 def __init__ (self,
     pdb_hierarchy,
     xray_structure,
     fmodel,
     params,
     cif_objects=(),
     out=sys.stdout,
     output_model=None,
     output_map_coeffs=None,
     prefix=None,
     write_files=True,
     reset_segid=True,
     verbose=True) :
   if (write_files) :
     assert ((prefix is not None) or
             (not None in [output_model,output_map_coeffs]))
   if (params.build_hydrogens is Auto) :
     params.build_hydrogens = xray_structure.hd_selection().count(True) > 0
   make_sub_header("Filling in partial sidechains", out=out)
   prefilter_callback = prefilter(
     fmodel=fmodel,
     out=out)
   n_atoms_start = xray_structure.sites_cart().size()
   self.n_extended = extend_protein_model(
     pdb_hierarchy=pdb_hierarchy,
     hydrogens=params.build_hydrogens,
     max_atoms_missing=params.max_atoms_missing,
     prefilter_callback=prefilter_callback,
     log=out)
   print >> out, "  %d sidechains extended." % self.n_extended
   if (self.n_extended > 0) and (not params.skip_rsr) :
     pdb_hierarchy, xray_structure = refit_residues(
       pdb_hierarchy=pdb_hierarchy,
       cif_objects=cif_objects,
       fmodel=fmodel,
       use_rotamers=params.use_rotamers,
       anneal=params.anneal_residues,
       out=out)
   else :
     xray_structure = pdb_hierarchy.extract_xray_structure(
       crystal_symmetry=xray_structure)
   fmodel.update_xray_structure(xray_structure, update_f_calc=True)
   n_atoms_end = xray_structure.sites_cart().size()
   self.r_work = fmodel.r_work()
   self.r_free = fmodel.r_free()
   self.n_new_atoms = n_atoms_end - n_atoms_start
   self.pdb_file = self.map_file = None
   if reset_segid :
     for atom in pdb_hierarchy.atoms() :
       atom.segid = ""
   if (write_files) :
     if (output_model is None) :
       output_model = prefix + "_extended.pdb"
     f = open(output_model, "w")
     f.write(pdb_hierarchy.as_pdb_string(fmodel.xray_structure))
     f.close()
     self.pdb_file = output_model
     print >> out, "  wrote new model to %s" % output_model
     if (output_map_coeffs is None) :
       output_map_coeffs = prefix + "_maps.mtz"
     from mmtbx.maps.utils import get_maps_from_fmodel
     import iotbx.map_tools
     two_fofc_map, fofc_map = get_maps_from_fmodel(fmodel)
     iotbx.map_tools.write_map_coeffs(
       fwt_coeffs=two_fofc_map,
       delfwt_coeffs=fofc_map,
       file_name=output_map_coeffs)
     print >> out, "  wrote map coefficients to %s" % output_map_coeffs
     self.map_file = output_map_coeffs