In [125]:
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

Это ибупрофен

In [105]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)

Параметры Липински - насколько хорош лиганд, чтобы использоваться при физиологических условиях

In [106]:
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]
1
1
206.130679816
3.0732
In [107]:
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, присоединение происходило нужным нам образом (к краевому углероду рядом с модифицированной группой)

In [129]:
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)

Проверим

In [112]:
mol=Chem.MolFromSmiles(smiles[145].replace("N=[N+]=N", mod_iby_smiles))
AllChem.Compute2DCoords(mol)
display(mol)
In [114]:
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)
In [127]:
from IPython.display import clear_output
In [135]:
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)
In [136]:
len(good_smiles)
Out[136]:
1925

Покажем несколько good_smiles, сгенерируем им хорошие имена

In [154]:
from random import sample, randint, choice, random
In [155]:
lucky_smiles = sample(good_smiles, 10)
In [156]:
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
In [159]:
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
MNKKN2224
MMMNM2815
NLM2991+
MK3732
MKKN3701+
NK4061
MM3634+
KNKK2883
NMLM1644+
KL2972

Попробуем визуализировать NMLM1644+

In [160]:
m2d = Chem.MolFromSmiles(name_lu["NMLM1644+"])
m3d=Chem.AddHs(m2d)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
Out[160]:
0
In [162]:
import nglview as nv

nv.show_rdkit(m3d)

Скриншот того, что получается)

In [163]:
from IPython.display import Image
Image(filename='screen3d.png')
Out[163]:
In [ ]: