Задание №8

Построим файл топологии для этана:

In [34]:
%%bash
cat ethane/ethane.top
#include "/usr/share/gromacs/top/oplsaa.ff/forcefield.itp"

[ moleculetype ]
; Name            nrexcl
et            3

[ atoms ]
;   nr  type  resnr  residue  atom   cgnr     charge       mass
    1   opls_135      1    ETH      C1      1    -0.189      12.01
    2   opls_135      1    ETH      C2      2    -0.155      12.01
    3   opls_140      1    ETH      H1      3     0.0059       1.008
    4   opls_140      1    ETH      H2      4     0.0059       1.008
    5   opls_140      1    ETH      H3      5     0.0059       1.008
    6   opls_140      1    ETH      H4      6     0.0056       1.008
    7   opls_140      1    ETH      H5      7     0.0056       1.008
    8   opls_140      1    ETH      H6      8     0.0056       1.008
    
[ bonds ]
;  ai    aj funct  b0       kb
     1   2   1  
     1   3   1
     1   4   1  
     1   5   1 
     2   6   1
     2   7   1
     2   8   1

[ angles ]
;  ai    aj    ak funct  phi0   kphi
;around c1
    3     1     4     1  
    4     1     5     1  
    3     1     5     1  
    2     1     3     1  
    2     1     4     1  
    2     1     5     1  
;around c2
    7     2     8     1  
    8     2     6     1  
    7     2     6     1  
    1     2     6     1  
    1     2     7     1  
    1     2     8     1  

[ dihedrals ]
;  ai    aj    ak    al funct  
    3    1     2     6      3  
    3    1     2     7      3 
    3    1     2     8      3  
    4    1     2     6      3
    4    1     2     7      3 
    4    1     2     8      3
    5    1     2     6      3
    5    1     2     7      3
    5    1     2     8      3

[ pairs ]
; список атомов 1-4
;  ai    aj funct
   3  6
   3  7
   3  8
   4  6
   4  7
   4  8
   5  6
   5  7
   5  8

[ System ]
; any text here
first one
[ molecules ]
;Name count
 et    1

Сгенерируем tpr файлы:

In [37]:
import subprocess

file_suffixes = ['be', 'vr', 'nh', 'an', 'sd']
method_names = ['Berendsen\'s Method', 'Velocity Rescale', 'Nose-Hoover MEthod', 'Andersen Method', 'Stochastic MD']
command = 'grompp -f {0}.mdp -c ethane.gro -p ethane.top -o ethane_{0}.tpr'
for suffix in file_suffixes:
    subprocess.call(command.format(suffix), shell=True)

Для каждого из полученных файлов запустим mdrun и измерим время работы:

In [52]:
import time

command = 'mdrun -deffnm ethane_{0} -v -nt 1'
for method_name, suffix in zip(method_names, file_suffixes):
    current_command = command.format(suffix)
    start = time.time()
    subprocess.call(current_command, shell=True)
    print '{0}: {1} (seconds)'.format(method_names[ind], time.time() - start)
Berendsen's Method: 3.29635310173 (seconds)
Velocity Rescale: 3.66203808784 (seconds)
Nose-Hoover MEthod: 3.51911711693 (seconds)
Andersen Method: 3.24347281456 (seconds)
Stochastic MD: 4.09246492386 (seconds)

Конвертируем каждую из 5 систем в pdb:

In [53]:
command = 'echo 0 | trjconv -f ethane_{0}.trr -s ethane_{0}.tpr -o ethane_{0}.pdb'
for suffix in file_suffixes:
    subprocess.call(command.format(suffix), shell=True)

Визуализируем получившиеся pdb:

In [1]:
from base64 import b64encode
from IPython.core.display import HTML, display

for method_name, suffix in zip(method_names, file_suffixes):
    video = open('ethane_{0}.mp4'.format(suffix), 'rb').read()
    video_encoded = b64encode(video)
    html_code = '<h1>{0}</h1><video controls alt="PyMol Movie" src="data:video/mp4;base64,{1}" type="video/mp4">'.format(method_name, video_encoded)
    display(HTML(html_code))

Berendsen's Method

Velocity Rescale

Nose-Hoover MEthod

Andersen Method

Stochastic MD

Видим, что при использовании метода Берендсена происходит активное вращение вокруг связи C-C. При velocity rescale и методы Нуза-Хувера также происходит вращение вокруг связи C-C, но менее интенсивное, чем при Берендсене. В целом velocity rescale похож на Нуза-Хувера. При методе Андерсена происходит лишь изменение длины связи C-C без вращений. И наконец стохастическая молекулярная динамик заставляет молекулу этана беспорядочно вращаться в пространстве. Кажется, что стохастическая молекулярная динамика показывает результаты имеющие минимальное отношение к действительности.

Сравним потенциальную энергию и кинетическую энергию для каждой из 5 систем:

In [55]:
command = 'echo -e \"10\n11\n\n\" | g_energy -f ethane_{0}.edr -o ethane_{0}_en.xvg -xvg none'
for suffix in file_suffixes:
    subprocess.call(command.format(suffix), shell=True)

Построим график изменения энергий:

In [72]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

for method_name, suffix in zip(method_names, file_suffixes):
    fig = plt.figure(figsize=(15, 5))
    ax = fig.add_subplot(111)
    a = np.loadtxt('ethane_{0}_en.xvg'.format(suffix))
    ax.plot(a[:,0], a[:,1], 'b', a[:,0], a[:,2], 'r')
    ax.set_title(method_name)
    blue_patch = mpatches.Patch(color='blue', label='Potential Energy')
    red_patch = mpatches.Patch(color='red', label='Kinetic Energy')
    ax.legend(handles=[blue_patch, red_patch])

plt.show()

Видим, что при методе Берендсена в отличие от других методов получается распределение энергии сильно похожее на распределение Больцмана.

Создадим индекс файл и запустим утилиту по анализу связей g_bond:

In [59]:
%%bash
echo -e "[ b ]\n1 2" > b.ndx
In [60]:
command = 'g_bond -f ethane_{0}.trr -s ethane_{0}.tpr -o bond_{0}.xvg -n b.ndx -xvg none'
for suffix in file_suffixes:
    subprocess.call(command.format(suffix), shell=True)

Построим график распределения длин связей:

In [69]:
for method_name, suffix in zip(method_names, file_suffixes):
    fig = plt.figure(figsize=(15, 5))
    ax = fig.add_subplot(111)
    a = np.loadtxt('bond_{0}.xvg'.format(suffix))
    ax.set_title(method_name)
    ax.bar(np.arange(len(a[:,0])), a[:,1])

plt.show()

Мы видим, что для методов Берендсена и Нуза-Хувера распределения длин связей больше всего похожи на нормальные. Помятуя также о том, что лишь при использовании метода Берендсена получается распределение энергий похожее на распределение Больцмана, можно сделать вывод, что в данной задаче для контроля температуры лучше всего подходит метод Берендсена, который к тому же еще и второй по быстродействию, уступаю методу Андерсена 0.05 секунды.