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