Pr3: Хемоинформатика

In [16]:
#импорт пакетов
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
In [2]:
#Нарисуем ибупрофен
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O') 
AllChem.Compute2DCoords(ibu)
display(ibu)
In [36]:
#Производное ибупрофена для клик-химии
ibu=Chem.MolFromSmiles('N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
In [46]:
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
In [47]:
#Посчитаем параметры для правила Лепински
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'
In [24]:
#Загрузим данные из 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)
Retrieved page 1 of NN#N search
Retrieved page 1 of N#NN search
In [41]:
pd.DataFrame(structures).to_csv("azids.csv")
#2433 находки
In [30]:
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])
In [37]:
#Замена групп
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
In [39]:
#визуализация нескольких полученных молекул
to_print = [x for x in random.sample(res, 9)]
display(Draw.MolsToGridImage(to_print, useSVG=True, molsPerRow=3, subImgSize=(150, 100)))
O N N N O OH N N N N N O OH H2N+ N N N N H N N N O HO N N N N O OH O- O N N N O OH N S N N N O HO N N HN N N N O OH N N N O OH N- N S N N N O HO
In [40]:
#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)
<rdkit.Chem.rdchem.Mol object at 0x00000178D40962B0>
In [46]:
#должна была быть 3Д структура, но nv.show_rdkit(m3d) не сработало, поэтому 2d
m3d=Chem.AddHs(res[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
display(m3d)