Загрузим необходимые пакеты
import rdkit
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import RDConfig
from rdkit.Chem.Draw import ShowMol
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import Draw
from IPython.display import display,Image,HTML,Video
from base64 import b64encode
import io
import base64
import numpy as np
import rdkit.Chem.Lipinski as Lipinksy
import pubchempy as pcp
Молекула ибупрофена:
ibu=Chem.MolFromSmiles('CC(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 is_valid_lipinsky(molecule):
return bool((Lipinksy.NumHDonors(molecule) <= 5)
and (Lipinksy.NumHAcceptors(molecule) <= 10)
and (Lipinksy.rdMolDescriptors.CalcExactMolWt(molecule) < 500)
and(Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(molecule)[0]) <= 5)
print(is_valid_lipinsky(ibu))
1 1 206.130679816 3.073200000000001 True
Ибупрофен, модифицированный для Click Chemistry:
ibu1 = Chem.MolFromSmiles('CC(C#C)CC1=CC=C(C=C1)C(C)C(=O)O')
tr1 = Chem.MolFromSmiles('N1N=NC(C(C)CC2=CC=C(C=C2)C(C)C(=O)O)=C1')
AllChem.Compute2DCoords(ibu1)
AllChem.Compute2DCoords(tr1)
display(ibu1,tr1)
compounds = []
per_page = 10**5
for smiles in ["N=N=N", "NN#N"]:
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:
continue
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 19 of N=N=N search Retrieved page 1 of NN#N search
mols = []
for smi in compounds:
if 'N=[N+]=[N-]' in list(smi.values())[1]:
newsmi = list(smi.values())[1].replace('N=[N+]=[N-]', 'CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
else:
continue
try:
newmol = Chem.MolFromSmiles(newsmi)
if is_valid_lipinsky(newmol):
mols.append(newmol)
except:
pass
len(mols)
551935
display(Draw.MolsToGridImage(
mols,
maxMols=9,
molsPerRow=3,
subImgSize=(400, 400)))
Similiraty Map ибупрофена с веществом из массива:
SimilarityMaps.GetSimilarityMapForFingerprint(
ibu,
mols[0],
SimilarityMaps.GetMorganFingerprint
)
(<Figure size 180x180 with 1 Axes>, 0.18729096989966554)
m3d = Chem.AddHs(mols[0])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d, maxIters=500, nonBondedThresh=200)
display(m3d)
import nglview as nv
nv.show_rdkit(m3d)