Gromacs_py basic example¶
Here is an example of a short simulation of the SH3 domain of phospholipase Cγ1. Five successive steps are used:
- Topologie creation using
GmxSys.prepare_top()
. - Minimisation of the structure using
GmxSys.em_2_steps()
. - Solvation of the system using
GmxSys.solvate_add_ions()
. - Equilibration of the system using
GmxSys.em_equi_three_step_iter_error()
. - Production run using
GmxSys.production()
.
Import¶
[1]:
import sys
import os
import urllib.request
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
# Gromacs_py import
sys.path.insert(0, os.path.abspath('../../..'))
import gromacs_py.gromacs.gmx5 as gmx
Gromacs version is 2018.3
FORCEFIELD_PATH = /home/murail/Documents/Code/gromacs_py/gromacs_py/gromacs/template
Simulation setup¶
[16]:
# Setup data location
DATA_OUT = 'data_sim'
PDB_ID = '1Y0M'
# System Setup
vsite='hydrogens'
ion_C = 0.15
sys_top_folder = os.path.join(DATA_OUT, 'sys_top')
# Energy Minimisation
em_folder = os.path.join(DATA_OUT, 'em')
em_sys_folder = os.path.join(DATA_OUT, 'sys_em')
em_step_number = 5000
# Equillibration
equi_folder = os.path.join(DATA_OUT, 'sys_equi')
HA_time = 0.5
CA_time = 1.0
CA_LOW_time = 2.0
dt_HA = 0.002
dt = 0.005
HA_step = 1000 * HA_time / dt_HA
CA_step = 1000 * CA_time / dt
CA_LOW_step = 1000 * CA_LOW_time / dt
# Production
prod_folder = os.path.join(DATA_OUT, 'sys_prod')
prod_time = 10.0
prod_step = 1000 * prod_time / dt
Get PDB file from the rcsb.org
website¶
[3]:
os.makedirs(DATA_OUT, exist_ok = True)
raw_pdb = urllib.request.urlretrieve('http://files.rcsb.org/download/{}.pdb'.format(PDB_ID),
'{}/{}.pdb'.format(DATA_OUT, PDB_ID))
Define the simulation system¶
[4]:
md_sys = gmx.GmxSys(name=PDB_ID, coor_file=raw_pdb[0])
md_sys.display()
name : 1Y0M
coor_file : data_sim/1Y0M.pdb
nt : 0
ntmpi : 0
sys_history : 0
1. Create topology:¶
[5]:
md_sys.prepare_top(out_folder=os.path.join(DATA_OUT, 'prot_top'), vsite=vsite)
md_sys.create_box(dist=1.0, box_type="dodecahedron", check_file_out=True)
Succeed to read file ../1Y0M.pdb , 648 atoms found
Succeed to save file tmp_pdb2pqr.pdb
pdb2pqr.py --ff CHARMM --ffout CHARMM --chain tmp_pdb2pqr.pdb 00_1Y0M.pqr
Succeed to read file 00_1Y0M.pqr , 996 atoms found
Chain: A Residue: 0 to 60
Succeed to save file 01_1Y0M_good_his.pdb
-Create topologie
gmx pdb2gmx -f 01_1Y0M_good_his.pdb -o 1Y0M_pdb2gmx.pdb -p 1Y0M_pdb2gmx.top -i 1Y0M_posre.itp -water tip3p -ff charmm36-jul2017 -ignh -vsite hydrogens
Molecule topologie present in 1Y0M_pdb2gmx.top , extract the topologie in a separate file: 1Y0M_pdb2gmx.itp
Protein_chain_A
-ITP file: 1Y0M_pdb2gmx.itp
-molecules defined in the itp file:
* Protein_chain_A
Rewrite topologie: 1Y0M_pdb2gmx.top
-Create pbc box
gmx editconf -f data_sim/prot_top/1Y0M_pdb2gmx.pdb -o data_sim/prot_top/1Y0M_pdb2gmx_box.pdb -bt dodecahedron -d 1.0
2. Energy minimisation¶
[6]:
md_sys.em_2_steps(out_folder=em_folder,
no_constr_nsteps=em_step_number,
constr_nsteps=em_step_number,
posres="",
create_box_flag=False)
-Create the tpr file Init_em_1Y0M.tpr
gmx grompp -f Init_em_1Y0M.mdp -c ../prot_top/1Y0M_pdb2gmx_box.pdb -r ../prot_top/1Y0M_pdb2gmx_box.pdb -p ../prot_top/1Y0M_pdb2gmx.top -po out_Init_em_1Y0M.mdp -o Init_em_1Y0M.tpr -maxwarn 1
-Launch the simulation Init_em_1Y0M.tpr
gmx mdrun -s Init_em_1Y0M.tpr -deffnm Init_em_1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
-Create the tpr file 1Y0M.tpr
gmx grompp -f 1Y0M.mdp -c Init_em_1Y0M.gro -r Init_em_1Y0M.gro -p ../prot_top/1Y0M_pdb2gmx.top -po out_1Y0M.mdp -o 1Y0M.tpr -maxwarn 1
-Launch the simulation 1Y0M.tpr
gmx mdrun -s 1Y0M.tpr -deffnm 1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
Plot energy:¶
[7]:
ener_pd_1 = md_sys.sys_history[-1].get_ener(selection_list=['Potential'])
ener_pd_2 = md_sys.get_ener(selection_list=['Potential'])
ener_pd_1['label'] = 'no bond constr'
ener_pd_2['label'] = 'bond constr'
ener_pd = pd.concat([ener_pd_1, ener_pd_2])
ener_pd.time = np.arange(len(ener_pd))
#ax = ener_pd.plot(x='time')
ax = sns.lineplot(x="time", y="Potential",
hue="label",
data=ener_pd)
ax.set_xlabel('step')
ax.set_ylabel('energy (KJ/mol)')
-Extract energy
gmx energy -f data_sim/em/Init_em_1Y0M.edr -o tmp.xvg
-Extract energy
gmx energy -f data_sim/em/1Y0M.edr -o tmp.xvg
[7]:
Text(0, 0.5, 'energy (KJ/mol)')
3. Solvation (water and \(Na^{+} Cl^{-}\))¶
[8]:
md_sys.solvate_add_ions(out_folder=sys_top_folder,
ion_C=ion_C)
md_sys.display()
-Create pbc box
gmx editconf -f data_sim/em/1Y0M.gro -o data_sim/em/1Y0M_box.pdb -bt dodecahedron -d 1.1
-Solvate the pbc box
Copy topologie file and dependancies
Copy topologie file and dependancies
-Create the tpr file genion_1Y0M_water_ion.tpr
gmx grompp -f ../../../../gromacs/template/mini.mdp -c 1Y0M_water.pdb -r 1Y0M_water.pdb -p 1Y0M_water_ion.top -po out_mini.mdp -o genion_1Y0M_water_ion.tpr -maxwarn 1
-Add ions to the system with an ionic concentration of 0.15 M , sytem charge = 0.0 water num= 11860
Add ions : NA : 32 CL : 32
gmx genion -s genion_1Y0M_water_ion.tpr -p 1Y0M_water_ion.top -o 1Y0M_water_ion.gro -np 32 -pname NA -nn 32 -nname CL
name : 1Y0M
sim_name : genion_1Y0M_water_ion
coor_file : data_sim/sys_top/1Y0M_water_ion.gro
top_file : data_sim/sys_top/1Y0M_water_ion.top
tpr : data_sim/sys_top/genion_1Y0M_water_ion.tpr
mdp : ../../gromacs/template/mini.mdp
xtc : data_sim/em/1Y0M.trr
edr : data_sim/em/1Y0M.edr
log : data_sim/em/1Y0M.log
nt : 0
ntmpi : 0
sys_history : 2
4. System minimisation and equilibration¶
[9]:
md_sys.em_equi_three_step_iter_error(out_folder=equi_folder,
no_constr_nsteps=em_step_number,
constr_nsteps=em_step_number,
nsteps_HA=HA_step,
nsteps_CA=CA_step,
nsteps_CA_LOW=CA_LOW_step,
dt=dt, dt_HA=dt_HA)
-Create the tpr file Init_em_1Y0M.tpr
gmx grompp -f Init_em_1Y0M.mdp -c ../../sys_top/1Y0M_water_ion.gro -r ../../sys_top/1Y0M_water_ion.gro -p ../../sys_top/1Y0M_water_ion.top -po out_Init_em_1Y0M.mdp -o Init_em_1Y0M.tpr -maxwarn 1
-Launch the simulation Init_em_1Y0M.tpr
gmx mdrun -s Init_em_1Y0M.tpr -deffnm Init_em_1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
-Create the tpr file 1Y0M.tpr
gmx grompp -f 1Y0M.mdp -c Init_em_1Y0M.gro -r Init_em_1Y0M.gro -p ../../sys_top/1Y0M_water_ion.top -po out_1Y0M.mdp -o 1Y0M.tpr -maxwarn 1
-Launch the simulation 1Y0M.tpr
gmx mdrun -s 1Y0M.tpr -deffnm 1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
-Convert trj/coor
gmx trjconv -f data_sim/sys_equi/sys_em/1Y0M.gro -o data_sim/sys_equi/sys_em/1Y0M_compact.pdb -s data_sim/sys_equi/sys_em/1Y0M.tpr -ur compact -pbc mol
-Create the tpr file equi_HA_1Y0M.tpr
gmx grompp -f equi_HA_1Y0M.mdp -c ../../sys_em/1Y0M_compact.pdb -r ../../sys_em/1Y0M_compact.pdb -p ../../../sys_top/1Y0M_water_ion.top -po out_equi_HA_1Y0M.mdp -o equi_HA_1Y0M.tpr -maxwarn 0
-Launch the simulation equi_HA_1Y0M.tpr
gmx mdrun -s equi_HA_1Y0M.tpr -deffnm equi_HA_1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
-Create the tpr file equi_CA_1Y0M.tpr
gmx grompp -f equi_CA_1Y0M.mdp -c ../00_equi_HA/equi_HA_1Y0M.gro -r ../../sys_em/1Y0M_compact.pdb -p ../../../sys_top/1Y0M_water_ion.top -po out_equi_CA_1Y0M.mdp -o equi_CA_1Y0M.tpr -maxwarn 0
-Launch the simulation equi_CA_1Y0M.tpr
gmx mdrun -s equi_CA_1Y0M.tpr -deffnm equi_CA_1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
-Create the tpr file equi_CA_LOW_1Y0M.tpr
gmx grompp -f equi_CA_LOW_1Y0M.mdp -c ../01_equi_CA/equi_CA_1Y0M.gro -r ../../sys_em/1Y0M_compact.pdb -p ../../../sys_top/1Y0M_water_ion.top -po out_equi_CA_LOW_1Y0M.mdp -o equi_CA_LOW_1Y0M.tpr -maxwarn 0
-Launch the simulation equi_CA_LOW_1Y0M.tpr
gmx mdrun -s equi_CA_LOW_1Y0M.tpr -deffnm equi_CA_LOW_1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
Display history and plot temperature¶
[11]:
md_sys.display_history()
State -7:
name : 1Y0M
coor_file : data_sim/prot_top/1Y0M_pdb2gmx_box.pdb
top_file : data_sim/prot_top/1Y0M_pdb2gmx.top
nt : 0
ntmpi : 0
sys_history : 0
State -6:
name : 1Y0M
sim_name : Init_em_1Y0M
coor_file : data_sim/em/Init_em_1Y0M.gro
top_file : data_sim/prot_top/1Y0M_pdb2gmx.top
tpr : data_sim/em/Init_em_1Y0M.tpr
mdp : data_sim/em/Init_em_1Y0M.mdp
xtc : data_sim/em/Init_em_1Y0M.trr
edr : data_sim/em/Init_em_1Y0M.edr
log : data_sim/em/Init_em_1Y0M.log
nt : 0
ntmpi : 0
sys_history : 0
State -5:
name : 1Y0M
sim_name : genion_1Y0M_water_ion
coor_file : data_sim/sys_top/1Y0M_water_ion.gro
top_file : data_sim/sys_top/1Y0M_water_ion.top
tpr : data_sim/sys_top/genion_1Y0M_water_ion.tpr
mdp : ../../gromacs/template/mini.mdp
xtc : data_sim/em/1Y0M.trr
edr : data_sim/em/1Y0M.edr
log : data_sim/em/1Y0M.log
nt : 0
ntmpi : 0
sys_history : 0
State -4:
name : 1Y0M
sim_name : Init_em_1Y0M
coor_file : data_sim/sys_equi/sys_em/Init_em_1Y0M.gro
top_file : data_sim/sys_top/1Y0M_water_ion.top
tpr : data_sim/sys_equi/sys_em/Init_em_1Y0M.tpr
mdp : data_sim/sys_equi/sys_em/Init_em_1Y0M.mdp
xtc : data_sim/sys_equi/sys_em/Init_em_1Y0M.trr
edr : data_sim/sys_equi/sys_em/Init_em_1Y0M.edr
log : data_sim/sys_equi/sys_em/Init_em_1Y0M.log
nt : 0
ntmpi : 0
sys_history : 0
State -3:
name : 1Y0M
sim_name : 1Y0M
coor_file : data_sim/sys_equi/sys_em/1Y0M_compact.pdb
top_file : data_sim/sys_top/1Y0M_water_ion.top
tpr : data_sim/sys_equi/sys_em/1Y0M.tpr
mdp : data_sim/sys_equi/sys_em/1Y0M.mdp
xtc : data_sim/sys_equi/sys_em/1Y0M.trr
edr : data_sim/sys_equi/sys_em/1Y0M.edr
log : data_sim/sys_equi/sys_em/1Y0M.log
nt : 0
ntmpi : 0
sys_history : 0
State -2:
name : 1Y0M
sim_name : equi_HA_1Y0M
coor_file : data_sim/sys_equi/sys_equi/00_equi_HA/equi_HA_1Y0M.gro
top_file : data_sim/sys_top/1Y0M_water_ion.top
tpr : data_sim/sys_equi/sys_equi/00_equi_HA/equi_HA_1Y0M.tpr
mdp : data_sim/sys_equi/sys_equi/00_equi_HA/equi_HA_1Y0M.mdp
xtc : data_sim/sys_equi/sys_equi/00_equi_HA/equi_HA_1Y0M.xtc
edr : data_sim/sys_equi/sys_equi/00_equi_HA/equi_HA_1Y0M.edr
log : data_sim/sys_equi/sys_equi/00_equi_HA/equi_HA_1Y0M.log
nt : 0
ntmpi : 0
sys_history : 0
State -1:
name : 1Y0M
sim_name : equi_CA_1Y0M
coor_file : data_sim/sys_equi/sys_equi/01_equi_CA/equi_CA_1Y0M.gro
top_file : data_sim/sys_top/1Y0M_water_ion.top
tpr : data_sim/sys_equi/sys_equi/01_equi_CA/equi_CA_1Y0M.tpr
mdp : data_sim/sys_equi/sys_equi/01_equi_CA/equi_CA_1Y0M.mdp
xtc : data_sim/sys_equi/sys_equi/01_equi_CA/equi_CA_1Y0M.xtc
edr : data_sim/sys_equi/sys_equi/01_equi_CA/equi_CA_1Y0M.edr
log : data_sim/sys_equi/sys_equi/01_equi_CA/equi_CA_1Y0M.log
nt : 0
ntmpi : 0
sys_history : 0
[31]:
ener_pd_1 = md_sys.sys_history[-2].get_ener(selection_list=['Volume'])
ener_pd_2 = md_sys.sys_history[-1].get_ener(selection_list=['Volume'])
ener_pd_3 = md_sys.get_ener(selection_list=['Volume'])
ener_pd_1['label'] = 'HA_constr'
ener_pd_2['label'] = 'CA_constr'
ener_pd_2.time = ener_pd_2.time + ener_pd_1.time.max()
ener_pd_3['label'] = 'CA_LOW_constr'
ener_pd_3.time = ener_pd_3.time + ener_pd_2.time.max()
ener_pd = pd.concat([ener_pd_1, ener_pd_2, ener_pd_3])
-Extract energy
gmx energy -f data_sim/sys_equi/sys_equi/02_equi_CA_LOW/equi_CA_LOW_1Y0M.edr -o tmp.xvg
-Extract energy
gmx energy -f data_sim/sys_equi/sys_equi/02_equi_CA_LOW/equi_CA_LOW_1Y0M.edr -o tmp.xvg
-Extract energy
gmx energy -f data_sim/sys_prod/prod_1Y0M.edr -o tmp.xvg
[34]:
ax = sns.lineplot(x="time", y="Volume",
hue="label",
data=ener_pd)
ax.set_xlabel('time')
ax.set_ylabel('Volume ($Å^3$)')
#ax.set_ylim(305, 322)
[34]:
Text(0, 0.5, 'Volume ($Å^3$)')
5. Production¶
[19]:
md_sys.production(out_folder=prod_folder,
nsteps=prod_step,
dt=dt)
-Create the tpr file prod_1Y0M.tpr
gmx grompp -f prod_1Y0M.mdp -c ../sys_equi/sys_equi/02_equi_CA_LOW/equi_CA_LOW_1Y0M.gro -r ../sys_equi/sys_equi/02_equi_CA_LOW/equi_CA_LOW_1Y0M.gro -p ../sys_top/1Y0M_water_ion.top -po out_prod_1Y0M.mdp -o prod_1Y0M.tpr -maxwarn 0
-Launch the simulation prod_1Y0M.tpr
gmx mdrun -s prod_1Y0M.tpr -deffnm prod_1Y0M -nt 0 -ntmpi 0 -nsteps -2 -nocopyright
[30]:
ener_temp = md_sys.get_ener(selection_list=['T-Protein', 'T-non-Protein'])
ax = ener_temp.plot(x='time')
ax.set_xlabel('time (ps)')
ax.set_ylabel('Temperature (K)')
-Extract energy
gmx energy -f data_sim/sys_prod/prod_1Y0M.edr -o tmp.xvg
[30]:
Text(0, 0.5, 'Temperature (K)')
[ ]: