-
Notifications
You must be signed in to change notification settings - Fork 0
/
analyze_kmc.py
80 lines (58 loc) · 1.68 KB
/
analyze_kmc.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import numpy as np
from simulate_kmc import simulate
from matplotlib import pyplot as plt
'''
simulate parameters:
param e_a: energy of basin A
param e_b: energy of basin B
param alpha1: height of free energy barrier for transition path 1
param alpha2: height of free energy barrier for transition path 2
param beta: inverse temperature
param epochs: number of steps per simulation
param init_state: initialization of state
return: time values, state values, and dict of equilibrium probabilities (both w/ microstates and coarse graining)
rtype: np.array
'''
def plot_trajectory(times,states,thin_factor):
'''
param times: array of times
param states: array of states
param thin_factor: interval of samples to plot
'''
plt.plot(times[::thin_factor],states[::thin_factor])
plt.show()
def rxn_rates(times,states):
'''
param times: array of times
param states: array of states
return: forward and reverse reaction rates
rtype: np.float
'''
A = [0,1,2]
B = [3,4,5]
t_AtoB = []
t_BtoA = []
for i in range(len(times)-1):
if states[i] in A and states[i+1] in B:
t_AtoB.append(times[i+1] - times[i])
elif states[i] in B and states[i+1] in A:
t_BtoA.append(times[i+1] - times[i])
fwd_rxn_rate = 1 / np.mean(np.array(t_AtoB))
rev_rxn_rate = 1 / np.mean(np.array(t_BtoA))
return fwd_rxn_rate, rev_rxn_rate
def main():
beta = 10
# sample trajectory with equal energy states
params = {
'e_a': 1/beta,
'e_b': 6/beta,
'alpha1': 3,
'alpha2': 3,
'beta': beta,
'epochs': 100000
}
times, states, probs = simulate(**params)
fwd_rate, rev_rate = rxn_rates(times,states)
print(f"Forward rate is {fwd_rate}; reverse rate is {rev_rate}")
if __name__ == '__main__':
main()