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
import pandas as pd
from IPython.display import display,Image
RDKit WARNING: [22:51:32] 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
Предложим способ изменения его SMILES для эмуляции продукта Click Chemistry:
ibu=Chem.MolFromSmiles('C#CC(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)
Загрузим PubChemPy и найдем азиды в базе данных:
import 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
Объединим SMILES в список:
compounds = {str(i['CID']).strip():i['CanonicalSMILES'].strip() for i in structures}
smiles = list(compounds.values())
len(smiles)
1701347
Из всех SMILES отберем те, которые после присоединения к ним модифицированного ибупрофена удовлетворяют 5 условиям Лепински. Отобразим первые 30 соединений:
res = []
for smi in smiles:
if len(res) > 30:
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
display(Draw.MolsToGridImage(res, useSVG=True, molsPerRow=3, subImgSize=(300, 200)))
Построим SimilarityMap ибупрофена с пятым веществом из нашего массива:
from rdkit.Chem.Draw import SimilarityMaps
ibu = Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
fp = SimilarityMaps.GetMorganFingerprint(res[5], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[5], SimilarityMaps.GetMorganFingerprint)
Построим 3D структуру лиганда:
m3d = Chem.AddHs(res[5])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)