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])
import pubchempy as pcp
Скачаем список азидов
compounds = []
per_page = 200
for smiles in ["N=N=N", "NN#N", "N=[N+]=[N-]"]:
for i in range(2):
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:
print('no')
print("Retrieved page {} of {} search".format(i+1, smiles))
compounds.extend(a)
compounds[0]['CanonicalSMILES']
Сохраним на всякий пожарный
# import json
# with open('compounds_.json', 'w') as file:
# json.dump(compounds, file)
import json
with open('compounds_.json', 'r') as file:
compounds = json.load(file)
templ = 'N1N=NC(C(C)CC2=CC=C(C=C2)C(C)C(=O)O)=C1'
template = Chem.MolFromSmiles(templ)
AllChem.Compute2DCoords(template)
display(template)
smiles_transform = []
smm = []
for k in compounds:
smm.append(k['CanonicalSMILES'])
for s in smm:
for a in ["N=[N+]=[N-]", "N=N=N", "NN#N"]:
if a in s:
new = s.replace(a, templ)
smiles_transform.append(new)
else:
continue
Создадим функцию, проверяющую соответствие правилу Липински, и отсортируем:
def lipinsky_rule(inp):
if Lipinksy.NumHDonors(inp) <= 5 and Lipinksy.NumHAcceptors(inp) <= 10 and Lipinksy.rdMolDescriptors.CalcExactMolWt(inp) < 500 and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(inp)[0] <= 5:
return True
lipinsky_rule(ibu)
final = []
for sm in smiles_transform:
try:
new = Chem.MolFromSmiles(sm)
if lipinsky_rule(new) == True:
final.append(new)
except:
pass
По какой-то причине сессия жупитера прерывается, когда я пытаюсь запустить ячейку выше, чтобы отсортировать данные по правилу Лепински, это происходит как на больших массивах, так и на маленьких, kernel вылетает(
from IPython.display import SVG
for s in final:
AllChem.Compute2DCoords(s)
display(Draw.MolsToGridImage(final[:6],useSVG=True, molsPerRow=3, subImgSize=(200, 200)))
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(final[5], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, final[5], SimilarityMaps.GetMorganFingerprint)
m3d=Chem.AddHs(m2d)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
import nglview as nv
nv.show_rdkit(m3d)