|
|
from spyrmsd import rmsd, molecule |
|
|
|
|
|
def get_symmetry_rmsd(mol, coords1, coords2, mol2=None, return_permutation=False): |
|
|
with time_limit(10): |
|
|
mol = molecule.Molecule.from_rdkit(mol) |
|
|
mol2 = molecule.Molecule.from_rdkit(mol2) if mol2 is not None else mol2 |
|
|
mol2_atomicnums = mol2.atomicnums if mol2 is not None else mol.atomicnums |
|
|
mol2_adjacency_matrix = mol2.adjacency_matrix if mol2 is not None else mol.adjacency_matrix |
|
|
RMSD = rmsd.symmrmsd( |
|
|
coords1, |
|
|
coords2, |
|
|
mol.atomicnums, |
|
|
mol2_atomicnums, |
|
|
mol.adjacency_matrix, |
|
|
mol2_adjacency_matrix, |
|
|
return_permutation=return_permutation |
|
|
) |
|
|
return RMSD |
|
|
|
|
|
|
|
|
import signal |
|
|
from contextlib import contextmanager |
|
|
|
|
|
|
|
|
class TimeoutException(Exception): pass |
|
|
|
|
|
|
|
|
@contextmanager |
|
|
def time_limit(seconds): |
|
|
def signal_handler(signum, frame): |
|
|
raise TimeoutException("Timed out!") |
|
|
|
|
|
signal.signal(signal.SIGALRM, signal_handler) |
|
|
signal.alarm(seconds) |
|
|
try: |
|
|
yield |
|
|
finally: |
|
|
signal.alarm(0) |
|
|
|
|
|
|