Pr3: Хемоинформатика
#импорт пакетов
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
from tqdm import tqdm, trange
import rdkit.Chem.Lipinski as Lipinksy
import pubchempy as pcp
import pandas as pd
from IPython.display import SVG
import random
from IPython.display import display
from rdkit.Chem.Draw import SimilarityMaps
import nglview as nv
import nglview as nv
#Нарисуем ибупрофен
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
#Производное ибупрофена для клик-химии
ibu=Chem.MolFromSmiles('N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
print(Lipinksy.NumHDonors(ibu))
print(Lipinksy.NumHAcceptors(ibu))
print(Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu))
print(Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0])
#Посчитаем параметры для правила Лепински
def Lipinksy_checker(molecule):
Lipinksy_check = bool(Lipinksy.NumHDonors(molecule) <= 5
and Lipinksy.NumHAcceptors(molecule) <= 10
and Lipinksy.rdMolDescriptors.CalcExactMolWt(molecule) < 500
and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0] <= 5)
return Lipinksy_check
#"N(N=N1)C=C1-C1=CC=C(C=C1)C(C)C(=O)O"
#'N1N=NC=C(CC(C(=O)O)C2=CC=C(CC(C)C)C=C2)1'
#'N1N=NC=C1C(C(O)=O)C(C=C1)=CC=C1CC(C)C'
#Загрузим данные из pubchempy и отфильтруем
structures = []
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))
structures.extend(a)
pd.DataFrame(structures).to_csv("azids.csv")
#2433 находки
smiles = []
for line in structures:
if len(list(line.values())[1]) < 30 and not '.' in list(line.values())[1]:
smiles.append(list(line.values())[1])
#Замена групп
res = []
for smi in smiles:
if '=N[N+]#N' in smi:
newsmi=smi.replace('=N[N+]#N','N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
else:
continue
try:
newmol=Chem.MolFromSmiles(newsmi)
if Lipinksy_checker(newmol) == True:
AllChem.Compute2DCoords(newmol)
res.append(newmol)
display(newmol)
except:
pass
#визуализация нескольких полученных молекул
to_print = [x for x in random.sample(res, 9)]
display(Draw.MolsToGridImage(to_print, useSVG=True, molsPerRow=3, subImgSize=(150, 100)))
#Similiraty Map ибупрофена с пятым веществом из массива
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
print(ibu)
fp = SimilarityMaps.GetMorganFingerprint(res[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, res[5], SimilarityMaps.GetMorganFingerprint)
#должна была быть 3Д структура, но nv.show_rdkit(m3d) не сработало, поэтому 2d
m3d=Chem.AddHs(res[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)