back_jump_prob_discrete

mdtools.dtrj.back_jump_prob_discrete(dtrj1, dtrj2, continuous=False, discard_neg=False, discard_neg_btw=False, return_norm=False, verbose=False)[source]

Calculate the back-jump probability resolved with respect to the states in a second discrete trajectory.

Take a discrete trajectory and calculate the probability to return back to the initial state at time \(t_0 + \Delta t\), given that a state transition has occurred at time \(t_0\) and given that the compound was in a specific state of another discrete trajectory at time \(t_0\).

Parameters:
  • dtrj1, dtrj2 (array_like) – The discrete trajectories. Arrays of shape (n, f), where n is the number of compounds and f is the number of frames. The shape can also be (f,), in which case the array is expanded to shape (1, f). Both arrays must have the same shape. The elements of the arrays are interpreted as the indices of the states in which a given compound is at a given frame.

  • continuous (bool) – If False, calculate the probability that a compound returns back to its initial state at time \(t_0 + \Delta t\). This probability might be regarded as the “discontinuous” or “intermittent” back-jump probability.

    If True, calculate the probability that a compound returns back to its initial state at time \(t_0 + \Delta t\) under the condition that it has continuously been in the new state from time \(t_0\) until \(t_0 + \Delta t\), i.e. that the compound does not visit other states in between. This probability might be regarded as the “continuous” or “true” back-jump probability.

  • discard_neg (bool, optional) – If True, discard negative states, i.e. discard back jumps starting from (and consequently ending in) a negative state.

  • discard_neg_btw (bool, optional) – If True, discard back jumps when the compound has visited a negative state between \(t_0\) and \(t_0 + \Delta t\).

  • return_norm (bool, optional) – If True, return the normalization factors for all states and all lag times.

  • verbose (bool, optional) – If True print a progress bar.

Returns:

  • bj_prob (numpy.ndarray) – Array of shape (m, f-1), where m is the number of states in the second discrete trajectory. The ij-th element of bj_prob is the probability that a compound returns back to its initial state j frames after a state transition has occurred, given that the compound was in state i of the second discrete trajectory at time \(t_0\).

  • norm (numpy.ndarray) – Array of the same shape as bj_prob containing the corresponding normalization factors.

See also

mdtools.dtrj.back_jump_prob()

Calculate the back-jump probability averaged over all states

mdtools.dtrj.remain_prob_discrete()

Calculate the probability that a compound is still (or again) in the same state as at time \(t_0\) after a lag time \(\Delta t\) resolved with respect to the states in a second discrete trajectory

mdtools.dtrj.leave_prob_discrete()

Calculate the probability that a compound leaves its state after a lag time \(\Delta t\) given that it has entered the state at time \(t_0\) resolved with respect to the states in a second discrete trajectory

Notes

If you parse the same discrete trajectory to dtrj1 and dtrj2 you will get the back-jump probability for each individual state of the input trajectory.

Examples

>>> dtrj = np.array([1, 3, 3, 3, 1, 2, 2])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[ 0.,  0.,  0.,  1.,  0.,  0.],
       [nan, nan, nan, nan, nan, nan],
       [ 0.,  0.,  0., nan, nan, nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[ 0.,  0.,  0.,  1.,  0.,  0.],
       [nan, nan, nan, nan, nan, nan],
       [ 0.,  0.,  0., nan, nan, nan]])
>>> dtrj = np.array([1, 3, 3, 3, 2, 2, 1])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[ 0.,  0.,  0.,  0.,  0.,  1.],
       [ 0., nan, nan, nan, nan, nan],
       [ 0.,  0.,  0., nan, nan, nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0., nan, nan, nan, nan, nan],
       [ 0.,  0.,  0., nan, nan, nan]])
>>> dtrj = np.array([[1, 3, 3, 3, 1, 2, 2],
...                  [1, 3, 3, 3, 2, 2, 1]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[0. , 0. , 0. , 0.5, 0. , 0.5],
       [0. , nan, nan, nan, nan, nan],
       [0. , 0. , 0. , nan, nan, nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[0. , 0. , 0. , 0.5, 0. , 0. ],
       [0. , nan, nan, nan, nan, nan],
       [0. , 0. , 0. , nan, nan, nan]])
>>> dtrj = np.array([[1, 2, 2, 1, 3, 3, 3],
...                  [1, 2, 2, 3, 3, 3, 1]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> dtrj = np.array([[1, 2, 2, 1, 3, 3, 3],
...                  [1, 5, 5, 5, 5, 5, 1]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [       nan,        nan,        nan,        nan,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [       nan,        nan,        nan,        nan,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> dtrj = np.array([[1, 2, 2, 1, 2, 2],
...                  [2, 2, 1, 2, 2, 1]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0., nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0., nan]])

Discard negative states:

>>> dtrj = np.array([[ 1,  2,  2,  1,  3,  3,  3],
...                  [-1,  2,  2, -1,  3,  3,  3],
...                  [ 1, -2, -2,  1,  3,  3,  3],
...                  [ 1,  2,  2,  3,  3,  3,  1],
...                  [-1,  2,  2,  3,  3,  3, -1],
...                  [ 1,  2,  2, -3, -3, -3,  1]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj)
array([[0.        ,        nan,        nan,        nan,        nan,
               nan],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, discard_neg=True)
array([[       nan,        nan,        nan,        nan,        nan,
               nan],
       [       nan,        nan,        nan,        nan,        nan,
               nan],
       [       nan,        nan,        nan,        nan,        nan,
               nan],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(
...     dtrj, dtrj, discard_neg_btw=True
... )
array([[0.        ,        nan,        nan,        nan,        nan,
               nan],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.25      , 0.        , 0.        ,
        0.5       ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(
...     dtrj, dtrj, discard_neg=True, discard_neg_btw=True
... )
array([[ nan,  nan,  nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan,  nan,  nan],
       [0.  , 0.  , 0.25, 0.  , 0.  , 0.5 ],
       [0.  , 0.  , 0.  , 0.  ,  nan,  nan],
       [0.  ,  nan,  nan,  nan,  nan,  nan]])
>>> mdt.dtrj.back_jump_prob_discrete(dtrj, dtrj, continuous=True)
array([[0.        ,        nan,        nan,        nan,        nan,
               nan],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(
...     dtrj, dtrj, continuous=True, discard_neg=True
... )
array([[       nan,        nan,        nan,        nan,        nan,
               nan],
       [       nan,        nan,        nan,        nan,        nan,
               nan],
       [       nan,        nan,        nan,        nan,        nan,
               nan],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(
...     dtrj, dtrj, continuous=True, discard_neg_btw=True
... )
array([[0.        ,        nan,        nan,        nan,        nan,
               nan],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        , 0.        , 0.33333333, 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.2       , 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        ,        nan,
               nan],
       [0.        ,        nan,        nan,        nan,        nan,
               nan]])
>>> mdt.dtrj.back_jump_prob_discrete(
...     dtrj,
...     dtrj,
...     continuous=True,
...     discard_neg=True,
...     discard_neg_btw=True,
... )
array([[nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan],
       [0. , 0. , 0.2, 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. , nan, nan],
       [0. , nan, nan, nan, nan, nan]])