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

Цель занятия используя пакет моудлей RDkit предложить аналог ибупрофена. Скачиваем с сайта PubChem SMILES нотации всех радикалов c азидом (файл 423776634641398567.txt).

Загружаем модули RDkit:

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

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

In [3]:
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 [4]:
strings=np.genfromtxt('423776634641398567.txt',dtype=np.str)
smiles=[]
for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles.append(line[1])

Нарисуем производное ибупрофена для Click Chemistry:

In [7]:
azid_ibu=Chem.MolFromSmiles('N(N=N1)C=C1-C1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(azid_ibu)
display(azid_ibu)

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

In [11]:
molecules=[]
mol=[]
min_mass=500
for smi in smiles[:100]:
    azid = 'N=[N+]=[N-]'
    ibu_azid = "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):
            molecules.append(newsmi)
            AllChem.Compute2DCoords(newmol)
            mol.append(newmol)
            if min_mass > Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol):
                min_mass=Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol)
                min_mol=newmol
    except:
        pass
    img=Draw.MolsToGridImage(mol,molsPerRow=8,subImgSize=(300,300))
    img.save('molgrid.png')

Image(url="molgrid.png")
Out[11]:

Вставка картинки Построим 3D молекулы с минимальной молекулярной массой:

In [9]:
print "Molecular weight is", Lipinksy.rdMolDescriptors.CalcExactMolWt(min_mol)
display (min_mol)
m3d=Chem.AddHs(min_mol)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
Image(url="3D.PNG")
Molecular weight is 259.11895214
Out[9]: