def exercise () :
  from mmtbx.building.alternate_conformations import conformer_generation
  from mmtbx.monomer_library import server
  import iotbx.pdb.hierarchy
  generate_inputs()
  params = master_phil().extract()
  mon_lib_srv = server.server()
  pdb_in = iotbx.pdb.hierarchy.input(file_name="shear_frag_single.pdb")
  hierarchy = pdb_in.hierarchy
  pdb_atoms = hierarchy.atoms()
  pdb_atoms.reset_i_seq()
  sites_cart = pdb_atoms.extract_xyz()
  xrs = pdb_in.input.xray_structure_simple()
  models = []
  prev_res = next_res = next_next_res = None
  for chain in hierarchy.only_model().chains() :
    residue_groups = chain.residue_groups()
    n_rg = len(residue_groups) # should be 4
    for i_res, residue_group in enumerate(residue_groups) :
      sites_orig = sites_cart.deep_copy()
      next_res = next_next_res = None
      if (i_res < (n_rg - 1)) :
        next_res = residue_groups[i_res+1].atom_groups()[0]
      if (i_res < (n_rg - 2)) :
        next_next_res = residue_groups[i_res+2].atom_groups()[0]
      atom_groups = residue_group.atom_groups()
      primary_conf = atom_groups[0]
      out = StringIO()
      confs = []
      for conf in conformer_generation.generate_single_residue_confs(
        atom_group=primary_conf,
        sites_cart=sites_cart.deep_copy(),
        mon_lib_srv=mon_lib_srv,
        params=params.torsion_search,
        prev_residue=prev_res,
        next_residue=next_res,
        next_next_residue=next_next_res,
        backrub=False,
        shear=True) :
          conf.show_summary(out=out)
          confs.append(conf)
      prev_res = primary_conf
      if (confs is None) :
        continue
      if (i_res == 1) :
        assert ("""  A ILE   7     None     4.0      mt""")
      for conf in confs :
        sites_new = sites_cart.set_selected(conf.sites_selection,
          conf.sites_selected())
        pdb_atoms.set_xyz(sites_new)
        models.append(hierarchy.only_model().detached_copy())
  new_hierarchy = iotbx.pdb.hierarchy.root()
  for i_model, conf in enumerate(models) :
    conf.id = str(i_model + 1)
    new_hierarchy.append_model(conf)
  open("shear_frag_naive_ensemble.pdb", "w").write(
    new_hierarchy.as_pdb_string())
示例#2
0
def screen_residue(residue,
                   prev_residue,
                   next_residue,
                   next_next_residue,
                   sites_cart,
                   fmodel,
                   mon_lib_srv,
                   params,
                   fofc_map=None,
                   two_fofc_map=None,
                   map_file_name=None,
                   backrub=False,
                   shear=False,
                   verbose=False,
                   out=None):
    from mmtbx.building.alternate_conformations import conformer_generation
    if (out is None):
        out = sys.stdout
    if (params is None):
        params = master_phil().extract()
    xrs = fmodel.xray_structure
    occ_start = xrs.scatterers().extract_occupancies()
    i_seqs = residue.atoms().extract_i_seq()
    assert (not i_seqs.all_eq(0))
    if (params.set_partial_occupancy is not None):
        occ = occ_start.deep_copy()
        occ.set_selected(i_seqs, params.set_partial_occupancy)
        xrs.set_occupancies(occ)
        fmodel.update_xray_structure(xrs, update_f_calc=True)
    if (fofc_map is None) or (params.set_partial_occupancy is not None):
        two_fofc_coeffs = fmodel.map_coefficients(map_type="2mFo-DFc")
        fofc_coeffs = fmodel.map_coefficients(map_type="mFo-DFc")
        two_fofc_fft = two_fofc_coeffs.fft_map(resolution_factor=1 / 4.)
        fofc_fft = fofc_coeffs.fft_map(resolution_factor=1 / 4.)
        two_fofc_map = two_fofc_fft.apply_sigma_scaling().real_map_unpadded()
        fofc_map = fofc_fft.apply_sigma_scaling().real_map_unpadded()
        if (map_file_name is not None):
            import iotbx.map_tools
            iotbx.map_tools.write_map_coeffs(two_fofc_coeffs, fofc_coeffs,
                                             map_file_name)
    unit_cell = xrs.unit_cell()
    sites_start = sites_cart.deep_copy()
    good_confs = []
    n_confs = 0
    t_start = time.time()
    for conf in conformer_generation.generate_single_residue_confs(
            atom_group=residue,
            sites_cart=sites_cart.deep_copy(),
            mon_lib_srv=mon_lib_srv,
            params=params.torsion_search,
            prev_residue=prev_residue,
            next_residue=next_residue,
            next_next_residue=next_next_residue,
            backrub=backrub,
            shear=shear):
        n_confs += 1
        # basically a very crude rigid-body grid search
        translations = []
        for sites_new, translation in translation_search(
                sites=conf.sites_selected(),
                translation=params.translation,
                translation_sampling=params.translation_sampling):
            conf_trans = conf.translate_sites(
                sites_new=sites_new,
                translation=translation).update_rmsd(sites_start)
            good_maps = score_density(self=conf_trans,
                                      two_fofc_map=two_fofc_map,
                                      fofc_map=fofc_map,
                                      unit_cell=unit_cell,
                                      params=params.sidechain_scoring)
            translations.append(conf_trans)
            if (good_maps):  #and (conf_trans.rmsd > params.rmsd_min):
                translations.append(conf_trans)
        if (len(translations) > 0):
            cmp_fn = lambda a, b: cmp(b.mean_fofc, a.mean_fofc)
            translations.sort(key=cmp_to_key(cmp_fn))
            good_confs.append(translations[0])
    if (n_confs > 1) and (len(good_confs) != 0):
        for conf in good_confs:
            conf.show_summary(out=out)
    xrs.set_occupancies(occ_start)
    t_end = time.time()
    if (verbose):
        print("time to sample residue: %.2fs" % (t_end - t_start), file=out)
    return good_confs
示例#3
0
def screen_residue(
    residue,
    prev_residue,
    next_residue,
    next_next_residue,
    sites_cart,
    fmodel,
    mon_lib_srv,
    params,
    fofc_map=None,
    two_fofc_map=None,
    map_file_name=None,
    backrub=False,
    shear=False,
    verbose=False,
    out=None,
):
    from mmtbx.building.alternate_conformations import conformer_generation

    if out is None:
        out = sys.stdout
    if params is None:
        params = master_phil().extract()
    xrs = fmodel.xray_structure
    occ_start = xrs.scatterers().extract_occupancies()
    i_seqs = residue.atoms().extract_i_seq()
    assert not i_seqs.all_eq(0)
    if params.set_partial_occupancy is not None:
        occ = occ_start.deep_copy()
        occ.set_selected(i_seqs, params.set_partial_occupancy)
        xrs.set_occupancies(occ)
        fmodel.update_xray_structure(xrs, update_f_calc=True)
    if (fofc_map is None) or (params.set_partial_occupancy is not None):
        two_fofc_coeffs = fmodel.map_coefficients(map_type="2mFo-DFc")
        fofc_coeffs = fmodel.map_coefficients(map_type="mFo-DFc")
        two_fofc_fft = two_fofc_coeffs.fft_map(resolution_factor=1 / 4.0)
        fofc_fft = fofc_coeffs.fft_map(resolution_factor=1 / 4.0)
        two_fofc_map = two_fofc_fft.apply_sigma_scaling().real_map_unpadded()
        fofc_map = fofc_fft.apply_sigma_scaling().real_map_unpadded()
        if map_file_name is not None:
            import iotbx.map_tools

            iotbx.map_tools.write_map_coeffs(two_fofc_coeffs, fofc_coeffs, map_file_name)
    unit_cell = xrs.unit_cell()
    sites_start = sites_cart.deep_copy()
    good_confs = []
    n_confs = 0
    t_start = time.time()
    for conf in conformer_generation.generate_single_residue_confs(
        atom_group=residue,
        sites_cart=sites_cart.deep_copy(),
        mon_lib_srv=mon_lib_srv,
        params=params.torsion_search,
        prev_residue=prev_residue,
        next_residue=next_residue,
        next_next_residue=next_next_residue,
        backrub=backrub,
        shear=shear,
    ):
        n_confs += 1
        # basically a very crude rigid-body grid search
        translations = []
        for sites_new, translation in translation_search(
            sites=conf.sites_selected(),
            translation=params.translation,
            translation_sampling=params.translation_sampling,
        ):
            conf_trans = conf.translate_sites(sites_new=sites_new, translation=translation).update_rmsd(sites_start)
            good_maps = score_density(
                self=conf_trans,
                two_fofc_map=two_fofc_map,
                fofc_map=fofc_map,
                unit_cell=unit_cell,
                params=params.sidechain_scoring,
            )
            translations.append(conf_trans)
            if good_maps:  # and (conf_trans.rmsd > params.rmsd_min) :
                translations.append(conf_trans)
        if len(translations) > 0:
            translations.sort(lambda a, b: cmp(b.mean_fofc, a.mean_fofc))
            good_confs.append(translations[0])
    if (n_confs > 1) and (len(good_confs) != 0):
        for conf in good_confs:
            conf.show_summary(out=out)
    xrs.set_occupancies(occ_start)
    t_end = time.time()
    if verbose:
        print >> out, "time to sample residue: %.2fs" % (t_end - t_start)
    return good_confs