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())
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"
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())
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
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
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
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 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()
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())
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,
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])