Цель занятия: используя пакет модулей RDkit, предложить аналог ибупрофена :
1) На сайте PubChem найти все радикалы c азидом для Click Chemistry и скачать их SMILES нотации или используйте pubchempy
2) Найти формулу ибупрофена и предложить способ изменения его SMILES для эмуляции продукта Click Chemistry
3) Заменить в найденых радикалах азидную группу на модифцированный ибупрофен.
4) Превратить новые SMILES в объекты-молекулы
5) Отобрать те молекулы, которые удовлетворяют правилу пяти Lepinsky
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: [14:11:02] Enabling RDKit 2019.09.3 jupyter extensions
#рисуем ибупрофен
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
print(Lipinksy.NumHDonors(ibu))
print(Lipinksy.NumHAcceptors(ibu))
print(Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu))
print(Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0])
1 1 206.130679816 3.073200000000001
import pubchempy as pcp
#скачаем smiles некоторых азидов из pubchem
compounds = []
per_page = 10
for smiles in ["N=N=N", "NN#N", "[N-][N+]#N", "N=[N+]=[N-]"]:
for i in range(10):
try:
a = pcp.get_properties(
properties="CanonicalSMILES",
identifier=smiles, namespace="smiles",
searchtype="substructure",
RingsNotEmbedded=True,
listkey_count=per_page, listkey_start=i*per_page
)
compounds.extend(a)
except:
print("Failed")
print("Retrieved page {} of {} search".format(i+1, smiles))
Retrieved page 1 of N=N=N search Retrieved page 2 of N=N=N search Retrieved page 3 of N=N=N search Retrieved page 4 of N=N=N search Retrieved page 5 of N=N=N search Retrieved page 6 of N=N=N search Retrieved page 7 of N=N=N search Retrieved page 8 of N=N=N search Retrieved page 9 of N=N=N search Retrieved page 10 of N=N=N search Retrieved page 1 of NN#N search Retrieved page 2 of NN#N search Retrieved page 3 of NN#N search Retrieved page 4 of NN#N search Retrieved page 5 of NN#N search Retrieved page 6 of NN#N search Retrieved page 7 of NN#N search Retrieved page 8 of NN#N search Retrieved page 9 of NN#N search Retrieved page 10 of NN#N search Retrieved page 1 of [N-][N+]#N search Retrieved page 2 of [N-][N+]#N search Retrieved page 3 of [N-][N+]#N search Retrieved page 4 of [N-][N+]#N search Retrieved page 5 of [N-][N+]#N search Retrieved page 6 of [N-][N+]#N search Retrieved page 7 of [N-][N+]#N search Retrieved page 8 of [N-][N+]#N search Retrieved page 9 of [N-][N+]#N search Retrieved page 10 of [N-][N+]#N search Retrieved page 1 of N=[N+]=[N-] search Retrieved page 2 of N=[N+]=[N-] search Retrieved page 3 of N=[N+]=[N-] search Retrieved page 4 of N=[N+]=[N-] search Retrieved page 5 of N=[N+]=[N-] search Retrieved page 6 of N=[N+]=[N-] search Retrieved page 7 of N=[N+]=[N-] search Retrieved page 8 of N=[N+]=[N-] search Retrieved page 9 of N=[N+]=[N-] search Retrieved page 10 of N=[N+]=[N-] search
#нам нужны только smiles, оставим их и выкинем дубликаты
my_smiles_full = [i['CanonicalSMILES'] for i in compounds]
my_smiles = list(set(my_smiles_full))
print(len(my_smiles), len(my_smiles_full))
196 400
#аналог ибупрофена с тройной связью для последующей клик-реакции может выглядеть, например, так
ibu3=Chem.MolFromSmiles('C#CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu3)
display(ibu3)
#тогда в реакции с азидом получится
ibu_az=Chem.MolFromSmiles('N1C=C(N=N1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu_az)
display(ibu_az)
template = 'N1C=C(N=N1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O'
#проверяем, что в smiles действительно есть азидная группа и заменяем её нашей молекулой, получим новую молекулу в виде smiles
#и проверим для неё выполнение правил Лепински
my_molecules = []
for smi in my_smiles:
if "N=[N+]=[N-]" in smi:
newsmi=smi.replace('N=[N+]=[N-]', template)
else:
continue
try:
newmol=Chem.MolFromSmiles(newsmi)
hdonors = Lipinksy.NumHDonors(newmol)
hacceptors = Lipinksy.NumHAcceptors(newmol)
molwt = Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol)
logp = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(newmol)[0]
if (hdonors <= 5) and (hacceptors <= 10) and (molwt <= 500) and (logp <= 5):
my_molecules.append(newmol)
except:
pass
#осталось 28 молекул
len(my_molecules)
28
#нарисуем их
from IPython.display import SVG
Draw.MolsToGridImage(my_molecules, useSVG=True, molsPerRow=3, subImgSize=(300, 200))
#построим Similiraty Map ибупрофена с пятым веществом из массива
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(my_molecules[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, my_molecules[4], SimilarityMaps.GetMorganFingerprint)
#попробуем нарисовать полученную молекулу в 3D
m3d=Chem.AddHs(my_molecules[4]) #добавление водородов
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200) #оптимизация геометрии
0
import nglview as nv
#первая конформация нашего лиганда, в html не видно, но на kodomo отображается
nv.show_rdkit(m3d)