Source code for icolos.core.workflow_steps.calculation.feature_counter

from rdkit.Chem import Mol
from rdkit.Chem.rdMolDescriptors import CalcNumRings, CalcNumAromaticRings
from pydantic import BaseModel

from icolos.utils.enums.program_parameters import FeatureCounterEnum
from icolos.utils.enums.step_enums import StepFeatureCounterEnum
from icolos.core.workflow_steps.step import _LE
from icolos.core.workflow_steps.calculation.base import StepCalculationBase

_FC = FeatureCounterEnum()
_SFC = StepFeatureCounterEnum()


[docs]class StepFeatureCounter(StepCalculationBase, BaseModel): def __init__(self, **data): super().__init__(**data) # extend parameters with defaults if _SFC.LEVEL not in self.settings.additional.keys(): self.settings.additional[_SFC.LEVEL] = _SFC.LEVEL_CONFORMER self._logger.log( f'No operational level for feature counting specified, defaulting to "{_SFC.LEVEL_CONFORMER}".', _LE.INFO, ) def _count_rings(self, mol: Mol): number_rings = CalcNumRings(mol) mol.SetProp(_FC.PROPERTY_NUM_RINGS, str(number_rings)) def _count_aromatic_rings(self, mol: Mol): number_rings = CalcNumAromaticRings(mol) mol.SetProp(_FC.PROPERTY_NUM_AROMATIC_RINGS, str(number_rings)) def _get_feature_method(self, feature: str): if feature == _FC.PROPERTY_NUM_RINGS: return self._count_rings elif feature == _FC.PROPERTY_NUM_AROMATIC_RINGS: return self._count_aromatic_rings else: raise ValueError(f'Feature "{feature}" not yet supported.')
[docs] def execute(self): feature = self.settings.additional[_SFC.FEATURE].lower() feature_method = self._get_feature_method(feature=feature) level = self.settings.additional[_SFC.LEVEL] mol_count = 0 for compound in self.get_compounds(): for enumeration in compound.get_enumerations(): if level == _SFC.LEVEL_ENUMERATION: mol = enumeration.get_molecule() if mol is not None: feature_method(mol) mol_count = mol_count + 1 elif level == _SFC.LEVEL_CONFORMER: for conformer in enumeration.get_conformers(): mol = conformer.get_molecule() if mol is not None: feature_method(mol) mol_count = mol_count + 1 else: raise ValueError(f'Level "{level}" not supported.') self._logger.log( f'Counted feature "{feature}" for {mol_count} molecules.', _LE.INFO )