Изучение работы методов контроля температуры в молекулярной динамике¶
На сервер кодомо были загружены файлы 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 не него ругался
Кинетическая и потенциальная энергиии¶
Далее идут графики энергий для каждого метода
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()
Распределение длин С-С связей¶
Распределение длин связей для каждого метода
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()
Pdb были проанализированы локально с помощью PyMol
Берендсена
Быстрое вращение вокруг связи C-C, малое смещение Выход на плато (замкнутая система) Узкое распределение с максимумом при 1.53 Å, минимальные флуктуации
Velocity rescale
Умеренное вращение, колебания длин связей и углов Умеренные флуктуации Распределение Больцмана с максимумом при 1.53 Å
Нузе-Хувера
Малое вращение, колебания длин связей и углов Резкие выбросы (до ~400 кДж/моль!). Асимметричное распределение (тяжелый левый хвост) с максимумом при 1.53 Å
Стохастическая динамика
Сильное вращение и смещение, аномальные удлинения связей Умеренные флуктуации Смещенное распределение (максимум не на 1.53 Å), форма "похожа" на Больцмана
Берендсена – слишком "зажатая" система, энергии почти не флуктуируют.
Velocity rescale – наиболее естественные колебания энергии.
Нузе-Хувера – нестабильный, с гигантскими выбросами (нефизично!).
Стохастическая динамика – энергии "скачут", потенциальная энергия систематически занижена.
Лучший выбор: Velocity rescale, так как дает реалистичную динамику.