visiomode-analysis
Analysis library and CLI for behavioural session data recorded with Visiomode, a visuomotor behaviour platform for rodents.
Features
- Session summaries: quickly summarise session stats, including signal detection theory metrics.
- HTML reports: standalone, self-contained session reports with embedded Plotly figures.
- GLM regressors: event regressors (stimulus/response/reward windows) aligned to an external timestamp series, such as imaging frame timestamps or electrophysiology acquisition rates.
- Subject-level and cohort-level analysis: combine per-session trial summaries into a single per-subject summary CSV, as well as group-level analysis across subjects.
Installation
Requires Python 3.11+.
pip install visiomode-analysis
Or, to install the latest unreleased code from main:
pip install git+https://github.com/DuguidLab/visiomode_analysis.git
For local development, this project uses uv to manage the virtual environment:
git clone https://github.com/DuguidLab/visiomode_analysis.git
cd visiomode_analysis
uv sync
This creates a .venv with the package, its dependencies and the development tooling installed, with the package itself in editable mode.
Usage
CLI
The package installs a visiomode-analysis command with five subcommands: session, regressors, session-start-time, subject, and group.
Process a single session — generates an HTML report and a trials CSV:
visiomode-analysis session path/to/sub-01_exp-myexperiment_ses-20260101_behaviour-gonogo.json -o output/
Skip the HTML report, or generate GLM regressors alongside it, with:
visiomode-analysis session path/to/session.json -o output/ --no-report
visiomode-analysis session path/to/session.json -o output/ --with-regressors --regressor-timestamps frame_times.csv
Generate regressors for an already-processed session, aligned to an external timestamp series:
visiomode-analysis regressors path/to/session.json -o output/ --regressor-timestamps frame_times.csv
--regressor-timestamps accepts a CSV or TXT of absolute ISO timestamps, or a mesoscopy H5 (from mesoscopy align) whose /timestamps_aligned dataset is already relative to behaviour start. For H5 input the dataset's session_start_time attribute must match the session's timestamp. The output .npz holds regressors, labels, timestamps, trial_idx, session_start_time and behaviour_session.
Print the session start time (the JSON timestamp key), e.g. for aligning an imaging recording:
visiomode-analysis session-start-time path/to/session.json
Collate a subject's sessions — combines every *trials.csv file in a directory (as produced by session) into one subject-level summary CSV:
visiomode-analysis subject path/to/subject_dir/ -o output/
Run visiomode-analysis --help or visiomode-analysis <command> --help for full option details.
Python API
The CLI is a thin wrapper around the visiomode_analysis.session module, which can also be used directly:
from visiomode_analysis import session
trials = session.get_trials("path/to/session.json")
metadata = session.get_metadata("path/to/session.json")
summary = session.summary(trials)
session.generate_report(trials, metadata, output_dir="output/")
Input files and naming convention
Session JSON filenames are expected to follow a BIDS-like pattern:
sub-<animal_id>_exp-<experiment>_ses-<YYYYMMDD>_behaviour-<protocol>.json
Metadata encoded in the filename takes precedence over the same fields in the JSON body. Output files (trials CSV, report HTML, regressors .npz, subject summary CSV) are named following the same convention, so downstream steps — e.g. subject globbing for *trials.csv — can find their inputs automatically.
Project structure
src/visiomode_analysis/
├── __init__.py # top-level Click CLI group, wires up subcommands
├── session/ # Session-level statistics
│ ├── __init__.py # JSON → trials DataFrame, metadata, summaries, report/regressor generation
│ ├── metrics.py # signal-detection-theory statistics
│ ├── plots.py # Plotly figure builders
│ └── regressor.py # per-protocol GLM regressor construction
├── subject/ # collates per-session trials.csv files into a subject summary
│ └── __init__.py
├── group/ # cohort-level aggregation across subjects (not implemented yet)
│ └── __init__.py
└── reports/ # Jinja2 templates for HTML session reports
├── __init__.py
└── templates/
├── base.html
└── session.html
Development
Common dev tasks are wrapped in a Makefile; run make on its own to list them.
# Run the test suite
make test
# Run tests with coverage
make test-cov
# Run a single test file or test
make test ARGS="tests/test_metrics.py"
make test ARGS="tests/test_metrics.py::test_d_prime_afc_correction -v"
# Type checking
make types
# Everything CI checks: tests with coverage, then type check
make check
# Build the sdist and wheel
make build
Each target is a wrapper around the equivalent uv run command (make test is uv run pytest), you can just call uv directly if you so please.
See CONTRIBUTING.md for how to contribute and raise issues. See CHANGELOG.md for release notes.
License
MIT — see LICENSE.
Release files for visiomode-analysis 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| visiomode_analysis-0.2.1.tar.gz | 482.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| visiomode_analysis-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 512.7 kB
Release files / visiomode_analysis-0.2.1.tar.gz
| Download URL | visiomode_analysis-0.2.1.tar.gz |
|---|---|
| Size | 482.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
47dd22aa4bcfac93dacfcac0c745bb1cd65f5eeae87405dd761d6bc5fe182f7e
|
|
BLAKE2b-256 checksum How to use checksums |
fa7d31ce4623707779c6c6db850c144720f2296d254bc0dbb03d64668c906282
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / visiomode_analysis-0.2.1-py3-none-any.whl
| Download URL | visiomode_analysis-0.2.1-py3-none-any.whl |
|---|---|
| Size | 30.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4805d794d8b22a366f67c54bba952ededfd15e056c9c639f91ece2a549d16c43
|
|
BLAKE2b-256 checksum How to use checksums |
59dd1fde11dc6028d2f21d2d0b3b09d99383e71a30d047a015f10737f4c87eef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency log