Source code for mordred.GravitationalIndex
import numpy as np
from ._base import Descriptor
from ._util import atoms_to_numpy
from ._graph_matrix import AdjacencyMatrix, DistanceMatrix3D
__all__ = ("GravitationalIndex",)
[docs]class GravitationalIndex(Descriptor):
__slots__ = "_heavy", "_pair"
[docs] def description(self):
return "{}{}gravitational index".format(
"heavy atom " if self._heavy else "",
"pair " if self._pair else "",
)
@classmethod
def preset(cls):
return (
cls(h, p)
for p in [False, True]
for h in [True, False]
)
require_3D = True
@property
def explicit_hydrogens(self):
return not self._heavy
def __str__(self):
return "GRAV{}{}".format(
"" if self._heavy else "H",
"p" if self._pair else "",
)
def parameters(self):
return self._heavy, self._pair
def __init__(self, heavy=True, pair=False):
self._heavy = heavy
self._pair = pair
def dependencies(self):
d = {"D": DistanceMatrix3D(self.explicit_hydrogens)}
if self._pair:
d["A"] = AdjacencyMatrix(self.explicit_hydrogens)
return d
def calculate(self, D, A=1.0):
w = atoms_to_numpy(lambda a: a.GetMass(), self.mol)
w = w[:, np.newaxis] * w
np.fill_diagonal(w, 0)
D = D.copy()
np.fill_diagonal(D, 1)
with self.rethrow_zerodiv():
return 0.5 * np.sum(w * A / D ** 2)
rtype = float