import numpy as np
import copy
# Отображение структур
import IPython.display
import ipywidgets
from IPython.display import display,display_svg,SVG,Image, HTML
# Open Drug Discovery Toolkit
import oddt
import oddt.docking
import oddt.interactions
# Органика
from rdkit.Chem import Draw
from rdkit.Chem.Draw import IPythonConsole
import pmx # Модуль для манипулирования pdb
pdb=pmx.Model('with_ligand.B99990001.pdb')
for r in pdb.residues[135:]:
print r #посмотрим остатки
# создание объектов белок и лиганда
newpdb = pdb.copy()
for r in newpdb.residues[-3:]:
newpdb.remove_residue(r)
lig = pdb.copy()
del lig.residues[:-3]
for a in lig.atoms:
a.x
display(HTML('<b>New pdb</b>'))
for r in newpdb.residues[135:]:
print r #посмотрим остатки
display(HTML('<b>Ligand</b>'))
for r in lig.residues:
print r #посмотрим остатки
coordinates = [a.x for a in lig.atoms]
center = np.mean(coordinates, axis=0)
newpdb.writePDB('my_prot.pdb')
prot = oddt.toolkit.readfile('pdb','my_prot.pdb').next()
prot.OBMol.AddPolarHydrogens()
prot.OBMol.AutomaticPartialCharge()
print 'Is it the first mol in 1lmp is protein?',prot.protein,':) and MW of this mol is:', prot.molwt
smilesNAG = ['CC(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O']
all_smiles = ['CC(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O', # original
'OC(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O', # OH
'[NH3+]C(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O', # NH3+
'C(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O', # H
'C2=CC=C(C=C2)C(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O', # Ph
'[O-]C(=O)C(=O)N[C@H]1[C@H](O)O[C@H](CO)[C@@H](O)[C@@H]1O'] # COO-
mols= []
images =[]
for s in all_smiles:
m = oddt.toolkit.readstring('smi', s)
if not m.OBMol.Has3D():
m.make3D(forcefield='mmff94', steps=150)
m.removeh()
m.OBMol.AddPolarHydrogens()
mols.append(m)
###with print m.OBMol.Has3D() was found that:
### deep copy needed to keep 3D , write svg make mols flat
images.append((SVG(copy.deepcopy(m).write('svg'))))
display_svg(*images)
dock_obj= oddt.docking.AutodockVina.autodock_vina(
protein=prot,size=(20,20,20),center=center,
executable='/usr/bin/vina',autocleanup=True, num_modes=3)
print dock_obj.tmp_dir
#print " ".join(dock_obj.params) # Опишите выдачу
display(HTML('<b>Параметры докинга</b>'))
print 'Координаты центра'
print " ".join(dock_obj.params[:6])
print 'Количество точек по каждой оси'
print " ".join(dock_obj.params[6:12])
print 'Ускорители'
print " ".join(dock_obj.params[12:14])
print 'Насколько глубоко ведется поиск (полнота алгоритма)'
print " ".join(dock_obj.params[14:16])
print 'Наибольшее число объектов связываний, которое может быть сгенерировано'
print " ".join(dock_obj.params[16:18])
print 'Максимально допустимый разброс энергии между ллучшим и худшим вариантом связывания'
print " ".join(dock_obj.params[18:])
# do it
res = dock_obj.dock(mols,prot)
info = np.array([[i,r.formula, r.data['vina_affinity'], r.data['vina_rmsd_ub'], r.residues[0].name] for i,r in enumerate(res)])
import pandas as pd
types = ['original']*3+['OH']*3+['NH3+']*3+['H']*3+['Ph']*3+['COO-']*3
results = pd.DataFrame({'formula':info[:,1],
'vina_affinity':info[:,2],
'vina_rmsd_ub':info[:,3],
'residue':info[:,4],
'type':types},
index=info[:,0].astype(int)).sort_values(by='vina_affinity', ascending=False)
results
for i,r in enumerate(res):
hbs = oddt.interactions.hbonds(prot,r)
stack = oddt.interactions.pi_stacking(prot,r)
phob = oddt.interactions.hydrophobic_contacts(prot,r)
for i,r in enumerate(res):
r.write(filename='r%s.pdb' % i, format='pdb', overwrite=True)
import __main__
__main__.pymol_argv = ['pymol','-qc'] # Pymol: quiet and no GUI
from time import sleep
import pymol
pymol.finish_launching()
#for index in [1,2,3]:
pymol.cmd.reinitialize()
pymol.cmd.load('r%d.pdb'%results.index.get_values()[0])
pymol.cmd.do('''
load my_prot.pdb
show cartoon, my_prot
hide lines, my_prot
orient
zoom r1, 9
rotate x,150
png pic0.png
''')
# Desired pymol commands here to produce and save figures
sleep(2.5) # (in seconds)
Image(filename='pic0.png')
C помощью oodt.virtualscreening можно было бы полностью провести докинг с помощью того же Autodock Vina. А также можно было бы посчитать score докинга с помощью RFscore и NNscore.