コード例 #1
0
ファイル: mfpt.py プロジェクト: junchaoxia/NMpathAnalysis
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)
コード例 #2
0
    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
コード例 #3
0
    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