Skip to content

Commit 4a8a07e

Browse files
committed
Updates to README and RTD installation instructions. Also correction to anchor location change tests.
1 parent 9451a80 commit 4a8a07e

File tree

5 files changed

+68
-41
lines changed

5 files changed

+68
-41
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ providing feedback, bug reports, or other comments.
169169
* Rommie Amaro (principal investigator)
170170
* Ilker Deveci (developer)
171171
* Hilliary Frank (contributor)
172+
* Sasha Heyneman (contributor)
172173
* Ben Jagger (developer)
173174
* Anand Ojha (developer)
174175
* Andy Stokely (developer)
@@ -194,7 +195,7 @@ You may also optionally cite the following papers:
194195

195196
### Copyright
196197

197-
Copyright (c) 2023, Lane Votapka
198+
Copyright (c) 2024, Lane Votapka
198199

199200

200201
#### Acknowledgements

seekr2/modules/common_analyze.py

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,9 @@ def calculate_kinetics(self):
515515
end_milestones = {}
516516
bulk_milestones = []
517517
MFPTs = {}
518+
MFPTs_anchors_to_bulk_milestones = defaultdict(float)
518519
k_off = 0.0
519520
k_ons = {}
520-
bulk_milestone = None
521521
for anchor in self.model.anchors:
522522
if anchor.endstate:
523523
for milestone_id in anchor.get_ids():
@@ -532,8 +532,8 @@ def calculate_kinetics(self):
532532
if anchor.alias_from_id(milestone_id) == 1:
533533
# TODO: hacky
534534
continue
535-
#bulk_milestones.append(milestone_id)
536-
bulk_milestone = milestone_id
535+
bulk_milestones.append(milestone_id)
536+
#bulk_milestone = milestone_id
537537

538538
if np.any(self.Q.sum(axis=1) > 1.E-10):
539539
problem_milestone = np.argmin(self.Q.T.sum(axis=1))
@@ -547,75 +547,92 @@ def calculate_kinetics(self):
547547
problem_milestone)
548548
raise Exception(error_msg)
549549
B, tau = PyGT.tools.load_CTMC(self.Q.T)
550-
assert len(bulk_milestones) <= 1, \
551-
"There cannot be more than one bulk milestone."
552-
if bulk_milestone is not None:
553-
n = self.Q.shape[0]
554-
for end_milestone in end_milestones:
555-
if end_milestone == bulk_milestone:
550+
#assert len(bulk_milestones) <= 1, \
551+
# "There cannot be more than one bulk milestone."
552+
#if bulk_milestone is not None:
553+
p_i_hat_normalize_per_anchor = defaultdict(float)
554+
for end_milestone_src in end_milestones:
555+
src_anchor_index = end_milestones[end_milestone_src]
556+
p_i_hat_normalize_per_anchor[src_anchor_index] \
557+
+= self.p_i[end_milestone_src]
558+
559+
n = self.Q.shape[0]
560+
for bulk_milestone in bulk_milestones:
561+
for end_milestone_src in end_milestones:
562+
563+
if end_milestone_src in bulk_milestones:
556564
continue
557565

558566
mfpt_ij, mfpt_ji = PyGT.mfpt.compute_MFPT(
559-
end_milestone, bulk_milestone, B, tau)
567+
end_milestone_src, bulk_milestone, B, tau)
560568
mfpt = mfpt_ji
561-
MFPTs[(end_milestones[end_milestone], "bulk")] = mfpt
562-
563-
MFPT_to_bulk = 0
569+
src_anchor_index = end_milestones[end_milestone_src]
570+
weighted_mfpt = mfpt * self.p_i[end_milestone_src] \
571+
/ p_i_hat_normalize_per_anchor[src_anchor_index]
572+
#MFPTs[(src_anchor_index, "bulk")] += weighted_mfpt
573+
MFPTs_anchors_to_bulk_milestones[(src_anchor_index, bulk_milestone)] \
574+
+= weighted_mfpt
575+
576+
for (mfpt_key, mfpt_value) in MFPTs_anchors_to_bulk_milestones.items():
577+
(src_anchor_index, bulk_milestone) = mfpt_key
578+
if src_anchor_index not in MFPTs:
579+
MFPTs[(src_anchor_index, "bulk")] = mfpt_value
580+
elif mfpt_value < MFPTs[src_anchor]:
581+
MFPTs[(src_anchor_index, "bulk")] = mfpt_value
582+
583+
MFPTs_to_bulk_dict = {}
584+
for bulk_milestone in bulk_milestones:
564585
for i in range(self.model.num_milestones):
565586
mfpt_ij, mfpt_ji = PyGT.mfpt.compute_MFPT(
566587
i, bulk_milestone, B, tau)
567588
mfpt = mfpt_ji
589+
if i not in MFPTs_to_bulk_dict:
590+
MFPTs_to_bulk_dict[i] = mfpt
591+
elif mfpt < MFPTs_to_bulk_dict[i]:
592+
MFPTs_to_bulk_dict[i] = mfpt
593+
594+
if len(bulk_milestones) > 0:
595+
MFPT_to_bulk = 0
596+
for i in range(self.model.num_milestones):
597+
mfpt = MFPTs_to_bulk_dict[i]
568598
MFPT_to_bulk += mfpt * self.p_i[i]
569599

570600
# convert to 1/s
571601
k_off = 1.0e12 / MFPT_to_bulk
572602
self.k_off = k_off
573603

574-
p_i_hat_normalize = defaultdict(float)
575-
576-
for end_milestone_dest in end_milestones:
577-
if end_milestone_dest == bulk_milestone:
578-
continue
579-
for end_milestone_src in end_milestones:
580-
if end_milestones[end_milestone_dest] \
581-
== end_milestones[end_milestone_src]:
582-
continue
583-
if end_milestone_src == bulk_milestone:
584-
continue
585-
p_i_hat_normalize[end_milestone_src] \
586-
+= self.p_i[end_milestone_src]
587-
588604
# Next, compute the MFPTs between different states
589605
possible_MFPTs = defaultdict(float)
590606
for end_milestone_dest in end_milestones:
591-
if end_milestone_dest == bulk_milestone:
607+
dest_anchor_index = end_milestones[end_milestone_dest]
608+
if end_milestone_dest in bulk_milestones:
592609
continue
593610

594611
for end_milestone_src in end_milestones:
595-
if end_milestones[end_milestone_dest] \
596-
== end_milestones[end_milestone_src]:
612+
src_anchor_index = end_milestones[end_milestone_src]
613+
if dest_anchor_index == src_anchor_index:
597614
# don't get the MFPT from a milestone to itself
598615
continue
599-
if end_milestone_src == bulk_milestone:
616+
if end_milestone_src in bulk_milestones:
600617
# a bulk milestone will never be a source
601618
continue
602619

603620
mfpt_ij, mfpt_ji = PyGT.mfpt.compute_MFPT(
604621
end_milestone_src, end_milestone_dest, B, tau)
605622
mfpt = mfpt_ji
606-
possible_MFPTs[(end_milestones[end_milestone_src],
607-
end_milestone_dest)] += mfpt \
623+
possible_MFPTs[(src_anchor_index, end_milestone_dest)] += mfpt \
608624
* self.p_i[end_milestone_src] \
609-
/ p_i_hat_normalize[end_milestone_src]
625+
/ p_i_hat_normalize_per_anchor[src_anchor_index]
610626

611627
# TODO: verify if correct: this finds the destination with the
612628
# fastest MFPT and just uses that, although the sources are
613629
# statistically weighed.
614630
for end_milestone_src in end_milestones:
631+
src_anchor_index = end_milestones[end_milestone_src]
615632
for end_milestone_dest in end_milestones:
616-
key = (end_milestones[end_milestone_src], end_milestone_dest)
617-
full_key = (end_milestones[end_milestone_src],
618-
end_milestones[end_milestone_dest])
633+
dest_anchor_index = end_milestones[end_milestone_dest]
634+
key = (src_anchor_index, end_milestone_dest)
635+
full_key = (src_anchor_index, dest_anchor_index)
619636
if key in possible_MFPTs:
620637
if full_key in MFPTs:
621638
# Get the minimum MFPT

seekr2/modules/common_sim_browndye2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def __init__(self):
8888
self.dielectric = 78.0
8989
self.relative_viscosity = 1.0
9090
self.kT = -1.0
91-
self.desolvation_parameter = 0.0
91+
self.desolvation_parameter = 1.0
9292
self.ions = []
9393
return
9494

seekr2/modules/mmvt_analyze.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,8 @@ def __init__(self, model, N_alpha_beta=None, k_alpha_beta=None,
700700
self.pi_alpha = None
701701
self.N_ij = {}
702702
self.R_i = {}
703+
self.N_ij_unmodified = {}
704+
self.R_i_unmodified = {}
703705
self.T = None
704706
self.Q = None
705707
self.K = None
@@ -906,6 +908,8 @@ def fill_out_data_quantities(self):
906908
raise Exception("R_i_alpha should always be set.")
907909

908910
# Now we need to try and correct the zero entries
911+
self.N_ij_unmodified = deepcopy(self.N_ij)
912+
self.R_i_unmodified = deepcopy(self.R_i)
909913
for key in self.N_ij:
910914
if self.N_ij[key] == 0.0:
911915
i = key[0]
@@ -1051,9 +1055,10 @@ def calculate_extra_thermodynamics(self):
10511055
Use this data sample's statistics to construct the
10521056
anchor free energy profile.
10531057
"""
1054-
self.free_energy_anchors = np.zeros(self.pi_alpha.shape[0])
1058+
self.free_energy_anchors = np.zeros(self.model.num_anchors)
10551059
highest_pi_alpha = max(self.pi_alpha)
1056-
for i, pi_alpha_val in enumerate(self.pi_alpha):
1060+
for i in range(self.model.num_anchors):
1061+
pi_alpha_val = self.pi_alpha[i, 0]
10571062
free_energy = -GAS_CONSTANT*self.model.temperature*np.log(
10581063
pi_alpha_val / highest_pi_alpha)
10591064
self.free_energy_anchors[i] = free_energy

seekr2/tests/test_common_prepare.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,14 @@ def test_move_add_delete_input_anchors(tmp_path, host_guest_mmvt_model_input):
101101
.upper_milestone_radius = 1.65
102102
host_guest_mmvt_model_input.cv_inputs[0].input_anchors[-2]\
103103
.lower_milestone_radius = 1.65
104+
host_guest_mmvt_model_input.cv_inputs[0].input_anchors[-2]\
105+
.radius = 1.75
104106
host_guest_mmvt_model_input.cv_inputs[0].input_anchors[-2]\
105107
.upper_milestone_radius = 1.85
106108
host_guest_mmvt_model_input.cv_inputs[0].input_anchors[-1]\
107109
.lower_milestone_radius = 1.85
110+
host_guest_mmvt_model_input.cv_inputs[0].input_anchors[-1]\
111+
.radius = 1.95
108112
host_guest_mmvt_model_input.root_directory = os.path.join(
109113
tmp_path, "host_guest_mmvt_5")
110114
os.chdir(TEST_DIRECTORY)

0 commit comments

Comments
 (0)