mirror of
https://github.com/gcorso/DiffDock.git
synced 2026-06-04 18:04:23 +08:00
95 lines
2.2 KiB
Python
95 lines
2.2 KiB
Python
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
|