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 exercise () :
  for module in ["reduce", "probe", "phenix_regression"] :
    if (not libtbx.env.has_module(module)) :
      print "%s not available, skipping" % module
      return
  from mmtbx.command_line import validation_summary
  from iotbx import file_reader
  import iotbx.pdb.hierarchy
  regression_pdb = libtbx.env.find_in_repositories(
    relative_path="phenix_regression/pdb/pdb1jxt.ent",
    test=os.path.isfile)
  out = StringIO()
  summary = validation_summary.run(args=[regression_pdb], out=out)
  assert approx_equal(summary.clashscore, 13.597, eps=0.001), "clashscore %s is not 13.597(0.0001)" % summary.clashscore
  ss = easy_pickle.dumps(summary)
  sss = easy_pickle.loads(ss)
  out_1 = StringIO()
  out_2 = StringIO()
  summary.show(out=out_1)
  sss.show(out=out_2)
  assert out_1.getvalue() == out_2.getvalue()
  pdb_in = file_reader.any_file(regression_pdb)
  hierarchy = pdb_in.file_object.hierarchy
  new_hierarchy = iotbx.pdb.hierarchy.root()
  for i in range(5) :
    model = hierarchy.only_model().detached_copy()
    model.id = str(i+1)
    new_hierarchy.append_model(model)
  open("tst_validation_summary.pdb", "w").write(new_hierarchy.as_pdb_string())
  out2 = StringIO()
  summary = validation_summary.run(args=["tst_validation_summary.pdb"],
    out=out2)
  assert (type(summary).__name__ == 'ensemble')
  print "OK"
  def as_pdb_ensemble(self, log=None):
    """
    Create a multi-MselfDEL PDB hierarchy with the trial results after filtering
    by density and rotamer score.

    :returns: the new multi-model PDB hierarchy, or if no models passed the
              filtering stage, None
    """
    if (log is None) : log = null_out()
    import iotbx.pdb.hierarchy
    root = iotbx.pdb.hierarchy.root()
    trials_and_models = self.get_filtered_trials(include_pdb_hierarchies=True,
      log=log)
    n_kept = 0
    for k, (trial, hierarchy) in enumerate(trials_and_models):
      n_kept += 1
      new_model = hierarchy.only_model().detached_copy()
      new_model.id = str(n_kept)
      print >> log, "MODEL %d:" % (k+1)
      trial.show_summary(prefix="  ", out=log)
      root.append_model(new_model)
    if (n_kept == 0):
      return None
    else :
      return root
def exercise():
    for module in ["reduce", "probe", "phenix_regression"]:
        if not libtbx.env.has_module(module):
            print "%s not available, skipping" % module
            return
    from mmtbx.command_line import validation_summary
    from iotbx import file_reader
    import iotbx.pdb.hierarchy

    regression_pdb = libtbx.env.find_in_repositories(
        relative_path="phenix_regression/pdb/pdb1jxt.ent", test=os.path.isfile
    )
    out = StringIO()
    summary = validation_summary.run(args=[regression_pdb], out=out)
    assert approx_equal(summary.clashscore, 13.597, eps=0.0001)
    ss = easy_pickle.dumps(summary)
    sss = easy_pickle.loads(ss)
    out_1 = StringIO()
    out_2 = StringIO()
    summary.show(out=out_1)
    sss.show(out=out_2)
    assert out_1.getvalue() == out_2.getvalue()
    pdb_in = file_reader.any_file(regression_pdb)
    hierarchy = pdb_in.file_object.hierarchy
    new_hierarchy = iotbx.pdb.hierarchy.root()
    for i in range(5):
        model = hierarchy.only_model().detached_copy()
        model.id = str(i + 1)
        new_hierarchy.append_model(model)
    open("tst_validation_summary.pdb", "w").write(new_hierarchy.as_pdb_string())
    out2 = StringIO()
    summary = validation_summary.run(args=["tst_validation_summary.pdb"], out=out2)
    assert type(summary).__name__ == "ensemble"
    print "OK"
示例#5
0
def get_chain_and_ranges(hierarchy):
    """
  Helper function to get info from hierarchy to create spec object.
  Used in get_ncs_info_as_spec
  hierarchy is already selected
  """
    c_ids = [c.id for c in hierarchy.only_model().chains()]
    assert len(set(c_ids)) == 1
    c_id = c_ids[0]
    rgs_all = []
    for chain in hierarchy.chains():
        rgs_all += list(chain.residue_groups())
    ranges = []
    in_range = False
    first_id = None
    last_id = None
    for rg in rgs_all:
        resseq = int(rg.resseq)
        if in_range:
            if resseq - last_id > 1:
                # terminate range, start new one
                ranges.append([first_id, last_id])
                first_id = resseq
                last_id = resseq
            else:
                # continue range
                last_id = resseq
        else:
            # start new range
            first_id = resseq
            last_id = resseq
            in_range = True
    # dumping rest:
    ranges.append([first_id, last_id])
    return c_id, ranges, len(c.residue_groups())
示例#6
0
def exercise_rejoin():
    from mmtbx.building.alternate_conformations.tst_build_simple import pdb_raw
    pdb_in = iotbx.pdb.hierarchy.input(pdb_string=pdb_raw)
    hierarchy = pdb_in.hierarchy
    params = alternate_conformations.rejoin_phil.extract()
    n_modified = alternate_conformations.rejoin_split_single_conformers(
        pdb_hierarchy=hierarchy,
        params=params,
        model_error_ml=0.5,
        log=null_out())
    assert (n_modified == 3), n_modified  # Gln5
    # split residue 6 without changing coordinates, set occupancy very low
    chain = hierarchy.only_model().chains()[0]
    rg6 = chain.residue_groups()[5]
    ag = rg6.only_atom_group().detached_copy()
    for atom in ag.atoms():
        atom.occ = 0.05
    for atom in rg6.atoms():
        atom.occ = 0.95
    rg6.only_atom_group().altloc = 'A'
    ag.altloc = 'B'
    rg6.append_atom_group(ag)
    n_modified = alternate_conformations.rejoin_split_single_conformers(
        pdb_hierarchy=hierarchy.deep_copy(),
        params=params,
        model_error_ml=0.5,
        log=null_out())
    assert (n_modified == 1), n_modified
    # now with higher B-factors for all atoms
    for atom in hierarchy.atoms():
        atom.b = atom.b * 10
    n_modified = alternate_conformations.rejoin_split_single_conformers(
        pdb_hierarchy=hierarchy, params=params, log=null_out())
    assert (n_modified == 1), n_modified
  def as_pdb_ensemble (self, log=None) :
    """
    Create a multi-MselfDEL PDB hierarchy with the trial results after filtering
    by density and rotamer score.

    :returns: the new multi-model PDB hierarchy, or if no models passed the
              filtering stage, None
    """
    if (log is None) : log = null_out()
    import iotbx.pdb.hierarchy
    root = iotbx.pdb.hierarchy.root()
    trials_and_models = self.get_filtered_trials(include_pdb_hierarchies=True,
      log=log)
    n_kept = 0
    for k, (trial, hierarchy) in enumerate(trials_and_models) :
      n_kept += 1
      new_model = hierarchy.only_model().detached_copy()
      new_model.id = str(n_kept)
      print >> log, "MODEL %d:" % (k+1)
      trial.show_summary(prefix="  ", out=log)
      root.append_model(new_model)
    if (n_kept == 0) :
      return None
    else :
      return root
示例#8
0
def join_hierarchies (hierarchies, model_ids=None) :
  import iotbx.pdb.hierarchy
  root = iotbx.pdb.hierarchy.root()
  for k, hierarchy in enumerate(hierarchies) :
    model_id = k + 1
    if (model_ids is not None) :
      model_id = model_ids[k]
    model = iotbx.pdb.hierarchy.model(id=str(model_id))
    root.append_model(model)
    chain = hierarchy.only_model().only_chain().detached_copy()
    model.append_chain(chain)
  return root
示例#9
0
def join_hierarchies(hierarchies, model_ids=None):
  import iotbx.pdb.hierarchy
  root = iotbx.pdb.hierarchy.root()
  for k, hierarchy in enumerate(hierarchies):
    model_id = k + 1
    if (model_ids is not None):
      model_id = model_ids[k]
    model = iotbx.pdb.hierarchy.model(id=str(model_id))
    root.append_model(model)
    chain = hierarchy.only_model().only_chain().detached_copy()
    model.append_chain(chain)
  return root
示例#10
0
def exercise_rejoin () :
  from mmtbx.building.alternate_conformations.tst_build_simple import pdb_raw
  pdb_in = iotbx.pdb.hierarchy.input(pdb_string=pdb_raw)
  hierarchy = pdb_in.hierarchy
  params = alternate_conformations.rejoin_phil.extract()
  n_modified = alternate_conformations.rejoin_split_single_conformers(
    pdb_hierarchy=hierarchy,
    params=params,
    model_error_ml=0.5,
    log=null_out())
  assert (n_modified == 3), n_modified # Gln5
  # split residue 6 without changing coordinates, set occupancy very low
  chain = hierarchy.only_model().chains()[0]
  rg6 = chain.residue_groups()[5]
  ag = rg6.only_atom_group().detached_copy()
  for atom in ag.atoms() :
    atom.occ = 0.05
  for atom in rg6.atoms() :
    atom.occ = 0.95
  rg6.only_atom_group().altloc = 'A'
  ag.altloc = 'B'
  rg6.append_atom_group(ag)
  n_modified = alternate_conformations.rejoin_split_single_conformers(
    pdb_hierarchy=hierarchy.deep_copy(),
    params=params,
    model_error_ml=0.5,
    log=null_out())
  assert (n_modified == 1), n_modified
  # now with higher B-factors for all atoms
  for atom in hierarchy.atoms() :
    atom.b = atom.b * 10
  n_modified = alternate_conformations.rejoin_split_single_conformers(
    pdb_hierarchy=hierarchy,
    params=params,
    log=null_out())
  assert (n_modified == 1), n_modified
示例#11
0
def exercise_synthetic () :
  from mmtbx.regression import tst_build_alt_confs
  pdb_in = iotbx.pdb.hierarchy.input(pdb_string=tst_build_alt_confs.pdb_raw)
  xrs = pdb_in.input.xray_structure_simple()
  fc = abs(xrs.structure_factors(d_min=1.5).f_calc())
  flags = fc.resolution_filter(d_min=1.6).generate_r_free_flags()
  ls = fc.lone_set(other=flags)
  # case 1: no work set in high-res shell
  flags2 = ls.array(data=flex.bool(ls.size(), True))
  flags_all = flags.concatenate(other=flags2)
  mtz_out = fc.as_mtz_dataset(column_root_label="F")
  mtz_out.add_miller_array(flags_all, column_root_label="FreeR_flag")
  mtz_out.mtz_object().write("tst_molprobity_1.mtz")
  open("tst_molprobity_1.pdb", "w").write(tst_build_alt_confs.pdb_raw)
  args = [
    "tst_molprobity_1.pdb",
    "tst_molprobity_1.mtz",
    "--kinemage",
    "--maps",
    "flags.clashscore=False",
    "flags.xtriage=True",
  ]
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  out = StringIO()
  result.show(out=out)
  # case 2: no test set in high-res shell
  flags2 = ls.array(data=flex.bool(ls.size(), False))
  flags_all = flags.concatenate(other=flags2)
  mtz_out = fc.as_mtz_dataset(column_root_label="F")
  mtz_out.add_miller_array(flags_all, column_root_label="FreeR_flag")
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  out = StringIO()
  result.show(out=out)
  # case 3: multi-MODEL structure
  # XXX This is not a very sophisticated test - it only ensures that the
  # program does not crash.  We need a test for expected output...
  hierarchy = pdb_in.hierarchy
  model2 = hierarchy.only_model().detached_copy()
  hierarchy.append_model(model2)
  hierarchy.models()[0].id = "1"
  hierarchy.models()[1].id = "2"
  open("tst_molprobity_multi_model.pdb", "w").write(hierarchy.as_pdb_string())
  args = [
    "tst_molprobity_multi_model.pdb",
    "tst_molprobity_1.mtz",
    "--kinemage",
    "--maps",
    "flags.clashscore=False",
  ]
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  out = StringIO()
  result.show(out=out)
  # test rotamer distributions
  open("tst_molprobity_misc1.pdb", "w").write(tst_build_alt_confs.pdb_raw)
  args = [
    "tst_molprobity_1.pdb",
    "rotamer_library=8000",
    "outliers_only=False",
    "flags.clashscore=False",
  ]
  out = StringIO()
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  result.show(outliers_only=False, out=out)
  assert ("""   A   7  TYR              m-80  93.10   299.6,92.0""" in
    out.getvalue()), out.getvalue()
示例#12
0
def refit_residues(pdb_hierarchy,
                   cif_objects,
                   fmodel,
                   use_rotamers=True,
                   anneal=False,
                   verbose=True,
                   allow_modified_residues=False,
                   out=sys.stdout):
    """
  Use real-space refinement tools to fit newly extended residues.
  """
    from mmtbx.refinement.real_space import fit_residue
    from mmtbx.rotamer import rotamer_eval
    import mmtbx.monomer_library.server
    from mmtbx import building
    from scitbx.array_family import flex
    mon_lib_srv = mmtbx.monomer_library.server.server()
    rotamer_manager = rotamer_eval.RotamerEval()
    ppdb_out = box_out = out
    if (not verbose):
        ppdb_out = null_out()
        box_out = null_out()
    make_sub_header("Processing new model", out=ppdb_out)
    processed_pdb = building.reprocess_pdb(
        pdb_hierarchy=pdb_hierarchy,
        crystal_symmetry=fmodel.f_obs().crystal_symmetry(),
        cif_objects=cif_objects,
        out=ppdb_out)
    print("", file=ppdb_out)
    hierarchy = processed_pdb.all_chain_proxies.pdb_hierarchy
    xrs = processed_pdb.xray_structure()
    grm_geometry = processed_pdb.geometry_restraints_manager()
    make_sub_header("Fitting residues", out=out)
    target_map = fmodel.map_coefficients(
        map_type="2mFo-DFc", exclude_free_r_reflections=True).fft_map(
            resolution_factor=0.25).apply_sigma_scaling().real_map_unpadded()
    unit_cell = xrs.unit_cell()
    for chain in hierarchy.only_model().chains():
        if (not chain.is_protein()) and (not allow_modified_residues): continue
        residue_groups = chain.residue_groups()
        for i_rg, residue_group in enumerate(residue_groups):
            prev_res = next_res = None
            atom_groups = residue_group.atom_groups()
            if (len(atom_groups) > 1): continue
            residue = atom_groups[0]
            atoms = residue.atoms()
            atoms.reset_tmp()
            segids = atoms.extract_segid()
            if (segids.all_eq("XXXX")):
                sites_start = atoms.extract_xyz()

                def get_two_fofc_mean(residue):
                    sum = 0
                    n_atoms = 0
                    for atom in residue.atoms():
                        if (not atom.element.strip() in ["H", "D"]):
                            site_frac = unit_cell.fractionalize(
                                site_cart=atom.xyz)
                            sum += target_map.eight_point_interpolation(
                                site_frac)
                            n_atoms += 1
                    assert (n_atoms > 0)
                    return sum / n_atoms

                sites_start = atoms.extract_xyz().deep_copy()
                two_fofc_mean_start = get_two_fofc_mean(residue)
                refit = fit_residue.run_with_minimization(
                    target_map=target_map,
                    residue=residue,
                    xray_structure=xrs,
                    mon_lib_srv=mon_lib_srv,
                    rotamer_manager=rotamer_manager,
                    geometry_restraints_manager=grm_geometry,
                    real_space_gradients_delta=fmodel.f_obs().d_min() * 0.25,
                    rms_bonds_limit=0.01,
                    rms_angles_limit=1.0,
                    backbone_sample_angle=20,
                    allow_modified_residues=allow_modified_residues)
                two_fofc_mean_end = get_two_fofc_mean(residue)
                sites_end = atoms.extract_xyz()
                flag = ""
                if (two_fofc_mean_end > two_fofc_mean_start):
                    flag = " <-- keep"
                    xrs = refit.xray_structure
                else:
                    atoms.set_xyz(sites_start)
                    for atom in atoms:
                        atom.tmp = 1
                print("    residue '%s' : rmsd=%5.3f 2fofc_start=%5.3f 2fofc_end=%5.3f%s" \
                  % (residue.id_str(), sites_end.rms_difference(sites_start),
                    two_fofc_mean_start, two_fofc_mean_end, flag), file=out)
    return hierarchy, xrs
def exercise():
    from mmtbx.building.alternate_conformations import density_sampling
    from mmtbx.utils import fmodel_simple
    from mmtbx.monomer_library import server
    from iotbx import file_reader
    import iotbx.pdb.hierarchy
    generate_inputs()
    fmodel_params = """
    high_resolution = 1.2
    r_free_flags_fraction = 0.1
    add_sigmas = True
    pdb_file = ser_frag.pdb
    output {
      label = F
      type = *real complex
      file_name = ser_frag.mtz
    }
    fmodel.k_sol = 0.3
    fmodel.b_sol = 20
    """
    open("ser_frag_fmodel.eff", "w").write(fmodel_params)
    assert (easy_run.fully_buffered("phenix.fmodel ser_frag_fmodel.eff").
            raise_if_errors().return_code == 0)
    assert os.path.isfile("ser_frag.mtz")
    mtz_in = file_reader.any_file("ser_frag.mtz")
    f_obs = mtz_in.file_server.miller_arrays[0]
    flags = mtz_in.file_server.miller_arrays[1]
    flags = flags.customized_copy(data=(flags.data() == 1))
    mon_lib_srv = server.server()
    pdb_in = iotbx.pdb.hierarchy.input(file_name="ser_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()
    fmodel = fmodel_simple(f_obs=f_obs,
                           xray_structures=[xrs],
                           scattering_table="n_gaussian",
                           r_free_flags=flags,
                           skip_twin_detection=True)
    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)
        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 = density_sampling.screen_residue(
                residue=primary_conf,
                prev_residue=prev_res,
                next_residue=next_res,
                next_next_residue=next_next_res,
                sites_cart=sites_cart,
                fmodel=fmodel,
                mon_lib_srv=mon_lib_srv,
                params=None,
                backrub=True,
                shear=False,
                verbose=True,
                out=out)
            prev_res = primary_conf
            if (confs is None):
                continue
            # TODO tweak density sampling to allow a backrubbed conformer with a
            # chi1 t rotamer for Ser 99
            if (i_res == 1):
                assert ("""  A SER  99     20.0    None       t"""
                        in out.getvalue())
            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())
            confs = density_sampling.screen_residue(
                residue=primary_conf,
                prev_residue=prev_res,
                next_residue=next_res,
                next_next_residue=next_next_res,
                sites_cart=sites_cart,
                fmodel=fmodel,
                mon_lib_srv=mon_lib_srv,
                params=None,
                backrub=False,
                out=out)
            if (i_res == 1):
                print len(confs)
    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("ser_frag_guided_ensemble.pdb",
         "w").write(new_hierarchy.as_pdb_string())
示例#14
0
def refit_residues (
    pdb_hierarchy,
    cif_objects,
    fmodel,
    use_rotamers=True,
    anneal=False,
    verbose=True,
    allow_modified_residues=False,
    out=sys.stdout) :
  """
  Use real-space refinement tools to fit newly extended residues.
  """
  from mmtbx.refinement.real_space import fit_residue
  from mmtbx.rotamer import rotamer_eval
  import mmtbx.monomer_library.server
  from mmtbx import building
  from scitbx.array_family import flex
  mon_lib_srv = mmtbx.monomer_library.server.server()
  rotamer_manager = rotamer_eval.RotamerEval()
  ppdb_out = box_out = out
  if (not verbose) :
    ppdb_out = null_out()
    box_out = null_out()
  make_sub_header("Processing new model", out=ppdb_out)
  processed_pdb = building.reprocess_pdb(
    pdb_hierarchy=pdb_hierarchy,
    crystal_symmetry=fmodel.f_obs().crystal_symmetry(),
    cif_objects=cif_objects,
    out=ppdb_out)
  print >> ppdb_out, ""
  hierarchy = processed_pdb.all_chain_proxies.pdb_hierarchy
  xrs = processed_pdb.xray_structure()
  grm_geometry = processed_pdb.geometry_restraints_manager()
  make_sub_header("Fitting residues", out=out)
  target_map = fmodel.map_coefficients(
    map_type="2mFo-DFc",
    exclude_free_r_reflections=True).fft_map(
      resolution_factor=0.25).apply_sigma_scaling().real_map_unpadded()
  unit_cell = xrs.unit_cell()
  for chain in hierarchy.only_model().chains() :
    if (not chain.is_protein()) and (not allow_modified_residues) : continue
    residue_groups = chain.residue_groups()
    for i_rg, residue_group in enumerate(residue_groups) :
      prev_res = next_res = None
      atom_groups = residue_group.atom_groups()
      if (len(atom_groups) > 1) : continue
      residue = atom_groups[0]
      atoms = residue.atoms()
      atoms.reset_tmp()
      segids = atoms.extract_segid()
      if (segids.all_eq("XXXX")) :
        sites_start = atoms.extract_xyz()
        def get_two_fofc_mean (residue) :
          sum = 0
          n_atoms = 0
          for atom in residue.atoms() :
            if (not atom.element.strip() in ["H","D"]) :
              site_frac = unit_cell.fractionalize(site_cart=atom.xyz)
              sum += target_map.eight_point_interpolation(site_frac)
              n_atoms += 1
          assert (n_atoms > 0)
          return sum / n_atoms
        sites_start = atoms.extract_xyz().deep_copy()
        two_fofc_mean_start = get_two_fofc_mean(residue)
        refit = fit_residue.run_with_minimization(
          target_map=target_map,
          residue=residue,
          xray_structure=xrs,
          mon_lib_srv=mon_lib_srv,
          rotamer_manager=rotamer_manager,
          geometry_restraints_manager=grm_geometry,
          real_space_gradients_delta=fmodel.f_obs().d_min()*0.25,
          rms_bonds_limit=0.01,
          rms_angles_limit=1.0,
          backbone_sample_angle=20,
          allow_modified_residues=allow_modified_residues)
        two_fofc_mean_end = get_two_fofc_mean(residue)
        sites_end = atoms.extract_xyz()
        flag = ""
        if (two_fofc_mean_end > two_fofc_mean_start) :
          flag = " <-- keep"
          xrs = refit.xray_structure
        else :
          atoms.set_xyz(sites_start)
          for atom in atoms :
            atom.tmp = 1
        print >> out, \
          "    residue '%s' : rmsd=%5.3f 2fofc_start=%5.3f 2fofc_end=%5.3f%s" \
          % (residue.id_str(), sites_end.rms_difference(sites_start),
            two_fofc_mean_start, two_fofc_mean_end, flag)
  return hierarchy, xrs
   scattering_table="n_gaussian")
 params = cmdline.params
 working_phil = master_phil.format(python_object=params)
 master_phil.fetch_diff(source=working_phil).show(out=out)
 fmodel = cmdline.fmodel
 hierarchy = cmdline.pdb_hierarchy
 sele_cache = hierarchy.atom_selection_cache()
 assert (params.selection is not None)
 selection = sele_cache.selection(params.selection)
 assert (selection.count(True) > 0)
 have_results = False
 pdb_atoms = hierarchy.atoms()
 sites_cart = pdb_atoms.extract_xyz()
 ensembles = []
 t1 = time.time()
 for chain in hierarchy.only_model().chains() :
   prev_residue = next_residue = None
   residue_groups = chain.residue_groups()
   n_groups = len(residue_groups)
   for i_res, residue_group in enumerate(residue_groups) :
     if (i_res < n_groups - 1) :
       next_residue = residue_groups[i_res+1].atom_groups()[0]
     i_seqs = residue_group.atoms().extract_i_seq()
     if (selection.select(i_seqs).all_eq(True)) :
       atom_group = residue_group.only_atom_group()
       if (get_class(atom_group.resname) != "common_amino_acid") :
         continue
       confs = density_sampling.screen_residue(
         residue=atom_group,
         prev_residue=prev_residue,
         next_residue=next_residue,
示例#16
0
def exercise_synthetic () :
  from mmtbx.regression import tst_build_alt_confs
  pdb_in = iotbx.pdb.hierarchy.input(pdb_string=tst_build_alt_confs.pdb_raw)
  xrs = pdb_in.input.xray_structure_simple()
  fc = abs(xrs.structure_factors(d_min=1.5).f_calc())
  flags = fc.resolution_filter(d_min=1.6).generate_r_free_flags()
  ls = fc.lone_set(other=flags)
  # case 1: no work set in high-res shell
  flags2 = ls.array(data=flex.bool(ls.size(), True))
  flags_all = flags.concatenate(other=flags2)
  mtz_out = fc.as_mtz_dataset(column_root_label="F")
  mtz_out.add_miller_array(flags_all, column_root_label="FreeR_flag")
  mtz_out.mtz_object().write("tst_molprobity_1.mtz")
  open("tst_molprobity_1.pdb", "w").write(tst_build_alt_confs.pdb_raw)
  args = [
    "tst_molprobity_1.pdb",
    "tst_molprobity_1.mtz",
    "--kinemage",
    "--maps",
    "flags.clashscore=False",
    "flags.xtriage=True",
  ]
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  out = StringIO()
  result.show(out=out)
  # case 2: no test set in high-res shell
  flags2 = ls.array(data=flex.bool(ls.size(), False))
  flags_all = flags.concatenate(other=flags2)
  mtz_out = fc.as_mtz_dataset(column_root_label="F")
  mtz_out.add_miller_array(flags_all, column_root_label="FreeR_flag")
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  out = StringIO()
  result.show(out=out)
  # case 3: multi-MODEL structure
  # XXX This is not a very sophisticated test - it only ensures that the
  # program does not crash.  We need a test for expected output...
  hierarchy = pdb_in.hierarchy
  model2 = hierarchy.only_model().detached_copy()
  hierarchy.append_model(model2)
  hierarchy.models()[0].id = "1"
  hierarchy.models()[1].id = "2"
  open("tst_molprobity_multi_model.pdb", "w").write(hierarchy.as_pdb_string())
  args = [
    "tst_molprobity_multi_model.pdb",
    "tst_molprobity_1.mtz",
    "--kinemage",
    "--maps",
  ]
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  out = StringIO()
  result.show(out=out)
  # test rotamer distributions
  open("tst_molprobity_misc1.pdb", "w").write(tst_build_alt_confs.pdb_raw)
  args = [
    "tst_molprobity_1.pdb",
    "rotamer_library=8000",
  ]
  out = StringIO()
  result = molprobity.run(args=args,
    ignore_missing_modules=True,
    out=null_out()).validation
  result.show(outliers_only=False, out=out)
def exercise () :
  from mmtbx.building.alternate_conformations import density_sampling
  from mmtbx.utils import fmodel_simple
  from mmtbx.monomer_library import server
  from iotbx import file_reader
  import iotbx.pdb.hierarchy
  generate_inputs()
  fmodel_params = """
    high_resolution = 1.2
    r_free_flags_fraction = 0.1
    add_sigmas = True
    pdb_file = shear_frag.pdb
    output {
      label = F
      type = *real complex
      file_name = shear_frag.mtz
    }
    fmodel.k_sol = 0.3
    fmodel.b_sol = 20
    """
  open("shear_frag_fmodel.eff", "w").write(fmodel_params)
  assert (easy_run.fully_buffered("phenix.fmodel shear_frag_fmodel.eff"
    ).raise_if_errors().return_code == 0)
  assert os.path.isfile("shear_frag.mtz")
  mtz_in = file_reader.any_file("shear_frag.mtz")
  f_obs = mtz_in.file_server.miller_arrays[0]
  flags = mtz_in.file_server.miller_arrays[1]
  flags = flags.customized_copy(data=(flags.data()==1))
  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()
  fmodel = fmodel_simple(
    f_obs=f_obs,
    xray_structures=[xrs],
    scattering_table="n_gaussian",
    r_free_flags=flags,
    skip_twin_detection=True)
  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 = density_sampling.screen_residue(
        residue=primary_conf,
        prev_residue=prev_res,
        next_residue=next_res,
        next_next_residue=next_next_res,
        sites_cart=sites_cart,
        fmodel=fmodel,
        mon_lib_srv=mon_lib_srv,
        params=None,
        backrub=True,
        shear=True,
        verbose=True,
        out=out)
      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())
def run(args, out=None):
    if (out is None): out = sys.stdout
    from mmtbx.building.alternate_conformations import density_sampling
    import mmtbx.maps.utils
    import mmtbx.utils
    from mmtbx.monomer_library import server
    import iotbx.pdb.hierarchy
    get_class = iotbx.pdb.common_residue_names_get_class
    mon_lib_srv = server.server()
    cmdline = mmtbx.utils.cmdline_load_pdb_and_data(
        args=args,
        master_phil=master_phil,
        process_pdb_file=False,
        scattering_table="n_gaussian")
    params = cmdline.params
    working_phil = master_phil.format(python_object=params)
    master_phil.fetch_diff(source=working_phil).show(out=out)
    fmodel = cmdline.fmodel
    hierarchy = cmdline.pdb_hierarchy
    sele_cache = hierarchy.atom_selection_cache()
    assert (params.selection is not None)
    selection = sele_cache.selection(params.selection)
    assert (selection.count(True) > 0)
    have_results = False
    pdb_atoms = hierarchy.atoms()
    sites_cart = pdb_atoms.extract_xyz()
    ensembles = []
    t1 = time.time()
    for chain in hierarchy.only_model().chains():
        prev_residue = next_residue = None
        residue_groups = chain.residue_groups()
        n_groups = len(residue_groups)
        for i_res, residue_group in enumerate(residue_groups):
            if (i_res < n_groups - 1):
                next_residue = residue_groups[i_res + 1].atom_groups()[0]
            i_seqs = residue_group.atoms().extract_i_seq()
            if (selection.select(i_seqs).all_eq(True)):
                atom_group = residue_group.only_atom_group()
                if (get_class(atom_group.resname) != "common_amino_acid"):
                    continue
                confs = density_sampling.screen_residue(
                    residue=atom_group,
                    prev_residue=prev_residue,
                    next_residue=next_residue,
                    sites_cart=sites_cart,
                    fmodel=fmodel,
                    mon_lib_srv=mon_lib_srv,
                    params=params,
                    map_file_name="map_coeffs.mtz",
                    out=out)
                ensemble = []
                for conf in confs:
                    conf_atoms = conf.set_atom_sites(pdb_atoms)
                    pdb_lines = []
                    for atom in conf_atoms:
                        pdb_lines.append(atom.format_atom_record())
                    ensemble.append("\n".join(pdb_lines))
                ensembles.append(ensemble)
            prev_residue = residue_group.atom_groups()[0]
    if (len(ensembles) == 0):
        raise Sorry("No alternate conformations found.")
    t2 = time.time()
    print("search time: %.1fs" % (t2 - t1), file=out)
    for i_ens, ensemble in enumerate(ensembles):
        ensemble_hierarchy = iotbx.pdb.hierarchy.root()
        for k, model_str in enumerate(ensemble):
            input = iotbx.pdb.hierarchy.input(pdb_string=model_str)
            model = input.hierarchy.only_model().detached_copy()
            model.id = str(k + 1)
            ensemble_hierarchy.append_model(model)
        f = open("ensemble_%d.pdb" % (i_ens + 1), "w")
        f.write(ensemble_hierarchy.as_pdb_string())
        f.close()
        print("wrote ensemble_%d.pdb" % (i_ens + 1))
    if (params.coot):
        easy_run.call(
            "coot --pdb %s --auto map_coeffs.mtz --pdb ensemble.pdb" %
            params.input.pdb.file_name[0])
def run (args, out=None ):
  if (out is None) : out = sys.stdout
  from mmtbx.building.alternate_conformations import density_sampling
  import mmtbx.maps.utils
  import mmtbx.utils
  from mmtbx.monomer_library import server
  import iotbx.pdb.hierarchy
  get_class = iotbx.pdb.common_residue_names_get_class
  mon_lib_srv = server.server()
  cmdline = mmtbx.utils.cmdline_load_pdb_and_data(
    args=args,
    master_phil=master_phil,
    process_pdb_file=False,
    scattering_table="n_gaussian")
  params = cmdline.params
  working_phil = master_phil.format(python_object=params)
  master_phil.fetch_diff(source=working_phil).show(out=out)
  fmodel = cmdline.fmodel
  hierarchy = cmdline.pdb_hierarchy
  sele_cache = hierarchy.atom_selection_cache()
  assert (params.selection is not None)
  selection = sele_cache.selection(params.selection)
  assert (selection.count(True) > 0)
  have_results = False
  pdb_atoms = hierarchy.atoms()
  sites_cart = pdb_atoms.extract_xyz()
  ensembles = []
  t1 = time.time()
  for chain in hierarchy.only_model().chains() :
    prev_residue = next_residue = None
    residue_groups = chain.residue_groups()
    n_groups = len(residue_groups)
    for i_res, residue_group in enumerate(residue_groups) :
      if (i_res < n_groups - 1) :
        next_residue = residue_groups[i_res+1].atom_groups()[0]
      i_seqs = residue_group.atoms().extract_i_seq()
      if (selection.select(i_seqs).all_eq(True)) :
        atom_group = residue_group.only_atom_group()
        if (get_class(atom_group.resname) != "common_amino_acid") :
          continue
        confs = density_sampling.screen_residue(
          residue=atom_group,
          prev_residue=prev_residue,
          next_residue=next_residue,
          sites_cart=sites_cart,
          fmodel=fmodel,
          mon_lib_srv=mon_lib_srv,
          params=params,
          map_file_name="map_coeffs.mtz",
          out=out)
        ensemble = []
        for conf in confs :
          conf_atoms = conf.set_atom_sites(pdb_atoms)
          pdb_lines = []
          for atom in conf_atoms :
            pdb_lines.append(atom.format_atom_record())
          ensemble.append("\n".join(pdb_lines))
        ensembles.append(ensemble)
      prev_residue = residue_group.atom_groups()[0]
  if (len(ensembles) == 0) :
    raise Sorry("No alternate conformations found.")
  t2 = time.time()
  print >> out, "search time: %.1fs" % (t2-t1)
  for i_ens, ensemble in enumerate(ensembles) :
    ensemble_hierarchy = iotbx.pdb.hierarchy.root()
    for k, model_str in enumerate(ensemble) :
      input = iotbx.pdb.hierarchy.input(pdb_string=model_str)
      model = input.hierarchy.only_model().detached_copy()
      model.id = str(k+1)
      ensemble_hierarchy.append_model(model)
    f = open("ensemble_%d.pdb" % (i_ens+1), "w")
    f.write(ensemble_hierarchy.as_pdb_string())
    f.close()
    print "wrote ensemble_%d.pdb" % (i_ens+1)
  if (params.coot) :
    easy_run.call("coot --pdb %s --auto map_coeffs.mtz --pdb ensemble.pdb" %
      params.input.pdb.file_name[0])