Python argument error occurs when running rdkit.DataStructs.cDataStructs.BulkTanimotoSimilarity(). (Python argument types did not match C++ signature)

Viewed 36

I'm trying to get SMILES chemical similarity using RDKIT. My dataframe "subs_df" contains 2 columns where one of them contains SMILES data.

import time
import random
import sys
from pathlib import Path
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
from rdkit import Chem
from rdkit import DataStructs
from rdkit.ML.Cluster import Butina
from rdkit.Chem import Draw
from rdkit.Chem import rdFingerprintGenerator
from rdkit.Chem.Draw import SimilarityMaps


for _, smiles in subs_df[["SMILES"]].itertuples():
    a=Chem.MolFromSmiles(smiles)
    molecules.append((a))

# Defining a function to calculate similarities among the molecules
def pairwise_similarity(fingerprints_list):
    
    global similarities

    similarities = np.zeros((nfgrps, nfgrps))

    for i in range(1, nfgrps):
        similarity = DataStructs.BulkTanimotoSimilarity(fgrps[i], fgrps[:i])
        similarities[i, :i] = similarity
        similarities[:i, i] = similarity

    return similarities


# Calculating similarities of molecules
pairwise_similarity(fgrps)
tri_lower_diag = np.tril(similarities, k=0)

The error occurs in the second block of code when DataStructs.BulkTanimotoSimilarity is called. Any leads to solving the above issue are appreciated.

The exact error popping up is:

ArgumentError: Python argument types in rdkit.DataStructs.cDataStructs.BulkTanimotoSimilarity(Mol, list) did not match C++ signature: BulkTanimotoSimilarity(RDKit::SparseIntVect v1, boost::python::list v2, bool returnDistance=False) BulkTanimotoSimilarity(RDKit::SparseIntVect v1, boost::python::list v2, bool returnDistance=False) BulkTanimotoSimilarity(RDKit::SparseIntVect v1, boost::python::list v2, bool returnDistance=False) BulkTanimotoSimilarity(RDKit::SparseIntVect v1, boost::python::list v2, bool returnDistance=False) BulkTanimotoSimilarity(ExplicitBitVect const* bv1, boost::python::api::object bvList, bool returnDistance=0) BulkTanimotoSimilarity(SparseBitVect const* bv1, boost::python::api::object bvList, bool returnDistance=0)

1 Answers

based on the error it looks like you inadvertently fed a mol and not a fingerprint into the bulk tanimoto similarity function. Can you show how you went from your list of molecules to your list of fingerprints?

here's a slight variation on your code block that outputs the expected result (with 5 random molecules, and ECFP4_1024 fingerprint):

from rdkit import Chem
from rdkit.Chem import DataStructs,AllChem
import numpy as np

smis = ["c1ccccc1","c1ccccc1C","c1ccccc1OC","c1ccccc1CCCOC","c1ccc(C)cc1C"]
mols = [Chem.MolFromSmiles(smi) for smi in smis]
fgrp = [AllChem.GetMorganFingerprintAsBitVect(mol,2,nBits=1024) for mol in mols]

def pairwise_similarity(fpl):
    
    global similarities
    
    similarities = np.zeros((len(fpl), len(fpl)))

    for i in range(len(fpl)):
        similarity = DataStructs.BulkTanimotoSimilarity(fpl[i], fpl[:i])
        similarities[i, :i] = similarity
        similarities[:i, i] = similarity

    return similarities


# Calculating similarities of molecules
pairwise_similarity(fgrp)
tri_lower_diag = np.tril(similarities, k=0)
print(tri_lower_diag)

the following matrix

[[0.         0.         0.         0.         0.        ]
 [0.27272727 0.         0.         0.         0.        ]
 [0.21428571 0.38888889 0.         0.         0.        ]
 [0.14285714 0.28       0.34615385 0.         0.        ]
 [0.15384615 0.53333333 0.23809524 0.17857143 0.        ]]
Related