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

Цель занятия: используя пакет моудлей RDkit, предложить аналог ибупрофена

In [2]:
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
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
from IPython.display import Image

Нарисуем ибупрофен

In [3]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O') 
AllChem.Compute2DCoords(ibu)
display(ibu)
In [4]:
# функция проверяет выполнение правила Лепински
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[4]:
True

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

In [33]:
Image(filename="click.png")
Out[33]:
In [16]:
ibu_azid = Chem.MolFromSmiles('N1N=NC=C1C(C(O)=O)C(C=C1)=CC=C1CC(C)C')
AllChem.Compute2DCoords(ibu_azid)
display(ibu_azid)
In [17]:
Lipinksy_checker(ibu_azid)
Out[17]:
True
In [22]:
# Вручную скачала 76,454 азидов с PubChem в файл azides.csv

strings = pd.read_csv('azides.csv')["isosmiles"] 
smiles = []

# Отсеиваем слишком большие соединения
# и те соединения, в которые входят не соединенные группы
for line in strings:
    if len(line) < 30 and not '.' in line:
        smiles.append(line)
len(smiles)
/mnt/scratch/mm-course/miniconda3/envs/molsim/lib/python3.6/site-packages/IPython/core/interactiveshell.py:3063: DtypeWarning: Columns (16,19) have mixed types.Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)
Out[22]:
8025
In [26]:
# модифицируем

ibu_azid_sm = 'N1N=NC=C1C(C(O)=O)C(C=C1)=CC=C1CC(C)C'
res = []
for smi in smiles:
    if 'N=[N+]=[N-]' in smi:
        newsmi=smi.replace('N=[N+]=[N-]',ibu_azid_sm)
    else:
        continue
    try:
        newmol=Chem.MolFromSmiles(newsmi)
        if Lipinksy_checker(newmol) == True:
            AllChem.Compute2DCoords(newmol)
            res.append(newmol)
    except:
        pass
len(res)
RDKit ERROR: [10:42:48] Explicit valence for atom # 21 Cl, 5, is greater than permitted
RDKit ERROR: [10:42:48] Explicit valence for atom # 1 Cl, 3, is greater than permitted
Out[26]:
7951
In [28]:
# Примеры

display(Draw.MolsToGridImage(
    res,
    maxMols=9,
    molsPerRow=3,
    subImgSize=(400, 400))
)
/mnt/scratch/mm-course/miniconda3/envs/molsim/lib/python3.6/site-packages/rdkit/Chem/Draw/IPythonConsole.py:188: UserWarning: Truncating the list of molecules to be displayed to 9. Change the maxMols value to display more.
  % (maxMols))

Построим Similiraty Map ибупрофена с пятым веществом из получившегося массива.

In [35]:
similarity_map = SimilarityMaps.GetMorganFingerprint(res[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[4], SimilarityMaps.GetMorganFingerprint)

3D

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