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