Source code for mordred.AcidBase

"""Acid Base descriptor.

References:
    * http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/qsar/descriptors/molecular/AcidicGroupCountDescriptor.html
    * http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/qsar/descriptors/molecular/BasicGroupCountDescriptor.html

"""  # noqa: E501

from abc import abstractproperty

from rdkit import Chem

from ._base import Descriptor

__all__ = ("AcidicGroupCount", "BasicGroupCount",)


class SmartsCountBase(Descriptor):
    __slots__ = "_mol",

    @classmethod
    def preset(cls):
        yield cls()

    def _create_smarts(self):
        s = ",".join("$(" + s + ")" for s in self.SMARTS)
        self._mol = Chem.MolFromSmarts("[" + s + "]")
        return self._mol

    @abstractproperty
    def SMARTS(self):
        pass

    def __str__(self):
        return self._name

    def parameters(self):
        return ()

    def calculate(self):
        pat = getattr(self, "_mol", None) or self._create_smarts()
        return len(self.mol.GetSubstructMatches(pat))

    rtype = int

    _extra_docs = "SMARTS",


[docs]class AcidicGroupCount(SmartsCountBase): r"""acidic group count descriptor.""" __slots__ = ()
[docs] def description(self): return "acidic group count"
_name = "nAcid" SMARTS = ( "[O;H1]-[C,S,P]=O", "[*;-;!$(*~[*;+])]", "[NH](S(=O)=O)C(F)(F)F", "n1nnnc1", )
[docs]class BasicGroupCount(SmartsCountBase): r"""basic group count descriptor.""" __slots__ = ()
[docs] def description(self): return "basic group count"
_name = "nBase" SMARTS = ( "[NH2]-[CX4]", "[NH](-[CX4])-[CX4]", "N(-[CX4])(-[CX4])-[CX4]", "[*;+;!$(*~[*;-])]", "N=C-N", "N-C=N", )