from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem.Draw import SimilarityMaps
from rdkit import RDConfig
from IPython.display import display,Image
from IPython.display import SVG
import numpy as np
import rdkit.Chem.Lipinski as Lipinksi
import pubchempy as pcp
import nglview as nv
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
print(Lipinksi.NumHDonors(ibu))
print(Lipinksi.NumHAcceptors(ibu))
print(Lipinksi.rdMolDescriptors.CalcExactMolWt(ibu))
print(Lipinksi.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0])
1 1 206.130679816 3.073200000000001
Вообще в PubChem очень много азидных находок, но раз мы будем работать с десяткой-сотней лучших - я ограничился небольшим числом страниц в поиске.
comp = []
smiles=["N=N=N"]
per_page = 10**5
for i in range(4):
try:
a = pcp.get_properties(
properties="CanonicalSMILES",
identifier=smiles,
namespace="smiles",
searchtype="substructure",
RingsNotEmbedded=True,
listkey_count=per_page,
listkey_start=0
)
except:
print('fail')
break
print("Retrieved page {}".format(i+1))
comp.extend([i['CanonicalSMILES'] for i in a])
Retrieved page 1 Retrieved page 2 Retrieved page 3 Retrieved page 4
Судя по структуре https://www.rcsb.org/3d-view/1EQG?preset=ligandInteraction&label_asym_id=K оптимально будет навешивать заместители на вторичный атом углерода.
ibuR = 'N1C=C(N=N1)C(C(C)C)C1=CC=C(C=C1)C(C)C(=O)O'
radical = Chem.MolFromSmiles(ibuR)
AllChem.Compute2DCoords(radical)
display(radical)
#lipinsky rule test
def lipinsky_rule(inp):
if Lipinksi.NumHDonors(inp) <= 5 and Lipinksi.NumHAcceptors(inp) <= 10 and Lipinksi.rdMolDescriptors.CalcExactMolWt(inp) < 500 and Lipinksi.rdMolDescriptors.CalcCrippenDescriptors(inp)[0] <= 5:
return True
return False
edited = []
for smi in comp[:100]:
if 'N=[N+]=[N-]' in smi:
newsmi=smi.replace('N=[N+]=[N-]', ibuR)
else:
continue
# Новую молекулу лучше создавать в try из-за битых Smiles
try:
newmol=Chem.MolFromSmiles(newsmi)
if lipinsky_rule(newmol):
edited.append(newmol)
except:
break
display(Draw.MolsToGridImage(edited,useSVG=True, molsPerRow=2, subImgSize=(350, 170)))
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, edited[4], SimilarityMaps.GetMorganFingerprint)
m3d=Chem.AddHs(edited[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
nv.show_rdkit(m3d)
NGLWidget()