Цель этой работы было найти аналог ибупрофена (нестероидного противовоспалительного лекарственного средства), используя пакет моудлей RDkit. На сайте PubChem я нашла все радикалы c азидом для Click Chemistry и скачала их SMILES нотации.
Далее по SMILES нарисуем ибупрофен.
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)
Посчитаем параметры для правила Лепински: количество доноров и акцепторов водородной связи, молекулярная масса, гидрофобность (logP).
import rdkit.Chem.Lipinski as Lipinksy
print Lipinksy.NumHDonors(ibu)
print Lipinksy.NumHAcceptors(ibu)
print Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu)
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0]
Построим струтуру модифицированного ибупрофена и шаблона, из которого будем получать производные:
mod_ibu=Chem.MolFromSmiles("C#CC1=CC=C(C=C1)C(C)C(=O)O")
AllChem.Compute2DCoords(mod_ibu)
display(mod_ibu)
template = "N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1"
ibu_cycle=Chem.MolFromSmiles(template)
AllChem.Compute2DCoords(ibu_cycle)
display(ibu_cycle)
Загрузим скаченные данные с радикалами с азидом и отфильтруем
strings=np.genfromtxt('1284171488468159250.txt',dtype=np.str)
smiles=[]
for line in strings:
if len(line[1]) < 30 and not '.' in line[1]:
smiles.append(line[1])
print len(smiles)
Всего SMILES структур с азидными радикалами было найдено 10 747.
Теперь заменим в найденых радикалах азидную группу на модифцированный ибупрофен, а полученные новые SMILES превратим в объекты-молекулы. Далее сохраним только те, которые удовлетворяют правилу пяти Lepinsky (параметр гидрофобности молекулы меньше 5).
good_new_smiles=[]
N=1
for smi in smiles[:10747]:
azid = 'N=[N+]=[N-]'
ibu_azid = "C-N(N=N1)C=C1-C1=CC=C(C=C1)C(C)C(=O)O"
if azid in smi:
newsmi=smi.replace(azid, ibu_azid)
else:
continue
try:
newmol=Chem.MolFromSmiles(newsmi)
if (Lipinksy.NumHDonors(newmol) <= 5) and (Lipinksy.NumHAcceptors(newmol) <= 10) and (Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol) <= 500) and (Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(newmol)[0] <= 5):
good_new_smiles.append(newsmi)
AllChem.Compute2DCoords(newmol)
#print N
N=N+1
#print newsmi
#display(newmol)
except:
pass
last=newmol
old_smi_last=smi
new_smi_last=newsmi
len(good_new_smiles)
Производных ибупрофена, удовлетворяющих правилу пяти Lepinsky и имеющих не "битый" SMILES, было моделировано 7 114 штук.
Ниже визуализировано последнее производное ибупрофена.
display(last)
print old_smi_last+" -> "+new_smi_last
print "Lipinksy hydrofobic parameter: "
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(last)[0]
m3d=Chem.AddHs(newmol)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
import nglview as nv
nv.show_rdkit(m3d)
from IPython.display import Image
Image(filename='3D_str.png')