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 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
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