Source code for molecular_simulations.build
import contextlib
from pathlib import Path
from .build_amber import ExplicitSolvent, ImplicitSolvent
from .build_interface import InterfaceBuilder
with contextlib.suppress(ImportError):
from .build_ligand import ComplexBuilder, LigandBuilder, PLINDERBuilder
PathLike = Path | str
[docs]
def convert_cif_with_biopython(cif: PathLike) -> PathLike:
"""
Helper function to convert a cif file to a pdb file using biopython.
"""
from Bio.PDB import PDBIO, MMCIFParser # ty: ignore[unresolved-import]
if not isinstance(cif, Path):
cif = Path(cif)
pdb = cif.with_suffix('.pdb')
parser = MMCIFParser()
structure = parser.get_structure('protein', str(cif))
io = PDBIO()
io.set_structure(structure)
io.save(str(pdb))
return pdb
[docs]
def convert_cif_with_gemmi(cif: PathLike) -> PathLike:
import gemmi # ty: ignore[unresolved-import]
if not isinstance(cif, Path):
cif = Path(cif)
structure = gemmi.read_structure(str(cif))
structure.write_pdb(str(cif.with_suffix('.pdb')))
return cif.with_suffix('.pdb')
[docs]
def add_chains(pdb: PathLike, first_res: int = 1, last_res: int = -1) -> PathLike:
"""
Helper function to add chain IDs to a model.
"""
import MDAnalysis as mda
u = mda.Universe(pdb)
u.add_TopologyAttr('chainID')
if last_res == -1:
assert u.residues is not None
last_res = u.residues.n_residues
chain_A = u.select_atoms(f'resid {first_res} to {last_res}')
chain_A.atoms.chainIDs = 'A'
if last_res != -1:
assert u.residues is not None
final_res = u.residues.n_residues
chain_B = u.select_atoms(f'resid {last_res} to {final_res}')
chain_B.atoms.chainIDs = 'B'
output_path = Path(pdb).parent / (Path(pdb).stem + '_withchains.pdb')
with mda.Writer(output_path) as W:
W.write(u.atoms)
return output_path