Устанавливаем необходимые модули в командной строке:
conda install -c rdkit rdkit
conda install -c jirinovo pubchempy
Активируем модули:
import rdkit
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 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
ibu=Chem.MolFromSmiles('C#CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
new_ibu=Chem.MolFromSmiles('N1C=C(N=N1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(new_ibu)
display(new_ibu)
Теперь загрузим структуры из PubChem, содержащие азидную группу, с помощью модуля PubChemPy:
import pubchempy as pcp
C:\ProgramData\Anaconda\lib\site-packages\PubChemPy-1.0.3-py3.6.egg\pubchempy.py:360: SyntaxWarning: "is not" with a literal. Did you mean "!="? C:\ProgramData\Anaconda\lib\site-packages\PubChemPy-1.0.3-py3.6.egg\pubchempy.py:360: SyntaxWarning: "is not" with a literal. Did you mean "!="?
compounds = []
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))
compounds.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 Retrieved page 1 of N#NN search
Построим и отфильтруем новые молекулы:
comp = {str(i['CID']).strip():i['CanonicalSMILES'].strip() for i in compounds}
smiles = list(comp.values())
final = []
for smi in smiles:
if len(final) == 20:
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)
final.append(newmol)
except:
pass
Полученный набор молекул:
Chem.Draw.MolsToGridImage(final, molsPerRow=5, subImgSize=(300, 300))
Построим Similiraty Map ибупрофена с пятым веществом из массива. Зелеными кругами отмечена общая часть из исходной полекулы ибупрофена, также есть довесок из соединения из массива:
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(final[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(new_ibu, final[4], SimilarityMaps.GetMorganFingerprint)
Построим 3D-структуру полученного соединения:
new_ibu = Chem.AddHs(final[4])
Chem.AllChem.EmbedMolecule(new_ibu)
AllChem.MMFFOptimizeMolecule(new_ibu, maxIters = 500, nonBondedThresh = 200)
new_ibu
Загрузка NGL viewer:
conda install -c omnia nglview
import nglview as nv
nv.show_rdkit(new_ibu)
Не отображается при переходе в html, но в исходном ноутбуке выглядело так:
Image('1.png')