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

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]:
import rdkit.Chem.Lipinski as Lipinksy

В этой работе мы будем модифицировать молекулу ибопрофена имитируя реакции Click-химии, а затем отберем те из соединений, что удовлетворяют правилу пяти Лепински. Для начала визуализируем молекулу ибупрофена:

In [3]:
def drawSmilesStructure(string):
    mol = Chem.MolFromSmiles(string)
    AllChem.Compute2DCoords(mol)
    display(mol)
In [4]:
ibu = 'CC(C)CC1=CC=C(C=C1)C(C)C(=O)O'
drawSmilesStructure(ibu)

Отлично. Теперь проверим, удовлетворяет ли ибупрофен правилу пяти Лепински:

In [5]:
def checkLepinsky(mol): 
    return bool((Lipinksy.NumHDonors(mol) <= 5) and (Lipinksy.NumHAcceptors(mol) <= 10) \
    and (Lipinksy.rdMolDescriptors.CalcExactMolWt(mol) < 500) \
    and(Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(mol)[0]) <= 5)
In [6]:
ibu_mol = Chem.MolFromSmiles(ibu)
AllChem.Compute2DCoords(ibu_mol)
checkLepinsky(ibu_mol)
Out[6]:
True

Теперь перепишем формулу ибупрофена так, чтобы получить шаблон для замены азидного радикала, имитируя реакцию Click-химии:

In [7]:
template = 'N1N=NC(=C1)C(C1=CC=C(C=C1)CC(C)C)(C(=O)O)'
drawSmilesStructure(template)

В базе PubChem были найдены и сохранены в файл SMILES-структуры 141959 веществ, содержащих азид-радикал не в составе цикла и потенциально пригодных для проведения нашей реакции. Для начала отфильтруем вещества по размеру записи и наличию разрывов:

In [8]:
strings=np.genfromtxt('2515324818764782706.txt',dtype=np.str)
smiles = []
for line in strings:
    if (len(line[1]) < 30) and (len(line[1]) > 11) and not ( '.' in line[1]):
        smiles.append(line[1])
In [9]:
len(smiles)
Out[9]:
12050
In [10]:
products = []
# Новую молекулу лучше создавать в try из-за битых  Smiles:
for smi in smiles:
    try:
        if not "N=[N+]=[N-]" in smi:
            continue
        newsmi = smi.replace("N=[N+]=[N-]", template)
        if checkLepinsky(Chem.MolFromSmiles(newsmi)):
            products.append(newsmi)
    except Exception:
        pass    
In [11]:
len(products)
Out[11]:
8902

Посмотрим, что же у нас получилось:

In [12]:
from random import sample
In [13]:
sample_mols = [Chem.MolFromSmiles(item) for item in sample(products, 12)]
Chem.Draw.MolsToGridImage(sample_mols, molsPerRow=3, subImgSize=(500, 400))
Out[13]:

Отличная выборка. Теперь построим similarity map исходной молекулы ибупрофена с, например, пятым веществом нашей выборки:

In [14]:
from rdkit.Chem.Draw import SimilarityMaps
In [17]:
ibumol = Chem.MolFromSmiles(ibu)
In [20]:
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibumol, \
                sample_mols[4], SimilarityMaps.GetMorganFingerprint)
In [21]:
maxweight
Out[21]:
0.18697183098591552

Теперь посмотрим на трехмерную структуру какой-нибудь молекулы из выборки, например 11-й:

In [2]:
def molTo3d(string):
    m3d=Chem.AddHs(string)
    Chem.AllChem.EmbedMolecule(m3d)
    AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
    return m3d
In [31]:
randmol3d = molTo3d(sample_mols[10])
In [3]:
import nglview as nv
import ipywidgets
In [6]:
nv.show_rdkit(randmol3d)
Widget Javascript not detected.  It may not be installed properly. Did you enable the widgetsnbextension? If not, then run "jupyter nbextension enable --py --sys-prefix widgetsnbextension"

Мне не удалось вылечить проблему с nglview, поэтому я построил .mol файл при помощи babel и открыл его в памоле:

In [11]:
Chem.MolToSmiles(randmol3d)
Out[11]:
'[H]OC(=O)C([H])(c1nnn(C23C([H])=C([H])C(C([H])([H])[H])(C([H])([H])C2([H])[H])C([H])([H])C3([H])[H])c1[H])c1c([H])c([H])c(C([H])([H])C([H])(C([H])([H])[H])C([H])([H])[H])c([H])c1[H]'
In [12]:
with open('smile.smi', 'w') as f:
    f.write(Chem.MolToSmiles(randmol3d))

bash: obgen smile.smi > smile.mol

In [1]:
import __main__

__main__.pymol_argv = [ 'pymol', '-x' ]

import pymol 
pymol.finish_launching()
from pymol import cmd, stored
In [2]:
cmd.load('smile.mol')
In [3]:
cmd.zoom()
cmd.turn("y", "90.0")
In [4]:
cmd.do('''
set antialias, 2
set ray_trace_mode, 3
''')
In [5]:
cmd.png(filename='pic1.png',width='8cm',dpi=300, ray=1)

Рис.1. Трехмерная структура соединения 11 из выборки полученных аналогов ибупрофена