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
Это ибупрофен
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
Параметры Липински - насколько хорош лиганд, чтобы использоваться при физиологических условиях
import rdkit.Chem.Lipinski as Lipinksy
print Lipinksy.NumHDonors(ibu)
print Lipinksy.NumHAcceptors(ibu)
print Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu)
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0]
strings=np.genfromtxt('compounds.txt',dtype=np.str)
smiles = []
for line in strings:
if len(line[1]) < 30 and not '.' in line[1]:
smiles.append(line[1])
Модифицируем ибупрофен и перепишем так, чтобы при замене азидной группы на наш template, присоединение происходило нужным нам образом (к краевому углероду рядом с модифицированной группой)
mod_ibu_smiles = 'CNC(C1=CC=C(C=C1)CC(C)C)(C(=O)O)'
mod_ibu=Chem.MolFromSmiles(mod_ibu_smiles)
AllChem.Compute2DCoords(mod_ibu)
display(mod_ibu)
Проверим
mol=Chem.MolFromSmiles(smiles[145].replace("N=[N+]=N", mod_iby_smiles))
AllChem.Compute2DCoords(mol)
display(mol)
def is_lepinsky_asseptable(mol):
hdonor = Lipinksy.NumHDonors(mol) <= 5
hacceptor = Lipinksy.NumHAcceptors(mol) <=10
MW = Lipinksy.rdMolDescriptors.CalcExactMolWt(mol) < 500
okt_water = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(mol)[0] <=5
return (hdonor and hacceptor and MW and okt_water)
from IPython.display import clear_output
good_smiles = []
for ind, mol_smile in enumerate(smiles):
if ind % 1000 == 0:
clear_output(wait=True)
print "process {} smile".format(ind)
try:
if not "N=[N+]=[N-]" in mol_smile:
continue
modified_mol_smile = mol_smile.replace("N=[N+]=[N-]", mod_ibu_smiles)
if is_lepinsky_asseptable(Chem.MolFromSmiles(modified_mol_smile)):
good_smiles.append(modified_mol_smile)
except Exception:
pass
clear_output(wait=False)
len(good_smiles)
Покажем несколько good_smiles, сгенерируем им хорошие имена
from random import sample, randint, choice, random
lucky_smiles = sample(good_smiles, 10)
def generate_name():
num = randint(2, 5)
word = "".join(choice("NLKM") for i in range(num))
i_d = randint(666, 4242)
name = word + str(i_d)
has_plus = random() > 0.5
if has_plus:
name += "+"
return name
name_lu = {}
for smile in lucky_smiles:
mol=Chem.MolFromSmiles(smile)
AllChem.Compute2DCoords(mol)
display(mol)
name = generate_name()
name_lu[name] = smile
print name
Попробуем визуализировать NMLM1644+
m2d = Chem.MolFromSmiles(name_lu["NMLM1644+"])
m3d=Chem.AddHs(m2d)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
import nglview as nv
nv.show_rdkit(m3d)
Скриншот того, что получается)
from IPython.display import Image
Image(filename='screen3d.png')