» Семестры » Восьмой семестр » Хемоинформатика

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

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

Сначала на сайте PubChem были найдены радикалы c азидом для Click Chemistry и скачены их SMILES аннотации (файл 4164465006777977305.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

По SMILES нарисуем ибупрофен, чьи производные мы будем дальше искать:

In [2]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)


Посчитаем параметры для правила Лепински:

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 [8]:
mod_ibu=Chem.MolFromSmiles("C#CC1=CC=C(C=C1)C(C)C(=O)O")
AllChem.Compute2DCoords(mod_ibu)
display(mod_ibu)
In [9]:
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 [6]:
strings=np.genfromtxt('4164465006777977305.txt',dtype=np.str)
smiles = {}
#smiles=[]
for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles[line[0]]=line[1]

Заменим в найденых радикалах азидную группу на модифцированный ибупрофен, а полученные новые SMILES превратим в объекты-молекулы. Далее сохраним только те, которые удовлетворяют правилу пяти Lepinsky.

In [55]:
def lepinsky_rulez(mol):
    hdonor = Lipinksy.NumHDonors(mol) <= 5
    hacceptor = Lipinksy.NumHAcceptors(mol) <=10
    MW = Lipinksy.rdMolDescriptors.CalcExactMolWt(mol) < 500
    okt_water = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(mol)[0] <=5
    
    return (hdonor * hacceptor * MW * okt_water)
    

   
good_drug = []

for smi in smiles.items():
    smi_id = smi[0]
    smi_mol = str(smi[1])

    if "N=[N+]=[N-]" in smi_mol:
        newsmi=smi_mol.replace('N=[N+]=[N-]',template)

    else:
        continue
   
    try:
        res_mol=Chem.MolFromSmiles(newsmi)
        
        if lepinsky_rulez(res_mol):
            good_drug.append([smi_id,res_mol,newsmi])
            AllChem.Compute2DCoords(res_mol)
            
            #display(res_mol)
            #print "SMILES id:\t%s\nSMILES:\t%s\n" %(smi_id,newsmi)

    except Exception as exp:
        pass
RDKit ERROR: [13:41:46] SMILES Parse Error: extra open parentheses for input: 'CC(CCCCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:46] SMILES Parse Error: extra open parentheses for input: 'CCC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:46] SMILES Parse Error: extra open parentheses for input: 'CCC(CCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:47] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:47] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:47] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:48] SMILES Parse Error: extra open parentheses for input: 'C(CNC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:49] SMILES Parse Error: extra open parentheses for input: 'CC1C=C(C=CC1OCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C(C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'CCC=CC(CCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'CCC=CC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C=CC(=C1CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)CN1CCC(CC1)(C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'C1CC([C@@H](CC1CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:50] SMILES Parse Error: extra open parentheses for input: 'CC=CC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:51] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(COC(=O)CCCC'
RDKit ERROR: [13:41:51] SMILES Parse Error: extra open parentheses for input: '[B](N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)[P+](CS'
RDKit ERROR: [13:41:52] SMILES Parse Error: extra open parentheses for input: 'C/C=C/CC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:52] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)[C@@H](C'
RDKit ERROR: [13:41:52] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)COC(=C[N+]'
RDKit ERROR: [13:41:53] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)CO/C(=C/[N+]'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'C1=C(N(C(=N1)CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)CO/C(=C/[N+]'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C=CC(=C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)CN(CC'
RDKit ERROR: [13:41:54] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:55] SMILES Parse Error: extra open parentheses for input: 'C1=C(C=C(C=C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:55] SMILES Parse Error: extra open parentheses for input: 'CCOC(=O)C(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:55] SMILES Parse Error: extra open parentheses for input: 'COC[C@@](CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:55] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C(C(C(C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:55] SMILES Parse Error: extra open parentheses for input: 'C1=CC(C(C(C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:56] SMILES Parse Error: extra open parentheses for input: 'CC/C=C\CCC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:56] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:57] SMILES Parse Error: extra open parentheses for input: 'CC/C=C/CCC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:41:57] SMILES Parse Error: extra open parentheses for input: 'C1=C(C=NC(=C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:58] SMILES Parse Error: extra open parentheses for input: 'CCOC(=O)C(CCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(CC'
RDKit ERROR: [13:41:58] SMILES Parse Error: extra open parentheses for input: 'C1=C(N=C(C(=N1)N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:41:58] SMILES Parse Error: extra open parentheses for input: 'CC1=NC(=C(C(=C1)N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:00] SMILES Parse Error: extra open parentheses for input: 'CC(CCCCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:42:00] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:00] SMILES Parse Error: extra open parentheses for input: 'CCC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(/C(=C/C'
RDKit ERROR: [13:42:00] SMILES Parse Error: extra open parentheses for input: 'C[Si](C)(C)OC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:42:00] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:01] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:02] Explicit valence for atom # 1 Cl, 2, is greater than permitted
RDKit ERROR: [13:42:02] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:42:03] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:42:03] SMILES Parse Error: extra open parentheses for input: 'C1CC(CCC1N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(CC'
RDKit ERROR: [13:42:03] SMILES Parse Error: extra open parentheses for input: 'CC(=CCC(CCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:42:04] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)COC(=C[N+]'
RDKit ERROR: [13:42:04] SMILES Parse Error: extra open parentheses for input: 'C(CNC(CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:04] SMILES Parse Error: extra open parentheses for input: 'CC1=CC(=C(C(=C1)N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:05] SMILES Parse Error: extra open parentheses for input: 'CC(=CCC(CCCN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)(C'
RDKit ERROR: [13:42:05] SMILES Parse Error: extra open parentheses for input: 'CC1=NC(=C(C(=C1)N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
RDKit ERROR: [13:42:05] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1)C'
In [62]:
len(good_drug)
Out[62]:
7095

В итоге было найдено 7095 удовлетворяющих правилу производных ибупрофена.

Ниже представлено изображение 40 случайных структур из общего списка, где под каждым соединением подписан его SMILES ID:

In [63]:
import random
choice = random.sample(good_drug,40)
good_mol = [x[1] for x in choice]
good_names = [n[0] for n in choice]


p = Chem.MolFromSmiles(template)
subms = [x for x in good_mol if x.HasSubstructMatch(p)]
AllChem.Compute2DCoords(p)
for m in subms: AllChem.GenerateDepictionMatching2DStructure(m,p)
img=Draw.MolsToGridImage(subms,molsPerRow=4,subImgSize=(200,200),legends=good_names)
img
Out[63]:


Также можно получить трёхмерную структуру любого из производных, воспользовавшись командой:

In [65]:
import random
choice = random.choice(good_drug)
print "SMILES ID:\t%s" %choice[0]
m2d = choice[1]
m3d=Chem.AddHs(m2d)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )

import nglview as nv

nv.show_rdkit(m3d)
SMILES ID:	61343251


Дата последнего обновления: 19.05.17
© Светлана Яровенко