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
Рассмотрим соединение ибупрофен, визуализируем его и опишем правило Лепински(насколько соединение может быть эффективным лекарством для аборального приема)
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
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
Создадим основу для будующих лекарств, которые будут образовываться по реакции клик-химии
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, а затем проведем с ними химическую реакцию.
import pubchempy
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)
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)
Визуализируем несколько кандидатов в лекарство
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)
Изучим карту схожести ибупрофена с пятым веществом из списка
from rdkit.Chem.Draw import SimilarityMaps
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, \
candidate_drugs[4], SimilarityMaps.GetMorganFingerprint)
maxweight
3D визуализация молекулы. NGLviewer несовместим с моей версией питона, так что я воспользовался PyMOL для визуального отображения структуры этой молекулы, полученной с этого https://cactus.nci.nih.gov/translate/ веб-ресурса
m = candidate_drugs[4]
m3d=Chem.AddHs(m)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
m3d
smiles_to_pymol = Chem.MolToSmiles(m3d)
with open('my_mol.smi', 'w') as file:
file.write(smiles_to_pymol)
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd
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)