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
Рисуем ибупрофен и проверяем, проходит ли он 5 правил Лепински (проходит)
import rdkit.Chem.Lipinski as Lipinksy
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
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
Изменим SMILES ибупрофена так, чтобы с ним можно было провести реакцию клик-химии (то есть добавим тройную связь)
ibu=Chem.MolFromSmiles('C(C#C)(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
В результате клик-реакции получим следующее соединение
ibu=Chem.MolFromSmiles('N1C=C(N=N1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
Теперь скачаем из pubchem соединения, содержащие азидную группу (то есть способные вступить в клик-реакцию с модифицированным ибупрофеном). Для этого мы используем модуль pubchempy
ibu=Chem.MolFromSmiles('N[C@H](C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
import pubchempy as pcp
structures = []
per_page = 10**5
#Ищем структуры, содержащие N=N=N, NN#N или N#NN в качестве подструктур
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))
structures.extend(a)
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 11 of N=N=N search Retrieved page 12 of N=N=N search Retrieved page 13 of N=N=N search Retrieved page 14 of N=N=N search Retrieved page 15 of N=N=N search Retrieved page 16 of N=N=N search Retrieved page 17 of N=N=N search Retrieved page 18 of N=N=N search Retrieved page 19 of N=N=N search Retrieved page 1 of NN#N search Retrieved page 1 of N#NN search
compounds = {str(i['CID']).strip():i['CanonicalSMILES'].strip() for i in structures}
#переводим находки в список их SMILES
smiles = list(compounds.values())
Далее ищем такие 15 структур, которые после присоединения к ним модифицированного ибупрофена удовлетворяют 5 правилам Лепински. Заменять решили группу =NN#N
res = []
for smi in smiles:
if len(res) > 15:
break
if '=N[N+]#N' in smi:
newsmi=smi.replace('=N[N+]#N','N1C=C(N=N1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
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)
res.append(newmol)
display(newmol)
except:
pass
Получили довольно громоздкий список разных причудливых соединений, который сложно целиком просмотреть. Для наглядного представления находок используем модуль IPython (с его помощью получаем картинку 3х3, представленную ниже, при этом отбирались самые "разумные" находки, не содержащие ибупрофен внутри цикла).
from IPython.display import display
to_print = [res[0], res[5], res[8], res[13]]
display(Draw.MolsToGridImage(to_print, useSVG=True, molsPerRow=3, subImgSize=(300, 200)))
Теперь оценим сходство одного из соединений с оригинальным ибупрофеном.
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(res[5], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[5], SimilarityMaps.GetMorganFingerprint)
Видим, что к исходной структуре добавился довесок, содержащий еще 2 азидные группы (которые потенциально могут провзаимодействовать с другими молекулами измененного ибупрофена)
Последним этапом изучим 3D структуру приведенного выше соединения. Для этого построим его модель на плоскости при помощи того же rdkit.
import nglview as nv
m3d=Chem.AddHs(res[5])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)
view = nv.show_rdkit(m3d)
view
nv.show_rdkit(m3d)