first running version
This commit is contained in:
@@ -76,55 +76,49 @@ class UmbrellaRunner():
|
|||||||
smaller E_max"""
|
smaller E_max"""
|
||||||
selection = np.where((pmf <= E_max) & (pmf >= 0))
|
selection = np.where((pmf <= E_max) & (pmf >= 0))
|
||||||
zipped = list(zip(*selection))
|
zipped = list(zip(*selection))
|
||||||
|
|
||||||
return zipped
|
return zipped
|
||||||
|
|
||||||
def _get_new_frames(self, pmf, root_frames):
|
def _generate_neighbor_list(self, root):
|
||||||
""" returns a dict of all frames surrounding the root_frames
|
""" builds a list of all direct neighbors of the root coordinate """
|
||||||
that have not an assigned energy yet, as well as their corresponding root
|
dimens = len(root)
|
||||||
frame in the format {new_frame1: root_frame1, new_frame2: root_frame2} """
|
coords = []
|
||||||
|
for i in range(dimens):
|
||||||
def generate_neighbor_list(root, coords=[]):
|
if len(coords) == 0:
|
||||||
""" recursively builds a list of all direct neighbors of the root coordinate """
|
new_coords = []
|
||||||
if len(coords) > 0 and len(coords[0]) == len(root):
|
new_coords.append([root[i]-1])
|
||||||
return [tuple(x) for x in coords]
|
new_coords.append([root[i]])
|
||||||
elif len(coords) == 0:
|
new_coords.append([root[i]+1])
|
||||||
coords.append([root[0]-1])
|
coords = new_coords
|
||||||
coords.append([root[0]])
|
|
||||||
coords.append([root[0]+1])
|
|
||||||
return generate_neighbor_list(root, coords)
|
|
||||||
else:
|
else:
|
||||||
new_coords = []
|
new_coords = []
|
||||||
for coord in coords:
|
for coord in coords:
|
||||||
dimen = len(coord)
|
new_coords.append(coord + [root[i] - 1])
|
||||||
|
new_coords.append(coord + [root[i]])
|
||||||
|
new_coords.append(coord + [root[i] + 1])
|
||||||
|
coords = new_coords
|
||||||
|
return [tuple(x) for x in coords]
|
||||||
|
|
||||||
new_coord = deepcopy(coord)
|
|
||||||
new_coord.append(root[dimen]-1)
|
|
||||||
new_coords.append(new_coord)
|
|
||||||
|
|
||||||
new_coord = deepcopy(coord)
|
def _is_in_pmf(self, frame):
|
||||||
new_coord.append(root[dimen])
|
|
||||||
new_coords.append(new_coord)
|
|
||||||
|
|
||||||
new_coord = deepcopy(coord)
|
|
||||||
new_coord.append(root[dimen]+1)
|
|
||||||
new_coords.append(new_coord)
|
|
||||||
return generate_neighbor_list(root, new_coords)
|
|
||||||
|
|
||||||
def in_pmf(frame):
|
|
||||||
num_dimens = len(self.pmf.shape)
|
num_dimens = len(self.pmf.shape)
|
||||||
for dimen in range(num_dimens):
|
for dimen in range(num_dimens):
|
||||||
if frame[dimen] < 0 or frame[dimen] >= self.pmf.shape[dimen]:
|
if frame[dimen] < 0 or frame[dimen] >= self.pmf.shape[dimen]:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def _get_new_frames(self, pmf, root_frames):
|
||||||
|
""" returns a dict of all frames surrounding the root_frames
|
||||||
|
that have not an assigned energy yet, as well as their corresponding root
|
||||||
|
frame in the format {new_frame1: root_frame1, new_frame2: root_frame2} """
|
||||||
|
|
||||||
# find all neighboring frames and create a dict that associates them to the root frame with lowest energy
|
# find all neighboring frames and create a dict that associates them to the root frame with lowest energy
|
||||||
new_frames = {}
|
new_frames = {}
|
||||||
for frame in root_frames:
|
for frame in root_frames:
|
||||||
neighbors = generate_neighbor_list(frame)
|
neighbors = self._generate_neighbor_list(frame)
|
||||||
|
|
||||||
# remove neighbors that are not inside the pmf
|
# remove neighbors that are not inside the pmf
|
||||||
neighbors = [n for n in neighbors if in_pmf(n)]
|
neighbors = [n for n in neighbors if self._is_in_pmf(n)]
|
||||||
|
|
||||||
# for each neighbor, check if its already in the list and compare root frame energy
|
# for each neighbor, check if its already in the list and compare root frame energy
|
||||||
for n in neighbors:
|
for n in neighbors:
|
||||||
@@ -166,6 +160,11 @@ class UmbrellaRunner():
|
|||||||
print("Max iterations reached ({})".format(self.max_iterations))
|
print("Max iterations reached ({})".format(self.max_iterations))
|
||||||
return
|
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))
|
||||||
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()])
|
||||||
|
|
||||||
@@ -394,28 +393,64 @@ class UmbrellaRunnerTest(unittest.TestCase):
|
|||||||
self.assertEquals(1, len(root_frames))
|
self.assertEquals(1, len(root_frames))
|
||||||
self.assertEquals((0, 2, 2), root_frames[0])
|
self.assertEquals((0, 2, 2), root_frames[0])
|
||||||
|
|
||||||
def test_get_new_frames(self):
|
def test_generate_neighbor_list(self):
|
||||||
|
runner = UmbrellaRunner()
|
||||||
|
root = (1, 3)
|
||||||
|
neighbors = runner._generate_neighbor_list(root)
|
||||||
|
expected_neighbors = [
|
||||||
|
(0, 2),
|
||||||
|
(0, 3),
|
||||||
|
(0, 4),
|
||||||
|
(1, 2),
|
||||||
|
(1, 3),
|
||||||
|
(1, 4),
|
||||||
|
(2, 2),
|
||||||
|
(2, 3),
|
||||||
|
(2, 4),
|
||||||
|
]
|
||||||
|
self.assertEquals(neighbors, expected_neighbors)
|
||||||
|
|
||||||
|
def test_generate_neighbor_list2(self):
|
||||||
|
runner = UmbrellaRunner()
|
||||||
|
root = (3, 1)
|
||||||
|
neighbors = runner._generate_neighbor_list(root)
|
||||||
|
expected_neighbors = [
|
||||||
|
(2, 0),
|
||||||
|
(2, 1),
|
||||||
|
(2, 2),
|
||||||
|
(3, 0),
|
||||||
|
(3, 1),
|
||||||
|
(3, 2),
|
||||||
|
(4, 0),
|
||||||
|
(4, 1),
|
||||||
|
(4, 2),
|
||||||
|
]
|
||||||
|
self.assertEquals(neighbors, expected_neighbors)
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_generate_neighbor_list_3d(self):
|
||||||
|
runner = UmbrellaRunner()
|
||||||
|
root = (2, 2, 2)
|
||||||
|
neighbors = runner._generate_neighbor_list(root)
|
||||||
|
expected_neighbors = []
|
||||||
|
for x in [-1, 0, 1]:
|
||||||
|
for y in [-1, 0, 1]:
|
||||||
|
for z in [-1, 0, 1]:
|
||||||
|
expected_neighbors.append((root[0]+x, root[1]+y, root[2]+z))
|
||||||
|
self.assertEquals(len(neighbors), len(expected_neighbors))
|
||||||
|
|
||||||
|
|
||||||
|
def test_is_in_pmf(self):
|
||||||
runner = UmbrellaRunner()
|
runner = UmbrellaRunner()
|
||||||
runner.cvs = np.array([
|
runner.cvs = np.array([
|
||||||
(-3, 3, 1),
|
(-1, 1, 1),
|
||||||
(0, 4, 1)
|
(-1, 1, 1),
|
||||||
|
(-1, 1, 1)
|
||||||
])
|
])
|
||||||
runner.pmf = runner._init_pmf()
|
runner.pmf = runner._init_pmf()
|
||||||
runner.pmf[0, 3] = 5
|
self.assertFalse(runner._is_in_pmf((-1, 0, 0)))
|
||||||
runner.pmf[0, 2] = 2
|
self.assertFalse(runner._is_in_pmf((0, 0, 3)))
|
||||||
runner.pmf[0, 4] = 2
|
self.assertTrue(runner._is_in_pmf((0, 0, 0)))
|
||||||
root_frames = [(0, 3), (0, 2), (0, 4)]
|
|
||||||
new_frames = runner._get_new_frames(runner.pmf, root_frames)
|
|
||||||
|
|
||||||
expected_new_frames = {
|
|
||||||
(0, 1): (0, 2),
|
|
||||||
(1, 1): (0, 2),
|
|
||||||
(1, 2): (0, 2),
|
|
||||||
(1, 3): (0, 2),
|
|
||||||
(1, 4): (0, 4)
|
|
||||||
}
|
|
||||||
self.assertEquals(len(expected_new_frames.keys()), len(new_frames.keys()))
|
|
||||||
self.assertDictEqual(expected_new_frames, new_frames)
|
|
||||||
|
|
||||||
def test_get_new_frames_3d(self):
|
def test_get_new_frames_3d(self):
|
||||||
runner = UmbrellaRunner()
|
runner = UmbrellaRunner()
|
||||||
@@ -439,6 +474,35 @@ class UmbrellaRunnerTest(unittest.TestCase):
|
|||||||
self.assertEquals(26, len(new_frames.keys()))
|
self.assertEquals(26, len(new_frames.keys()))
|
||||||
self.assertDictEqual(expected_new_frames, new_frames)
|
self.assertDictEqual(expected_new_frames, new_frames)
|
||||||
|
|
||||||
|
def test_get_new_frames(self):
|
||||||
|
runner = UmbrellaRunner()
|
||||||
|
runner.cvs = np.array([
|
||||||
|
(-2, 2, 1),
|
||||||
|
(-2, 2, 1),
|
||||||
|
])
|
||||||
|
runner.pmf = np.array([
|
||||||
|
[-1, -1, -1, -1, -1],
|
||||||
|
[-1, 34, 32, 26, -1],
|
||||||
|
[-1, 40, 42, 51, -1],
|
||||||
|
[-1, 28, 41, 37, -1],
|
||||||
|
[-1, -1, -1, -1, -1]])
|
||||||
|
root_frames = [(1, 3), (3, 1)]
|
||||||
|
expected_new_frames = {
|
||||||
|
(0, 2): (1, 3),
|
||||||
|
(0, 3): (1, 3),
|
||||||
|
(0, 4): (1, 3),
|
||||||
|
(1, 4): (1, 3),
|
||||||
|
(2, 4): (1, 3),
|
||||||
|
(2, 0): (3, 1),
|
||||||
|
(3, 0): (3, 1),
|
||||||
|
(4, 0): (3, 1),
|
||||||
|
(4, 1): (3, 1),
|
||||||
|
(4, 2): (3, 1),
|
||||||
|
}
|
||||||
|
new_frames = runner._get_new_frames(runner.pmf, root_frames)
|
||||||
|
self.assertDictEqual(expected_new_frames, new_frames)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
22
example.py
22
example.py
@@ -13,12 +13,21 @@ class MyUmbrellaRunner(WHAM2DRunner):
|
|||||||
pmf_to_plot = deepcopy(self.pmf.T)
|
pmf_to_plot = deepcopy(self.pmf.T)
|
||||||
pmf_to_plot[pmf_to_plot < 0] = None
|
pmf_to_plot[pmf_to_plot < 0] = None
|
||||||
plt.figure()
|
plt.figure()
|
||||||
plt.imshow(pmf_to_plot, origin="lower", cmap='jet')
|
plt.imshow(pmf_to_plot, origin="bottom", cmap='jet')
|
||||||
|
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_labels = [ str(x[0]) for x in ticks ]
|
||||||
|
|
||||||
|
plt.xticks(tick_positions, tick_labels)
|
||||||
|
plt.yticks(tick_positions, tick_labels)
|
||||||
|
|
||||||
|
|
||||||
cb = plt.colorbar(pad=0.1)
|
cb = plt.colorbar(pad=0.1)
|
||||||
cb.set_label("kJ/mol")
|
cb.set_label("kJ/mol")
|
||||||
plt.savefig(filename)
|
plt.savefig(filename)
|
||||||
os.system("cp {} {}".format(filename, "pmf_current.pdf"))
|
os.system("cp {} {}".format(filename, "pmf_current.pdf"))
|
||||||
|
|
||||||
|
|
||||||
def simulate_frames(self, lambdas, frames):
|
def simulate_frames(self, lambdas, frames):
|
||||||
print("{} new simulations:".format(len(lambdas)))
|
print("{} new simulations:".format(len(lambdas)))
|
||||||
counter = 0
|
counter = 0
|
||||||
@@ -35,17 +44,16 @@ class MyUmbrellaRunner(WHAM2DRunner):
|
|||||||
# print("Running {}".format(command))
|
# print("Running {}".format(command))
|
||||||
os.system(command)
|
os.system(command)
|
||||||
|
|
||||||
|
|
||||||
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.1, 3.1, 0.1),
|
(-3, 3, 0.2),
|
||||||
(-3.1, 3.1, 0.1),
|
(-3, 3, 0.2),
|
||||||
])
|
])
|
||||||
runner.cvs_init = (1, -1.4)
|
runner.cvs_init = (1.4, -1.4)
|
||||||
runner.E_min = 10
|
runner.E_min = 10
|
||||||
runner.E_max = 200
|
runner.E_max = 100
|
||||||
runner.E_incr = 10
|
runner.E_incr = 10
|
||||||
runner.max_iterations = 25
|
runner.max_iterations = 100
|
||||||
|
|
||||||
runner.run()
|
runner.run()
|
||||||
|
|||||||
Reference in New Issue
Block a user