Source code for mordred.KappaShapeIndex

from __future__ import division

from .Chi import ChiCache
from ._base import Descriptor

__all__ = ("KappaShapeIndex1", "KappaShapeIndex2", "KappaShapeIndex3",)


class KappaShapeIndexBase(Descriptor):
    explicit_hydrogens = False

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

    def __str__(self):
        return "Kier{}".format(self._order)

    def parameters(self):
        return ()

    def __init__(self):
        self._order = int(self.__class__.__name__[-1])

    def dependencies(self):
        return {"Chi": ChiCache(self._order)}

    def _common(self, Chi):
        P = len(Chi.path)

        A = self.mol.GetNumAtoms()
        Pmin = A - self._order

        return P, A, Pmin

    rtype = float


[docs]class KappaShapeIndex1(KappaShapeIndexBase): r"""Kappa shape index 1 descriptor. :returns: NaN when :math:`N_{\rm Chi-path} = 0` """ __slots__ = ()
[docs] def description(self): return "kappa shape index 1"
def calculate(self, Chi): P, A, Pmin = self._common(Chi) Pmax = 0.5 * A * (A - 1) with self.rethrow_zerodiv(): return 2 * Pmax * Pmin / (P * P)
[docs]class KappaShapeIndex2(KappaShapeIndexBase): r"""Kappa shape index 2 descriptor. :returns: NaN when :math:`N_{\rm Chi-path} = 0` """ __slots__ = ()
[docs] def description(self): return "kappa shape index 2"
def calculate(self, Chi): P, A, Pmin = self._common(Chi) Pmax = 0.5 * (A - 1) * (A - 2) with self.rethrow_zerodiv(): return 2 * Pmax * Pmin / (P * P)
[docs]class KappaShapeIndex3(KappaShapeIndexBase): r"""Kappa shape index 3 descriptor. :returns: NaN when :math:`N_{\rm Chi-path} = 0` """ __slots__ = ()
[docs] def description(self): return "kappa shape index 3"
def calculate(self, Chi): P, A, Pmin = self._common(Chi) if A % 2 == 0: Pmax = 0.25 * (A - 2) ** 2 else: Pmax = 0.25 * (A - 1) * (A - 3) with self.rethrow_zerodiv(): return 4 * Pmax * Pmin / (P * P)