Загрузка модулей conda и rdkit.
conda install -c rdkit rdkit
conda install -c jirinovo pubchempy
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
Изобразим молекулу ибупрофена.
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 Lipinsky
def lipinsky_check(molecule):
if ((Lipinsky.NumHDonors(molecule) <= 5) \
and (Lipinsky.NumHAcceptors(molecule) <= 10) \
and (Lipinsky.rdMolDescriptors.CalcExactMolWt(molecule) < 500) \
and (Lipinsky.rdMolDescriptors.CalcCrippenDescriptors(molecule)[0] <= 5)):
return True
else:
return False
lipinsky_check(ibu)
Необходимые условия выполнены.
Модифицируем ибупрофен.
#template_smiles = 'CC(C)CC1=CC=C(C=C1)C(C)C(=O)N=[N+]=[N-]'
template_smiles = 'N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O'
template = Chem.MolFromSmiles(template_smiles)
AllChem.Compute2DCoords(template)
display(template)
print(template)
Далее в базе Pubchem был произведён поиск вручную радикалов с азидом, удовлетворяющих правилу Липинского. Отфильтруем скачанные SMILES.
strings = np.genfromtxt('result.txt', dtype = np.str)
smiles = []
for line in strings:
if (len(line[1]) < 30) and not ('.' in line[1]):
smiles.append(line[1])
len(smiles)
Построим новые молекулы и отфильтруем их.
new_smiles = []
for smi in smiles:
if 'N=[N+]=[N-]' in smi:
newsmile = smi.replace('N=[N+]=[N-]', template_smiles)
#print(newsmile)
try:
newsmi = Chem.MolFromSmiles(newsmile)
#print(newsmi)
if lipinsky_check(newsmi):
new_smiles.append(newsmi)
except Exception:
pass
else:
continue
len(new_smiles)
Chem.Draw.MolsToGridImage(new_smiles[20:40], molsPerRow=4, subImgSize=(300, 300))
Сравним 5-ую производную с ибупрофеном.
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(new_smiles[5], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, new_smiles[5], SimilarityMaps.GetMorganFingerprint)
Построим 3D-структуру.
m3d=Chem.AddHs(new_smiles[5])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=300)
m3d
Загрузка NGL viewer.
conda install -c omnia nglview
import nglview as nv
nv.show_rdkit(m3d)
#conda install jupyter_core notebook nbconvert ipykernel ipywidgets
to_pymol = Chem.MolToSmiles(m3d)
with open('ibu_modif.smi', 'w') as file:
file.write(to_pymol)
import subprocess
subprocess.run('obgen ibu_modif.smi > new_mol.mol', shell = True)
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]
import pymol
pymol.finish_launching()
from pymol import cmd,stored
from IPython.display import Image
import time
import sys
cmd.reinitialize()
cmd.load('new_mol.mol', 'structure')
cmd.do('''
bg_color white
util.cbaw
set ray_trace_mode, 3
set ray_opaque_background, 0
''')
cmd.png('ibu_modif.png')
time.sleep(3)
Image(filename='ibu_modif.png')