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: [16:59:29] Enabling RDKit 2019.09.3 jupyter extensions
Нарисуем ибупрофен и проверим на правила Лепински:
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 ибупрофена для проведения клик-реакции (то есть добавим тройную связь)
libu=Chem.MolFromSmiles('C#CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(libu)
display(libu)
После реакции он будет таким:
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.
import pubchempy as pcp
structures = []
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))
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 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 = list(compounds.values())
Найдем такие структуры, которые после присоединения к ним ибупрофена удовлетворяют 5 правилам Лепински.
res = []
for smi in smiles:
if len(res) > 25:
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
from IPython.display import display
to_print = [res[0], res[5], res[8], res[13], res[17], res[20], res[22], res[23], res[25]]
display(Draw.MolsToGridImage(to_print, useSVG=True, molsPerRow=3, subImgSize=(300, 200)))
Построим Similiraty Map ибупрофена с одним из соединений.
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(res[3], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[3], SimilarityMaps.GetMorganFingerprint)
Добавился крупный довесок, способный образовывать H-связи.
import nglview as nv
m3d=Chem.AddHs(res[3])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)
view = nv.show_rdkit(m3d)
view