from textwrap import dedent
from fabric import Connection
import keyring
import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt
import seaborn as sns
from jupyterthemes import jtplot
import shutil, time, os
from IPython.display import Image
from io import StringIO
jtplot.style(figsize=(17, 11), fscale=1.5)
THERMOSTATS = ['an', 'nh', 'vr', 'be', 'sd']
NAMES = ['Andersen', 'Nose-Hoover', 'V-rescale', 'Berendsen', 'Stochastic']
Макрос для исполнения команд на kodomo:
def kodomo_do(command):
with Connection('kodomo.fbb.msu.ru', user='aidar',
connect_kwargs={'password': keyring.get_password('kodomo', 'aidar')}) as kodomo:
with kodomo.cd('~/tmp/term8'):
result = kodomo.run(command, hide='both')
return result.stdout
_ = kodomo_do('wget -q http://kodomo.fbb.msu.ru/FBB/year_08/term6/etane.gro -O et.gro')
Нам была дана заготовка для файла топологии, но ее нужно было подкорректировать. Сначала я добавил недостающие связи, углы и торсионные углы (для последних я также поменял тип на 3). Затем в файле с типами атомов (/usr/share/gromacs/top/oplsaa.ff/atomtypes.atp) я нашел следующие строчки:
opls_135 12.01100 ; alkane CH3 opls_140 1.00800 ; alkane H.Эти типы я и вставил в наш файл с топологией (и поправил массы углерода). И наконец, я поправил заряды согласно файлу с нековалентными взаимодействиями (/usr/share/gromacs/top/oplsaa.ff/ffnonbonded.itp).
for therm in THERMOSTATS:
kodomo_do(f'wget http://kodomo.fbb.msu.ru/FBB/year_08/term6/{therm}.mdp')
for therm in THERMOSTATS:
kodomo_do(f'grompp -f {therm}.mdp -c et.gro -p et.top -o et_{therm}.tpr')
for therm in THERMOSTATS:
kodomo_do(f'mdrun -deffnm et_{therm} -nt 1')
for therm in THERMOSTATS:
kodomo_do(f'echo 0 | trjconv -f et_{therm}.trr -s et_{therm}.tpr -o et_{therm}.pdb')
for therm in THERMOSTATS:
with open(f'{therm}.pdb', 'w') as f:
f.write(kodomo_do(f'cat et_{therm}.pdb'))
import pymol
pymol.finish_launching(['pymol'])
from pymol import cmd
for therm in THERMOSTATS:
cmd.reinitialize()
cmd.set('ray_trace_mode', 3)
cmd.set('ray_trace_gain', 0)
cmd.set('antialias', 2)
cmd.set('sphere_scale', 0.2)
cmd.set('stick_radius', 0.15)
cmd.load(f'{therm}.pdb')
cmd.orient()
cmd.move('z', 3)
cmd.show('spheres')
dirpath = 'images/'
if os.path.exists(dirpath):
shutil.rmtree(dirpath)
time.sleep(0.1)
os.mkdir(dirpath)
cmd.mpng(dirpath, mode=2, width=1920//3, height=1080//3)
while not os.path.exists(f'{dirpath}0251.png'):
time.sleep(0.1)
with imageio.get_writer(f'{therm}.gif', mode='I', fps=30) as writer:
for x in range(0, 251):
filename = os.path.join(dirpath, f'{x+1:04}.png')
image = imageio.imread(filename)
writer.append_data(image)
for therm, name in zip(THERMOSTATS, NAMES):
print(f'{name} thermostat:')
display(Image(f'{therm}.gif', format='png'))