def fixPdb2pqrPDB(filename_modified, filename_original, filename_output=None): """ Used to regenerate some data lost by PDB2PQR. Parameters ---------- filename_modified : str Name of the modified PDB file. filename_original : str Name of the original PDB file. filename_output : str Name of the fixed output PDB file. Returns ------- filename_output : str The absolute path to the fixed output PDB file. """ pdb_original = _PDB(filename_original) pqr_modified = _PDB(filename_modified) for res_orig in pdb_original.filter("type=='amino_acid'"): filter = "chainID=='{}'&resSeq=={}&iCode=='{}'".format( res_orig.chainID, res_orig.resSeq, res_orig.iCode) res_mod = pqr_modified.filter(filter)[0] res_orig.clear() res_orig.__init__(res_mod) for atom in res_orig: for attr in ["occupancy", "tempFactor", "element", "charge"]: setattr(atom, attr, "") pdb_original.missing_atoms = [] for bond in pdb_original.disulfide_bonds: for res in bond: if res.resName != "CYX": _warnings.warn( "Disulfide bond found at a residue not labelled " "as CYX ({} {}{}{}). Please check your " "structure. Correcting residue to CYX...".format( res.resName, res.chainID, res.resSeq, res.iCode)) res.resName = "CYX" pdb_original.reNumberAtoms() if filename_output is None: filename_output = _os.path.splitext(pdb_original.filename)[0] + \ "_modified.pdb" return pdb_original.writePDB(filename_output)
def charmmguiTransform(filename, **kwargs): """ Adds missing residues to a PDB file. Parameters ---------- filename : str Name of the input PDB file. kwargs Keyword arguments to be passed to PDBReader. Returns ------- filename_output : str Absolute path to the modified file. """ tgz = _tarfile.open(PDBReader(filename, **kwargs), "r:gz") paths = [] for member in tgz: if "model.pdb" in member.name.split("/")[-1]: f = tgz.extractfile(member) with open(member.name.split("/")[-1], "wb") as file: file.write(f.read()) paths += [_os.path.abspath(member.name.split("/")[-1])] tgz.close() paths = sorted(paths) pdb_obj = _PDB(paths[0]) chainID = paths[0].split("pro")[-1][0].upper() for chain in pdb_obj: chain.chainID = chainID for path in paths[1:]: pdb_add = _PDB(path) chainID = paths[0].split("pro")[-1][0].upper() for chain in pdb_add: chain.chainID = chainID pdb_obj += pdb_add filename_output = _os.path.splitext(filename)[0] + "_charmmgui.pdb" return fixCharmmguiPDB(pdb_obj, filename, filename_output=filename_output)
def fixCharmmguiPDB(pdb_modified, filename_original, filename_output=None): """ Used to regenerate some data lost by CHARMM-GUI. Parameters ---------- pdb_modified : ProtoCaller.IO.PDB.PDB PDB object containing all fixed residues created by CHARMM-GUI. filename_original : str Name of the original PDB file. filename_output : str Name of the fixed output PDB file. Returns ------- filename_output : str The absolute path to the fixed output PDB file. """ pdb_original = _PDB(filename_original) for miss_res in pdb_original.missing_residues: filter = "chainID=='{}'&resSeq=={}&iCode=='{}'".format( miss_res.chainID, miss_res.resSeq, miss_res.iCode) fixed_res = _copy.copy(pdb_modified.filter(filter)[0]) fixed_res.chainID = miss_res.chainID fixed_res.resSeq = miss_res.resSeq if fixed_res.resName != miss_res.resName: _warnings.warn("Mismatch between original residue name ({}) " "and the residue name output by CHARMM-GUI ({}) in " "chain {}, residue number {}.".format( miss_res.resName, fixed_res.resName, miss_res.chainID, miss_res.resSeq)) chain = pdb_original.filter("chainID=='{}'".format(miss_res.chainID), type="chains")[0] if miss_res > chain[-1]: chain.append(fixed_res) else: for i, res in enumerate(chain): if res > miss_res: chain.insert(i, fixed_res) break pdb_original.missing_residues = [] pdb_original.reNumberAtoms() pdb_original.reNumberResidues() if filename_output is None: filename_output = _os.path.splitext(pdb_original.filename)[0] + \ "_modified.pdb" return pdb_original.writePDB(filename_output)
def fixPDBFixerPDB(filename_modified, filename_original, replace_nonstandard_residues, add_missing_residues, add_missing_atoms, filename_output=None): """ Used to regenerate some data lost by PDBFixer. Parameters ---------- filename_modified : str Name of the modified PDB file. filename_original : str Name of the original PDB file. replace_nonstandard_residues : bool Whether to replace nonstandard residues with their standard equivalents. add_missing_residues : bool Whether to add missing residues. add_missing_atoms : bool Whether to add missing atoms. filename_output : str Name of the fixed output PDB file. Returns ------- filename_output : str The absolute path to the fixed output PDB file. """ pdb_original = _PDB(filename_original) pdb_modified = _PDB(filename_modified) all_res_mod = pdb_modified.totalResidueList() if add_missing_residues: all_res_orig = pdb_original.totalResidueList() else: if replace_nonstandard_residues: all_res_orig = pdb_original.filter("type in ['amino_acid', " "'amino_acid_modified']") else: all_res_orig = pdb_original.filter("type=='amino_acid'") _PDB.sortResidueList(all_res_orig) if len(all_res_orig) != len(all_res_mod): raise ValueError( "Mismatch between original number of residues ({}) " "and number of residues output by PDBFixer ({}).".format( len(all_res_orig), len(all_res_mod))) if replace_nonstandard_residues: for mod_res in pdb_original.modified_residues: fixed_res = all_res_mod[all_res_orig.index(mod_res)] fixed_res.chainID = mod_res.chainID fixed_res.resSeq = mod_res.resSeq fixed_res.iCode = mod_res.iCode mod_res.clear() mod_res.__init__(fixed_res) pdb_original.modified_residues = [] if add_missing_residues: for miss_res in pdb_original.missing_residues: fixed_res = _copy.copy(all_res_mod[all_res_orig.index(miss_res)]) fixed_res.chainID = miss_res.chainID fixed_res.resSeq = miss_res.resSeq if fixed_res.resName != miss_res.resName: _warnings.warn("Mismatch between original residue name ({}) " "and the residue name output by PDBFixer ({}) " "in chain {}, residue number {}.".format( miss_res.resName, fixed_res.resName, miss_res.chainID, miss_res.resSeq)) chain = pdb_original.filter("chainID=='{}'".format( miss_res.chainID), type="chains")[0] if miss_res > chain[-1]: chain.append(fixed_res) else: for i, res in enumerate(chain): if res > miss_res: chain.insert(i, fixed_res) break pdb_original.missing_residues = [] if add_missing_atoms: for missing_atom in pdb_original.missing_atoms: filter = "chainID=='{}'&resSeq=={}&iCode=='{}'".format( missing_atom.chainID, missing_atom.resSeq, missing_atom.iCode) res = pdb_original.filter(filter)[0] fixed_res = all_res_mod[all_res_orig.index(res)] fixed_res.chainID = missing_atom.chainID fixed_res.resSeq = missing_atom.resSeq res.__init__(fixed_res) pdb_original.missing_atoms = [] pdb_original.reNumberAtoms() if add_missing_residues: pdb_original.reNumberResidues() if filename_output is None: filename_output = _os.path.splitext(pdb_original.filename)[0] + \ "_modified.pdb" return pdb_original.writePDB(filename_output)