Моделирование белковой структуры и сетки 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!'