DiffDock / spyrmsd /graph.py
Dvincis's picture
解决合并冲突,同步远程变更
ce9690f
try:
from spyrmsd.graphs.gt import (
cycle,
graph_from_adjacency_matrix,
lattice,
match_graphs,
num_edges,
num_vertices,
vertex_property,
)
except ImportError:
try:
from spyrmsd.graphs.nx import (
cycle,
graph_from_adjacency_matrix,
lattice,
match_graphs,
num_edges,
num_vertices,
vertex_property,
)
except ImportError:
raise ImportError("graph_tool or NetworkX libraries not found.")
__all__ = [
"graph_from_adjacency_matrix",
"match_graphs",
"vertex_property",
"num_vertices",
"num_edges",
"lattice",
"cycle",
"adjacency_matrix_from_atomic_coordinates",
]
import numpy as np
from spyrmsd import constants
def adjacency_matrix_from_atomic_coordinates(
aprops: np.ndarray, coordinates: np.ndarray
) -> np.ndarray:
"""
Compute adjacency matrix from atomic coordinates.
Parameters
----------
aprops: numpy.ndarray
Atomic properties
coordinates: numpy.ndarray
Atomic coordinates
Returns
-------
numpy.ndarray
Adjacency matrix
Notes
-----
This function is based on an automatic bond perception algorithm: two
atoms are considered to be bonded when their distance is smaller than
the sum of their covalent radii plus a tolerance value. [3]_
.. warning::
The automatic bond perceptron rule implemented in this functions
is very simple and only depends on atomic coordinates. Use
with care!
.. [3] E. C. Meng and R. A. Lewis, *Determination of molecular topology and atomic
hybridization states from heavy atom coordinates*, J. Comp. Chem. **12**, 891-898
(1991).
"""
n = len(aprops)
assert coordinates.shape == (n, 3)
A = np.zeros((n, n))
for i in range(n):
r_i = constants.anum_to_covalentradius[aprops[i]]
for j in range(i + 1, n):
r_j = constants.anum_to_covalentradius[aprops[j]]
distance = np.sqrt(np.sum((coordinates[i] - coordinates[j]) ** 2))
if distance < (r_i + r_j + constants.connectivity_tolerance):
A[i, j] = A[j, i] = 1
return A