Source code for prody.compounds.functions

"""This module defines functions for using compounds from the PDB and elsewhere."""

from .pdbligands import PDBLigandRecord
import numpy as np

__all__ = ['calc2DSimilarity', 'calc2DSimilarityMatrix']


[docs]def calc2DSimilarity(smiles1, smiles2): """Calculate 2D similarity using Morgan Fingerprints :arg smiles1: first SMILES string or PDBLigandRecord containing one :type smiles1: str, :class:`.PDBLigandRecord` :arg smiles2: second SMILES string or PDBLigandRecord containing one :type smiles2: str, :class:`.PDBLigandRecord` """ try: from rdkit import Chem from rdkit import DataStructs from rdkit.Chem.Fingerprints import FingerprintMols from rdkit.Chem import AllChem except ImportError: raise ImportError('rdkit is a required package for calc2DSimilarity') if not isinstance(smiles1, str): if hasattr(smiles1, 'getCanonicalSMILES'): smiles1 = smiles1.getCanonicalSMILES() else: raise TypeError('smiles1 should be a string or an object with method getCanonicalSMILES') if not isinstance(smiles2, str): if hasattr(smiles2, 'getCanonicalSMILES'): smiles2 = smiles2.getCanonicalSMILES() else: raise TypeError('smiles2 should be a string or an object with method getCanonicalSMILES') m1 = Chem.MolFromSmiles(smiles1) m2 = Chem.MolFromSmiles(smiles2) if m1 is not None and m2 is not None: fp1 = AllChem.GetMorganFingerprint(m1, 2, useFeatures=True) fp2 = AllChem.GetMorganFingerprint(m2, 2, useFeatures=True) simi_score = DataStructs.TanimotoSimilarity(fp1, fp2) return simi_score
def calc2DSimilarityMatrix(smiles_set): num_smiles = len(smiles_set) sim_mat = np.ones((num_smiles, num_smiles)) for i in range(num_smiles): for j in range(i+1, num_smiles): sim_mat[i, j] = sim_mat[j, i] = calc2DSimilarity(smiles_set[i], smiles_set[j]) return sim_mat