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

Для начала загрузим все необходимые нам модули

In [133]:
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
from tqdm import tqdm, trange
import rdkit.Chem.Lipinski as Lipinksy
import pubchempy as pcp
import pandas as pd
from IPython.display import SVG
import random
from IPython.display import display
from rdkit.Chem.Draw import SimilarityMaps
import nglview as nv
import nglview as nv

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

In [2]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O') 
AllChem.Compute2DCoords(ibu)
display(ibu)
In [3]:
def Lipinksy_checker(molecule):
    Lipinksy_check = bool(Lipinksy.NumHDonors(molecule) <= 5 
                    and Lipinksy.NumHAcceptors(molecule) <= 10
                    and Lipinksy.rdMolDescriptors.CalcExactMolWt(molecule) < 500
                    and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0] <= 5)
    return Lipinksy_check

Lipinksy_checker(ibu)
Out[3]:
True

Ибупрофен удовлетворяет правилу пяти Лепински

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

Сначала модифицируем ибупрофен.

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

Мы просто подставляем азид в цикл ибупрофена, а потом заменяем азидную часть на азид + довесок веществ, найденных в PubChem. Получится как-то так.

In [63]:
ibu=Chem.MolFromSmiles('CC(N1C=C(N=N1))(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
In [65]:
pcp.get_compounds('azide', 'name')
Out[65]:
[Compound(33558)]
In [84]:
structures = []
per_page = 10**5
for smiles in ["N=N=N", "NN#N", "N#NN"]:
    for i in range(200):
        try:
            a = pcp.get_properties(
              properties="CanonicalSMILES", 
              identifier=smiles, namespace="smiles", 
              searchtype="substructure",
              RingsNotEmbedded=True,
              listkey_count=per_page, listkey_start=i*per_page
            )
        except:
            break
        print("Retrieved page {} of {} search".format(i+1, smiles))
        structures.extend(a)
Retrieved page 1 of NN#N search
Retrieved page 1 of N#NN search
In [85]:
structures[0]['CanonicalSMILES']
Out[85]:
'CCN(CC)P(=N[N+]#N)(N(CC)CC)N(CC)CC.[Br-]'
In [86]:
len(structures)
Out[86]:
2428
In [87]:
pd.DataFrame(structures).to_csv("azids.csv")

Всего было найдено 177805 пригодных для реакции веществ. Сначала отфильтруем небольшие радикалы, содержащие азид

In [95]:
smiles = []
for line in structures:
    #print(line)
    if len(list(line.values())[1]) < 30 and not '.' in list(line.values())[1]:
        smiles.append(list(line.values())[1])
In [97]:
res = []
for smi in smiles:
    if '=N[N+]#N' in smi:
        newsmi=smi.replace('=N[N+]#N','CC(N1C=C(N=N1))(C)CC1=CC=C(C=C1)C(C)C(=O)O')
    else:
        continue
    try:
        newmol=Chem.MolFromSmiles(newsmi)
        if Lipinksy_checker(newmol) == True:
            AllChem.Compute2DCoords(newmol)
            res.append(newmol)
            display(newmol)
    except:
        pass
In [107]:
to_print = [x for x in random.sample(res, 12)]
display(Draw.MolsToGridImage(to_print, useSVG=True, molsPerRow=3, subImgSize=(300, 200)))
N N N N N O OH N S N N N O HO O N N N O HO N N N O OH N N NH N N N O OH O N N N N O OH O N N N O HO N N NH N N N O HO N N NH N N N O OH O N N N N O HO N PH N N N O OH N N N N N O HO N N HN
In [108]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O') 
fp = SimilarityMaps.GetMorganFingerprint(res[5], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[5], SimilarityMaps.GetMorganFingerprint)

Получили видоизмененный ибупрофен с двумя азидами. Посмотрим на 3Д структуру.

In [111]:
m3d=Chem.AddHs(res[5])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)

Мне кажется, мы добились того, что хотели. Данная молекула может быть изучена с помощью других методов как аналог ибупрофена.

In [138]:
import warnings
warnings.filterwarnings('ignore') # make the notebook nicer

import pytraj as pt
import nglview as nv

print("nglview version = {}".format(nv.__version__))
print("pytraj version = {}".format(pt.__version__))

Chem.rdmolfiles.MolToPDBFile(m3d, 'xxx.pdb')
traj = pt.load('xxx.pdb')
view = nv.show_pytraj(traj)
view
nglview version = 2.7.5
pytraj version = 2.0.4
In [139]:
view.render_image()
In [140]:
view._display_image()
Out[140]:

;(