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

1

Я использую RDKit для вычисления молекулярной подобия, основанной на коэффициенте Tanimoto между двумя списками молекул с структурами 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 у меня (более 10 000) в списке "ms" и получить отпечатки пальцев. Тогда я сравню сходство между каждой парой молекул из двух списков, может быть, цикл for нужен здесь?

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

Я использовал dataframe pandas для выбора и распечатки списков с моими структурами, и я сохранил свои списки в 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']. 

Например, SMILES для гадодиамида "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=',')
Теги:
csv
similarity
fingerprint
rdkit

1 ответ

0
Лучший ответ

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

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

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

Первый csv с недопустимым SMILES

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

Второй csv с правильными SMILES

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

Вот как читать SMILES, удалять недействительные, делать сходство с отпечатками пальцев без дубликатов и сохранять отсортированные значения.

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
  • 0
    Спасибо за Ваш ответ! Ваши коды работают хорошо. Итак, как я могу импортировать мои структуры из CSV-файла в два списка?
  • 0
    В своем вопросе вы написали, что вы можете извлечь улыбки из CSV. Разве вы не поместили их в список? Что ты сделал?
Показать ещё 19 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню