def markov_mfpts(markov_tmatrix, stateA, stateB, lag_time=1): '''Computes mean first passage times in both directions A->B and B->A from a markov model. The mfpts computed this way are directly comparable with the values obtained by a long back and forth simulation between the tar ''' auxiliar_matrix = aux.pseudo_nm_tmatrix(markov_tmatrix, stateA, stateB) # Is going to return a MARKOVIAN mfpt since the auxiliar # matrix was build from a pure markovian matrix return non_markov_mfpts(auxiliar_matrix, stateA, stateB, lag_time)
def fluxBA_distribution_on_A(self): if self.markovian: t_matrix = pseudo_nm_tmatrix(self.markov_tmatrix, self.stateA, self.stateB) else: t_matrix = self.nm_tmatrix distrib_on_A = np.zeros(len(self.stateA)) labeled_pops = pops_from_tmatrix(t_matrix) for i in range(1, 2 * self.n_states + 1, 2): for j in range(2 * self.n_states): if j // 2 in self.stateA: distrib_on_A[self.stateA.index(j // 2)] += \ labeled_pops[i] * t_matrix[i, j] return distrib_on_A
def fit(self): '''Fits the the markov plus color model from a list of sequences ''' # Non-Markovian count matrix nm_tmatrix = np.zeros((2 * self.n_states, 2 * self.n_states)) # Markovian transition matrix markov_tmatrix = np.zeros((self.n_states, self.n_states)) start = self._lag_time step = 1 lag = self._lag_time hlength = self.hist_length if not self.sliding_window: step = lag # Markov first for traj in self.trajectories: for i in range(start, len(traj), step): markov_tmatrix[traj[i - lag], traj[i]] += 1.0 # counting markov_tmatrix = markov_tmatrix + markov_tmatrix.T markov_tmatrix = normalize_markov_matrix(markov_tmatrix) p_nm_tmatrix = pseudo_nm_tmatrix(markov_tmatrix, self.stateA, self.stateB) pops = pops_from_tmatrix(p_nm_tmatrix) # Pseudo-Markov Flux matrix fmatrix = p_nm_tmatrix for i, _ in enumerate(fmatrix): fmatrix[i] *= pops[i] for traj in self.trajectories: for i in range(start, len(traj), step): # Previous color determination (index i - lag) prev_color = "U" for k in range(i - lag, max(i - lag - hlength, 0) - 1, -1): if traj[k] in self.stateA: prev_color = "A" break elif traj[k] in self.stateB: prev_color = "B" break # Current Color (in index i) if traj[i] in self.stateA: color = "A" elif traj[i] in self.stateB: color = "B" else: color = prev_color if prev_color == "A" and color == "B": nm_tmatrix[2 * traj[i - lag], 2 * traj[i] + 1] += 1.0 elif prev_color == "B" and color == "A": nm_tmatrix[2 * traj[i - lag] + 1, 2 * traj[i]] += 1.0 elif prev_color == "A" and color == "A": nm_tmatrix[2 * traj[i - lag], 2 * traj[i]] += 1.0 elif prev_color == "B" and color == "B": nm_tmatrix[2 * traj[i - lag] + 1, 2 * traj[i] + 1] += 1.0 elif prev_color == "U" and color == "B": temp_sum = fmatrix[2 * traj[i - lag], 2 * traj[i] + 1] +\ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i] + 1] nm_tmatrix[2 * traj[i - lag], 2 * traj[i] + 1] += \ fmatrix[2 * traj[i - lag], 2 * traj[i] + 1] / temp_sum nm_tmatrix[2 * traj[i - lag] + 1, 2 * traj[i] + 1] += \ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i] + 1] /\ temp_sum elif prev_color == "U" and color == "A": temp_sum = (fmatrix[2 * traj[i - lag], 2 * traj[i]] + fmatrix[2 * traj[i - lag] + 1, 2 * traj[i]]) nm_tmatrix[2 * traj[i - lag]][2 * traj[i]] += \ fmatrix[2 * traj[i - lag], 2 * traj[i]] / temp_sum nm_tmatrix[2 * traj[i - lag] + 1][2 * traj[i]] += \ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i]] / temp_sum elif prev_color == "U" and color == "U": temp_sum = fmatrix[2 * traj[i - lag], 2 * traj[i] + 1] +\ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i] + 1] +\ fmatrix[2 * traj[i - lag], 2 * traj[i]] +\ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i]] nm_tmatrix[2 * traj[i - lag], 2 * traj[i] + 1] += \ fmatrix[2 * traj[i - lag], 2 * traj[i] + 1] / temp_sum nm_tmatrix[2 * traj[i - lag] + 1][2 * traj[i] + 1] += \ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i] + 1] /\ temp_sum nm_tmatrix[2 * traj[i - lag]][2 * traj[i]] += \ fmatrix[2 * traj[i - lag], 2 * traj[i]] / temp_sum nm_tmatrix[2 * traj[i - lag] + 1][2 * traj[i]] += \ fmatrix[2 * traj[i - lag] + 1, 2 * traj[i]] / temp_sum self.nm_cmatrix = nm_tmatrix # not normalized, it is like count matrix nm_tmatrix = normalize_markov_matrix(nm_tmatrix) self.nm_tmatrix = nm_tmatrix self.markov_tmatrix = markov_tmatrix