import numpy as np
import copy
# Отображение структур
import IPython.display
import ipywidgets
from IPython.display import display,display_svg,SVG,Image
# Open Drug Discovery Toolkit
import oddt
import oddt.docking
import oddt.interactions
# Органика
from rdkit.Chem import Draw
from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole
import mdtraj as md
Загрузим файл из прошлого практикума
u = md.load('sequence.B99990006.pdb')
pdb = u.topology
Сохраним файл без лиганда
u2 = u.atom_slice(range(1096))
u2.save_pdb('sequence.B99990006-clean.pdb', force_overwrite=True)
Найдём геометрический центр лиганда
lig = u.atom_slice(range(1096,1138))
lig_center = np.mean(lig.xyz[0], axis=0) * 10
lig_center
prot = next(oddt.toolkit.readfile('pdb','sequence.B99990006-clean.pdb'))
print('is it the first mol in 1lmp is protein?',prot.protein,':) and MW of this mol is:', prot.molwt )
smiles = ["CC(=O)NC1C(O)OC(CO)C(O)C1O", # NAG
"OC(=O)NC1C(O)OC(CO)C(O)C1O", # OH
"[NH3+]C(=O)NC1C(O)OC(CO)C(O)C1O", # NH3+
"C(=O)NC1C(O)OC(CO)C(O)C1O", # H
"C=1(C=CC=CC1)C(=O)NC1C(O)OC(CO)C(O)C1O", # Ph
"C(C([O-])=O)(=O)NC1C(O)OC(CO)C(O)C1O"] # COO-
mols = []
images =[]
for s in smiles:
m = oddt.toolkit.readstring('smi', s)
# m.addh()
m.make3D(forcefield='mmff94', steps=150)
mols.append(m)
images.append((SVG(copy.deepcopy(m).write('svg'))))
display_svg(*images)
#create docking object
dock_obj= oddt.docking.AutodockVina.autodock_vina(protein=prot,
size=(20, 20, 20),
center=lig_center)
print(dock_obj.tmp_dir)
print(" ".join(dock_obj.params))
center_x, center_y, center_z - координаты центра области для докинга; size_x, size_y, size_z - размер области для докинга; exhaustiveness - то, насколько "дотошно" будет происходить поиск. Иными словами параметр, который указывает, как долго будет происходить поиск минимума энергии; num_mode - число вариантов, которое найдёт программа; energy_range - в каком диапазоне от лучшего варианта будут находиться остальные или размер отсечки по энергии. Варианты хуже не будут рассматриваться.
res = dock_obj.dock(mols, prot)
Посчитаем определённое количество метрик для каждого лиганда и отсортируем по affinity:
data = []
for i,r in enumerate(res):
data.append([
Chem.rdMolDescriptors.CalcMolFormula(r.Mol),
r.data['vina_affinity'],
r.data['vina_rmsd_ub'],
len(oddt.interactions.hbonds(prot,r)[0]),
len(oddt.interactions.pi_stacking(prot,r)[0]),
len(oddt.interactions.hydrophobic_contacts(prot,r)[0])
])
data.sort(key=lambda x:x[0])
import pandas as pd
table = pd.DataFrame(data, columns=['Formula', 'Affinity', 'RMSD', 'H bonds', 'Stacking', 'Hydrophobic contacts'])
table
Лиганд с наивысшей аффинностью — C13H17NO6. Он также образует много водородных связей.