Source code for shepherd_score.extract_profiles
"""
Convenience module to hold functions used to extract interaction profiles.
"""
# noqa: F401
import numpy as np
import open3d
from rdkit import Chem
from shepherd_score.score.constants import COULOMB_SCALING
from shepherd_score.generate_point_cloud import get_molecular_surface, get_atomic_vdw_radii
from shepherd_score.pharm_utils.pharmacophore import get_pharmacophores, get_pharmacophores_dict
from shepherd_score.evaluations.utils.convert_data import get_mol_from_atom_pos, get_xyz_content
[docs]
def get_electrostatic_potential(mol: Chem.Mol,
partial_charges: np.ndarray,
surf_pos: np.ndarray
) -> np.ndarray:
"""
Get the electrostatic potential (ESP) at each surface point.
Arguments
---------
mol : rdkit.Chem.Mol object with a conformer
partial_charges : np.ndarray (N,) atom-mapped to the `mol` object
surf_pos : np.ndarray (M,3) sampled surface positions
Returns
-------
np.ndarray (M,) electrostatic potential at each surface point
"""
centers = mol.GetConformer().GetPositions()
distances = np.linalg.norm(surf_pos[:, np.newaxis] - centers, axis=2)
# Calculate the potentials
E_pot = np.dot(partial_charges, 1 / distances.T) * COULOMB_SCALING
# Ensure that invalid distances (where distance is 0) are handled
E_pot[np.isinf(E_pot)] = 0
return E_pot.astype(np.float32)