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
Нотация SMILES ибупрофена: CC(C)CC1=CC=C(C=C1)C(C)C(=O)O. Используя ее, нарисуем ибупрофен.
ibuprophenSmiles = 'CC(C)CC1=CC=C(C=C1)C(C)C(=O)O'
ibuprophen=Chem.MolFromSmiles(ibuprophenSmiles)
AllChem.Compute2DCoords(ibuprophen)
display(ibuprophen)
Модифицируем ибупрофена, с помощью замены изопропила на этин: CC(C) на C#.
mod_ibuprophenSmiles = ibuprophenSmiles.replace('CC(C)','C#')
mod_ibuprophen=Chem.MolFromSmiles(mod_ibuprophenSmiles)
AllChem.Compute2DCoords(mod_ibuprophen)
display(mod_ibuprophen)
Проведем Copper(I)-catalyzed azide-alkyne cycloaddition (CuAAC). Для начала построим template с радикалом R1, которым будем модифицированный ибупрофен.
template = 'N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O'
ibu_cycle=Chem.MolFromSmiles(template)
AllChem.Compute2DCoords(ibu_cycle)
display(ibu_cycle)
Теперь загрузим скачанные SMILES для радикалов с азидом и отфильтруем их.
strings=np.genfromtxt('873774121219644625.txt',dtype=np.str)
r_smiles=[]
for line in strings:
if len(line[1]) < 30 and not '.' in line[1]:
r_smiles.append(line[1])
print(len(r_smiles))
И заменим в них азид на построенный template.
res_smiles=[]
azid = 'N=[N+]=[N-]'
for r_smi in r_smiles[:10747]:
if azid in r_smi:
res_smi=r_smi.replace(azid, template)
res_smiles.append(res_smi)
else:
continue
import rdkit.Chem.Lipinski as Lipinksy
print(Lipinksy.NumHDonors(ibuprophen))
print(Lipinksy.NumHAcceptors(ibuprophen))
print(Lipinksy.rdMolDescriptors.CalcExactMolWt(ibuprophen))
print(Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibuprophen)[0])
Отберем SMILES, удовлетворяющие правилу:
analog_smiles=[]
for smi in res_smiles:
try:
newmol=Chem.MolFromSmiles(smi)
if ((Lipinksy.NumHDonors(newmol) <= 5) and (Lipinksy.NumHAcceptors(newmol) <= 10) and (Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol) <= 500) and (Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(newmol)[0] <= 5)):
analog_smiles.append(smi)
AllChem.Compute2DCoords(newmol)
except:
pass
len(analog_smiles)
Построим стурктуры первых 10 полученных SMILES:
for analog in analog_smiles[:10]:
print(analog)
mol=Chem.MolFromSmiles(analog)
AllChem.Compute2DCoords(mol)
display(mol)
Построим 3D структуру одной из молекул.
smile_3d=analog_smiles[20]
mol_3d=Chem.MolFromSmiles(smile_3d)
m3d=Chem.AddHs(mol_3d)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200)
import nglview as nv
nv.show_rdkit(m3d)
m3d