This commit is contained in:
Daniel Bauer
2018-06-17 22:39:35 +02:00
parent f905853d29
commit 510cc6f04b
4 changed files with 54 additions and 38 deletions

View File

@@ -145,31 +145,46 @@ class UmbrellaRunner():
def _main(self): def _main(self):
# get the initial simulation and surrounding frames
root_frames = [self._get_index_for_lambdas(self.cvs_init)]
new_frames = self._get_new_frames(self.pmf, self.sample_list, root_frames)
self.num_iterations = 0 self.num_iterations = 0
self.E = self.E_min # TODO move this in the loop?
# outer main loop: increase E and calculate PMF until E > E_max # outer main loop: increase E and calculate PMF until E > E_max
while True: while True:
self.E = self.E_min
# stop if max iterations is reached
self.num_iterations += 1 self.num_iterations += 1
if(self.max_iterations > 0 and self.num_iterations > self.max_iterations):
print("Max iterations reached ({})".format(self.max_iterations))
return
# stop if the pmf is sampled
if len(np.where(self.pmf < 0)) == 0:
print("Every window of the PMF appears to be sampled.")
return
print("~~~~~~~~~~~~~~~ Iteration {}/{} ~~~~~~~~~~~~~~~~".format(self.num_iterations, self.max_iterations)) print("~~~~~~~~~~~~~~~ Iteration {}/{} ~~~~~~~~~~~~~~~~".format(self.num_iterations, self.max_iterations))
# find frames to sample
if self.num_iterations == 1:
# get the initial simulation and surrounding frames
root_frames = [self._get_index_for_lambdas(self.cvs_init)]
new_frames = self._get_new_frames(self.pmf, self.sample_list, root_frames)
else:
while self.E <= self.E_max:
# get new frames for energy level
root_frames = self._get_root_frames(self.pmf, self.sample_list, self.E)
new_frames = self._get_new_frames(self.pmf, self.sample_list, root_frames)
# increase energy level if no frames are found
if len(new_frames) == 0:
self.E += self.E_incr
print("Max energy increased to {} (max={})".format(self.E, self.E_max))
else:
break
# abort sampling if no new frames could be found
if len(new_frames) == 0:
print("Sampling aborted. No neighbors found for E_max={}".format(self.E))
return
# lambda states for new frames
lambdas = dict([(self._get_lambdas_for_index(x), self._get_lambdas_for_index(y)) for x,y in new_frames.items()]) lambdas = dict([(self._get_lambdas_for_index(x), self._get_lambdas_for_index(y)) for x,y in new_frames.items()])
self.pre_run_hook() self.pre_run_hook()
print("Running simulations") print("Running simulations")
self.simulate_frames(lambdas, new_frames) self.simulate_frames(lambdas, new_frames)
@@ -179,17 +194,17 @@ class UmbrellaRunner():
# update list of sampled windows # update list of sampled windows
for new_frame in new_frames.keys(): for new_frame in new_frames.keys():
self.sample_list[new_frame] = self.num_iterations self.sample_list[new_frame] = self.num_iterations
self.after_run_hook() self.after_run_hook()
while self.E <= self.E_max: if(self.max_iterations > 0 and self.num_iterations == self.max_iterations):
root_frames = self._get_root_frames(self.pmf, self.sample_list, self.E) print("Max iterations reached ({})".format(self.max_iterations))
new_frames = self._get_new_frames(self.pmf, self.sample_list, root_frames) return
if len(new_frames) == 0: # stop if the pmf is sampled
self.E += self.E_incr if len(np.where(self.pmf < 0)) == 0:
print("Max energy increased to {} (max={})".format(self.E, self.E_max)) print("Every window of the PMF appears to be sampled.")
else: return
break
def run(self): def run(self):

View File

@@ -18,6 +18,6 @@ sed -i -e "s/LAMBDA2/${lambda2}/g" $FOLDER/plumed.dat
cd $FOLDER cd $FOLDER
source /usr/local/gromacs/bin/GMXRC source /usr/local/gromacs/bin/GMXRC
gmx --quiet mdrun -deffnm topol -plumed plumed.dat -nsteps 100000 2>&1 gmx --quiet mdrun -deffnm topol -plumed plumed.dat -nsteps 250000 2>&1
cd ../.. cd ../..

BIN
examples/example.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

31
examples/example.py Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/env python3
import os import os
from copy import deepcopy from copy import deepcopy
@@ -110,7 +111,7 @@ class MyUmbrellaRunner(WHAM2DRunner):
cum_frames = [0] cum_frames = [0]
def after_run_hook(self): def after_run_hook(self):
filename = "tmp/pmf_{}.pdf".format(self.num_iterations) filename = "tmp/pmf_{}.pdf".format("%02d" % self.num_iterations)
print("Writing new pmf to {}".format(filename)) print("Writing new pmf to {}".format(filename))
pmf_to_plot = deepcopy(self.pmf) pmf_to_plot = deepcopy(self.pmf)
pmf_to_plot[pmf_to_plot < 0] = None pmf_to_plot[pmf_to_plot < 0] = None
@@ -128,13 +129,13 @@ class MyUmbrellaRunner(WHAM2DRunner):
ax1.set_xlabel("Cycles") ax1.set_xlabel("Cycles")
ax1.set_ylabel("Number of umbrella Windows") ax1.set_ylabel("Number of umbrella Windows")
ticks = [(x,x) for x in [-3, -2, -1, 0, 1, 2, 3]] # ticks = [(x,x) for x in [-3, -2, -1, 0, 1, 2, 3]]
tick_positions = [ self._get_index_for_lambdas(x)[0] for x in ticks ] # tick_positions = [ self._get_index_for_lambdas(x)[0] for x in ticks ]
tick_labels = [ str(x[0]) for x in ticks ] # tick_labels = [ str(x[0]) for x in ticks ]
ax0.set_yticks(tick_positions) # ax0.set_yticks(tick_positions)
ax0.set_yticklabels(tick_labels) # ax0.set_yticklabels(tick_labels)
ax0.set_xticks(tick_positions) # ax0.set_xticks(tick_positions)
ax0.set_xticklabels(tick_labels) # ax0.set_xticklabels(tick_labels)
ax0.set_ylabel("$\phi$") ax0.set_ylabel("$\phi$")
ax0.set_xlabel("$\psi$") ax0.set_xlabel("$\psi$")
@@ -163,13 +164,13 @@ class MyUmbrellaRunner(WHAM2DRunner):
runner = MyUmbrellaRunner() runner = MyUmbrellaRunner()
runner.WHAM_EXEC = "/opt/wham/wham-2d/wham-2d" runner.WHAM_EXEC = "/opt/wham/wham-2d/wham-2d"
runner.cvs = np.array([ runner.cvs = np.array([
(-3, 3, 0.2), (-3, 3, 0.3),
(-3, 3, 0.2), (-3, 3, 0.3),
]) ])
runner.cvs_init = (-1.4, 1.4) runner.cvs_init = (-1.8, 1.8)
runner.E_min = 2 runner.E_min = 5
runner.E_max = 50 runner.E_max = 100
runner.E_incr = 5 runner.E_incr = 10
runner.max_iterations = 30 runner.max_iterations = 100
runner.run() runner.run()