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

Попытаемся предложить аналог ибупрофена.

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

Сделаем функцию, которая проверяет, удовлетворяет ли вещество правилу пяти Лепински.

In [4]:
import rdkit.Chem.Lipinski as Lipinksy
In [5]:
def rule_of_5(mol):
    if Lipinksy.NumHDonors(mol) <= 5 and Lipinksy.NumHAcceptors(mol) <= 10 and Lipinksy.rdMolDescriptors.CalcExactMolWt(mol) < 500 and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(mol)[0] <= 5:
        return True
    else:
        return False
In [6]:
rule_of_5(ibu)
Out[6]:
True

С помощью SMILES покажем, как будет выглядеть модифицированный ибупрофен, которым мы будем заменять азидную группу в радикалах (для этого пришлось представить, как бы прошла реакция клик-химии).

In [7]:
ibu_mod=Chem.MolFromSmiles('N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu_mod)
display(ibu_mod)
In [8]:
rule_of_5(ibu_mod)
Out[8]:
True

Получим SMILES всех небольших радикалов, содержащих азидную группу, с сайта PubChem.

In [9]:
#strings=np.genfromtxt('2501540076512678923.txt',dtype=np.str)
file = open('2501540076512678923.txt', 'r')
strings = file.read().split("\n")[:-1]
smiles = [] 
for line in strings:
    line = line.split()
    #print(line[1])
    if (len(line[1]) < 30) and (not '.' in line[1]):
        smiles.append(line[1])

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

In [10]:
correct_mols = []

for smi in smiles:
    if 'N=[N+]=[N-]' in smi:
        #print(smi)
        newsmi=smi.replace('N=[N+]=[N-]', 'N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
    else:
        continue
    try:
        newmol=Chem.MolFromSmiles(newsmi)
        if rule_of_5(newmol) == True:
            correct_mols.append(newmol)
    except:
        pass
RDKit ERROR: [12:57:04] Explicit valence for atom # 4 Cl, 3, is greater than permitted
RDKit ERROR: [12:57:16] Explicit valence for atom # 1 Cl, 2, is greater than permitted

Отобразим несколько молекул, прошедших отбор.

In [59]:
Chem.Draw.MolsToGridImage(correct_mols[:9], molsPerRow=3, subImgSize=(500, 400))
Out[59]:

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

In [61]:
from rdkit.Chem.Draw import SimilarityMaps

fp = SimilarityMaps.GetMorganFingerprint(correct_mols[4], fpType='bv')

fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, \
                correct_mols[4], SimilarityMaps.GetMorganFingerprint)

Загрузим 3D структуру и покажем конформацию лиганда.

In [11]:
m3d=Chem.AddHs(correct_mols[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
Out[11]:
0
In [12]:
m3d
Out[12]:
In [13]:
import nglview as nv
import ipywidgets

Показывает только на кодомо ((

In [14]:
nv.show_rdkit(m3d)
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"