Source code for stko._internal.calculators.shape_calculators

import logging
from collections import abc

import stk
from rdkit.Chem import Descriptors3D as D3D  # noqa: N814

from stko._internal.calculators.results.shape_results import ShapeResults

logger = logging.getLogger(__name__)


[docs] class ShapeCalculator: """Calculates shape measures of a molecule. Uses :mod:`rdkit` 3D Descriptors [#]_ module to calculate all measures. Examples: .. testcode:: shape-rdkit import stk import stko bb1 = stk.BuildingBlock('C1CCCCC1') shape_calc = stko.ShapeCalculator() shape_results = shape_calc.get_results(bb1) eccentricity = shape_results.get_eccentricity() .. testcode:: shape-rdkit :hide: assert eccentricity == 0.8147863429806671 assert shape_results.get_asphericity() == 0.14435990108591792 References: .. [#] https://www.rdkit.org/docs/source/rdkit.Chem.Descriptors3D.html """
[docs] def calculate(self, mol: stk.Molecule) -> abc.Iterable[dict]: rdkit_mol = mol.to_rdkit_mol() results_dict = { "pmi1": D3D.PMI1(rdkit_mol), "pmi2": D3D.PMI2(rdkit_mol), "pmi3": D3D.PMI3(rdkit_mol), "npr1": D3D.NPR1(rdkit_mol), "npr2": D3D.NPR2(rdkit_mol), "asphericity": D3D.Asphericity(rdkit_mol), "eccentricity": D3D.Eccentricity(rdkit_mol), "inertialshapefactor": D3D.InertialShapeFactor(rdkit_mol), "radiusofgyration": D3D.RadiusOfGyration(rdkit_mol), "spherocityindex": D3D.SpherocityIndex(rdkit_mol), } yield results_dict
[docs] def get_results(self, mol: stk.Molecule) -> ShapeResults: """Calculate the shape measures of `mol`. Parameters: mol: The :class:`stk.Molecule` whose energy is to be calculated. Returns: The shape measures of the molecule. """ return ShapeResults(self.calculate(mol))