Используя пакет модулей RDkit, попробуем предложить аналог ибупрофена. Для этого нужно:
1) на сайте PubChem найти все радикалы c азидом для Click Chemistry и скачать их SMILES нотации
2) Найти формулу ибупрофена и предложить способ изменения его SMILES для эмуляции продукта Click Chemistry
3) Заменить в найденых радикалах азидную группу на модифцированный ибупрофен.
4) Превратить новые SMILES в объекты-молекулы
5) Отобрать те молекулы, которые удовлетворяют правилу пяти Lepinsky
Загрузим модули RDkit
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)
#Удалим изопропил и сделаем тройную связь
test_template=Chem.MolFromSmiles('C#CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(test_template)
display(test_template)
#Добавим ароматическое кольцо
template=Chem.MolFromSmiles('N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(template)
display(template)
#Будем использовать это соединение дальше
Посчитаем параметры для правила Лепински
import rdkit.Chem.Lipinski as Lipinksy
print Lipinksy.NumHDonors(template)
print Lipinksy.NumHAcceptors(template)
print Lipinksy.rdMolDescriptors.CalcExactMolWt(template)
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(template)[0]
Загрузим скаченные данные и отфильтруем
strings=np.genfromtxt('pubchem.txt',dtype=np.str)
smiles = []
for line in strings:
if len(line[1]) < 30 and not '.' in line[1]:
smiles.append(line[1])
Пстроим новые молекулы и отфильтруем
mols = []
n = 1
for smi in smiles:
if 'N=[N+]=[N-]' in smi:
newsmi=smi.replace('N=[N+]=[N-]','N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O')
else:
continue
# Новую молекулу лучше создавать в try из-за битых Smiles
try:
newmol=Chem.MolFromSmiles(newsmi)
don = Lipinksy.NumHDonors(newmol)
acc = Lipinksy.NumHAcceptors(newmol)
mass = Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol)
crip = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(newmol)[0]
if don <= 3 and don >=2 and acc <= 6 and acc >= 2 and mass <= 300.0 and mass >= 200.0 and crip <= 3.5:
print n
mols.append(newmol)
AllChem.Compute2DCoords(newmol)
display(newmol)
n = n + 1
except:
pass
print len(mols)
Пострим 3D модель для 125 соединения
m3d=Chem.AddHs(mols[124])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
import nglview as nv
nv.show_rdkit(m3d)