Изучение работы методов контроля температуры в молекулярной динамике

Скачаем файл с координатами этана и создадим файл с топологией

In [ ]:
> http://kodomo.fbb.msu.ru/FBB/year_08/term6/etane.gro
> cat et.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_139      1    ETH      C1      1    -0.189      12.01
    2   opls_139      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
    6     2     7     1
    7     2     8     1
    6     2     8     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

Загрузим файлы с методами контроля температуры

In [ ]:
> wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/be.mdp
> wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/vr.mdp
> wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/nh.mdp
> wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/an.mdp
> wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/sd.mdp

Построим входные файлы для mdrun

In [ ]:
> grompp -f be.mdp -c et.gro -p et.top -o et_be.tpr
> grompp -f vr.mdp -c et.gro -p et.top -o et_vr.tpr
> grompp -f nh.mdp -c et.gro -p et.top -o et_nh.tpr
> grompp -f an.mdp -c et.gro -p et.top -o et_an.tpr
> grompp -f sd.mdp -c et.gro -p et.top -o et_sd.tpr

Запустим молекулярную динамику для каждого метода

In [ ]:
> mdrun -deffnm et_be -v -nt 1
> mdrun -deffnm et_vr -v -nt 1
> mdrun -deffnm et_nh -v -nt 1
> mdrun -deffnm et_an -v -nt 1
> mdrun -deffnm et_sd -v -nt 1

Проанализируем результат визуально: переконвертируем в pdb и посмотрим в pymol

In [ ]:
> for i in be vr nh an sd; do trjconv -f et_$i.trr -s et_$i.tpr -o et_$i.pdb; done
Select a group: ETH
In [21]:
import __main__
__main__.pymol_argv = [ 'pymol', '-x' ]

import pymol
pymol.finish_launching()
from pymol import cmd
In [26]:
cmd.reinitialize()
cmd.load('et_sd.pdb')

метод Берендсена

Наблюдается в основном вращение вокруг С-С связи и, в меньшей степени, вокруг перпендикулярной ей оси

метод "Velocity rescale"

Наблюдается вращение вокруг С-С связи

метод Нуза-Хувера

Наблюдается вращение вокруг С-С связи и конформационные изменения

метод Андерсена

Наблюдается колебание длин связей

метод стохастической молекулярной динамики

Наблюдается хаотичное движение молекулы в пространстве

Теперь сравним потенциальную и кинетическую энергии

In [ ]:
> for i in be vr nh an sd; do g_energy -f et_$i.edr -o et_$i_en.xvg -xvg none; done
In [2]:
import numpy as np
import matplotlib.pyplot as plt
In [5]:
a= np.loadtxt('et_be_en.xvg')
t=a[:,0]
pot=a[:,1]
kin=a[:,2]
tot=a[:,3]
print('Berendsen')
plt.figure(figsize=[16,4.8])
n=plt.plot(t, pot,c='blue', linewidth=0.5)
n=plt.plot(t, kin,c='red', linewidth=0.5)
n=plt.plot(t, tot,c='black', linewidth=0.5)
Berendsen

Потенциальная и кинетическая энергии примерно одинаковы, и амплитуда колебаний уменьшается со временем от 40 до 5 кДж/моль и затем остается постоянной. При этм полная энергия системы остается постоянной практически на всем отрезке времени

In [4]:
a= np.loadtxt('et_vr_en.xvg')
t=a[:,0]
pot=a[:,1]
kin=a[:,2]
tot=a[:,3]

print('velocity rescale')
plt.figure(figsize=[16,4.8])
n=plt.plot(t, pot,c='blue', linewidth=0.5)
n=plt.plot(t, kin,c='red', linewidth=0.5)
n=plt.plot(t, tot,c='black', linewidth=0.5)
velocity rescale
In [ ]:
Потенциальная и кинетическая энергии сравнимы, их колебания хаотичны на всем отрезке времени.
In [8]:
a= np.loadtxt('et_nh_en.xvg')
t=a[:,0]
pot=a[:,1]
kin=a[:,2]
tot=a[:,3]
print('nose-hoover')
plt.figure(figsize=[16,4.8])
n=plt.plot(t, tot,c='black', linewidth=0.5)
n=plt.plot(t, pot,c='blue', linewidth=0.5)
n=plt.plot(t, kin,c='red', linewidth=0.5)
nose-hoover
In [ ]:
Кинетическая энергия несколько выше потенциальной, колебания сначала довольно большие (порядка 200 кДж/моль), затем 
резко уменьшаются до 50 кДж/моль.
In [11]:
a= np.loadtxt('et_an_en.xvg')
t=a[:,0]
pot=a[:,1]
kin=a[:,2]
tot=a[:,3]
print('andersen')
plt.figure(figsize=[16,4.8])
n=plt.plot(t, pot,c='blue', linewidth=0.5)
n=plt.plot(t, kin,c='red', linewidth=0.5)
n=plt.plot(t, tot,c='black', linewidth=0.5)
andersen
In [ ]:
Кинетическая энергия выше потенциальной, их амплитуды довольно малы (1.4 кДж/моль) и постоянны на всем отрезке времени. 
Полная энергия не меняется 
In [15]:
a= np.loadtxt('et_sd_en.xvg')
t=a[:,0]
pot=a[:,1]
kin=a[:,2]
tot=a[:,3]
print('stochastic')
plt.figure(figsize=[16,4.8])
n=plt.plot(t, pot,c='blue', linewidth=0.5)
n=plt.plot(t, kin,c='red', linewidth=0.5)
n=plt.plot(t, tot,c='black', linewidth=0.5)
stochastic

Потенциальная и кинетическая энергии сравнимы и демонстрируют хаотичные колебания

Рассмотрим распределение полной энергии системы

In [6]:
a= np.loadtxt('et_be_en.xvg')
tot=a[:,3]
print('Berendsen')

plt.figure(figsize=[16,4])
n=plt.hist(tot,color='green', bins=500)
Berendsen

Распределение энергий симметрично, много выбросов, дисперсия мала

In [78]:
a= np.loadtxt('et_vr_en.xvg')
tot=a[:,3]
plt.figure(figsize=[16,4])
n=plt.hist(tot,color='green', bins=500)

Распределение симметрично, с большой дисперсией

In [9]:
a= np.loadtxt('et_nh_en.xvg')
tot=a[:,3]
print('nose-hoover')
plt.figure(figsize=[16,4])
n=plt.hist(tot,color='green', bins=500)
nose-hoover

Асимметричное распределение, похоже на расределение Больцмана, но почему-то имеет два пика

In [12]:
a= np.loadtxt('et_an_en.xvg')
tot=a[:,3]
print('andersen')
plt.figure(figsize=[16,4])
n=plt.hist(tot,color='green', bins=500)
andersen

Распределение обладает наименьше дисперсией, также имеется небольшая асимметрия, напоминающая распределение Больцмана

In [16]:
a= np.loadtxt('et_sd_en.xvg')
tot=a[:,3]
print('stochastic')
plt.figure(figsize=[16,4])
n=plt.hist(tot,color='green', bins=500)
stochastic

Распределение со средней дисперсией, и некоторой асимметрией.

Распределение энергий в системе должно соответствовать распределению Больцмана. Из всех методов больше ему соответствует метод Нуза-Хувера.

Рассчитаем распределение длины С-С связи в каждом случае

In [ ]:
> cat b.ndx
[ b ]
1 2
> for i in be vr nh an sd; do g_bond -f et_$i.trr -s et_$i.tpr -o bond_$i.xvg -n b.ndx -xvg none; done
In [7]:
a= np.loadtxt('bond_be.xvg')
length=a[:,0]
dens=a[:,1]
print('Berendsen')

plt.figure(figsize=[16,4])

n=plt.hist(length,weights=dens, bins=len(dens), color='green')
Berendsen

Длина связи колеблется в пределах 0.151-0.156 нм, однако есть отдельные выбросы до 0.023 нм в обе стороны

In [55]:
a= np.loadtxt('bond_vr.xvg')
length=a[:,0]
dens=a[:,1]
plt.figure(figsize=[16,4])

n=plt.hist(length,weights=dens, bins=len(dens), color='green')

Длина связи колеблется от 0.145 до 0.16 нм

In [10]:
a= np.loadtxt('bond_nh.xvg')
length=a[:,0]
dens=a[:,1]
print('nose-hoover')
plt.figure(figsize=[16,4])
n=plt.hist(length,weights=dens, bins=len(dens), color='green')
nose-hoover

Длина связи колеблется от 0.145 до 0.16 нм, более четко выражен пик в области 0.153 нм

In [13]:
a= np.loadtxt('bond_an.xvg')
length=a[:,0]
dens=a[:,1]
print('andersen')
plt.figure(figsize=[16,4])
n=plt.hist(length,weights=dens, bins=len(dens), color='green')
andersen

Длина связи колеблется в пределах 0.150-0.156 нм

In [17]:
a= np.loadtxt('bond_sd.xvg')
length=a[:,0]
dens=a[:,1]
print('stochastic')
plt.figure(figsize=[16,4])
n=plt.hist(length,weights=dens, bins=len(dens), color='green')
stochastic

Длина колеблется от 0.145 до 0.16 нм

Рассмотрим время работы всех методов.

In [ ]:
> for i in be vr nh an sd; do echo $i; cat et_$i.log | tail -10 | grep Time | awk '{print $3}' ; done
be
4.088
vr
4.139
nh
4.184
an
4.003
sd
4.793

Как можно заметить, самый быстрый метод - Андерсена, а самый медленный - метод стохастической молекулярной динамики

Можно сделать вывод, что метод Нуза-Хувера позволяет наиболее реалистично поддерживать температуру в системе. Однако у других методов есть свои преимущества: например, метод Андерсена самый быстрый, также он позволяет моделировать колебательные движения молекул. Метод стохастической молекулярной динамики позволяет моделировать перемещения молекулы в пространстве, таким образом, его можно использовать для докинга.