osl-dynamics is a Python toolbox for studying brain dynamics using neuroimaging data: MEG, EEG and fMRI. It provides generative models that decompose data into brain networks (often called brain states or modes), including the Hidden Markov Model (HMM) and Dynamic Network Modes (DyNeMo), along with everything needed for a complete analysis: data loading and preparation, spectral estimation, network visualisation and statistical significance testing.
You can use osl-dynamics to:
- Infer dynamic functional networks from resting-state or task M/EEG and fMRI data using the HMM, DyNeMo and related models (M-DyNeMo, HIVE, DIVE, DyNeSTE and more).
- Characterise brain states/modes with summary statistics (fractional occupancy, lifetimes, intervals, switching rates), state-specific power maps, and functional connectivity.
- Estimate spectra using multitaper and regression-based methods, or wavelet transforms.
- Detect oscillatory bursts.
- Test for statistical significance using GLM permutation testing.
- Preprocess and source reconstruct M/EEG data: preprocessing, coregistration, beamforming and parcellation.
- Simulate time series data from HMMs, sinusoidal oscillators and autoregressive models.
osl-dynamics works with MNE-Python: a typical M/EEG workflow preprocesses, source reconstructs and parcellates data first, then models the dynamics of the parcel time courses with osl-dynamics. Data can be loaded from NumPy (.npy), MATLAB (.mat), text (.txt) or MNE (.fif) files.
For a full description of the toolbox, see the documentation.
Train a Time-Delay Embedded Hidden Markov Model (TDE-HMM) on source-space MEG data to infer dynamic functional brain networks:
from osl_dynamics.data import Data
from osl_dynamics.models.hmm import Config, Model
# Load data, e.g. parcel time courses
data = Data("training_data")
# Prepare the data: time-delay embedding + PCA captures spectral structure
data.prepare({
"tde_pca": {"n_embeddings": 15, "n_pca_components": 80},
"standardize": {},
})
# Train an HMM
config = Config(
n_states=8,
n_channels=data.n_channels,
sequence_length=200,
learn_means=False,
learn_covariances=True,
batch_size=256,
learning_rate=0.01,
n_epochs=20,
)
model = Model(config)
model.random_state_time_course_initialization(data, n_init=3, n_epochs=1)
model.fit(data)
# Get inferred state probabilities, then compute summary statistics,
# spectra, power maps and connectivity networks
alpha = model.get_alpha(data)See the tutorials for complete walkthroughs and the examples directory for full analysis pipelines.
We recommend installing osl-dynamics using the conda environment files in /envs, which can be installed using Miniforge.
Miniforge (conda/mamba) can be installed with:
curl -LO "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
rm Miniforge3-$(uname)-$(uname -m).sh
Different computers have their own environment files. For more information see the envs README.
curl -LO https://raw.githubusercontent.com/OHBA-analysis/osl-dynamics/refs/heads/main/envs/osld-tf.yml
mamba env create -f osld-tf.yml
rm osld-tf.yml
If you have a GPU, then use the osld-tf-cuda.yml environment instead:
curl -LO https://raw.githubusercontent.com/OHBA-analysis/osl-dynamics/refs/heads/main/envs/osld-tf-cuda.yml
mamba env create -f osld-tf-cuda.yml
rm osld-tf-cuda.yml
If you have an M-series (M1, M2, M3) chip use:
curl -LO https://raw.githubusercontent.com/OHBA-analysis/osl-dynamics/refs/heads/main/envs/osld-tf.yml
mamba env create -f osld-tf.yml
rm osld-tf.yml
Otherwise, if you have an Intel chip use:
curl -LO https://raw.githubusercontent.com/OHBA-analysis/osl-dynamics/refs/heads/main/envs/osld-tf-macos.yml
mamba env create -f osld-tf-macos.yml
rm osld-tf-macos.yml
If you are using a Windows computer, we recommend first installing Linux (Ubuntu) as a Windows Subsystem by following the instructions here. Then follow the instructions for Linux above in the Ubuntu terminal.
On the OHBA workstation (hbaws), install Miniforge and Mamba using the instructions above and install osl-dynamics using:
curl -LO https://raw.githubusercontent.com/OHBA-analysis/osl-dynamics/refs/heads/main/envs/hbaws.yml
mamba env create -f hbaws.yml
rm hbaws.yml
On the Biomedical Research Computing (BMRC) cluster, conda is available as a software module:
module load Miniforge3
and osl-dynamics can be installed with:
curl -LO https://raw.githubusercontent.com/OHBA-analysis/osl-dynamics/refs/heads/main/envs/bmrc.yml
conda env create -f bmrc.yml
rm bmrc.yml
The above can be run on the login nodes (clusterX.bmrc.ox.ac.uk). On compg017 you will need to set the following to use conda:
unset https_proxy http_proxy no_proxy HTTPS_PROXY HTTP_PROXY NO_PROXY
You should only need to do this if you need a feature or fix that has not been released on pip yet.
After you have created an osld environment you can install the latest code (development version) from the GitHub repository with:
conda activate osld
pip install git+https://github.com/OHBA-analysis/osl-dynamics.git
After you have created an osld environment you can install an editable local copy of the source code on your computer with:
git clone https://github.com/OHBA-analysis/osl-dynamics.git
conda activate osld
cd osl-dynamics
pip install -e .
You will run your local copy of the code when you import osl_dynamics.
If you are a developer, you may wish to clone the repository using SSH rather than HTTPS to make pushing branches/commits easier:
git clone git@github.com:OHBA-analysis/osl-dynamics.git
You can use the following to check if TensorFlow is using any GPUs you have available:
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
This should return a list of GPUs.
Simply delete the conda environment:
conda env remove -n osld
conda clean --all
And remove the GitHub repository if you have cloned it:
rm -rf osl-dynamics
The read the docs page should be automatically updated whenever there's a new commit on the main branch.
The documentation is included as docstrings in the source code. The API reference documentation will only be automatically generated if the docstrings are written correctly. The documentation directory /doc also contains .rst files that provide additional info regarding installation, development, the models, etc.
To compile the documentation locally you need to install the required packages (sphinx, etc) in your conda environment:
cd osl-dynamics
conda activate osld
pip install -r doc/requirements.txt
To compile the documentation locally use:
sphinx-build -b html doc build
The local build of the documentation webpage can be found in build/sphinx/html/index.html.
To skip building the tutorials, comment out "sphinx_gallery.gen_gallery" here.
To release a new version:
-
Check the latest commit on
mainhas compiled successfully on readthedocs. -
Create a new release using the 'Create a new release' link on the right of the GitHub repo webpage. Set the tag to the new version number with a
vprefix (e.g.v3.3.0), write the release notes, the output of the following is a useful starting point:
git log --oneline <previous tag>..main
Select 'Latest' for the release label and click 'Publish release'.
- Publishing the release triggers a GitHub Actions workflow (
.github/workflows/release.yml) that builds the package and uploads it to PyPI. Check the workflow succeeded under the Actions tab of the GitHub repo.
Installations from a clone of the repo (pip install -e .) automatically get a development version number based on the latest tag, e.g. 3.3.1.dev12 if 12 commits have been made since v3.3.0.
If you find this toolbox useful, please cite the paper:
Gohil, C., Huang, R., Roberts, E., van Es, M. W., Quinn, A. J., Vidaurre, D., & Woolrich, M. W. (2024). osl-dynamics, a toolbox for modeling fast dynamic brain activity. Elife, 12, RP91949.