Как использовать RDKit для расчета молекулярного отпечатка пальца и сходства списка структур SMILE?

Я использую RDKit для вычисления молекулярного сходства на основе коэффициента Танимото между двумя списками молекул со структурами SMILE. Теперь я могу извлечь структуры SMILE из двух отдельных файлов CSV. Мне интересно, как поместить эти структуры в модуль отпечатка пальца в RDKit, и как вычислить сходство попарно одно за другим между двумя списками молекул?

from rdkit import DataStructs
from rdkit.Chem.Fingerprints import FingerprintMols
ms = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO'), ... Chem.MolFromSmiles('COC')]
fps = [FingerprintMols.FingerprintMol(x) for x in ms]
DataStructs.FingerprintSimilarity(fps[0],fps[1])

Я хочу поместить все имеющиеся у меня SMILE-структуры (более 10000) в список "ms" и получить их отпечатки пальцев. Затем я сравню сходство между каждой парой молекул из двух списков, может быть, здесь нужен цикл for?

Заранее спасибо!

Я использовал pandas dataframe, чтобы выбрать и распечатать списки с моими структурами, и я сохранил свои списки в list_1 и list_2. Когда он запускается в строку ms1, он имеет следующую ошибку:

TypeError: No registered converter was able to produce a C++ rvalue of type std::__cxx11::basic_string<wchar_t, 
std::char_traits<wchar_t>, std::allocator<wchar_t> > from this Python object of type float

Затем я проверил файлы, и в столбце смайлов только SMILES. Но когда я вручную помещаю некоторые структуры молекул в списки для тестирования, все равно возникают ошибки, касающиеся

fpArgs['minSize']. 

Например, УЛЫБКИ для гадодиамида: "O=C1[O-][Gd+3]234567[O]=C(C[N]2(CC[N]3(CC([O-]4)=O").)CC[N]5(CC(=[O]6)NC)CC(=O)[O-]7)C1)NC", и коды ошибок следующие (при запуске линии fps):

ArgumentError: Python argument types in
rdkit.Chem.rdmolops.RDKFingerprint(NoneType, int, int, int, int, int, float, int)
did not match C++ signature:
RDKFingerprint(RDKit::ROMol mol, unsigned int minPath=1, 
unsigned int maxPath=7, unsigned int fpSize=2048, unsigned int nBitsPerHash=2, 
bool useHs=True, double tgtDensity=0.0, unsigned int minSize=128, bool branchedPaths=True, 
bool useBondOrder=True, boost::python::api::object atomInvariants=0, boost::python::api::object fromAtoms=0, 
boost::python::api::object atomBits=None, boost::python::api::object bitInfo=None).

Как включить имена молекул в выходной файл вместе со значениями подобия, если исходный файл CSV выглядит следующим образом:

имена, улыбки, стоимость, значение2

molecule1, CCOCN (С)(С),0,25, А

molecule2, ССО,1.12, В

molecule3, КОК, 2,25, С

Я добавил эти коды, чтобы включить имена молекул в выходной файл, и это некоторая ошибка в значении массива относительно имен (особенно для d2):

name_1 = df_1['id1']
name_2 = df_2['id2']
name_3 = pd.concat([name_1, name_2])
# create a list for the dataframe
d1, qu, d2, ta, sim = [], [], [], [], []
for n in range(len(fps)-1): 
    s = DataStructs.BulkTanimotoSimilarity(fps[n], fps[n+1:]) 
    #print(c_smiles[n], c_smiles[n+1:])
    for m in range(len(s)):
        qu.append(c_smiles[n])
        ta.append(c_smiles[n+1:][m])
        sim.append(s[m])
        d1.append(name_3[n])
        d2.append(name_3[n+1:][m])
    #print()
d = {'ID_1':d1, 'query':qu, 'ID_2':d2, 'target':ta, 'Similarity':sim}
df_final = pd.DataFrame(data=d)
df_final = df_final.sort_values('Similarity', ascending=False)
for index, row in df.iterrows():
    print (row["ID_1"], row["query"], row["ID_2"], row["target"], row["Similarity"])
print(df_final)
# save as csv
df_final.to_csv('RESULT_3.csv', index=False, sep=',')

1 ответ

Решение

Отредактировал ответ, чтобы перехватить все комментарии.

RDKit имеет большую функцию сходства, поэтому вы можете сравнить один отпечаток со списком отпечатков пальцев. Просто зациклите список отпечатков пальцев.

Если CSV выглядит так

Первый CSV с недопустимой улыбкой

smiles,value,value2
CCOCN(C)(C),0.25,A
CCO,1.12,B
COC,2.25,C

Второй CSV с правильными улыбками

smiles,value,value2
CCOCC,0.55,D
CCCO,2.58,E
CCCCO,5.01,F

Это способ считывания СМЕЙЛ, удаления неправильных, создания сходства отпечатков пальцев без дубликатов и сохранения отсортированных значений.

from rdkit import Chem
from rdkit import DataStructs
from rdkit.Chem.Fingerprints import FingerprintMols
import pandas as pd

# read and Conconate the csv's
df_1 = pd.read_csv('first.csv')
df_2 = pd.read_csv('second.csv')
df_3 = pd.concat([df_1, df_2])

# proof and make a list of SMILES
df_smiles = df_3['smiles']
c_smiles = []
for ds in df_smiles:
    try:
        cs = Chem.CanonSmiles(ds)
        c_smiles.append(cs)
    except:
        print('Invalid SMILES:', ds)
print()

# make a list of mols
ms = [Chem.MolFromSmiles(x) for x in c_smiles]

# make a list of fingerprints (fp)
fps = [FingerprintMols.FingerprintMol(x) for x in ms]

# the list for the dataframe
qu, ta, sim = [], [], []

# compare all fp pairwise without duplicates
for n in range(len(fps)-1): # -1 so the last fp will not be used
    s = DataStructs.BulkTanimotoSimilarity(fps[n], fps[n+1:]) # +1 compare with the next to the last fp
    print(c_smiles[n], c_smiles[n+1:]) # witch mol is compared with what group
    # collect the SMILES and values
    for m in range(len(s)):
        qu.append(c_smiles[n])
        ta.append(c_smiles[n+1:][m])
        sim.append(s[m])
print()

# build the dataframe and sort it
d = {'query':qu, 'target':ta, 'Similarity':sim}
df_final = pd.DataFrame(data=d)
df_final = df_final.sort_values('Similarity', ascending=False)
print(df_final)

# save as csv
df_final.to_csv('third.csv', index=False, sep=',')

Распечатка:

Invalid SMILES: CCOCN(C)(C)C

CCO ['COC', 'CCOCC', 'CCCO', 'CCCCO']
COC ['CCOCC', 'CCCO', 'CCCCO']
CCOCC ['CCCO', 'CCCCO']
CCCO ['CCCCO']

   query target  Similarity
9   CCCO  CCCCO    0.769231
2    CCO   CCCO    0.600000
1    CCO  CCOCC    0.500000
7  CCOCC   CCCO    0.466667
3    CCO  CCCCO    0.461538
8  CCOCC  CCCCO    0.388889
4    COC  CCOCC    0.333333
5    COC   CCCO    0.272727
0    CCO    COC    0.250000
6    COC  CCCCO    0.214286
Другие вопросы по тегам