from IPython.display import Image, display
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import RDConfig
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import Draw, Lipinski
import numpy as np
from IPython.display import display,Image
Правило 5 Лепински:
def lipinski_rule(smiles):
don = Lipinski.NumHDonors(smiles) < 5
acc = Lipinski.NumHAcceptors(smiles) < 10
wgt = Lipinski.rdMolDescriptors.CalcExactMolWt(smiles) < 500
des = Lipinski.rdMolDescriptors.CalcCrippenDescriptors(smiles)[0] < 5
return all([don, acc, wgt, des])
Нарисуем ибупрофен:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
Сделаем производное ибупрофена для клик-химии
nnn_ibu=Chem.MolFromSmiles('CC(C)Cc1ccc(cc1)[C@@](C)(C1=CN=NN1)C(=O)O') # SMILES с википедии =)
AllChem.Compute2DCoords(nnn_ibu)
display(nnn_ibu)
# Хотя от механизма реакции зависит, какое стереопроизводное будет в результате получения.
# Дальше лучше буду рисовать без этой информации.
Перевернем его для удобного использвания дальше
templ = Chem.MolFromSmiles('N1N=NC(=C1)C(C(O)=O)(C)C1=CC=C(C=C1)CC(C)C')
AllChem.Compute2DCoords(templ)
display(templ)
Идем в PubChem https://pubchem.ncbi.nlm.nih.gov/search/search.cgi и ищем поиском Substructure search (33558).
Скачали данные в формате SMILES
import pandas as pd
smiles = pd.read_csv("./4432027415351750751.txt", sep="\t", header=None, names=["id", "SMILES"])
smiles.head(3)
len(smiles)
smiles = smiles["SMILES"]
condition = smiles.apply(lambda x: '.' not in x) &\
smiles.apply(lambda x: len(x) < 30)
targets = smiles[condition].reset_index(drop=True)
targets
azides = [Chem.MolFromSmiles('N=[N+]=[N-]'),
Chem.MolFromSmiles('N=[N+]=[NH]')]
mods = []
for smile in smiles:
if "N=[N+]=[N-]" in smile: # cheers =)
smile = smile.replace("N=[N+]=[N-]", 'N1N=NC(=C1)C(C(O)=O)(C)C1=CC=C(C=C1)CC(C)C')
else:
continue
try:
mol = Chem.MolFromSmiles(smile)
if lipinski_rule(mol):
mods.append(mol)
except:
pass
len(mods)
Молекул набралось немало! Это отлично.
Отрисуем несколько (64):
Draw.MolsToGridImage(mods[:64], molsPerRow=8, subImgSize=(150, 150))
mods[5]
Ну и теперь посчитаем сходство пятой молекулы из полученных с исходной молекулой
from rdkit.Chem.Draw import SimilarityMaps
similarity = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, mods[4], SimilarityMaps.GetMorganFingerprint)
similarity[1]
Вес маловат, сходство небольшое
Попробуем понять, что это значит, сравнив исходники друг с другом
similarity = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, templ, SimilarityMaps.GetMorganFingerprint)
similarity[1]
similarity = SimilarityMaps.GetSimilarityMapForFingerprint(templ, nnn_ibu, SimilarityMaps.GetMorganFingerprint)
similarity[1]
Тут вес почему-то даже меньше, чем в предыдущем случае, странно.
Теперь посмотрим в 3D
m3d = Chem.AddHs(mods[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d, maxIters=500, nonBondedThresh=200)
display(m3d)
Странно выглядящая 2D-проекция одной из конформаций молекулы.
nglview
установить не удалось =(
Сохраню результаты:
import pickle
with open('mod5.pkl', 'wb') as modfile:
pickle.dump(m3d, modfile)
Поменяю ядро и загружусь
import pickle
with open('mod5.pkl', 'rb') as modfile:
m3d = pickle.load(modfile)
import nglview as nv
nv.show_rdkit(m3d)
view = nv.show_rdkit(m3d)
view
view.render_image()
view._display_image()
Все равно не работает =(((