pyrosetta4-Basic Folding Algorit

2022-08-17  本文已影响0人  学了忘了学

蛋白质的折叠在蛋白质的设计中有着关键性的作用,并一直在被人类坐探索。这里将通过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

参考

RosettaCommonsPyRosetta.notebooks

上一篇 下一篇

猜你喜欢

热点阅读