Source code for openff.nagl.domains

import typing

from openff.nagl._base.base import ImmutableModel

try:
    from pydantic.v1 import Field
except ImportError:
    from pydantic import Field

if typing.TYPE_CHECKING:
    from openff.toolkit.topology import Molecule

[docs]class ChemicalDomain(ImmutableModel): """A domain of chemical space to which a molecule can belong Used for determining if a molecule is represented in the training data for a given model. """ allowed_elements: typing.Tuple[int, ...] = Field( description="The atomic numbers of the elements allowed in the domain", default_factory=tuple ) forbidden_patterns: typing.Tuple[str, ...] = Field( description="The SMARTS patterns which are forbidden in the domain", default_factory=tuple )
[docs] def check_molecule( self, molecule: "Molecule", return_error_message: bool = False ) -> typing.Union[bool, typing.Tuple[bool, str]]: checks = [ self.check_allowed_elements, self.check_forbidden_patterns ] for check in checks: is_allowed, err = check(molecule, return_error_message=True) if not is_allowed: if return_error_message: return False, err return False if return_error_message: return True, "" return True
[docs] def check_allowed_elements( self, molecule: "Molecule", return_error_message: bool = False ) -> typing.Union[bool, typing.Tuple[bool, str]]: if not self.allowed_elements: return True atomic_numbers = [atom.atomic_number for atom in molecule.atoms] for atomic_number in atomic_numbers: if atomic_number not in self.allowed_elements: if return_error_message: err = f"Molecule contains forbidden element {atomic_number}" return False, err return False if return_error_message: return True, "" return True
[docs] def check_forbidden_patterns( self, molecule: "Molecule", return_error_message: bool = False ) -> typing.Union[bool, typing.Tuple[bool, str]]: for pattern in self.forbidden_patterns: if molecule.chemical_environment_matches(pattern): err = f"Molecule contains forbidden SMARTS pattern {pattern}" if return_error_message: return False, err return False if return_error_message: return True, "" return True