Моделирование белковой структуры и сетки monte carlo
Я работаю над сценарием моделирования Монте-Карло над структурой белка. Я никогда не делал этого до написания сценариев Монте-Карло. Я буду распространять эту программу в больших масштабах. Согласно координатам xyz белка, я должен определить размер коробки. Этот ящик будет разделен на сетку размером 0,5 А. Основываясь на критериях расстояния и угла, я должен назначить точку, основанную на распределении вероятностей Больцмана.
![Protein structure in the 3-D box, showing the grid]()
Моя программа должна двигаться в каждом направлении, беря сетку 0,5 А и генерируя случайную точку и проверяя состояние расстояния и угла. Если удовлетворять условию put point, то в противном случае отбросить эту точку, основанную на распределении вероятностей Больцмана.
Вот мой код для генерации случайных точек
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. Как проверить каждую точку в поле.
Любая помощь будет заметна.
Ответы
Ответ 1
Мне нравится ваша тема, вопрос и подход. Я не знаю, как долго он будет стоять здесь.
Трехмерная сетка в прямоугольном пространстве является общей для анализа конечных элементов и всех других методов анализа физических проблем. Посмотрите, как генерируются сетки.
Обычно есть две части: сетка (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)
Таким образом, одним из возможных подходов было бы перебрать все ящики, проверить положение в центре и настроить соответствующим образом.
Я бы выделил определение ячейки из вашего кода и прочитал его из файла. Таким образом, вы можете обрабатывать разные ячейки с помощью одного и того же кода.
Если я правильно вас пойму, сетка останется фиксированной в пространстве. Вы пытаетесь рандомизировать движение самого белка. Это похоже на проблему с жидкостями, эйлеровский подход: вы отслеживаете движение материала против фиксированного объема управления. За исключением этого белка вместо жидкости.
Таким образом, у вас также будет отдельное определение начального условия для белка в космосе. Вы планируете постепенно наращивать его, чтобы увидеть, как белок складывается в соответствии с вашими правилами.
Я близко?
Ответ 2
Считаете ли вы использование PyRosetta? Это гораздо проще в использовании, так как многие из функций, которые вам нужны, уже встроены. Вы можете визуализировать свой вывод в реальном времени в PyMol. Я написал аналогичный скрипт в PyRosetta, довольно легко писать и модифицировать, и он сделал то, что он должен был делать.
Ответ 3
Мой код был написан для приложения для складывания белков, но общая идея такая же. Он начинается с определенной температуры и уменьшает температурный шаг, белок (или в вашем случае "точка") перемещается случайным образом, если энергетическая оценка новой позиции/структуры ниже предыдущей, она принимается, если не поза будет оцениваться в соответствии с распределением "Метрополис". Вы должны определить свою функцию 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!'