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)