蛋白质的折叠在蛋白质的设计中有着关键性的作用,并一直在被人类坐探索。这里将通过pyrosetta实现简单的折叠算法。
方法的实现
首先导入pyrosetta并且,Create a simple poly-alanine pose with 10 residues for testing your folding algorithm. Store the pose in a variable called "polyA." 创建一个有着十个 alanine 残基的pose 来测试我们的算法,并将pose命名为 “polyA”
#导入pyrosetta
from pyrosetta import *
from pyrosetta.teaching import *
init()
# 创建 poly-alanine
polyA = pyrosetta.pose_from_sequence('A' * 10)
polyA.pdb_info().name("polyA")
Building A Basic de Novo Folding Algorithm
接下来将通过蒙特卡洛算法来优化蛋白质的结构。程序将通过一百次的循环来对蛋白的结构随机的进行操作,并打分以及选择。
Step 1: Random Move
对于Random Move,编写一个子程序以使用 random.randint() 随机选择一个氨基酸残基,然后通过从高斯分布中选择的随机数随机改变φ 或 ψ 角,使用Python中 内置函数 random.gauss(),其平均值为当前角度,标准差为 25°。 。改变扭转角后,使用 pmm.apply(polyA) 更新结构。
import math
import random
def randTrial(your_pose):
randNum = random.randint(2, your_pose.total_residue()) # 随机选择氨基酸残基
currPhi = your_pose.phi(randNum) # 现在的phi角
currPsi = your_pose.psi(randNum) # 现在的psi角
newPhi = random.gauss(currPhi, 25) # 高斯分布随机生成phi角
newPsi = random.gauss(currPsi, 25) # 高斯分布随机生成psi角
your_pose.set_phi(randNum,newPhi) # 将新的phi角设置到pose中
your_pose.set_psi(randNum,newPsi) # 将新的psi角设置到pose中
pmm.apply(your_pose) # 更新我们的pose
return your_pose
Step 2: Scoring Move
打分程序,对我们的更新后的pose进行打分。
sfxn = get_fa_scorefxn()
def score(your_pose):
return sfxn(your_pose)
core.scoring.ScoreFunctionFactory: SCOREFUNCTION: ref2015
Step 3: Accepting/Rejecting Move
在选择的子程序中,我们通过 Metropolis criterion 对新构象的pose进行选择。Metropolis criterion新的选择的概率为P=exp(−ΔG/kT),当 ΔE≥0(ΔE为后一步pose的能量减去前一步pose的能量), Metropolis criterion 接受新的pose的概率为 P=exp(−ΔG/kT). 当 ΔE<0, the Metropolis criterion probability of accepting the move is P=1. Use kT=1 Rosetta Energy Unit (REU).
def decision(before_pose, after_pose):
E = score(after_pose) - score(before_pose) ## ΔE
if E < 0:
return after_pose
elif random.uniform(0, 1) >= math.exp(-E/1): # Metropolis criterion 概率
return before_pose
else:
return after_pose
Step 4: Execution
现在可以将前面的三个子程序合并运行并执行100次循环。
def basic_folding(your_pose):
"""Your basic folding algorithm that completes 100 Monte-Carlo iterations on a given pose"""
lowest_pose = Pose() # 创建一个空的pose用来储存低能量的pose
for i in range(100):
if i == 0:
lowest_pose.assign(your_pose)
before_pose = Pose()
before_pose.assign(your_pose) # 复制我们的pose
after_pose = Pose()
after_pose.assign(randTrial(your_pose)) # 随机改变 并将pose储存为after_pose
your_pose.assign(decision(before_pose, after_pose)) # 对前后的pose进行比较,并储存我们选择的pose
if score(your_pose) < score(lowest_pose): # 更新能量低的pose
lowest_pose.assign(your_pose)
print("Iteration # %i" %i) # output
print("Current pose score: %1.3f" %score(your_pose)) # output
print("Lowest pose score: %1.3f" %score(lowest_pose)) # output
return lowest_pose