Source code for haddock.modules.analysis.ilrmsdmatrix.ilrmsd
"""ilRMSD calculations."""
import os
from pathlib import Path
import numpy as np
from haddock import log
from haddock.core.typing import NDFloat, Any
from haddock.libs.libalign import (
get_atoms,
)
from haddock.libs.libontology import PDBFile
from haddock.modules.analysis.caprieval.capri import load_contacts
[docs]
class ContactJob:
"""A Job dedicated to the fast retrieval of receptor contacts."""
def __init__(
self,
output,
params,
contact_obj):
log.info(f"core {contact_obj.core}, initialising Contact...")
self.params = params
self.output = output
self.contact_obj = contact_obj
log.info(f"core {contact_obj.core}, Contact initialised")
[docs]
def run(self):
"""Run this ContactJob."""
log.info(f"core {self.contact_obj.core}, running Contact...")
self.contact_obj.run()
self.contact_obj.output()
return
[docs]
class Contact:
"""Contact class."""
def __init__(
self,
model_list: list[PDBFile],
output_name: str,
core: int,
path: Path,
contact_distance_cutoff: float = 5.0,
**params: dict[str, Any],
):
"""Initialise Contact class."""
self.model_list = model_list
self.output_name = output_name
self.core = core
self.path = path
self.contact_distance_cutoff = contact_distance_cutoff
self.atoms = {}
self.receptor_chain = params["params"]["receptor_chain"]
self.ligand_chains = params["params"]["ligand_chains"]
self.unique_rec_res: NDFloat = []
self.unique_lig_res: NDFloat = []
for m in model_list:
self.atoms.update(get_atoms(m))
[docs]
def run(self):
"""Run contact calculations."""
nmodels = len(self.model_list)
# create empty set of receptor interface residues
receptor_interface_residues = []
ligand_interface_residues = []
for n in range(nmodels):
contacts = load_contacts(
self.model_list[n],
cutoff=self.contact_distance_cutoff,
)
rec_resids = [
con[1] if con[0] == self.receptor_chain
else con[3] for con in contacts
]
lig_resids = [
con[1] if con[0] in self.ligand_chains
else con[3] for con in contacts
]
if rec_resids != []:
receptor_interface_residues.append(np.unique(rec_resids))
if lig_resids != []:
ligand_interface_residues.append(np.unique(lig_resids))
# concatenate all the receptor residues
if receptor_interface_residues != []:
rec_np_arr = np.concatenate(receptor_interface_residues)
self.unique_rec_res = np.unique(rec_np_arr)
# now the ligand residues
if ligand_interface_residues != []:
lig_np_arr = np.concatenate(ligand_interface_residues)
self.unique_lig_res = np.unique(lig_np_arr)
[docs]
def output(self):
"""Write down unique contacts to file."""
output_fname = Path(self.path, self.output_name)
with open(output_fname, "w") as out_fh:
# first the receptor
out_fh.write(f"{self.receptor_chain} ")
out_fh.write(" ".join([str(res) for res in self.unique_rec_res]))
out_fh.write(f"{os.linesep}")
# now the ligand
for chain in self.ligand_chains:
out_fh.write(f"{chain} ")
res_str = " ".join([str(res) for res in self.unique_lig_res])
out_fh.write(res_str)
out_fh.write(f"{os.linesep}")