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

Цель этой работы было найти аналог ибупрофена (нестероидного противовоспалительного лекарственного средства), используя пакет моудлей RDkit. На сайте PubChem я нашла все радикалы c азидом для Click Chemistry и скачала их SMILES нотации.
Далее по SMILES нарисуем ибупрофен.

In [25]:
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 [27]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)

Посчитаем параметры для правила Лепински: количество доноров и акцепторов водородной связи, молекулярная масса, гидрофобность (logP).

In [28]:
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 [29]:
mod_ibu=Chem.MolFromSmiles("C#CC1=CC=C(C=C1)C(C)C(=O)O")
AllChem.Compute2DCoords(mod_ibu)
display(mod_ibu)
In [30]:
template = "N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1"
ibu_cycle=Chem.MolFromSmiles(template)
AllChem.Compute2DCoords(ibu_cycle)
display(ibu_cycle)

Загрузим скаченные данные с радикалами с азидом и отфильтруем

In [31]:
strings=np.genfromtxt('1284171488468159250.txt',dtype=np.str)
smiles=[]
for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles.append(line[1])
In [32]:
print len(smiles)
10747

Всего SMILES структур с азидными радикалами было найдено 10 747.
Теперь заменим в найденых радикалах азидную группу на модифцированный ибупрофен, а полученные новые SMILES превратим в объекты-молекулы. Далее сохраним только те, которые удовлетворяют правилу пяти Lepinsky (параметр гидрофобности молекулы меньше 5).

In [ ]:
good_new_smiles=[]
N=1
for smi in smiles[:10747]:
    azid = 'N=[N+]=[N-]'
    ibu_azid = "C-N(N=N1)C=C1-C1=CC=C(C=C1)C(C)C(=O)O"
    if azid in smi:
        newsmi=smi.replace(azid, ibu_azid)
    else:
        continue
    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):
            good_new_smiles.append(newsmi)
            AllChem.Compute2DCoords(newmol)
            #print N
            N=N+1
            #print newsmi
            #display(newmol)
    except:
        pass
last=newmol
old_smi_last=smi
new_smi_last=newsmi
In [70]:
len(good_new_smiles)
Out[70]:
7114

Производных ибупрофена, удовлетворяющих правилу пяти Lepinsky и имеющих не "битый" SMILES, было моделировано 7 114 штук.
Ниже визуализировано последнее производное ибупрофена.

In [76]:
display(last)
print old_smi_last+" -> "+new_smi_last
print "Lipinksy hydrofobic parameter: "
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(last)[0]
C1=CC=C(C=C1)CN=[N+]=[N-] -> C1=CC=C(C=C1)CC-N(N=N1)C=C1-C1=CC=C(C=C1)C(C)C(=O)O
Lipinksy hydrofobic parameter: 
3.3759
In [74]:
m3d=Chem.AddHs(newmol)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
Out[74]:
0
In [78]:
import nglview as nv
nv.show_rdkit(m3d)
In [80]:
from IPython.display import Image
Image(filename='3D_str.png')
Out[80]: