我正在研究蛋白质结构的蒙特卡罗模拟脚本。我从来没有在蒙特卡洛脚本之前做过。我将大规模扩展这个计划。 根据蛋白质xyz坐标我必须定义盒子大小。此框将被划分为大小为0.5 A的网格。根据距离和角度标准,我必须根据玻尔兹曼概率分布来指定点。
我的程序应该通过取0.5 A的网格在每个方向上移动并生成随机点并检查距离和角度的条件。如果满足条件,则根据玻尔兹曼概率分布丢弃该点。
这是我生成随机点的代码
from __future__ import division
import math as mean
from numpy import *
import numpy as np
from string import *
from random import *
def euDist(cd1, cd2):# calculate distance
d2 = ((cd1[0]-cd2[0])**2 + (cd1[1]-cd2[1])**2 + (cd1[2]-cd2[2])**2)
d1 = d2 ** 0.5
return round(d1, 2)
def euvector(c2,c1):# generate vector
x_vec = (c2[0] - c1[0])
y_vec = (c2[1] - c1[1])
z_vec = (c2[2] - c1[2])
return (x_vec, y_vec, z_vec)
for arang in range(1000): # generate random point
arang = arang + 1
x,y,z = uacoord
#print x,y,z
x1,y1,z1 = (uniform(x-3.5,x+3.5), uniform(y-3.5,y+3.5), uniform(z-3.5,z+5))
pacord = [x1,y1,z1] # random point coordinates
print pacord
我完全惊讶于从蛋白质结构的xyz坐标生成盒子大小以及如何定义大小为0.5的网格。如何检查框中的每个点 任何帮助都会很明显。
答案 0 :(得分:3)
我爱您的主题,问题和方法。我不知道它会在这里停留多长时间。
矩形空间中的3D网格在有限元分析和所有其他分析物理问题的技术中很常见。看看网格是如何生成的。
通常有两个部分:空间中的(x,y,z)点网格和连接它们的框。具有两个元素的简单2D网格将如下所示:
D E F
o (1, 0) ------ o (1, 1) ------ o (1, 2)
+ + +
+ + +
+ + +
o (0, 0) -------+ (0, 1) -------+ (0, 2)
A B C
此网格中有六个点:
A (0, 0)
B (0, 1)
C (0, 2)
D (1, 0)
E (1, 1)
F (1, 2)
和两个方框:
1 - (A, B, E, D)
2 - (B, C, F, E)
因此,一种可能的方法是迭代所有框,检查质心处的位置,并相应地进行调整。
我会从您的代码中外部化网格定义并从文件中读取它。这样你就可以使用相同的代码处理不同的网格。
如果我理解正确,网格将保持固定在空间中。你试图随机化蛋白质本身的运动。这就像一个流体问题,一个欧拉方法:你跟踪材料对固定控制体积的运动。除了它是蛋白质而不是液体。
因此,您还将对空间蛋白质的初始条件进行单独定义。您计划及时增加它以查看蛋白质如何根据您的规则折叠。
我关闭了吗?
答案 1 :(得分:3)
你考虑过使用PyRosetta吗?它更容易使用,因为您已经内置了许多所需的功能。您可以在PyMol中实时显示您的输出。我在PyRosetta中编写了一个类似的脚本,相当容易编写和修改,它完成了应该做的事情。
答案 2 :(得分:1)
我的代码是为蛋白质折叠应用程序编写的,但总体思路是一样的。它从一定的温度开始并逐步降低温度,蛋白质(或在你的情况下是'点)随机移动,如果新位置/结构的能量分数低于前一个,它被接受,如果不是该姿势将根据Metropolis分布进行评估。您必须定义scorefunction(),一个定义随机起始位置的函数和一个将您的点从其原始位置移动的移动器。下面的代码是从我原来的脚本中修改的,只是为了给你一个粗略的想法。
kT_lower=0.1
kT_upper=100
ktemp=kT_upper
max_iterations=15000
i=-1
#create random start point
pose=create_pose()
#evaluate start point
starting_score=scorefunction(pose)
while i<max_iterations:
i=i+1
new_pose=random_move(pose)
if scorefunction(new_pose)<scorefunction(pose):
pose=new_pose
else:
#linear decrease of kT
ktemp=kT_upper-i*(kT_upper-kT_lower)/max_iterations
#exponentatial decrease of kT
#ktemp=math.exp(float(i)/float(max_iterations)*float(-5))*kT_upper+kT_lower
try:
p=math.exp(DeltaE/ktemp)
except OverflowError:
p=-1
if random.random()<p:
pose=new_pose
print str(i)+'; accept new pose, metropolis'
else:
print str(i)+'; reject new pose!'