コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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)