
Protein
│
└── Binding pocket
│
├── Phe
├── Tyr
├── Asp
├── Leu
└── Arg LIGLigand
│
├── translation
├── rotation
└── torsion
│
▼
Binding pocket
│
▼
不同 docking posesPose 1 -10.2 kcal/mol
Pose 2 -9.8 kcal/mol
Pose 3 -9.5 kcal/mol
... Phe
\
\
pocket Phe
↻
\
LIG
/
Tyr ↻Phe ── 固定
Tyr ── 固定
Asp ── 固定
↓
LIG
↓
寻找最佳位置Protein
├── backbone 固定
├── side chain 基本固定
│
└── ligand
├── rotation
├── translation
└── torsioninduced fitVina:
PHE100
\
\
LIG
真实:
PHE100
↻
\
LIGLigand
↓
接近 binding pocket
↓
side-chain rearrangement
↓
更合理的 interfacePose 1 -10.2
Pose 2 -9.9
Pose 3 -9.7Pose 1 = 正确
Pose 2 = 错误Pose A
Vina = -10.5
但是:
steric clash
+
不合理 side chain
+
H-bond geometry不好Pose B
Vina = -9.8
但是:
H-bond合理
+
interface packing好
+
没有明显clashapo proteinPhe100
Tyr105
Asp110apo stateholo stateapo protein
↓
Vina
↓
ligand docking搜索 + 打分时间尺度上的动力学模拟这个 ligand 在 100 ns 后是否稳定?
binding pocket 是否持续存在?
H-bond 是否持续?
protein backbone 是否发生变化?GROMACS / AMBER 等 MDVina
│
│ ligand pose search
▼
初始 complex
│
│ 但 protein side chain 没有充分优化
▼
PyRosetta
│
├── side-chain repacking
├── local minimization
├── protein-ligand interface optimization
└── local relaxation
│
▼
refined complex
│
▼
GROMACS
│
└── dynamic stabilityProtein = 500 aa20 residuesLigand
↓
5~8 Å
↓
Binding pocket整个 500 aa protein远离 ligand 的区域
↓
尽量固定
ligand 周围 5~8 Å
↓
允许调整local refinement Protein PDB
│
▼
Protein preparation
│
▼
AutoDock Vina
│
┌──────────┼──────────┐
▼ ▼ ▼
Pose1 Pose2 Pose3
│ │ │
└──────────┼──────────┘
▼
Top 5~10 poses
│
▼
Ligand parametrization
│
▼
LIG.params
│
▼
Protein + ligand complex
│
▼
PyRosetta Pose
│
▼
Identify 5~8 Å pocket
│
▼
Side-chain repack
│
▼
Local minimization
│
▼
Local Relax
│
▼
Final minimization
│
▼
Refined complexes
│
▼
Interface / H-bond / clash
│
▼
Pose ranking
│
▼
GROMACSvina_rosetta/
├── input/
│ ├── protein.pdb
│ └── ligand.sdf
│
├── vina/
│ ├── receptor.pdbqt
│ ├── ligand.pdbqt
│ ├── config.txt
│ └── vina_out.pdbqt
│
├── params/
│ ├── LIG.params
│ └── LIG_0001.pdb
│
├── poses/
│
├── complexes/
│
├── optimized/
│
└── results/vina \
--receptor vina/receptor.pdbqt \
--ligand vina/ligand.pdbqt \
--config vina/config.txt \
--exhaustiveness 32 \
--num_modes 10 \
--out vina/vina_out.pdbqt--num_modes 10Top 5Top 10Vina scorePose 1 -10.4
Pose 2 -10.1
Pose 3 -9.9
Pose 4 -9.8
Pose 5 -9.6Pose 1 → refine
Pose 2 → refine
Pose 3 → refine
...ligand.pdbqtLIG.paramsligand.sdf
│
▼
molfile_to_params.py
│
├── LIG.params
└── LIG_0001.pdbpython \
$ROSETTA/main/source/scripts/python/public/molfile_to_params.py \
-n LIG \
-p LIG \
input/ligand.sdfLIG.params
LIG_0001.pdb原子
│
├── C
├── N
├── O
└── ...
键
│
├── C-C
├── C-N
└── C-O
torsion
│
└── 哪些键可以旋转
Rosetta atom typeLIG.pdbLIG.paramsligand.sdfLIG.paramsVina poseSDF
↓
化学结构
Vina
↓
空间位置Protein
+
Vina ligand coordinates
+
Rosetta ligand topologycomplex.pdbimport pyrosetta
pyrosetta.init(
"-extra_res_fa params/LIG.params "
"-mute all"
)from pyrosetta import *
from pyrosetta.rosetta import *pose = pose_from_pdb(
"complexes/complex_01.pdb"
)for i in range(
1,
pose.total_residue() + 1
):
print(
i,
pose.residue(i).name3()
)1 ALA
2 GLY
3 VAL
...
250 TYR
251 LIGligand_res = None
for i in range(
1,
pose.total_residue() + 1
):
if pose.residue(i).name3() == "LIG":
ligand_res = i
break
if ligand_res is None:
raise RuntimeError(
"LIG not found"
)
print(
"Ligand residue:",
ligand_res
)6 Åfrom pyrosetta.rosetta.core.select import residue_selector
lig_selector = (
residue_selector.ResidueIndexSelector(
str(ligand_res)
)
)
pocket_selector = (
residue_selector.NeighborhoodResidueSelector()
)
pocket_selector.set_focus(
lig_selector
)
pocket_selector.set_distance(
6.0
)
pocket_selector.set_include_focus_in_subset(
True
)subset = pocket_selector.apply(
pose
)
pocket_residues = []
for i in range(
1,
pose.total_residue() + 1
):
if subset[i]:
pocket_residues.append(i)
print(
pocket_residues
)4 Å
5 Å
6 Å
8 Å4 Å6 Å8 Åscorefxn = get_fa_scorefxn()
initial_score = scorefxn(
pose
)
print(
"Initial score:",
initial_score
)Vina = -10.2
Rosetta = -135Vina
↓
protein side chain固定
↓
PyRosetta
↓
重新选择合理 rotamertask = pyrosetta.standard_packer_task(
pose
)
task.restrict_to_repacking()packer = (
protocols.minimization_packing
.PackRotamersMover(
scorefxn,
task
)
)
packer.apply(
pose
)Protein = 500 aaLigand
↓
6 Å
↓
允许 repack远离 ligand
↓
禁止 repackfrom pyrosetta.rosetta.core.pack.task import TaskFactory
from pyrosetta.rosetta.core.pack.task.operation import (
InitializeFromCommandline,
RestrictToRepacking,
PreventRepackingRLT,
OperateOnResidueSubset
)tf = TaskFactory()
tf.push_back(
InitializeFromCommandline()
)
tf.push_back(
RestrictToRepacking()
)tf.push_back(
OperateOnResidueSubset(
PreventRepackingRLT(),
pocket_selector,
flip_subset=True
)
)flip_subset=Truetask = (
tf.create_task_and_apply_taskoperations(
pose
)
)packer = (
protocols.minimization_packing
.PackRotamersMover(
scorefxn,
task
)
)
packer.apply(
pose
)Side-chain optimizationRepack
↓
选择一个更好的 rotamer
Minimize
↓
在这个 rotamer 附近继续微调Repack
→
Minimizemovemap = MoveMap()
movemap.set_bb(False)
movemap.set_chi(False)backbone = 不动
side chain = 不动for resi in pocket_residues:
movemap.set_chi(
resi,
True
)Protein backbone
↓
固定
Pocket side chains
↓
可以动movemap.set_chi(
ligand_res,
True
)set_chi(ligand_res, True)min_mover = (
protocols.minimization_packing
.MinMover()
)
min_mover.movemap(
movemap
)
min_mover.score_function(
scorefxn
)
min_mover.min_type(
"lbfgs_armijo_nonmonotone"
)
min_mover.tolerance(
0.01
)min_mover.apply(
pose
)local energy minimizationVina:
Phe
\
\
LIG
/
AspPhe ↻
\
\
LIG
/
Asp ↻Phe
\
LIG
/
Asp距离
角度
torsion
van der Waals
electrostaticsrelax = protocols.relax.FastRelax()
relax.set_scorefxn(
scorefxn
)
relax.apply(
pose
)MoveMap
+
Coordinate constraints
+
Pocket restrictionPhe100
Tyr105
Asp110side chain调整Phe100整个跑掉允许局部优化
+
限制整体偏移min_mover.apply(
pose
)Vina
↓
Repack
↓
Minimize
↓
Relax
↓
Minimizeimport pyrosetta
from pyrosetta import *
from pyrosetta.rosetta import *
from pyrosetta.rosetta.core.select import residue_selector
from pyrosetta.rosetta.core.pack.task import (
TaskFactory
)
from pyrosetta.rosetta.core.pack.task.operation import (
InitializeFromCommandline,
RestrictToRepacking,
PreventRepackingRLT,
OperateOnResidueSubset
)
# =====================================================
# 1. Init
# =====================================================
pyrosetta.init(
"-extra_res_fa params/LIG.params "
"-mute all"
)
# =====================================================
# 2. Load complex
# =====================================================
pose = pose_from_pdb(
"complexes/complex_01.pdb"
)
# =====================================================
# 3. Find ligand
# =====================================================
ligand_res = None
for i in range(
1,
pose.total_residue() + 1
):
if pose.residue(i).name3() == "LIG":
ligand_res = i
break
if ligand_res is None:
raise RuntimeError(
"LIG not found"
)
print(
"Ligand:",
ligand_res
)
# =====================================================
# 4. Binding pocket
# =====================================================
lig_selector = (
residue_selector.ResidueIndexSelector(
str(ligand_res)
)
)
pocket_selector = (
residue_selector.NeighborhoodResidueSelector()
)
pocket_selector.set_focus(
lig_selector
)
pocket_selector.set_distance(
6.0
)
pocket_selector.set_include_focus_in_subset(
True
)
subset = pocket_selector.apply(
pose
)
pocket_residues = []
for i in range(
1,
pose.total_residue() + 1
):
if subset[i]:
pocket_residues.append(i)
print(
"Pocket:",
pocket_residues
)
# =====================================================
# 5. Score
# =====================================================
scorefxn = get_fa_scorefxn()
score0 = scorefxn(
pose
)
print(
"Initial:",
score0
)
# =====================================================
# 6. Repack pocket
# =====================================================
tf = TaskFactory()
tf.push_back(
InitializeFromCommandline()
)
tf.push_back(
RestrictToRepacking()
)
tf.push_back(
OperateOnResidueSubset(
PreventRepackingRLT(),
pocket_selector,
flip_subset=True
)
)
task = (
tf.create_task_and_apply_taskoperations(
pose
)
)
packer = (
protocols.minimization_packing
.PackRotamersMover(
scorefxn,
task
)
)
packer.apply(
pose
)
score1 = scorefxn(
pose
)
print(
"After repack:",
score1
)
# =====================================================
# 7. MoveMap
# =====================================================
movemap = MoveMap()
movemap.set_bb(
False
)
movemap.set_chi(
False
)
for resi in pocket_residues:
movemap.set_chi(
resi,
True
)
movemap.set_chi(
ligand_res,
True
)
# =====================================================
# 8. Minimization
# =====================================================
min_mover = (
protocols.minimization_packing
.MinMover()
)
min_mover.movemap(
movemap
)
min_mover.score_function(
scorefxn
)
min_mover.min_type(
"lbfgs_armijo_nonmonotone"
)
min_mover.tolerance(
0.01
)
min_mover.apply(
pose
)
score2 = scorefxn(
pose
)
print(
"After minimize:",
score2
)
# =====================================================
# 9. Relax
# =====================================================
relax = protocols.relax.FastRelax()
relax.set_scorefxn(
scorefxn
)
relax.apply(
pose
)
score3 = scorefxn(
pose
)
print(
"After relax:",
score3
)
# =====================================================
# 10. Final minimize
# =====================================================
min_mover.apply(
pose
)
score4 = scorefxn(
pose
)
print(
"Final:",
score4
)
# =====================================================
# 11. Save
# =====================================================
pose.dump_pdb(
"optimized/complex_01_refined.pdb"
)Pose
↓
ResidueSelector
↓
TaskFactory
↓
Repack
↓
MoveMap
↓
MinMover
↓
FastRelax① 多个 Vina poses
Top 10
② 每个 pose 多次 refinement10 Vina poses
×
10 Rosetta trajectories
=
100 structures
③ Pose clustering100 structures
↓
RMSD clustering
↓
Cluster 1
Cluster 2
Cluster 3
④ Interface scoretotal_scoreinterface score
interface ΔG一次运行
↓
绝对全局最优初始构象
rotamer
局部能量极小值Vina Pose 1
↓
Rosetta 1
Rosetta 2
Rosetta 3
...多个局部 minimum相似 binding modeVina pose | Rosetta run | Vina score | Rosetta score | Interface ΔG | H-bond | Clash |
|---|---|---|---|---|---|---|
P1 | 1 | -10.2 | -145 | -25 | 5 | 0 |
P1 | 2 | -10.2 | -149 | -27 | 6 | 0 |
P1 | 3 | -10.2 | -143 | -24 | 4 | 0 |
P2 | 1 | -9.9 | -158 | -31 | 7 | 0 |
P2 | 2 | -9.9 | -161 | -33 | 8 | 0 |
P3 | 1 | -9.6 | -140 | -20 | 3 | 1 |
Vina最好
P1Rosetta refinement最好P2Vina score
+
Rosetta interface energy
+
H-bond
+
vdW
+
electrostatics
+
steric clash
+
pose clusteringGROMACS MD搜索 binding poseside chain
+
torsion
+
local geometry
+
interface energyprotein dynamics
+
ligand dynamics
+
water
+
ions原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。