Source code for rdkit_utilities.rdMolAlign

import itertools
from typing import Optional, List

from rdkit import Chem as rdChem
import numpy as np


[docs]def GetBestConformerRMS( mol: rdChem.Mol, heavyAtomsOnly: bool = False, confIds: Optional[List[int]] = None ) -> np.ndarray: """Get square array of conformer-to-conformer symmetric RMS Parameters ---------- mol: rdkit.Chem.Mol Molecule of interest heavyAtomsOnly: bool If True, all hydrogens are removed before calculating RMS. This is done on a copy to avoid changing the molecule confIds: Optional[List[int]] If given, the RMS calculation is limited to these conformer IDs. If not, all conformers are used. Returns ------- rms: numpy.ndarray Square array of RMS from each conformer to each other. This is ordered by the input `confIds` if given, or by the order of the conformers on the molecule if `confIds=None`. """ from rdkit.Chem import rdMolAlign if confIds is None: confIds = [c.GetId() for c in mol.GetConformers()] n_conformers = len(confIds) if heavyAtomsOnly: mol = rdChem.RemoveAllHs(mol, sanitize=False) rdChem.SanitizeMol( mol, rdChem.SANITIZE_ALL ^ rdChem.SANITIZE_SETAROMATICITY ^ rdChem.SANITIZE_SETCONJUGATION ^ rdChem.SANITIZE_SETHYBRIDIZATION ^ rdChem.SANITIZE_ADJUSTHS, ) rms = np.zeros((n_conformers, n_conformers)) for i, j in itertools.combinations(np.arange(n_conformers), 2): rmsd = rdMolAlign.GetBestRMS(mol, mol, confIds[i], confIds[j]) rms[i, j] = rms[j, i] = rmsd return rms