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: [19:33:48] Enabling RDKit 2019.09.3 jupyter extensions
Задание заключается в том, чтобы с помощью пакета модулей RDkit предложить аналог ибупрофена, который можно получить посредством реакций клик-химиии. Одна из наиболее используемых клик-реакций — азид-алкиновое циклоприсоединение. Это реакция между азидами и алкинами с образованием 1,2,3-триазолов. Таким образом, сначала необходимо ввести в структуру ибупрофена алкильный радикал, и далее в результате взаимодействия такого модифицированного ибупрофена с веществом содержащим азид, получается продукт клик-реакции.
Вначале посмотрим на структуру самого ибупрофена:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
Теперь попробуем модифицировать структуру так, чтобы она напоминала продукт клик-химии.
mod_ibu=Chem.MolFromSmiles('N1N=NC(=C1)C1=CC(CC(C)C)=CC=C1(C(C)C(=O)O)')
AllChem.Compute2DCoords(mod_ibu)
display(mod_ibu)
template = 'N1N=NC(=C1)C1=CC(CC(C)C)=CC=C1(C(C)C(=O)O)'
Посчитаем параметры для правила Лепински для ибупрофена.
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
С помощью модуля pubchempy загрузим структуры с азидной группой из PubChem.
import pubchempy as pcp
compounds = []
per_page = 10**5
for smiles in ["N=N=N", "NN#N", "N#NN"]:
for i in range(200):
try:
a = pcp.get_properties(
properties="CanonicalSMILES",
identifier=smiles, namespace="smiles",
searchtype="substructure",
RingsNotEmbedded=True,
listkey_count=per_page, listkey_start=i*per_page
)
except:
break
print("Retrieved page {} of {} search".format(i+1, smiles))
compounds.extend(a)
Retrieved page 1 of N=N=N search Retrieved page 1 of NN#N search Retrieved page 1 of N#NN search
Отфильтруем новые молекулы.
Согласно правилу Липински (или правилу пяти) вещество, кандидат на лекарство, должно обладать следующими свойствами:
comp = {str(i['CID']).strip():i['CanonicalSMILES'].strip() for i in compounds}
smiles = list(comp.values())
Отберем 20 кандидатов.
final = []
for smi in smiles:
if len(final) == 20:
break
if 'N=[N+]=[N-]' in smi:
newsmi=smi.replace('N=[N+]=[N-]',template)
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):
AllChem.Compute2DCoords(newmol)
final.append(newmol)
except:
pass
Chem.Draw.MolsToGridImage(final, molsPerRow=5, subImgSize=(300, 300))
Построим Similiraty Map ибупрофена с пятым веществом из массива. Зелеными кругами отмечена общая часть из исходной полекулы ибупрофена.
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(final[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, final[4], SimilarityMaps.GetMorganFingerprint)
Посмотрим на 3Д структуру этого соединения.
new_ibu = Chem.AddHs(final[4])
Chem.AllChem.EmbedMolecule(new_ibu)
AllChem.MMFFOptimizeMolecule(new_ibu, maxIters = 500, nonBondedThresh = 200)
new_ibu
Использемм nglviewer.
import nglview as nv
nv.show_rdkit(new_ibu)