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

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
RDKit WARNING: [22:38:40] Enabling RDKit 2019.09.3 jupyter extensions

Рассмотрим соединение ибупрофен, визуализируем его и опишем правило Лепински(насколько соединение может быть эффективным лекарством для аборального приема)

In [2]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
In [5]:
import rdkit.Chem.Lipinski as Lipinksy
def checkLipinski (ibu):
    if  Lipinksy.NumHDonors(ibu)<=5 and Lipinksy.NumHAcceptors(ibu) <= 10 and Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu) < 500  and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0] <=5:
        return True
    else:
        return False

Создадим основу для будующих лекарств, которые будут образовываться по реакции клик-химии

In [6]:
ibu_mod=Chem.MolFromSmiles('N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
ibu_mod1 = 'N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O'
AllChem.Compute2DCoords(ibu_mod)
display(ibu_mod)

Отфильтруем полученные из базы данных pubchem молекулы, оставив только содержащие ровно одну молекулу формулу не длиннее 30, а затем проведем с ними химическую реакцию.

In [7]:
import pubchempy
In [8]:
strings=np.genfromtxt('smiles.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])
len(smiles)
Out[8]:
705
In [10]:
candidate_drugs = []

for smi in smiles[:15000]:
    if 'N=[N+]=[N-]' in smi:
        newsmi=smi.replace('N=[N+]=[N-]',ibu_mod1)
    else:
        continue
   
# Новую молекулу лучше создавать в try из-за битых  Smiles
    try:
        newmol=Chem.MolFromSmiles(newsmi) 
        if checkLipinski(newmol) == True:
            candidate_drugs.append(newsmi)
    except:
        pass
len(candidate_drugs)
Out[10]:
527

Визуализируем несколько кандидатов в лекарство

In [24]:
from IPython.display import SVG
from random import sample

samplelist = sample(candidate_drugs, 9)

for m in samplelist:
    AllChem.Compute2DCoords(m)
pil = Draw.MolsToGridImage(samplelist, useSVG=True, molsPerRow=3, maxMols=9, subImgSize=(350, 350))

display(pil)
N N O O N N N O OH O O O O O H2N N N N O OH N NH N N N O OH NH2 P S H2N N N N O OH N O O N N N O OH N N O N N N O OH HO N N N O HO N N NH N N N O OH Se N N N O OH

Изучим карту схожести ибупрофена с пятым веществом из списка

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

fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, \
   candidate_drugs[4], SimilarityMaps.GetMorganFingerprint)
maxweight
Out[27]:
0.19088766692851533

3D визуализация молекулы. NGLviewer несовместим с моей версией питона, так что я воспользовался PyMOL для визуального отображения структуры этой молекулы, полученной с этого https://cactus.nci.nih.gov/translate/ веб-ресурса

In [28]:
m = candidate_drugs[4]
m3d=Chem.AddHs(m)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
m3d
Out[28]:
In [41]:
smiles_to_pymol = Chem.MolToSmiles(m3d)
with open('my_mol.smi', 'w') as file:
    file.write(smiles_to_pymol)
In [31]:
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]

import pymol
pymol.finish_launching()

from pymol import cmd
In [43]:
cmd.do("""
reini
bg_color white

""")
cmd.load('mol.pdb')
cmd.turn('y', -30)
cmd.turn('z', 20)
cmd.set('ray_trace_mode', 1)
cmd.png('mol.png', '1920', '1080', ray=1)
Image('mol.png', retina=True)
Out[43]: