загрузим модули RDkit

In [210]:
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

визуализируем ибупрофен:

In [211]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)

посчитаем параметры для правила лепински и проверим, удовлетворяет ли ему ибупрофен

In [212]:
import rdkit.Chem.Lipinski as Lipinksy
def checkLipinski (ibu):
    if  Lipinksy.NumHDonors(ibu)<=5 and Lipinksy.NumHAcceptors(ibu) <= 10 and Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu) < 500  and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0] <=5:
        return True
    else:
        return False

изменим формулу ибупрофена и получим шаблон для замены азидного радикала, имитируя реакцию Click-химии:

In [213]:
ibu_mod=Chem.MolFromSmiles('N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
ibu_mod1 = 'N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O'
AllChem.Compute2DCoords(ibu_mod)
display(ibu_mod)

загрузим список азидов из PubChem

Substructure/superstructure, идем в CID,SMILES/SMARTS,InChi, вбиваем 33558, в Options выбираем Substructure. К полученным результатам прибавляем условия и получаем команду:

148 OR #149 OR #150 OR #151 OR #152 OR #153 OR #154 OR #155 OR #156 OR #157 OR #158 OR #159 OR #160 OR #161 OR #162 OR #163 OR #164 OR #165 AND (lipinski_rule_of_5[filt]) AND (pccompound_pcassay[filt])

69448 результатов

отфильтруем скачанные данные

In [214]:
strings=np.genfromtxt('3275445470557341278.txt',dtype=np.str)
smiles = []
for line in strings:
    if len(line[1]) < 30 and  len(line[1]) > 11 and not '.' in line[1]:
        smiles.append(line[1])
len(smiles)
Out[214]:
2281

замещаем азид на ибупрофен. на вход подаются 2281 формулы азидов

In [215]:
# Новую молекулу лучше создавать в try из-за битых  Smiles
mass = []
for smi in smiles:
    if 'N=[N+]=[N-]'  in smi:
        newsmi=smi.replace('N=[N+]=[N-]',ibu_mod1)
    else:
        continue
    try:
        newmol=Chem.MolFromSmiles(newsmi)
        if checkLipinski(Chem.MolFromSmiles(newsmi)):
            mass.append(newsmi)
    except Exception:
            pass 
print(len(mass))
94

посмотрим на некоторые из отфильтрованных компонент

In [216]:
from random import sample
samplelist = []
for item in sample(mass, 10):
    samplelist.append(Chem.MolFromSmiles(item))
Chem.Draw.MolsToGridImage(samplelist,useSVG=True, molsPerRow=3, subImgSize=(300, 300))
Out[216]:
NH S O O N N N O OH F N N N O HO S N NH N N N N O OH N N N N N O OH OH N N N O OH O O N N N O OH N N N O OH O N N N O OH N N N O OH O O N O N N N N O HO

нужно построить Similarity Map ибупрофена с пятым веществом из массива

In [217]:
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(ibu, fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu,  samplelist[4], SimilarityMaps.GetMorganFingerprint)

построим трехмерную структуру полученной молекулы

In [218]:
m3d=Chem.AddHs(samplelist[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
Out[218]:
0
In [219]:
m3d
Out[219]:

покажем первую конформацию лиганда

In [241]:
import nglview as nv
import ipywidgets
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-241-bdeda24d8fe6> in <module>
----> 1 import nglview as nv
      2 import ipywidgets
      3 
      4 

~\Miniconda3\lib\site-packages\nglview\__init__.py in <module>
     35 # interface
     36 from .config import BACKENDS
---> 37 from .widget import NGLWidget
     38 from .base_adaptor import *
     39 from .adaptor import *

~\Miniconda3\lib\site-packages\nglview\widget.py in <module>
      7 import numpy as np
      8 from IPython.display import display
----> 9 from ipywidgets import DOMWidget, widget_image
     10 from traitlets import (Unicode, Bool, Dict, List, Int, Integer, observe,
     11                        CaselessStrEnum)

~\Miniconda3\lib\site-packages\ipywidgets\widget_image.py in <module>
      9 import base64
     10 
---> 11 from .domwidget import DOMWidget
     12 from .widget import register
     13 from traitlets import Unicode, CUnicode, Bytes, observe

~\Miniconda3\lib\site-packages\ipywidgets\domwidget.py in <module>
      6 from traitlets import Unicode, Dict, Instance, Bool, List, \
      7     CaselessStrEnum, Tuple, CUnicode, Int, Set, observe
----> 8 from .widget import Widget, widget_serialization
      9 from .trait_types import Color
     10 from .widget_layout import Layout

ModuleNotFoundError: No module named 'ipywidgets.widget'

в общем, widget_image,например, не работал, кажется, его просто нет на гитхабе на данный момент, а nglview его требует. сама скачала из интернета и положила в папочку. но тут все очень сложно со структурой оказалось