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 rdkit.Chem.Lipinski as Lipinksy
from IPython.display import display,Image
Цель занятия — используя пакет модулей RDkit предложить аналог ибупрофена:
# Search canonical SMILES for azide with pubchempy:
import pubchempy as pcp
# get_properties() allows the retrieval of specific properties without having to deal with entire compound records
# useful for retrieving the properties of a large number of compounds at once
# to avoid timeout_error use:
# the listkey_count value specifies the number of results per page
# the listkey_start value specifies which page to return
# specify PubChem search parameters RingsNotEmbedded, MatchTautomers, MatchCharges from deafault false to true
azide_radicales = []
start_page = 1
for smile in ['[N-]=[N+]=[N-]',
'[N-][N+]#[N]',
'[N]#[N+][N-]',
'[N-][N]#[N+]',
'[N+]#[N][N-]'
]:
start_page +=1
try:
# avoid exceptions on the server side
azide_radicales.append(pcp.get_properties('CanonicalSMILES', smile, 'smiles', searchtype='substructure',
RingsNotEmbedded=True, MatchTautomers=True,
listkey_count=100000, listkey_start=start_page))
except:
continue
# проверить количество найденных нотаций
azide_radicales = sum(azide_radicales, [])
azide_radicales = [x['CanonicalSMILES'] for x in azide_radicales]
len(azide_radicales)
# найти формулу ибупрофена
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
# измененить SMILES ибупрофена для эмуляции реагента Click Chemistry (азид-алкиновое циклоприсоединение):
# замена изопропила на ацетилен
ibu_edited=Chem.MolFromSmiles('C#CCC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu_edited)
display(ibu_edited)
# отфильтровать нотации найденных радикалов
smiles = []
for smile in set(azide_radicales):
if len(smile) < 30 and not '.' in smile:
smiles.append(smile)
# подготовить шаблон для построения новых молекул: соединение ибупрофена с азидом
template = 'N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O'
# построить из каждой нотации молекулу и проверить ее качество по правилу Липински
good_structures = []
for smile in smiles:
if 'N=[N+]=[N-]' in smile:
merged_structure = smile.replace('N=[N+]=[N-]', template)
try:
molecule = Chem.MolFromSmiles(merged_structure)
if(Lipinksy.NumHDonors(molecule) <= 5 and
Lipinksy.NumHAcceptors(molecule) <= 10 and
Lipinksy.rdMolDescriptors.CalcExactMolWt(molecule) < 500 and
Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(molecule)[0] <= 5):
good_structures.append(merged_structure)
except:
continue
else:
continue
print('Passed the test: %s good structures' % len(good_structures))
# отобразить несколько первых структур из найденных 7680
for molecule in good_structures[:10]:
display(Chem.MolFromSmiles(molecule))
# выбрать лиганд и показать его конформацию
m3d=Chem.AddHs(Chem.MolFromSmiles(good_structures[7]))
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
import nglview as nv
nv.show_rdkit(m3d)
%%bash
jupyter nbconvert --to html hw3_filippova.ipynb