Metadata-Version: 2.4
Name: murineshiftwork
Version: 2.15.4
Summary: Behaviour acquisition framework for standardised, scalable experiments.
Project-URL: Homepage, https://github.com/MurineShiftWork/murineshiftwork
Project-URL: Documentation, https://MurineShiftWork.github.io/murineshiftwork/
Project-URL: Issue Tracker, https://github.com/MurineShiftWork/murineshiftwork/issues
Author-email: "Lars B. Rollik" <lars@rollik.me>
License: Copyright (c) 2021-present Lars B. Rollik. All rights reserved.
        
        Permission is granted, free of charge, to use, copy, modify, and distribute
        this software and associated documentation files (the "Software") for
        non-commercial research or academic purposes only, subject to the following
        conditions:
        
        1. This copyright notice and permission notice must be included in all copies
           or substantial portions of the Software.
        
        2. Any publication, presentation, or product that uses or builds upon the
           Software must give clear attribution to the original work and its authors.
        
        3. Commercial use is prohibited without a separate written commercial licence
           agreement with the copyright holder. Commercial use means incorporation of
           the Software into anything for which fees or other compensation are charged
           or received, including commercial products and commercial services.
        
        4. No patent licence, express or implied, is granted under these terms. Any
           use that would require a patent licence from the copyright holder requires
           a separate written agreement.
        
        5. Redistribution, in source or binary form, is permitted only for
           non-commercial purposes and must retain this notice unmodified.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM,
        DAMAGES, OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE
        SOFTWARE OR THE USE OR DEALINGS IN THE SOFTWARE.
        
        For commercial or patent licensing enquiries contact: lars@rollik.me
License-File: LICENSE
Requires-Python: <3.14,>=3.12
Requires-Dist: ipython>=9.14.1
Requires-Dist: msw-core>=0.6.0
Requires-Dist: msw-io>=1.6.0
Requires-Dist: plotly>=5.0
Requires-Dist: pyarrow>=24.0.0
Requires-Dist: tqdm
Provides-Extra: agent
Requires-Dist: msw-agent>=0.1.0; extra == 'agent'
Provides-Extra: calibration
Requires-Dist: serial-scale-bench>=0.2.0; extra == 'calibration'
Requires-Dist: serial-scale-hx711>=2.1.0; extra == 'calibration'
Provides-Extra: dev
Requires-Dist: commitizen; extra == 'dev'
Requires-Dist: gitpython; extra == 'dev'
Requires-Dist: httpx; extra == 'dev'
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pyarrow; extra == 'dev'
Requires-Dist: pypulsepal>=0.4.0; extra == 'dev'
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-material; extra == 'docs'
Requires-Dist: mkdocstrings[python]; extra == 'docs'
Provides-Extra: full
Requires-Dist: msw-open-ephys>=3.0.0; extra == 'full'
Requires-Dist: msw-tasks-core>=0.2.0; extra == 'full'
Requires-Dist: myterial; extra == 'full'
Requires-Dist: pyqt6; extra == 'full'
Requires-Dist: pyqtgraph; extra == 'full'
Requires-Dist: rpi-camera-ensemble[conductor]>=0.5.0; extra == 'full'
Requires-Dist: serial-scale-bench>=0.2.0; extra == 'full'
Requires-Dist: serial-scale-hx711>=2.1.0; extra == 'full'
Requires-Dist: sshkeyboard; extra == 'full'
Provides-Extra: keyboard
Requires-Dist: sshkeyboard; extra == 'keyboard'
Provides-Extra: oe
Requires-Dist: msw-open-ephys>=3.0.0; extra == 'oe'
Provides-Extra: pulsepal
Requires-Dist: pypulsepal>=0.4.0; extra == 'pulsepal'
Provides-Extra: qt
Requires-Dist: myterial; extra == 'qt'
Requires-Dist: pyqt6; extra == 'qt'
Requires-Dist: pyqtgraph; extra == 'qt'
Provides-Extra: rce
Requires-Dist: rpi-camera-ensemble[conductor]>=0.5.0; extra == 'rce'
Provides-Extra: tasks
Requires-Dist: msw-tasks-core>=0.2.0; extra == 'tasks'
Description-Content-Type: text/markdown

# Murine Shift Work

Behaviour acquisition framework for standardised, scalable experiments.

```bash
msw run --setup rig-a --subject mouse001 --task sequence
```

---

## What it does

- **Behavioural tasks**: sequence learning, probabilistic switching, optotagging, calibration routines
- **Hardware abstraction**: interchangeable backends for behaviour controllers, cameras, stage, scale, stimulators
- **Config system**: layered YAML overrides (bundled defaults, rig overlay, task mode, subject, CLI)
- **Session files**: structured `.msw.session.yaml` + JSONL trial data; reader API for analysis
- **Live plot**: per-task online performance display during acquisition
- **TTL barcodes**: unique per-trial barcodes on BNC output for alignment with parallel recordings

---

## Installation

Requires Python ≥ 3.12 and [uv](https://docs.astral.sh/uv/).

```bash
pip install murineshiftwork
```

### First-time setup

```bash
msw init --config-dir /path/to/msw_configs
msw setup create rig-a
msw subject add -s mouse001
```

---

## Development

```bash
git clone https://github.com/MurineShiftWork/murineshiftwork.git
cd murineshiftwork
uv sync --group dev
uv run pytest tests/
```

Pre-commit hooks (ruff, mypy, secrets scan):

```bash
pre-commit install
```

---

## Docs

See `docs/` for CLI reference, config system, session files, and task guides.
Key architecture decisions are in `docs/MASTER_PLAN.md`.

---

## License

Copyright © 2021-2026 Lars B. Rollik.
See [LICENSE](LICENSE) for terms.
