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])
def lipinsky(smiles):
return (Lipinksy.NumHDonors(smiles),
Lipinksy.NumHAcceptors(smiles),
Lipinksy.rdMolDescriptors.CalcExactMolWt(smiles),
Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(smiles)[0])
def is_lipinsky(smiles, parameters=(5, 10, 500, 5)):
return all(i < j for i, j in zip(lipinsky(smiles), parameters))
is_lipinsky(ibu)
Займемся скачиванием азидов
import pubchempy as pcp
compounds = []
per_page = 1000
for smiles in ["N=[N+]=[N-]", "N=N=N", "NN#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 ('oh')
print ("Retrieved page {} of {} search".format(i+1, smiles))
compounds.extend(a)
Думаю, этого хватит.
smiles_list = [k['CanonicalSMILES'] for k in compounds] # просто поглядеть
smiles_list[:10]
Сохранила азиды в json и научилась извлекать оттуда на всякий случай (ох как помогло)
import json
with open('./term8/compounds.json', 'w') as f:
json.dump(compounds, f)
with open('compounds.json', 'r', encoding='utf-8') as f:
compounds = json.load(f)
print(compounds[0]) # поглядели
Прикинем template для эмуляции продукта Click Chemistry.
template = 'N1N=NC(=C1)C(C)(C(=O)O)C1=CC=C(C=C1)CC(C)C'
template_mol = Chem.MolFromSmiles('N1N=NC(=C1)C(C)(C(=O)O)C1=CC=C(C=C1)CC(C)C')
AllChem.Compute2DCoords(template_mol)
display(template_mol)
Пстроим новые smiles, затем молекулы; и отфильтруем
new_smiles = []
for smi in smiles_list:
for a in ["N=[N+]=[N-]", "N=N=N", "NN#N"]:
if a in smi:
newsmi=smi.replace(a, template)
new_smiles.append(newsmi)
else:
continue
len(new_smiles)
good_mol = []
for smi in new_smiles:
try:
newmol=Chem.MolFromSmiles(smi)
if is_lipinsky(newmol) == True:
good_mol.append(newmol)
#display(newmol)
except:
pass
len(good_mol)
Итого получилось 4005 smiles потенциальных азидных аналогов ибупрофена, из которых 460 удовлетворяют правилу Липински.
Изобразим первые 12 получившихся адекватных молекул.
from IPython.display import SVG
for mol in good_mol:
AllChem.Compute2DCoords(mol)
display(Draw.MolsToGridImage(good_mol[:12],useSVG=True, molsPerRow=3, subImgSize=(300, 300)))
Теперь изобразим Similiraty Map ибупрофена с пятым веществом из нашего массива.
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(good_mol[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, good_mol[4], SimilarityMaps.GetMorganFingerprint)
Построим 3D структуру.
m3d=Chem.AddHs(good_mol[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
m3d
И даже покрутим! (но не в html)
import nglview as nv
nv.show_rdkit(m3d)
До чего техника дошла...