Cookbook

This group of handy recipies might be helpful if you’re looking to do something pretty specific and pretty common.

Building an MSM

Using the object-level interface

from enspara.msm import MSM, builders

# build the MSM fitter with a lag time of 100 (frames) and
# using the transpose method
msm = MSM(lag_time=100, method=builders.transpose)

# fit the MSM to your assignments (a numpy ndarray or ragged array)
msm.fit(assignments)

print(msm.tcounts_)
print(msm.tprobs_)
print(msm.eq_probs_)

Using the function-level interface

from enspara.msm import builders
from enspara.msm.transition_matrices import assigns_to_counts, TrimMapping, \
    eq_probs, trim_disconnected

lag_time = 100

tcounts = assigns_to_counts(assigns, lag_time=lag_time)

#if you want to trim states without counts in both directions:
mapping, tcounts = trim_disconnected(tcounts)

tprobs = builders.transpose(tcounts)
eq_probs_ = eq_probs(tprobs)

Coarse-graining with BACE

Danger

Be warned that our BACE implementaiton is still experimental, and you should be careful to check your output.

BACE is an algorithm for converting a large, fine-grained Markov state model into a smaller, coarser-grained model.

from enspara import array as ra
from enspara import msm

assigs = ra.load('path/to/assignments.h5')

m = msm.MSM(lag_time=20, method=msm.builders.transpose)
m.fit(assigs)

bayes_factors, labels = msm.bace.bace(m.tcounts_, n_macrostates=2, n_procs=8)

This code will create two dictionaries, bayes_factors, which contains a mapping from number of microstates (up to n_microstates as specified in the call to bace()) to a the Bayes’ factor for the model with that number of microstates, and labels, a mapping from number of microstates to a labeling of the initial microstates of m into a that number of microstates.

Changing logging

Enspara uses python’s logging module. Each file has its own logger, which are usually set to output files with the module name (e.g. enspara.cluster.khybrid).

They can be made louder or quieter on a per-file level by accessing the logger and running logger.setLevel(). So the following code sets the log level of util.load to DEBUG.

import logging

logging.getLogger('enspara.util.load').setLevel(logging.DEBUG)