Цель занятия - предложить аналог ибупрофена.
#Импортируем необходимые модули
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: [17:09:33] 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
#импортируем модуль для взаимодействия с PubChem
import pubchempy as pcp
structures = []
per_page = 10**5
#ищем структуры, содержащие N=N=N, NN#N в качестве подструктур
for smiles in ["N=N=N", "NN#N"]:
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 1 of NN#N search
compounds = {str(i['CID']).strip():i['CanonicalSMILES'].strip() for i in structures}
#переводим находки в список их SMILES
smiles = list(compounds.values())
len(structures)
1601375
#модифицируем ибупрофен и проверяем, удовлетворяет ли молекула правилу Липински
res = []
for smi in smiles[:1500]:
if "N=[N+]=[N-]" in smi:
newsmi=smi.replace('N=[N+]=[N-]', 'N1N=NC=C1C(C(O)=O)C(C=C1)=CC=C1CC(C)C') #модифицированный smiles ибупрофена
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)
except Exception:
pass
RDKit ERROR: [17:21:15] Explicit valence for atom # 8 Cl, 3, is greater than permitted
Вот такие молекулы получились. Ниже некоторые примеры.
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)))
#совмещаем новую структуру со структурой обычного ибупрофена
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(res[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[4], SimilarityMaps.GetMorganFingerprint)
Как видно на карте "основная часть" ибупрофена сохранилась.
#получим 3D-структуру
m3d=Chem.AddHs(res[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)
import nglview as nv
nv.show_rdkit(m3d) # к сожалению, виджет не загрузжается в HTML формате
Тут ссылка на ноутбук на кодомо. Можно покрутить получившуюся молекулу. https://kodomo.fbb.msu.ru/jupyter/hub/user-redirect/lab/tree/term8/HW2_Nesterenko.ipynb