Хемоинформатика

Целью данного практикума было используя пакет модулей RDkit предложить аналог ибупрофена:

  • На сайте PubChem найти все радикалы c азидом для Click Chemistry и скачать их SMILES нотации
  • Найти формулу ибупрофена и предложить способ изменения его SMILES для эмуляции продукта Click Chemistry
  • Заменить в найденных радикалах азидную группу на модифицированный ибупрофен
  • Превратить новые SMILES в объекты-молекулы
  • Отобрать те молекулы, которые удовлетворяют правилу пяти Lepinsky

На сайте PubChem скачали SMILES радикалов с азидом (файл 873774121219644625.txt).

In [4]:
#Загружаем модули RDkit
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import RDConfig
from rdkit.Chem.Draw import IPythonConsole 
from rdkit.Chem import Draw
import numpy as np
from IPython.display import display,Image
In [25]:
#Рисуем ибупрофен
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
In [26]:
#Cчитаем параметры для правила Лепински
import rdkit.Chem.Lipinski as Lipinksy
print Lipinksy.NumHDonors(ibu)
print Lipinksy.NumHAcceptors(ibu)
print Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu)
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0]
1
1
206.130679816
3.0732
In [7]:
#Построим модифицированный ибупрофен
mod_ibu=Chem.MolFromSmiles("C#CC1=CC=C(C=C1)C(C)C(=O)O")
AllChem.Compute2DCoords(mod_ibu)
display(mod_ibu)
In [19]:
#Построим шаблон, на который мы будем заменять азид в найденных на PubChem SMILES
template = 'N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O'
ibu_cycle=Chem.MolFromSmiles(template)
AllChem.Compute2DCoords(ibu_cycle)
display(ibu_cycle)
In [5]:
#Загрузим скаченные SMILES и отфильтруем
strings=np.genfromtxt('873774121219644625.txt',dtype=np.str)
smiles=[]

for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles.append(line[1])
print(len(smiles))
10747

Теперь заменим в скаченных SMILES азид на template и проверим, удовлетворяют ли получившиеся молекулы правилу пяти Лепински (параметр гидрофобности молекулы меньше 5).

In [17]:
#Проводим замену
new_smiles=[]
for smi in smiles[:10747]:
    azid = 'N=[N+]=[N-]'
    if azid in smi:
        newsmi=smi.replace(azid,'N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O')
        new_smiles.append(newsmi)
    else:
        continue
In [30]:
#Проверяем правило пяти Лепински
selected_smiles=[]
for newsmi in new_smiles:
    try:
        newmol=Chem.MolFromSmiles(newsmi)
        if ((Lipinksy.NumHDonors(newmol) <= 5) and (Lipinksy.NumHAcceptors(newmol) <= 10) and (Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol) <= 500) and (Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(newmol)[0] <= 5)):
            selected_smiles.append(newsmi)
            AllChem.Compute2DCoords(newmol)
    except:
        pass
RDKit ERROR: [15:24:30] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C=CC(=C1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:30] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(COC(=O)CCCC'
RDKit ERROR: [15:24:31] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:31] SMILES Parse Error: extra open parentheses for input: 'CC1C=C(C=CC1OCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C(C'
RDKit ERROR: [15:24:31] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:32] SMILES Parse Error: extra open parentheses for input: 'CC1=NC(=C(C(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'CCOC(=O)C(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'CCOC(=O)C(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(CC'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'C1=C(C=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C(C(C(C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:33] SMILES Parse Error: extra open parentheses for input: 'C1=CC(C(C(C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:34] SMILES Parse Error: extra open parentheses for input: '[B](N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)[P+](CS'
RDKit ERROR: [15:24:34] SMILES Parse Error: extra open parentheses for input: 'C1CC([C@@H](CC1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:34] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:34] SMILES Parse Error: extra open parentheses for input: 'C1=C(N(C(=N1)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:34] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:34] SMILES Parse Error: extra open parentheses for input: 'CCC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(/C(=C/C'
RDKit ERROR: [15:24:35] SMILES Parse Error: extra open parentheses for input: 'CC(CCCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:35] SMILES Parse Error: extra open parentheses for input: 'CC(CCCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:35] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C=CC(=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:35] SMILES Parse Error: extra open parentheses for input: 'C1CC(CCC1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(CC'
RDKit ERROR: [15:24:35] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:36] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:36] SMILES Parse Error: extra open parentheses for input: 'CC1=NC(=C(C(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'CC=CC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'CCC=CC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'CCC=CC(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'C(CNC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'C(CNC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:37] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:40] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CN(CC'
RDKit ERROR: [15:24:42] Explicit valence for atom # 1 Cl, 2, is greater than permitted
RDKit ERROR: [15:24:43] SMILES Parse Error: extra open parentheses for input: 'CC1=CC(=C(C(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:44] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:44] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CN1CCC(CC1)(C'
RDKit ERROR: [15:24:44] SMILES Parse Error: extra open parentheses for input: 'C1=C(N=C(C(=N1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:45] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:46] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'CC/C=C/CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'CC(=CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'C/C=C/CC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'CCC(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'C[Si](C)(C)OC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'CC/C=C\CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'CC(=CCC(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:47] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)[C@@H](C'
RDKit ERROR: [15:24:48] SMILES Parse Error: extra open parentheses for input: 'COC[C@@](CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [15:24:48] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CO/C(=C/[N+]'
RDKit ERROR: [15:24:48] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CO/C(=C/[N+]'
RDKit ERROR: [15:24:48] SMILES Parse Error: extra open parentheses for input: 'C1=C(C=NC(=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [15:24:48] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)COC(=C[N+]'
RDKit ERROR: [15:24:48] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)COC(=C[N+]'
In [31]:
len(selected_smiles)
Out[31]:
7206
In [37]:
#Отобразим структуры 1-ых 30-ти выбранных молекул
for selsmi in selected_smiles[:30]:
    print selsmi
    selmol=Chem.MolFromSmiles(selsmi)
    AllChem.Compute2DCoords(selmol)
    display(selmol)
#Сохраним одну молекулу для дальнейшего построения 3D структуры
tdsmi=selsmi
tdmol=selmol
C1C(COC1=O)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CCCNCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC(CN)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C(CN=N)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC1CN([C@@H]1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)N=N
C1COC[C@@H](C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)O
C1[C@@H](C(CO1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)O
CCOC(=O)C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)NI
CCOC(=C)COCCOC(C)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC1(CCC1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1=C(N=CN1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)N
C(C(CO)(CO)O)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC(CO)C(=O)OCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C(C(C(=O)OCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)O)O
C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)NCCO
C1CNC(=O)C(N1)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CCS(=O)(=O)N
C=CCCCC(N)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CCCCN(C(C)C(=O)O)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C(CCC(=O)N)CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C(=O)ON)N
C(CSN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1=CN=C(N=C1Cl)NCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC(=S=CO)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1=CSC(=C1F)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1=C(SC(=C1F)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)Br
C(CO)COCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC1CCC1CNC(=O)CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1CC(C1)(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)N=O
C1=CC(=C(C=C1O)O)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O

Для одной из отобранных молекул отобразим 3D структуру и покрутим её

In [40]:
display(tdmol)
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(tdmol)[0]
2.5927
In [41]:
m3d=Chem.AddHs(tdmol)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
Out[41]:
0
In [42]:
import nglview as nv
nv.show_rdkit(m3d)
In [43]:
from IPython.display import Image
Image(filename='3dlig.png')
Out[43]: