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

На сервер кодомо были загружены файлы etane.gro, а также пять конфигурационных файла для алгоритмов контроля температуры:

be.mdp - метод Берендсена для контроля температуры.

vr.mdp - метод "Velocity rescale" для контроля температуры.

nh.mdp - метод Нуза-Хувера для контроля температуры.

an.mdp - метод Андерсена для контроля температуры.

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

С помощь пакета rdkit был получен файл et.top

код для получения файла:

import rdkit

from rdkit import Chem

from rdkit.Chem import AllChem, Draw

from rdkit.Chem import Descriptors

from rdkit import RDConfig

from IPython.display import Image,display

import numpy as np

Файл топологии этана¶

et=open('et.top','w')

et.write(

'''#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

1     2     6     1  

1     2     7     1  

1     2     8     1  

6     2     7     1  

6     2     8     1  

7     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'''

)

et.close()

Далее велась работа с командной строкой. Были использованы следующие команды:

gmx grompp -f be.mdp -c etane.gro -p et.top -o et_be.tpr

gmx grompp -f vr.mdp -c etane.gro -p et.top -o et_vr.tpr

gmx grompp -f nh.mdp -c etane.gro -p et.top -o et_nh.tpr

gmx grompp -f sd.mdp -c etane.gro -p et.top -o et_sd.tpr

gmx mdrun -deffnm et_be -v -nt 1

gmx mdrun -deffnm et_vr -v -nt 1

gmx mdrun -deffnm et_nh -v -nt 1

gmx mdrun -deffnm et_sd -v -nt 1

gmx trjconv -f et_be.trr -s et_be.tpr -o et_be.pdb

gmx trjconv -f et_vr.trr -s et_vr.tpr -o et_vr.pdb

gmx trjconv -f et_nh.trr -s et_nh.tpr -o et_nh.pdb

gmx trjconv -f et_sd.trr -s et_sd.tpr -o et_sd.pdb

echo "8" | gmx energy -f et_be.edr -o et_be_potential_en.xvg -xvg none

echo "8" | gmx energy -f et_vr.edr -o et_vr_potential_en.xvg -xvg none

echo "8" | gmx energy -f et_nh.edr -o et_nh_potential_en.xvg -xvg none

echo "8" | gmx energy -f et_sd.edr -o et_sd_potential_en.xvg -xvg none

echo "9" | gmx energy -f et_be.edr -o et_be_kinetic_en.xvg -xvg none

echo "9" | gmx energy -f et_vr.edr -o et_vr_kinetic_en.xvg -xvg none

echo "9" | gmx energy -f et_nh.edr -o et_nh_kinetic_en.xvg -xvg none

echo "9" | gmx energy -f et_sd.edr -o et_sd_kinetic_en.xvg -xvg none

echo "0" | gmx distance -f et_be.trr -s et_be.tpr -oall bond_be.xvg -n b.ndx -xvg none

echo "0" | gmx distance -f et_vr.trr -s et_vr.tpr -oall bond_vr.xvg -n b.ndx -xvg none

echo "0" | gmx distance -f et_nh.trr -s et_nh.tpr -oall bond_nh.xvg -n b.ndx -xvg none

echo "0" | gmx distance -f et_sd.trr -s et_sd.tpr -oall bond_sd.xvg -n b.ndx -xvg none

Работа с an.mdp не велась, GROMACS не него ругался

Кинетическая и потенциальная энергиии¶

Далее идут графики энергий для каждого метода

In [1]:
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')  

thermostats = {
    'be': {'color': '#2c7bb6', 'name': 'Berendsen Thermostat'},
    'nh': {'color': '#d7191c', 'name': 'Nose-Hoover Thermostat'},
    'sd': {'color': '#fdae61', 'name': 'Stochastic Dynamics'}, 
    'vr': {'color': '#1a9641', 'name': 'Velocity Rescale'}
}

for thermo_code, params in thermostats.items():
    t = np.loadtxt(f'et_{thermo_code}_potential_en.xvg')[:,0]
    U = np.loadtxt(f'et_{thermo_code}_potential_en.xvg')[:,1]
    K = np.loadtxt(f'et_{thermo_code}_kinetic_en.xvg')[:,1]
    
    fig, ax = plt.subplots(figsize=(10, 5))
    
    ax.plot(t, U, color=params['color'], alpha=0.8, 
            linewidth=2, label='Potential Energy')
    ax.plot(t, K, color='#333333', linestyle='--', 
            alpha=0.7, linewidth=1.5, label='Kinetic Energy')
    
    ax.set_title(f"{params['name']}", pad=15, fontsize=13)
    ax.set_xlabel('Simulation Time (ps)', labelpad=10)
    ax.set_ylabel('Energy (kJ/mol)', labelpad=10)
    ax.legend(framealpha=0.9, loc='upper right')
    
    ax.axhline(np.mean(U), color=params['color'], linestyle=':', linewidth=1)
    ax.axhline(np.mean(K), color='#333333', linestyle=':', linewidth=1)
    
    plt.tight_layout()
    plt.show()
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Распределение длин С-С связей¶

Распределение длин связей для каждого метода

In [4]:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

plt.style.use('seaborn-v0_8-whitegrid')

colors = ['#3498db', '#e74c3c', '#2ecc71', '#9b59b6']

for idx, (code, name) in enumerate([('be', 'Berendsen'), 
                                  ('nh', 'Nose-Hoover'),
                                  ('sd', 'Stochastic Dynamics'),
                                  ('vr', 'Velocity Rescale')]):
    
    bond_lengths = np.loadtxt(f'bond_{code}.xvg')[:,1] * 10  
    
    fig, ax = plt.subplots(figsize=(8, 5))
    
    ax.hist(bond_lengths, bins=15, color=colors[idx], 
           alpha=0.7, edgecolor='white', density=True)
    
    kde = gaussian_kde(bond_lengths)
    x_vals = np.linspace(min(bond_lengths), max(bond_lengths), 200)
    ax.plot(x_vals, kde(x_vals), color=colors[idx], linewidth=2)
    
    mean_val = np.mean(bond_lengths)
    ax.axvline(mean_val, color='#34495e', linestyle='--', linewidth=1.5,
              label=f'Mean: {mean_val:.2f} Å')
    
    ax.set_title(f'C-C Bond Length Distribution\n({name} Thermostat)', pad=15)
    ax.set_xlabel('Bond Length (Å)', labelpad=10)
    ax.set_ylabel('Probability Density', labelpad=10)
    ax.legend()
    
    plt.tight_layout()
    plt.show()
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Pdb были проанализированы локально с помощью PyMol

Берендсена

Быстрое вращение вокруг связи C-C, малое смещение Выход на плато (замкнутая система) Узкое распределение с максимумом при 1.53 Å, минимальные флуктуации

Velocity rescale

Умеренное вращение, колебания длин связей и углов Умеренные флуктуации Распределение Больцмана с максимумом при 1.53 Å

Нузе-Хувера

Малое вращение, колебания длин связей и углов Резкие выбросы (до ~400 кДж/моль!). Асимметричное распределение (тяжелый левый хвост) с максимумом при 1.53 Å

Стохастическая динамика

Сильное вращение и смещение, аномальные удлинения связей Умеренные флуктуации Смещенное распределение (максимум не на 1.53 Å), форма "похожа" на Больцмана

Берендсена – слишком "зажатая" система, энергии почти не флуктуируют.

Velocity rescale – наиболее естественные колебания энергии.

Нузе-Хувера – нестабильный, с гигантскими выбросами (нефизично!).

Стохастическая динамика – энергии "скачут", потенциальная энергия систематически занижена.

Лучший выбор: Velocity rescale, так как дает реалистичную динамику.