IgFold / model /utils /abnumber_.py
wuxing0105's picture
Upload folder using huggingface_hub
1fdc49a verified
Raw
History Blame Contribute Delete
2.33 kB
import warnings
from abnumber import Chain
from Bio.PDB import PDBParser, PDBIO
from Bio.SeqUtils import seq1
from igfold.utils.pdb import clean_pdb
def is_heavy(seq):
chain = Chain(seq, scheme='chothia')
return chain.is_heavy_chain()
def rechain_pdb(pdb_file):
parser = PDBParser()
with warnings.catch_warnings(record=True):
structure = parser.get_structure("_", pdb_file)
for chain in structure.get_chains():
seq = seq1(''.join([residue.resname for residue in chain]))
abnum_chain = Chain(seq, scheme='chothia')
chain_id = "H" if abnum_chain.is_heavy_chain() else "L"
try:
chain.id = chain_id
except ValueError:
chain.id = chain_id + "_"
for chain in structure.get_chains():
if "_" in chain.id:
chain.id = chain.id.replace("_", "")
io = PDBIO()
io.set_structure(structure)
io.save(pdb_file)
def renumber_pdb(
in_pdb_file,
out_pdb_file=None,
scheme="chothia",
):
"""
Renumber the pdb file.
"""
if out_pdb_file is None:
out_pdb_file = in_pdb_file
clean_pdb(in_pdb_file)
parser = PDBParser()
with warnings.catch_warnings(record=True):
structure = parser.get_structure(
"_",
in_pdb_file,
)
for chain in structure.get_chains():
seq = seq1(''.join([residue.resname for residue in chain]))
abnum_chain = Chain(seq, scheme=scheme)
numbering = abnum_chain.positions.items()
chain_res = list(chain.get_residues())
assert len(chain_res) == len(numbering)
for pdb_r, (pos, aa) in zip(chain_res, numbering):
if aa != seq1(pdb_r.get_resname()):
raise Exception(f"Failed to renumber PDB file {in_pdb_file}")
pos = str(pos)[1:]
if not pos[-1].isnumeric():
ins = pos[-1]
pos = int(pos[:-1])
else:
pos = int(pos)
ins = ' '
pdb_r._id = (' ', pos, ins)
io = PDBIO()
io.set_structure(structure)
io.save(out_pdb_file)
def truncate_seq(seq, scheme="chothia"):
abnum_chain = Chain(seq, scheme=scheme)
numbering = abnum_chain.positions.items()
seq = "".join([r[1] for r in list(numbering)])
return seq