Source code for haddock.gear.haddockmodel

"""Represent an Haddock model."""


from haddock.core.typing import FilePath


[docs]class HaddockModel: """Represent HADDOCK model.""" def __init__(self, pdb_f: FilePath) -> None: self.energies = self._load_energies(pdb_f) @staticmethod def _load_energies(pdb_f: FilePath) -> dict[str, float]: energy_dic: dict[str, float] = {} with open(pdb_f) as fh: for line in fh.readlines(): if line.startswith('REMARK'): # TODO: use regex to do this if 'energies' in line: energy_values = map( float, line.rstrip().split(':')[-1].split(',') ) total, bonds, angles, improper, dihe, vdw, elec, air, cdih, coup, rdcs, vean, dani, xpcs, rg = energy_values # noqa: E501 energy_dic['total'] = total energy_dic['bonds'] = bonds energy_dic['angles'] = angles energy_dic['improper'] = improper energy_dic['dihe'] = dihe energy_dic['vdw'] = vdw energy_dic['elec'] = elec energy_dic['air'] = air energy_dic['cdih'] = cdih energy_dic['coup'] = coup energy_dic['rdcs'] = rdcs energy_dic['vean'] = vean energy_dic['dani'] = dani energy_dic['xpcs'] = xpcs energy_dic['rg'] = rg if 'buried surface area' in line: bsa = float(line.rstrip().split(':')[-1]) energy_dic['bsa'] = bsa if 'Desolvation energy' in line: desolv = float(line.rstrip().split(':')[-1]) energy_dic['desolv'] = desolv if 'Symmetry energy' in line: sym = float(line.rstrip().split(':')[-1]) energy_dic['sym'] = sym return energy_dic
[docs] def calc_haddock_score(self, **weights: float) -> float: """Calculate the haddock score based on the weights and energies.""" weighted_terms: list[float] = [] for key, weight in weights.items(): component_id = key.split('_')[1] value = self.energies[component_id] weighted_terms.append(value * weight) # the haddock score is simply the sum of the weighted terms haddock_score = sum(weighted_terms) return haddock_score