diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..4d11160 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,44 @@ +name: Tests + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.11", "3.12", "3.13"] + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Cache uv + uses: actions/cache@v4 + with: + path: ~/.cache/uv + key: uv-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }} + restore-keys: | + uv-${{ runner.os }}-py${{ matrix.python-version }}- + + - name: Install Hatch + run: pip install hatch + + - name: Run tests with coverage + run: hatch test --python ${{ matrix.python-version }} --cover diff --git a/.gitignore b/.gitignore index fb1fc8a..ceb4223 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,17 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# Ignore outputs +*.csv +*.html + +scratch/ +scratch + +# AI agent instruction files (not tracked for now) +CLAUDE.md +AGENTS.md +GEMINI.md +.claude/CLAUDE.md + diff --git a/README.md b/README.md index f51b994..5ce465a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,128 @@ -# visiomode_analysis -Analysis library for behaviour data generated with visiomode +# visiomode-analysis + +Analysis library and CLI for behavioural session data recorded with [Visiomode](https://github.com/DuguidLab/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+. + +```bash +pip install git+https://github.com/DuguidLab/visiomode_analysis.git +``` + +For local development, this project uses [uv](https://docs.astral.sh/uv/) to manage the virtual environment: + +```bash +git clone https://github.com/DuguidLab/visiomode_analysis.git +cd visiomode_analysis +uv sync +``` + +This creates a `.venv` with the package and its dependencies installed in editable mode. + +## Usage + +### CLI + +The package installs a `visiomode-analysis` command with four subcommands: `session`, `regressors`, `subject`, and `group`. + +**Process a single session** — generates an HTML report and a trials CSV: + +```bash +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: + +```bash +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: + +```bash +visiomode-analysis regressors path/to/session.json -o output/ --regressor-timestamps frame_times.csv +``` + +**Collate a subject's sessions** — combines every `*trials.csv` file in a directory (as produced by `session`) into one subject-level summary CSV: + +```bash +visiomode-analysis subject path/to/subject_dir/ -o output/ +``` + +Run `visiomode-analysis --help` or `visiomode-analysis --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: + +```python +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-_exp-_ses-_behaviour-.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 + +```sh +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 (stub, unimplemented) +│ └── __init__.py +└── reports/ # Jinja2 templates for HTML session reports + ├── __init__.py + └── templates/ + ├── base.html + └── session.html +``` + +## Development + +```bash +# Run the full test suite with coverage (matches CI) +hatch test --cover + +# Run tests directly with pytest (faster iteration) +.venv/bin/pytest + +# Run a single test file / test +.venv/bin/pytest tests/test_metrics.py::test_d_prime_afc_correction -v + +# Type checking +hatch run types:check +``` + +See [CONTRIBUTING.md](CONTRIBUTING.md). + +## License + +MIT — see [LICENSE](LICENSE). diff --git a/exploratory/session-api.ipynb b/exploratory/session-api.ipynb new file mode 100644 index 0000000..5f8cd35 --- /dev/null +++ b/exploratory/session-api.ipynb @@ -0,0 +1,1606 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 16, + "id": "85b00c2c", + "metadata": {}, + "outputs": [], + "source": [ + "from visiomode_analysis import session\n", + "from scipy.stats import norm" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "6aa96b71", + "metadata": {}, + "outputs": [], + "source": [ + "path = \"./test_data/example-gonogo-leverpush.json\"\n", + "path2 = \"./test_data/example-targetonly-leverpush.json\"\n", + "\n", + "df = session.get_trials(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "772564e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
animal_idsession_dateprotocolenvironmentexperimentstart_timestop_timecue_onsetresponseresponse_time...correctionpos_xpos_ydist_xdist_ysdt_typestim_idstim_periodstim_contraststim_freq
0MM2292022-03-09gonogounknown109hrb21d4.48467913.4846799.484679NaNNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
1MM2292022-03-09gonogounknown109hrb21d14.99183919.065675NaNunknown4.072411...False400.0240.00.00.0NaNNaNNaNNaNNaN
2MM2292022-03-09gonogounknown109hrb21d19.06717925.19655424.067179unknown1.128456...False400.0240.00.00.0hitmovinggrating301.01.0
3MM2292022-03-09gonogounknown109hrb21d26.70047335.70047331.700473NaNNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
4MM2292022-03-09gonogounknown109hrb21d37.20694543.88107242.206945unknown1.670673...False400.0240.00.00.0hitmovinggrating301.01.0
..................................................................
300MM2292022-03-09gonogounknown109hrb21d1765.8470141774.0558251770.847014unknown3.207015...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
301MM2292022-03-09gonogounknown109hrb21d1774.0574611781.8511671779.057461unknown2.791260...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
302MM2292022-03-09gonogounknown109hrb21d1781.8528391786.325765NaNunknown4.472022...True400.0240.00.00.0NaNNaNNaNNaNNaN
303MM2292022-03-09gonogounknown109hrb21d1786.3277441795.3277441791.327744NaNNaN...TrueNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
304MM2292022-03-09gonogounknown109hrb21d1796.8319601802.6626951801.831960unknown0.828844...False400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
\n", + "

305 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " animal_id session_date protocol environment experiment start_time \\\n", + "0 MM229 2022-03-09 gonogo unknown 109hrb21d 4.484679 \n", + "1 MM229 2022-03-09 gonogo unknown 109hrb21d 14.991839 \n", + "2 MM229 2022-03-09 gonogo unknown 109hrb21d 19.067179 \n", + "3 MM229 2022-03-09 gonogo unknown 109hrb21d 26.700473 \n", + "4 MM229 2022-03-09 gonogo unknown 109hrb21d 37.206945 \n", + ".. ... ... ... ... ... ... \n", + "300 MM229 2022-03-09 gonogo unknown 109hrb21d 1765.847014 \n", + "301 MM229 2022-03-09 gonogo unknown 109hrb21d 1774.057461 \n", + "302 MM229 2022-03-09 gonogo unknown 109hrb21d 1781.852839 \n", + "303 MM229 2022-03-09 gonogo unknown 109hrb21d 1786.327744 \n", + "304 MM229 2022-03-09 gonogo unknown 109hrb21d 1796.831960 \n", + "\n", + " stop_time cue_onset response response_time ... correction pos_x \\\n", + "0 13.484679 9.484679 NaN NaN ... False NaN \n", + "1 19.065675 NaN unknown 4.072411 ... False 400.0 \n", + "2 25.196554 24.067179 unknown 1.128456 ... False 400.0 \n", + "3 35.700473 31.700473 NaN NaN ... False NaN \n", + "4 43.881072 42.206945 unknown 1.670673 ... False 400.0 \n", + ".. ... ... ... ... ... ... ... \n", + "300 1774.055825 1770.847014 unknown 3.207015 ... True 400.0 \n", + "301 1781.851167 1779.057461 unknown 2.791260 ... True 400.0 \n", + "302 1786.325765 NaN unknown 4.472022 ... True 400.0 \n", + "303 1795.327744 1791.327744 NaN NaN ... True NaN \n", + "304 1802.662695 1801.831960 unknown 0.828844 ... False 400.0 \n", + "\n", + " pos_y dist_x dist_y sdt_type stim_id stim_period \\\n", + "0 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "1 240.0 0.0 0.0 NaN NaN NaN \n", + "2 240.0 0.0 0.0 hit movinggrating 30 \n", + "3 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "4 240.0 0.0 0.0 hit movinggrating 30 \n", + ".. ... ... ... ... ... ... \n", + "300 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "301 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "302 240.0 0.0 0.0 NaN NaN NaN \n", + "303 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "304 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "\n", + " stim_contrast stim_freq \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 1.0 1.0 \n", + "3 NaN NaN \n", + "4 1.0 1.0 \n", + ".. ... ... \n", + "300 NaN NaN \n", + "301 NaN NaN \n", + "302 NaN NaN \n", + "303 NaN NaN \n", + "304 NaN NaN \n", + "\n", + "[305 rows x 21 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2fdcc5f6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'animal_id': 'MM229',\n", + " 'experiment': '109hrb21d',\n", + " 'session_date': datetime.date(2022, 3, 9),\n", + " 'environment': 'unknown',\n", + " 'protocol': 'gonogo',\n", + " 'version': 'unknown',\n", + " 'duration': 30.0,\n", + " 'session_start_time': '2022-03-09T12:04:03.108928',\n", + " 'response_device': 'leverpush',\n", + " 'reward_profile': 'waterreward',\n", + " 'stimulus_duration': 4000.0,\n", + " 'iti': 5000.0,\n", + " 'corrections_enabled': 'true',\n", + " 'device': 'meso-2',\n", + " 'stimuli': {'target_id': 'movinggrating',\n", + " 'target_period': '30',\n", + " 'target_contrast': '1.0',\n", + " 'target_freq': '1.0',\n", + " 'distractor_id': 'isoluminantgray'},\n", + " 'notes': ''}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.get_metadata(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "046be0af", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "metadata = json.load(open(path, \"r\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "64029d34", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "81" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df[df.sdt_type == \"false_alarm\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7911ef4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "24ec43f8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.int64(49)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[(df.response.notnull()) & (df.outcome == \"correct\") & (df.correction == False)].outcome.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "0c6d04df", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.int64(40)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[(df.response.notnull()) & (df.outcome == \"incorrect\") & (df.correction == False)].outcome.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "323606ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'animal_id': 'MM229',\n", + " 'session_date': datetime.date(2022, 3, 9),\n", + " 'protocol': 'gonogo',\n", + " 'environment': 'unknown',\n", + " 'experiment': '109hrb21d',\n", + " 'correct': 61,\n", + " 'correct_wc': 100,\n", + " 'incorrect': 40,\n", + " 'incorrect_wc': 81,\n", + " 'correction_trials': 41,\n", + " 'hits': 49,\n", + " 'hits_wc': 49,\n", + " 'false_alarms': 40,\n", + " 'false_alarms_wc': 81,\n", + " 'correct_rejections': 12,\n", + " 'correct_rejections_wc': 51,\n", + " 'misses': 0,\n", + " 'misses_wc': 0,\n", + " 'cued': 101,\n", + " 'cued_wc': 181,\n", + " 'precued': 124,\n", + " 'total': 305,\n", + " 'percentage_correct': 60.396039603960396,\n", + " 'percentage_correct_wc': 55.24861878453039,\n", + " 'cued_ratio': 0.8145161290322581,\n", + " 'correction_ratio': 2.4634146341463414,\n", + " 'hit_rate': 0.99,\n", + " 'hit_rate_wc': 0.99,\n", + " 'fa_rate': 0.7641509433962265,\n", + " 'fa_rate_wc': 0.6127819548872181,\n", + " 'd_prime': 1.606629016515605,\n", + " 'd_prime_wc': 2.039770694891421,\n", + " 'decision_criterion': -1.5230333657830384,\n", + " 'decision_criterion_wc': -1.3064625265951302,\n", + " 'perseveration': 0.5061728395061729,\n", + " 'rt': 0.7579958438873291,\n", + " 'rt_wc': 0.7752770185470581,\n", + " 'rt_hits': 0.8411245346069336,\n", + " 'rt_hits_wc': 0.8411245346069336,\n", + " 'rt_false_alarms': 0.724478006362915,\n", + " 'rt_false_alarms_wc': 0.7548151016235352,\n", + " 'rt_iqr': 0.6941144466400146,\n", + " 'rt_iqr_wc': 0.8146393895149231}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.summary(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d34c3920", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/fromnumeric.py:3824: RuntimeWarning: Mean of empty slice\n", + " return _methods._mean(a, axis=axis, dtype=dtype,\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/_methods.py:142: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/fromnumeric.py:3824: RuntimeWarning: Mean of empty slice\n", + " return _methods._mean(a, axis=axis, dtype=dtype,\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/_methods.py:142: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n" + ] + }, + { + "data": { + "text/plain": [ + "{'animal_id': 'MM229',\n", + " 'session_date': datetime.date(2022, 3, 1),\n", + " 'protocol': 'targetonly',\n", + " 'environment': 'unknown',\n", + " 'experiment': '109hrb21d',\n", + " 'correct': 166,\n", + " 'correct_wc': 166,\n", + " 'incorrect': 0,\n", + " 'incorrect_wc': 0,\n", + " 'correction_trials': 0,\n", + " 'hits': 166,\n", + " 'hits_wc': 166,\n", + " 'false_alarms': 0,\n", + " 'false_alarms_wc': 0,\n", + " 'correct_rejections': 0,\n", + " 'correct_rejections_wc': 0,\n", + " 'misses': 71,\n", + " 'misses_wc': 71,\n", + " 'cued': 237,\n", + " 'cued_wc': 237,\n", + " 'precued': 54,\n", + " 'total': 291,\n", + " 'percentage_correct': 70.042194092827,\n", + " 'percentage_correct_wc': 70.042194092827,\n", + " 'cued_ratio': 4.388888888888889,\n", + " 'correction_ratio': 0.0,\n", + " 'hit_rate': 0.6995798319327731,\n", + " 'hit_rate_wc': 0.6995798319327731,\n", + " 'fa_rate': 0.5,\n", + " 'fa_rate_wc': 0.5,\n", + " 'd_prime': 0.5231924482394528,\n", + " 'd_prime_wc': 0.5231924482394528,\n", + " 'decision_criterion': -0.2615962241197264,\n", + " 'decision_criterion_wc': -0.2615962241197264,\n", + " 'perseveration': 0.0,\n", + " 'rt': 3.505884289741516,\n", + " 'rt_wc': 3.505884289741516,\n", + " 'rt_hits': 3.505884289741516,\n", + " 'rt_hits_wc': 3.505884289741516,\n", + " 'rt_false_alarms': nan,\n", + " 'rt_false_alarms_wc': nan,\n", + " 'rt_iqr': 4.261228859424591,\n", + " 'rt_iqr_wc': 4.261228859424591}" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.summary(path2)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "20981f82", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
animal_idsession_dateprotocolenvironmentexperimentstart_timestop_timecue_onsetresponseresponse_time...correctionpos_xpos_ydist_xdist_ysdt_typestim_idstim_periodstim_contraststim_freq
0MM2292022-03-09gonogounknown109hrb21d4.48467913.4846799.484679NaNNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
1MM2292022-03-09gonogounknown109hrb21d14.99183919.065675NaNunknown4.072411...False400.0240.00.00.0NaNNaNNaNNaNNaN
2MM2292022-03-09gonogounknown109hrb21d19.06717925.19655424.067179unknown1.128456...False400.0240.00.00.0hitmovinggrating301.01.0
3MM2292022-03-09gonogounknown109hrb21d26.70047335.70047331.700473NaNNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
4MM2292022-03-09gonogounknown109hrb21d37.20694543.88107242.206945unknown1.670673...False400.0240.00.00.0hitmovinggrating301.01.0
..................................................................
300MM2292022-03-09gonogounknown109hrb21d1765.8470141774.0558251770.847014unknown3.207015...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
301MM2292022-03-09gonogounknown109hrb21d1774.0574611781.8511671779.057461unknown2.791260...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
302MM2292022-03-09gonogounknown109hrb21d1781.8528391786.325765NaNunknown4.472022...True400.0240.00.00.0NaNNaNNaNNaNNaN
303MM2292022-03-09gonogounknown109hrb21d1786.3277441795.3277441791.327744NaNNaN...TrueNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
304MM2292022-03-09gonogounknown109hrb21d1796.8319601802.6626951801.831960unknown0.828844...False400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
\n", + "

305 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " animal_id session_date protocol environment experiment start_time \\\n", + "0 MM229 2022-03-09 gonogo unknown 109hrb21d 4.484679 \n", + "1 MM229 2022-03-09 gonogo unknown 109hrb21d 14.991839 \n", + "2 MM229 2022-03-09 gonogo unknown 109hrb21d 19.067179 \n", + "3 MM229 2022-03-09 gonogo unknown 109hrb21d 26.700473 \n", + "4 MM229 2022-03-09 gonogo unknown 109hrb21d 37.206945 \n", + ".. ... ... ... ... ... ... \n", + "300 MM229 2022-03-09 gonogo unknown 109hrb21d 1765.847014 \n", + "301 MM229 2022-03-09 gonogo unknown 109hrb21d 1774.057461 \n", + "302 MM229 2022-03-09 gonogo unknown 109hrb21d 1781.852839 \n", + "303 MM229 2022-03-09 gonogo unknown 109hrb21d 1786.327744 \n", + "304 MM229 2022-03-09 gonogo unknown 109hrb21d 1796.831960 \n", + "\n", + " stop_time cue_onset response response_time ... correction pos_x \\\n", + "0 13.484679 9.484679 NaN NaN ... False NaN \n", + "1 19.065675 NaN unknown 4.072411 ... False 400.0 \n", + "2 25.196554 24.067179 unknown 1.128456 ... False 400.0 \n", + "3 35.700473 31.700473 NaN NaN ... False NaN \n", + "4 43.881072 42.206945 unknown 1.670673 ... False 400.0 \n", + ".. ... ... ... ... ... ... ... \n", + "300 1774.055825 1770.847014 unknown 3.207015 ... True 400.0 \n", + "301 1781.851167 1779.057461 unknown 2.791260 ... True 400.0 \n", + "302 1786.325765 NaN unknown 4.472022 ... True 400.0 \n", + "303 1795.327744 1791.327744 NaN NaN ... True NaN \n", + "304 1802.662695 1801.831960 unknown 0.828844 ... False 400.0 \n", + "\n", + " pos_y dist_x dist_y sdt_type stim_id stim_period \\\n", + "0 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "1 240.0 0.0 0.0 NaN NaN NaN \n", + "2 240.0 0.0 0.0 hit movinggrating 30 \n", + "3 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "4 240.0 0.0 0.0 hit movinggrating 30 \n", + ".. ... ... ... ... ... ... \n", + "300 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "301 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "302 240.0 0.0 0.0 NaN NaN NaN \n", + "303 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "304 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "\n", + " stim_contrast stim_freq \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 1.0 1.0 \n", + "3 NaN NaN \n", + "4 1.0 1.0 \n", + ".. ... ... \n", + "300 NaN NaN \n", + "301 NaN NaN \n", + "302 NaN NaN \n", + "303 NaN NaN \n", + "304 NaN NaN \n", + "\n", + "[305 rows x 21 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.get_trials(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "2cf49e90", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.12845564, 1.67067313, 0.75222349, 0.7189033 , 0.58157992,\n", + " 2.63856554, 1.02317667, 1.09140873, 0.9076066 , 0.58795977,\n", + " 1.98388386, 3.61881399, 3.61073375, 1.04348946, 0.65499592,\n", + " 0.45944071, 0.26327109, 1.28396535, 0.87741184, 0.49710107,\n", + " 0.56599116, 0.84596944, 0.84112453, 0.4502275 , 1.91021109,\n", + " 0.53104758, 0.70769119, 3.00024486, 0.74060893, 0.49157977,\n", + " 0.62760639, 0.50835109, 0.42487359, 0.82556057, 0.3984499 ,\n", + " 0.39205909, 0.7548151 , 2.94736958, 0.44928479, 0.44550776,\n", + " 0.48086047, 0.41519713, 3.11189342, 2.50167394, 1.25001621,\n", + " 1.90612602, 0.99718571, 0.58729029, 0.4282968 , 0.55701089,\n", + " 0.63315582, 3.36899853, 0.5712564 , 0.64555478, 0.09124446,\n", + " 0.84036136, 0.50356007, 0.59616613, 0.27872372, 1.51335716,\n", + " 1.34386039, 2.26025271, 0.52169633, 1.84859204, 0.65409708,\n", + " 0.53360224, 0.94292784, 1.02442169, 0.21108174, 1.5925734 ,\n", + " 0.94771004, 0.1555655 , 3.32345533, 0.65784979, 0.54014683,\n", + " 0.4714303 , 0.78326321, 0.84392142, 0.15697026, 0.49913096,\n", + " 0.54947042, 0.24266291, 0.75799584, 0.5250001 , 0.21599102,\n", + " 0.46551609, 0.71576905, 0.87470198, 0.66445208, 1.33302426,\n", + " 0.60051966, 1.68480587, 1.64150071, 0.4529109 , 0.29112673,\n", + " 3.2855885 , 1.86356854, 2.44906521, 3.3949523 , 1.99941421,\n", + " 0.76729083, 1.65594125, 0.72418523, 0.8692615 , 1.29176593,\n", + " 0.87070751, 1.11195922, 0.66701508, 0.96783257, 1.75673079,\n", + " 0.72477078, 0.73314214, 1.209373 , 1.91370678, 3.23936605,\n", + " 0.14834547, 0.0970118 , 1.24704385, 0.89157176, 0.27321911,\n", + " 1.85134625, 1.16960907, 0.51525855, 0.65883112, 0.91119289,\n", + " 1.44596767, 0.83379054, 3.20701528, 2.79126048, 0.82884383])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trials = session.get_trials(path)\n", + "trials[(trials.response.notnull()) & (trials.cue_onset.notnull())].response_time.values" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "3e0e4839", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.date(2022, 3, 9)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trials[\"session_date\"][0]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "95529ecb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.75222349, 0.7189033 , 0.58157992, 2.63856554, 1.02317667,\n", + " 1.09140873, 0.9076066 , 0.58795977, 1.98388386, 3.61073375,\n", + " 1.04348946, 0.65499592, 0.49710107, 0.56599116, 1.91021109,\n", + " 0.53104758, 0.70769119, 3.00024486, 0.49157977, 0.39205909,\n", + " 0.7548151 , 2.94736958, 0.44928479, 0.41519713, 3.11189342,\n", + " 2.50167394, 1.25001621, 1.90612602, 0.99718571, 0.58729029,\n", + " 0.4282968 , 0.63315582, 3.36899853, 0.09124446, 0.50356007,\n", + " 0.59616613, 0.27872372, 1.51335716, 1.34386039, 2.26025271,\n", + " 0.52169633, 1.84859204, 0.65409708, 0.53360224, 0.94292784,\n", + " 0.94771004, 0.1555655 , 3.32345533, 0.65784979, 0.78326321,\n", + " 0.84392142, 0.15697026, 0.49913096, 0.54947042, 0.24266291,\n", + " 0.75799584, 0.21599102, 0.46551609, 0.66445208, 1.33302426,\n", + " 0.60051966, 1.64150071, 0.4529109 , 0.29112673, 3.2855885 ,\n", + " 1.86356854, 2.44906521, 3.3949523 , 1.99941421, 0.76729083,\n", + " 1.65594125, 0.72418523, 0.66701508, 0.72477078, 0.14834547,\n", + " 0.0970118 , 1.24704385, 0.83379054, 3.20701528, 2.79126048,\n", + " 0.82884383])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.get_rts(path, \"false_alarm\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "e951c2f0", + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Length of values (1) does not match length of index (305)", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[31]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43msession_id\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m]\u001b[49m = df.groupby([\u001b[33m\"\u001b[39m\u001b[33manimal_id\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33msession_date\u001b[39m\u001b[33m\"\u001b[39m], sort=\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/pandas/core/frame.py:4672\u001b[39m, in \u001b[36mDataFrame.__setitem__\u001b[39m\u001b[34m(self, key, value)\u001b[39m\n\u001b[32m 4669\u001b[39m \u001b[38;5;28mself\u001b[39m._setitem_array([key], value)\n\u001b[32m 4670\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 4671\u001b[39m \u001b[38;5;66;03m# set column\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m4672\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_set_item\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/pandas/core/frame.py:4872\u001b[39m, in \u001b[36mDataFrame._set_item\u001b[39m\u001b[34m(self, key, value)\u001b[39m\n\u001b[32m 4862\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_set_item\u001b[39m(\u001b[38;5;28mself\u001b[39m, key, value) -> \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 4863\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 4864\u001b[39m \u001b[33;03m Add series to DataFrame in specified column.\u001b[39;00m\n\u001b[32m 4865\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 4870\u001b[39m \u001b[33;03m ensure homogeneity.\u001b[39;00m\n\u001b[32m 4871\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m4872\u001b[39m value, refs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sanitize_column\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 4874\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[32m 4875\u001b[39m key \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.columns\n\u001b[32m 4876\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m value.ndim == \u001b[32m1\u001b[39m\n\u001b[32m 4877\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(value.dtype, ExtensionDtype)\n\u001b[32m 4878\u001b[39m ):\n\u001b[32m 4879\u001b[39m \u001b[38;5;66;03m# broadcast across multiple columns if necessary\u001b[39;00m\n\u001b[32m 4880\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m.columns.is_unique \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m.columns, MultiIndex):\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/pandas/core/frame.py:5742\u001b[39m, in \u001b[36mDataFrame._sanitize_column\u001b[39m\u001b[34m(self, value)\u001b[39m\n\u001b[32m 5739\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m _reindex_for_setitem(value, \u001b[38;5;28mself\u001b[39m.index)\n\u001b[32m 5741\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_list_like(value):\n\u001b[32m-> \u001b[39m\u001b[32m5742\u001b[39m \u001b[43mcom\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequire_length_match\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 5743\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m sanitize_array(value, \u001b[38;5;28mself\u001b[39m.index, copy=\u001b[38;5;28;01mTrue\u001b[39;00m, allow_2d=\u001b[38;5;28;01mTrue\u001b[39;00m), \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/pandas/core/common.py:601\u001b[39m, in \u001b[36mrequire_length_match\u001b[39m\u001b[34m(data, index)\u001b[39m\n\u001b[32m 597\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 598\u001b[39m \u001b[33;03mCheck the length of data matches the length of the index.\u001b[39;00m\n\u001b[32m 599\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 600\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(data) != \u001b[38;5;28mlen\u001b[39m(index):\n\u001b[32m--> \u001b[39m\u001b[32m601\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 602\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mLength of values \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 603\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m(\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(data)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m) \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 604\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mdoes not match length of index \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 605\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m(\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(index)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m)\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 606\u001b[39m )\n", + "\u001b[31mValueError\u001b[39m: Length of values (1) does not match length of index (305)" + ] + } + ], + "source": [ + "df[\"session_id\"] = df.groupby([\"animal_id\", \"session_date\"], sort=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "b5ac7dd3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
animal_idsession_dateprotocolenvironmentexperimentstart_timestop_timecue_onsetresponseresponse_time...correctionpos_xpos_ydist_xdist_ysdt_typestim_idstim_periodstim_contraststim_freq
0MM2292022-03-09gonogounknown109hrb21d4.48467913.4846799.484679NaNNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
206MM2292022-03-09gonogounknown109hrb21d1210.5695471216.1761511215.569547unknown0.600520...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
205MM2292022-03-09gonogounknown109hrb21d1204.2325001210.5676951209.232500unknown1.333024...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
204MM2292022-03-09gonogounknown109hrb21d1198.5619651204.2310171203.561965unknown0.664452...False400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
203MM2292022-03-09gonogounknown109hrb21d1196.8853791198.560174NaNunknown1.673468...False400.0240.00.00.0NaNNaNNaNNaNNaN
..................................................................
98MM2292022-03-09gonogounknown109hrb21d575.658764581.657955580.658764unknown0.997186...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
97MM2292022-03-09gonogounknown109hrb21d573.101924575.657338NaNunknown2.554549...True400.0240.00.00.0NaNNaNNaNNaNNaN
96MM2292022-03-09gonogounknown109hrb21d566.192007573.100423571.192007unknown1.906126...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
103MM2292022-03-09gonogounknown109hrb21d604.162670613.162670609.162670NaNNaN...TrueNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
304MM2292022-03-09gonogounknown109hrb21d1796.8319601802.6626951801.831960unknown0.828844...False400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
\n", + "

305 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " animal_id session_date protocol environment experiment start_time \\\n", + "0 MM229 2022-03-09 gonogo unknown 109hrb21d 4.484679 \n", + "206 MM229 2022-03-09 gonogo unknown 109hrb21d 1210.569547 \n", + "205 MM229 2022-03-09 gonogo unknown 109hrb21d 1204.232500 \n", + "204 MM229 2022-03-09 gonogo unknown 109hrb21d 1198.561965 \n", + "203 MM229 2022-03-09 gonogo unknown 109hrb21d 1196.885379 \n", + ".. ... ... ... ... ... ... \n", + "98 MM229 2022-03-09 gonogo unknown 109hrb21d 575.658764 \n", + "97 MM229 2022-03-09 gonogo unknown 109hrb21d 573.101924 \n", + "96 MM229 2022-03-09 gonogo unknown 109hrb21d 566.192007 \n", + "103 MM229 2022-03-09 gonogo unknown 109hrb21d 604.162670 \n", + "304 MM229 2022-03-09 gonogo unknown 109hrb21d 1796.831960 \n", + "\n", + " stop_time cue_onset response response_time ... correction pos_x \\\n", + "0 13.484679 9.484679 NaN NaN ... False NaN \n", + "206 1216.176151 1215.569547 unknown 0.600520 ... True 400.0 \n", + "205 1210.567695 1209.232500 unknown 1.333024 ... True 400.0 \n", + "204 1204.231017 1203.561965 unknown 0.664452 ... False 400.0 \n", + "203 1198.560174 NaN unknown 1.673468 ... False 400.0 \n", + ".. ... ... ... ... ... ... ... \n", + "98 581.657955 580.658764 unknown 0.997186 ... True 400.0 \n", + "97 575.657338 NaN unknown 2.554549 ... True 400.0 \n", + "96 573.100423 571.192007 unknown 1.906126 ... True 400.0 \n", + "103 613.162670 609.162670 NaN NaN ... True NaN \n", + "304 1802.662695 1801.831960 unknown 0.828844 ... False 400.0 \n", + "\n", + " pos_y dist_x dist_y sdt_type stim_id stim_period \\\n", + "0 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "206 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "205 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "204 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "203 240.0 0.0 0.0 NaN NaN NaN \n", + ".. ... ... ... ... ... ... \n", + "98 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "97 240.0 0.0 0.0 NaN NaN NaN \n", + "96 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "103 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "304 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "\n", + " stim_contrast stim_freq \n", + "0 NaN NaN \n", + "206 NaN NaN \n", + "205 NaN NaN \n", + "204 NaN NaN \n", + "203 NaN NaN \n", + ".. ... ... \n", + "98 NaN NaN \n", + "97 NaN NaN \n", + "96 NaN NaN \n", + "103 NaN NaN \n", + "304 NaN NaN \n", + "\n", + "[305 rows x 21 columns]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.sort_values(\"session_date\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a084f706", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/exploratory/session-regressors.ipynb b/exploratory/session-regressors.ipynb new file mode 100644 index 0000000..c2285a5 --- /dev/null +++ b/exploratory/session-regressors.ipynb @@ -0,0 +1,1119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "908eb12a", + "metadata": {}, + "source": [ + "# Generate session regressors" + ] + }, + { + "cell_type": "code", + "execution_count": 325, + "id": "ee2f6242", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from visiomode_analysis import session\n", + "from visiomode_analysis.session import regressor" + ] + }, + { + "cell_type": "code", + "execution_count": 326, + "id": "1c4bd08b", + "metadata": {}, + "outputs": [], + "source": [ + "gng_path = \"./test_data/example-gonogo-leverpush.json\"\n", + "\n", + "meta = session.get_metadata(gng_path)\n", + "df = session.get_trials(gng_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 327, + "id": "274611c3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
animal_idsession_dateprotocolenvironmentexperimentstart_timestop_timecue_onsetresponseresponse_time...correctionpos_xpos_ydist_xdist_ysdt_typestim_idstim_periodstim_contraststim_freq
0MM2292022-03-09gonogounknown109hrb21d4.48467913.4846799.484679NoneNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
1MM2292022-03-09gonogounknown109hrb21d14.99183919.065675NaNunknown4.072411...False400.0240.00.00.0NoneNaNNaNNaNNaN
2MM2292022-03-09gonogounknown109hrb21d19.06717925.19655424.067179unknown1.128456...False400.0240.00.00.0hitmovinggrating301.01.0
3MM2292022-03-09gonogounknown109hrb21d26.70047335.70047331.700473NoneNaN...FalseNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
4MM2292022-03-09gonogounknown109hrb21d37.20694543.88107242.206945unknown1.670673...False400.0240.00.00.0hitmovinggrating301.01.0
..................................................................
300MM2292022-03-09gonogounknown109hrb21d1765.8470141774.0558251770.847014unknown3.207015...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
301MM2292022-03-09gonogounknown109hrb21d1774.0574611781.8511671779.057461unknown2.791260...True400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
302MM2292022-03-09gonogounknown109hrb21d1781.8528391786.325765NaNunknown4.472022...True400.0240.00.00.0NoneNaNNaNNaNNaN
303MM2292022-03-09gonogounknown109hrb21d1786.3277441795.3277441791.327744NoneNaN...TrueNaNNaNNaNNaNcorrect_rejectionisoluminantgrayNaNNaNNaN
304MM2292022-03-09gonogounknown109hrb21d1796.8319601802.6626951801.831960unknown0.828844...False400.0240.00.00.0false_alarmisoluminantgrayNaNNaNNaN
\n", + "

305 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " animal_id session_date protocol environment experiment start_time \\\n", + "0 MM229 2022-03-09 gonogo unknown 109hrb21d 4.484679 \n", + "1 MM229 2022-03-09 gonogo unknown 109hrb21d 14.991839 \n", + "2 MM229 2022-03-09 gonogo unknown 109hrb21d 19.067179 \n", + "3 MM229 2022-03-09 gonogo unknown 109hrb21d 26.700473 \n", + "4 MM229 2022-03-09 gonogo unknown 109hrb21d 37.206945 \n", + ".. ... ... ... ... ... ... \n", + "300 MM229 2022-03-09 gonogo unknown 109hrb21d 1765.847014 \n", + "301 MM229 2022-03-09 gonogo unknown 109hrb21d 1774.057461 \n", + "302 MM229 2022-03-09 gonogo unknown 109hrb21d 1781.852839 \n", + "303 MM229 2022-03-09 gonogo unknown 109hrb21d 1786.327744 \n", + "304 MM229 2022-03-09 gonogo unknown 109hrb21d 1796.831960 \n", + "\n", + " stop_time cue_onset response response_time ... correction pos_x \\\n", + "0 13.484679 9.484679 None NaN ... False NaN \n", + "1 19.065675 NaN unknown 4.072411 ... False 400.0 \n", + "2 25.196554 24.067179 unknown 1.128456 ... False 400.0 \n", + "3 35.700473 31.700473 None NaN ... False NaN \n", + "4 43.881072 42.206945 unknown 1.670673 ... False 400.0 \n", + ".. ... ... ... ... ... ... ... \n", + "300 1774.055825 1770.847014 unknown 3.207015 ... True 400.0 \n", + "301 1781.851167 1779.057461 unknown 2.791260 ... True 400.0 \n", + "302 1786.325765 NaN unknown 4.472022 ... True 400.0 \n", + "303 1795.327744 1791.327744 None NaN ... True NaN \n", + "304 1802.662695 1801.831960 unknown 0.828844 ... False 400.0 \n", + "\n", + " pos_y dist_x dist_y sdt_type stim_id stim_period \\\n", + "0 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "1 240.0 0.0 0.0 None NaN NaN \n", + "2 240.0 0.0 0.0 hit movinggrating 30 \n", + "3 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "4 240.0 0.0 0.0 hit movinggrating 30 \n", + ".. ... ... ... ... ... ... \n", + "300 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "301 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "302 240.0 0.0 0.0 None NaN NaN \n", + "303 NaN NaN NaN correct_rejection isoluminantgray NaN \n", + "304 240.0 0.0 0.0 false_alarm isoluminantgray NaN \n", + "\n", + " stim_contrast stim_freq \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 1.0 1.0 \n", + "3 NaN NaN \n", + "4 1.0 1.0 \n", + ".. ... ... \n", + "300 NaN NaN \n", + "301 NaN NaN \n", + "302 NaN NaN \n", + "303 NaN NaN \n", + "304 NaN NaN \n", + "\n", + "[305 rows x 21 columns]" + ] + }, + "execution_count": 327, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 328, + "id": "01235bb3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'animal_id': 'MM229',\n", + " 'experiment': '109hrb21d',\n", + " 'session_date': datetime.date(2022, 3, 9),\n", + " 'environment': 'unknown',\n", + " 'protocol': 'gonogo',\n", + " 'version': 'unknown',\n", + " 'duration': 30.0,\n", + " 'session_start_time': '2022-03-09T12:04:03.108928',\n", + " 'response_device': 'leverpush',\n", + " 'reward_profile': 'waterreward',\n", + " 'stimulus_duration': 4000.0,\n", + " 'iti': 5000.0,\n", + " 'corrections_enabled': 'true',\n", + " 'device': 'meso-2',\n", + " 'stimuli': {'target_id': 'movinggrating',\n", + " 'target_period': '30',\n", + " 'target_contrast': '1.0',\n", + " 'target_freq': '1.0',\n", + " 'distractor_id': 'isoluminantgray'},\n", + " 'notes': ''}" + ] + }, + "execution_count": 328, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "meta" + ] + }, + { + "cell_type": "code", + "execution_count": 329, + "id": "cc5c7ad2", + "metadata": {}, + "outputs": [], + "source": [ + "# Generate regressors for the session\n", + "# Uniformly sampled timestamps (would otherwise be external, e.g. imaging session)\n", + "\n", + "timestamps = np.arange(0, df.stop_time.max(), 0.04) # Mock imaging at 25 Hz (processed)" + ] + }, + { + "cell_type": "code", + "execution_count": 330, + "id": "886ea992", + "metadata": {}, + "outputs": [], + "source": [ + "GO_STIM = \"movinggrating\"\n", + "NOGO_STIM = \"isoluminantgray\"" + ] + }, + { + "cell_type": "code", + "execution_count": 331, + "id": "808a8d71", + "metadata": {}, + "outputs": [], + "source": [ + "regr_stim_go = []\n", + "regr_stim_nogo = []\n", + "regr_resp_cuedpush = []\n", + "regr_resp_uncuedpush = []\n", + "regr_resp_hold = []\n", + "regr_reward = []\n", + "\n", + "leverpush_rt = np.nanmedian(df[df.response.notna()].response_time.values)\n", + "\n", + "trial_idx = []\n", + "\n", + "for idx, timestamp in enumerate(timestamps):\n", + " trial = df[(df[\"start_time\"] < timestamp) & (df[\"stop_time\"] > timestamp)]\n", + " if trial.empty:\n", + " continue\n", + "\n", + " trial_idx.append(idx)\n", + "\n", + " # Stimulus regressors\n", + " regr_stim_go.append(\n", + " 1\n", + " if (\n", + " (trial.stim_id.values[0] == GO_STIM)\n", + " & (timestamp >= trial.cue_onset.values[0])\n", + " & (timestamp <= trial.cue_onset.values[0] + 150)\n", + " )\n", + " else 0\n", + " )\n", + " regr_stim_nogo.append(\n", + " 1\n", + " if (\n", + " (trial.stim_id.values[0] == NOGO_STIM)\n", + " & (timestamp >= trial.cue_onset.values[0])\n", + " & (timestamp <= trial.cue_onset.values[0] + 150)\n", + " )\n", + " else 0\n", + " )\n", + "\n", + " # Response regressors\n", + " regr_resp_cuedpush.append(\n", + " 1\n", + " if (\n", + " (trial.response.notna().values[0])\n", + " & (trial.outcome.values[0] != \"precued\")\n", + " & (timestamp >= trial.stop_time.values[0] - 0.07) # 70 ms is lever push duration from Dacre et al. 2021\n", + " & (timestamp <= trial.stop_time.values[0])\n", + " )\n", + " else 0\n", + " ) # 70 ms is lever push duration from Dacre et al. 2021\n", + " regr_resp_uncuedpush.append(\n", + " 1\n", + " if (\n", + " (trial.outcome.values[0] == \"precued\")\n", + " & (timestamp >= trial.stop_time.values[0] - 0.07) # 70 ms is lever push duration from Dacre et al. 2021\n", + " & (timestamp <= trial.stop_time.values[0])\n", + " )\n", + " else 0\n", + " )\n", + " regr_resp_hold.append(\n", + " 1\n", + " if (\n", + " (trial.response.isna().values[0])\n", + " & (timestamp >= trial.cue_onset.values[0] + leverpush_rt - 0.07)\n", + " & (timestamp <= trial.cue_onset.values[0] + leverpush_rt)\n", + " )\n", + " else 0\n", + " )\n", + "\n", + " # Reward regressors\n", + " if trial.index > 0:\n", + " previous_trial = df.iloc[df.index.get_loc(trial.index[0]) - 1] # type: ignore\n", + " regr_reward.append(\n", + " 1 if ((previous_trial.outcome == \"correct\") & (timestamp <= trial.start_time.values[0] + 1.5)) else 0\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 332, + "id": "522f0d88", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "304 incorrect\n", + "Name: outcome, dtype: object" + ] + }, + "execution_count": 332, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trial.outcome" + ] + }, + { + "cell_type": "code", + "execution_count": 333, + "id": "904d0358", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 333, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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M+Sggw6Sq6++2rbMAAAAAABUwojpDldccYWcc845cumll0YB9cUXXywnn3yyPPDAA7LHHnsMbL9jxw553eteF732zW9+U/bee2954oknZOHCha7qAAAAAABAPYLqiy66SM4880w544wzoscquL7qqqvksssuk3PPPXdge/X8s88+KzfeeKNMmzYtek59yp1m+/bt0b+ODRs2mBYTAABUCpecBVA1rEso4evf6lPn22+/XU466aTJBIaGosc33XRT7D7f/e535cQTT4y+/r148WI5/PDD5dOf/rSMjY0l5nPhhRfKggULJv4tXbrUpJgAAAAAAFQvqF67dm0UDKvguJt6vHLlyth9Hn300ehr32o/9Tvqj3/84/LFL35R/vqv/zoxn/POO0/Wr18/8W/FihUmxQQANAW33gEAONV9XOEYg5K+/m2q1WpFv6f+53/+ZxkeHpZjjz1WnnzySfn85z8vF1xwQew+6mJm6h8AAAAAAI0JqhctWhQFxqtWrep5Xj1esmRJ7D7qit/qt9Rqv45DDz00+mRbfZ18+vTp0jhhmP7YXUae0tXNb/JxaFJHh+1hlJRNv/Rv04rfJzTpi540w9L6zO++Mak5qWpY/txU+2Smk5JubJ4exkFaGVPLH1OWsOWvXN3riOuki5Jn/Ysep/WNZT5xWae0cDltFxa2/jinvZbYbVf0kSF9Yw/9lJRmYedPBciqS1jMuUFn3vemnj997RTSjj2OhAX3X5iZee+TLj4L7ztSpK3mufOJ7bqsuR4O7J1SppjzqKn29W8VAKtPmq+77rqeT6LVY/W76TgvfelL5eGHH46263jwwQejYLuRAbVTGdPQekAmfO2lIV+zrFQ1qlSWWrV7RRpOuxh53qyomKx1pVITrI5fAQxLGx8NPIfJFGSOV1f93tW4qXladEKj5pypqTRo89U18DZHilGRYqBoQTB171Otbqf1la98Rf7t3/5N7rvvPnnve98rmzdvnrga+GmnnRb9JrpDva6u/n322WdHwbS6Uri6UJm6cBkAAAAAAFPqN9WnnnqqrFmzRs4///zoK9xHH320XHPNNRMXL1u+fHl0RfAOdeXuH/zgB/KBD3xAjjzyyOg+1SrA/vCHP+y2JgAAAAAA1OFCZWeddVb0L871118/8Jz6avjNN99skxUAAAAAAM35+jcAAAAAAGgjqAYAAAAA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uc+Fv/nNb8KPfexj4bRp08K77767oJYA9Jx88snhv/7rv0Zj+a677grf9KY3hfvuu2+4adOmiW3e8573hEuXLg2vu+668Lbbbgtf/OIXhy95yUsmXh8dHQ0PP/zw8KSTTgrvvPPOaB4uWrQoPO+88ya2efTRR8PZs2eH55xzTjQn/uEf/iGaI9dcc83ENhyvUAff/e53w6uuuip88MEHwwceeCD8yEc+Eq3vag4pzBcg2a233houW7YsPPLII8Ozzz574nnmjV8E1Q4cf/zx4fve976Jx2NjY+Fee+0VXnjhhaWWC/CtP6hutVrhkiVLws9//vMTz61bty6cMWNGFBgrahFW+/3yl7+c2Ob73/9+GARB+OSTT0aPv/SlL4W77LJLuH379oltPvzhD4cHH3zwxOM/+qM/Ct/85jf3lOeEE04I//RP/9RTbQE3Vq9eHc2Bn/70pxNzRAUM3/jGNya2ue+++6JtbrrppuixOrkZGhoKV65cObHNl7/85XD+/PkT8+RDH/pQ+IIXvKAnr1NPPTUK6js4XqGu1DHhq1/9KvMFSLFx48bwwAMPDK+99trwla985URQzbzxj69/57Rjxw65/fbbo6+4dgwNDUWPb7rpplLLBhTtsccek5UrV/bMhwULFkRf/enMB/Vf9ZXv4447bmIbtb2aN7fccsvENq94xStk+vTpE9ucfPLJ0Vdmn3vuuYltuvPpbMO8Q9WtX78++u+uu+4a/VcdQ3bu3NkzntXPGvbdd9+eeaN+4rB48eKe8b5hwwa59957teYExyvU0djYmFx++eWyefPm6GvgzBcgmfp6t/r6dv/YZt74N1JAHo22du3aaMHvHoCKenz//feXVi6gDCqgVuLmQ+c19V/1O51uIyMjUYDRvc1+++03kEbntV122SX6b1o+QBW1Wq3oN24vfelL5fDDD4+eU2NWvYGk3mxKmzdx473zWto26oRo69at0RtSHK9QF3fffXcURKvfgarff37729+Www47TO666y7mCxBDvfl0xx13yC9/+cuB1zjO+EdQDQBAgZ8i3HPPPXLDDTeUXRSg0g4++OAogFbf7PjmN78pp59+uvz0pz8tu1hAJa1YsULOPvtsufbaa6OLg6F4fP07p0WLFsnw8PDA1fPU4yVLlpRWLqAMnTGfNh/Uf1evXt3zurqypLoiePc2cWl055G0DfMOVXXWWWfJ9773PfnJT34i++yzz8Tzasyqr8ytW7cudd7Yzgl19WR1JX6OV6gT9amaurLwscceG11B/6ijjpK/+7u/Y74AMdRXrtW5lboqt/r2n/qn3oT6+7//++hv9Ukx88YvgmoHi75a8K+77rqer/epx+prS8BUor6yrRbN7vmgvhKkfivdmQ/qv2pRVweAjh//+MfRvFG/ve5so27dpX7/06HefVWfXKivfne26c6nsw3zDlWjrumnAmr19VU11vt/2qCOIdOmTesZz+r6AerWJt3zRn0dtvsNKTXe1YmM+kqszpzgeIU6U2N1+/btzBcgxmtf+9pozKtvd3T+qWvXqNuXdv5m3nhWwMXQGk9dOl5d3fhrX/tadGXjd7/73dGl47uvngc06cqS6lYL6p9aQi666KLo7yeeeGLillpq/H/nO98Jf/3rX4e/+7u/G3tLrWOOOSa85ZZbwhtuuCG6UmX3LbXUVSrVLbXe8Y53RLdQUXNM3cKh/5ZaIyMj4Re+8IXoCpYXXHABt9RCJb33ve+NbjN3/fXXh08//fTEvy1btvTc6kTdZuvHP/5xdKuTE088MfrXf6uT17/+9dFtudTtS3bffffYW5188IMfjObEJZdcEnurE45XqLpzzz03ujr+Y489Fh1H1GN1h4gf/vCH0evMFyBb99W/FeaNXwTVjqj7tKmBqu7Lpi4lr+6/CzTRT37ykyiY7v93+umnT9xW6+Mf/3gUFKtF9bWvfW10n9FuzzzzTBREz507N7pVwxlnnBEF693UPa5f9rKXRWnsvffeUbDe7z//8z/Dgw46KJp36hYP6r6mQNXEzRf1T927ukO96fRnf/Zn0W2D1AnL7/3e70WBd7fHH388fOMb3xjds13dO/Qv/uIvwp07dw7Mz6OPPjqaE/vvv39PHh0cr1B1f/InfxI+73nPi8aoOqlXx5FOQK0wXwDzoJp541eg/s/3p+EAAAAAADQRv6kGAAAAAMASQTUAAAAAAJYIqgEAAAAAsERQDQAAAACAJYJqAAAAAAAsEVQDAAAAAGCJoBoAAAAAAEsE1QAAAAAAWCKoBgAAAADAEkE1AAAAAACWCKoBAAAAABA7/z+2DhjX1opUpwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot stimulus regressors\n", + "plt.figure(figsize=(12, 8))\n", + "plt.plot(regr_stim_go, label=\"Stimulus Go\")\n", + "plt.plot(regr_stim_nogo, label=\"Stimulus NoGo\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 334, + "id": "9764ab7f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot response regressors\n", + "plt.figure(figsize=(12, 8))\n", + "plt.plot(regr_resp_cuedpush, label=\"Response Cued Push\")\n", + "plt.plot(regr_resp_uncuedpush, label=\"Response Uncued Push\")\n", + "plt.plot(regr_resp_hold, label=\"Response Hold\")\n", + "plt.legend()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"Response\")\n", + "plt.title(\"Response Regressors\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 335, + "id": "a382bdc3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 335, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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AAAAiCSoBgAAgEiCagAAAIgkqAYAAIBIgmoAAACIJKhuQf4+i/nnu+/vt+3v4m0noT69tmks34ZapO3bbfVKvu27fC0cSzV2bLAMJfcPH8Kgbve+pgMn10g5il/vvrdu0ue1Bfs1U7weZerOJ2n1vs3JmC6eddabwk2Tdu/Ju/Dpcb0bYb5/e9Wl//2l515vo4ox4y/qWFTh+FKebI0x2eA9iKu8Pux7NTeXb4UTo7ppJvWPsYXbLXiieJkZYscMkkyDzRxzzlSlnerO60Havuq6M2i79TqWjOnhYrKD6rPOOivst99+YccddwxHHnlkuOyyyyrt98lPfjK77dRrXvOamGwBgAqc/DDpt1tye6/xoSdmtw3G9Y3XqQiqzzvvvHDKKaeE008/PVxxxRXhkEMOCcccc0y4/fbb++534403hj/+4z8OL3nJSwYpLwAAAExuUH3mmWeGk046KZx44onhgAMOCGeffXZYuXJlOOecc3rus2XLlvC6170uvPe97w1PfepTS/PYtGlT2LBhQ+4fAAAATHRQvXnz5nD55ZeHo48+ensCS5Zkf1966aU99/uzP/uzsMcee4Q3vOENlfI544wzwurVq+f/rV27tk4xAQAAYPyC6jvvvDP71HnNmjW559O/161bV7jPN77xjfAP//AP4WMf+1jlfE499dRw3333zf+75ZZb6hQTAAAAhmJZm4nff//94fWvf30WUO++++6V91uxYkX2DwAAAKYmqE4D46VLl4b169fnnk//3nPPPRdt//Of/zy7QNmxxx47/9zWrVu3ZbxsWbjuuuvC0572tPjSAwAAwKR8/Xv58uXhsMMOCxdffHEuSE7/PuqooxZtv//++4err746XHnllfP/Xv3qV4eXvexl2WO/lQYAAGCmvv6d3k7rhBNOCIcffng44ogjwoc//OGwcePG7GrgqeOPPz7svffe2cXG0vtYH3jggbn9d9111+y/C58HAACAqQ+qjzvuuHDHHXeE0047Lbs42aGHHhouuuii+YuX3XzzzdkVwZl+SRjNHeGTghvSJxVvVO8e9qOT9OuYCZEbZy2MpmRG5vAkGaSNBh3ybc2ZKZiK0XUrer3q8SOqPJW3azbjvqn1OHaOou0XbZN7PHjp8ukNtn9U/i219aK0KzTuION8sH177zBJS1HdNmhqLcmnM0kt1n8sTOP5R9SF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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot reward regressors\n", + "plt.figure(figsize=(12, 8))\n", + "plt.plot(regr_reward, label=\"Reward\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "241de8f3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 336, + "id": "f23a83cc", + "metadata": {}, + "outputs": [], + "source": [ + "regressors, labels = regressor.generate_gonogo_regressors(\n", + " df,\n", + " timestamps,\n", + " go_stim_id=GO_STIM,\n", + " nogo_stim_id=NOGO_STIM,\n", + " uncued_push_id=\"precued\",\n", + " correct_outcome_id=\"correct\",\n", + " lever_push_duration=0.07,\n", + " stimulus_duration=0.15,\n", + " reward_duration=1.5,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 337, + "id": "23676744", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0]], shape=(41168, 6))" + ] + }, + "execution_count": 337, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "regressors" + ] + }, + { + "cell_type": "code", + "execution_count": 338, + "id": "6c69afc5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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TtHxmXj2WyxPbNMPP/wgt8kTYnldu3aVFxAefPBBmVZxZ1g0JRfNusWwZmLINdEqQHQqJ5rGi2Hl3El7dUSALoL8W2+9Fb1798aNN94om9OLYdVE53ribr4IqHfs2CEvCogLCOJihLg4IIaxExdhxDyCyAtxZ1sMRScCeHG3XFx4EOsov2gi7n6LvB89erR87EGUk7gQ83//93+yOX35nf2aiKH1srOz5XP0og6J59hFXREXBMqfbSciIqqWy/3AExERBRkxnNb999+vtm3bVo2OjlZjYmLUjh07qvfdd58cIq2iP//8Uz3zzDPldGKIrcsvv1zdunWr0zTlQ7CJIcwclQ8xtnfvXvtnJpNJnTBhghwiLSIiQm3WrJn6zDPPqCUlJU7ziqG8xo4dq6anp8t1n3/++ep///0nh3QTaXW0e/duOVyYGLZMbFPfvn3Vn376yaX8EEOwXXrppVV+9+mnn8r0i+0o99FHH6l9+vSRaUpISFC7deumPvXUU+qRI0fcTnt5/lQ3PNrff/+tDh48WA67JrarTZs26m233aauXr1afn/8+HE5TJwov7i4ODldv3791O+++86+jLVr16o33XST2rx5czUqKkoOqXfZZZfZl+E47Nujjz6qNm7cWJZLu3bt5NBuVqvVabqKQ9OVmzVrlhzKTiw/MjJSru/ee+9VMzIyXCgFIiIKdYr4X/UhPBEREWmRuPsuekh/8cUX5V1fPdFz2omIiHyNz6QTERFpnGhaX1H5s+wVO07TGj2nnYiIKBD4TDoREZHGffvtt/j000/lc9NimLAlS5bIZ8/Fs+DimWwt03PaiYiIAoFBOhERkcaJnsFFR2iTJk1CXl6evUM20Vxc6/ScdiIiokDgM+lEREREREREGsFn0omIiIiIiIg0gkE6ERERERERkUaE3DPpVqsVR44cQUJCAhRFCXRyiIiIiIiIKMipqor8/Hw0btwYBkPN98pDLkgXAXqzZs0CnQwiIiIiIiIKMQcPHkTTpk1rnCbkgnRxB708cxITEwOdHCIiIiIiIgpyeXl58mZxeTxak5AL0subuIsAnUE6ERERERER+Ysrj1yz4zgiIiIiIiIijWCQTkRERERERKQRDNKJiIiIiIiINIJBOhEREREREZFGMEgnIiIiIiIi0ggG6UREREREREQawSCdiIiIiIiISCMYpBMRERER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yD24Fwmltn1ZtBosOGE7p5RWT5cBurAsY5ncR0WALnz131cyQBdOfvMtdpacXZaXtmPvoUPHT8UhQURXQbonnnnmGXm1ovx1sOxEi4iIiIiIiEhrAvpMurvS09NxTNzRcSD+Fs0FYmIc7sY4EL3AixcRERERERGR1unqTnr//v2xYIHt2Ylyf/zxh/yciIiIiIiISO8CGqQXFBTIodTEq3yINfH+wIED9qbqw4YNs09/3333Yc+ePXjqqaewbds2TJ06Fd999x0efbSs8xUiIiIiIiIiHQtokL569Wr06tVLvoTHHntMvh83bpz8OyMjwx6wC2L4tfnz58u752J8dTEU28cffxzcw68RERERERFRyAjoM+nnnnsuahoB7tNPP61ynnXrynouJiIiIiIiIgoiunomnYiIiIiIiCiYMUgnIiIiIiIi0ggG6UREREREREQawSCdiIiIiIiISCMYpBMRERERERFpBIN0IiIiIiIiIo1gkE5ERERERESkEQzSiYiIiIiIiDSCQToRERERERGRRjBIJyIiIiIiItIIBunBToW+EqlU+baOm+HdTFAdE1aJ4oN1BKIQVb+sXalh6TV957d88WvWqzpZvlrn+RSvr73qTxXv75oBLAPX5619U71fAnVZqqrl3ynF462q02prmlv1IMOcf0+9sDP4aX9SA7HqWvO36nMWrfGsnF2oW17ZZtWtdSiOk7tc/VUPzivc4b3Cd+181ztpd8xL1/ND9Um+aPnQrwUM0okCyPEA6d0fj9DCvKOqTw9YL7xNwzEJEfns/ER/9JhmIkcM0omIiIiIiIg0gkE6ERERERERkUYwSCciIiIiIiLSCAbpRERERERERBrBIJ2IiIiIiIhIIxikExEREREREWkEg3QiIiIiIiIijWCQTi5R1QrjDVf8u6bPrac+U30xbrHjOr20+Oo2z38LCBC9pttVjpvnap32tWDP82DPG1WneeDKMVwP+V/GpylVra6vUQt55vCbGygepcCFvFPrnOd1yBuPytZPZVFb2nxQL11epCvHlGA/59J6+jxIt6ubpIZannkRg/RQpCjVf+XaAryYGNIPlrsWctr5QpfixTLzvHwVf52Iksb3ycCmp/p6qJV8Unz2201VYH65SK/5pNd0E7mGQToRERERERGRRjBIJyIiIiIiItIIBulEREREREREGsEgnYiI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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot regressors\n", + "plt.figure(figsize=(12, 8))\n", + "for i, label in enumerate(labels):\n", + " plt.plot(regressors[:, i], label=labels[i])\n", + "plt.legend()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"Regressor Value\")\n", + "plt.title(\"Gonogo Regressors\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6f0789bf", + "metadata": {}, + "source": [ + "------" + ] + }, + { + "cell_type": "markdown", + "id": "f9fb1d0d", + "metadata": {}, + "source": [ + "## From library" + ] + }, + { + "cell_type": "code", + "execution_count": 379, + "id": "9d79adca", + "metadata": {}, + "outputs": [], + "source": [ + "path = \"../scratch/sub-MM229_exp-109hrb21d_ses-20220329_behaviour-gonogo_regressors.npz\"\n", + "testfile = np.load(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 380, + "id": "10444c5e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ItemsView(NpzFile '../scratch/sub-MM229_exp-109hrb21d_ses-20220329_behaviour-gonogo_regressors.npz' with keys: regressors, labels, timestamps, trial_idx)" + ] + }, + "execution_count": 380, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "testfile.items()" + ] + }, + { + "cell_type": "code", + "execution_count": 381, + "id": "dea26eb9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['stim_go', 'stim_nogo', 'resp_cuedpush', 'resp_uncuedpush',\n", + " 'resp_hold', 'reward'], dtype='" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot regressors\n", + "plt.figure(figsize=(12, 8))\n", + "for i, label in enumerate(testfile.get(\"labels\")):\n", + " plt.plot(testfile.get(\"regressors\")[:, i], label=label)\n", + "plt.legend()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"Regressor Value\")\n", + "plt.title(\"Gonogo Regressors\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d979b843", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 384, + "id": "bb731aec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 384, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(testfile.get(\"regressors\")[:, 0], label=testfile.get(\"labels\")[0])\n", + "plt.plot(testfile.get(\"regressors\")[:, 1], label=testfile.get(\"labels\")[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 385, + "id": "54e2b2a7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 385, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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XYtYFwZxLgziXBjEOTmxjsUJrAAAwF2JHhkBAAD2UYwAAACrKEYAAIBVFCMAAMCqRBcjCxculEGDBklZWZmMHz9e1q5da/uQYqOmpkb+/u//3l8Vt3///nL55ZfLpk2bMu7z4YcfyvXXXy/HH3+89OrVS7785S9LQ0NDxn22bt0ql156qfTs2dP/d2666SY5fPhwgZ9NfNx9993+KsTf/OY307cR586zfft2+ed//mc/lj169JAzzzxTnn/++fTPzfn+c+bMkRNPPNH/+cSJE+X111/P+Dfee+89ueKKK/yFo/r27StXXnml7Nu3z8Kz0am5uVluv/12GTx4sB/D0047TebNm5exdwlxjuapp56Syy67zF/t1HxOrFixIuPnnRXXl156Sc477zz//51m1dZ77rkn4hFnHlwiLVu2zCspKfGWLFnivfLKK96MGTO8vn37eg0NDbYPLRaqq6u9n/3sZ97LL7/sbdiwwbvkkku8k08+2du3b1/6Ptdcc41XWVnp1dbWes8//7z36U9/2pswYUL654cPH/ZGjBjhTZw40XvhhRe8lStXev369fNmz55t6VnptnbtWm/QoEHeWWed5d1www3p24lz53jvvfe8U045xfv617/uPfvss97mzZu9xx9/3HvjjTfS97n77ru9Pn36eCtWrPBefPFF7/Of/7w3ePBg74MPPkjf56KLLvJGjhzpPfPMM96f//xn7/TTT/cmT55s6Vnpc+edd3rHH3+897vf/c7bsmWL98tf/tLr1auX96Mf/Sh9H+IcjXlv33bbbd6vf/1rU9l5jz76aMbPOyOue/bs8crLy70rrrjC//z/r//6L69Hjx7ef/7nf3r5SGwxMm7cOO/6669PX29ubvYGDBjg1dTUWD2uuNqxY4f/4v/Tn/7kX9+9e7d3zDHH+B80Ka+++qp/n7q6uvQbp1u3bl59fX36Pvfff7/Xu3dvr6mpycKz0Gvv3r3eGWec4T3xxBPeZz/72XQxQpw7z8033+yde+65gT9vaWnxKioqvB/84Afp20z8S0tL/Q9k469//asf++eeey59n9///vdeUVGRt3379i5+BvFw6aWXet/4xjcybvvSl77k/8/NIM6do20x0llxve+++7xjjz0247PDvHeGDBmS1/Emcprm4MGDsm7dOn+IqvX+N+Z6XV2d1WOLqz179vhfjzvuOP+rie+hQ4cyYjx06FA5+eST0zE2X80weHl5efo+1dXV/oZNr7zySsGfg2ZmGsZMs7SOp0GcO89vfvMbGTt2rHz1q1/1p7JGjx4tixcvTv98y5YtUl9fnxFrs+eGmeJtHWsztG3+nRRzf/P58uyzzxb4Gek0YcIEqa2tlddee82//uKLL8qaNWvk4osv9q8T567RWXE19/nMZz4jJSUlGZ8nZpr+/fffj3x8sdgor7Pt2rXLn7ds/eFsmOsbN260dlxxZXZVNucwnHPOOTJixAj/NvOiNy9W88JuG2Pzs9R9suUg9TMcsWzZMlm/fr0899xz7X5GnDvP5s2b5f7775dZs2bJrbfe6sf7X/7lX/z4Tps2LR2rbLFsHWtTyLRWXFzsF+nE+ohbbrnFL4RN0dy9e3f/s/jOO+/0z1MwiHPX6Ky4mq/mfJ+2/0bqZ8cee2yk40tkMYLO/6v95Zdf9v+6Qecy23nfcMMN8sQTT/gni6Fri2rzF+Fdd93lXzcjI+Z1vWjRIr8YQed45JFH5OGHH5alS5fKpz71KdmwYYP/x4w56ZI4J1cip2n69evnV+RtOw7M9YqKCmvHFUczZ86U3/3ud/Lkk0/KSSedlL7dxNFMh+3evTswxuZrthykfoYj0zA7duyQs88+2/8LxVz+9Kc/yY9//GP/e/MXCXHuHKbDYPjw4Rm3DRs2zO9Eah2rjj43zFeTr9ZM15LpUCDWR5hOLjM68rWvfc2fPpwyZYrceOONfoeeQZy7RmfFtas+TxJZjJhh1zFjxvjzlq3/KjLXq6qqrB5bXJjzo0wh8uijj8of//jHdsN2Jr7HHHNMRozNnKL5YE/F2Hz9y1/+kvHiNyMApqWs7f8UkuqCCy7wY2T+ekxdzF/vZkg79T1x7hxmmrFte7o5r+GUU07xvzevcfNh2zrWZrrBzKW3jrUpDE0RmWLeH+bzxczNQ+TAgQP+OQitmT8OTYwM4tw1Oiuu5j6mhdicq9b682TIkCGRp2h8XoJbe81ZxA899JB/BvHVV1/tt/a27jhAsGuvvdZvEVu9erX3zjvvpC8HDhzIaDk17b5//OMf/ZbTqqoq/9K25fTCCy/024NXrVrlnXDCCbScHkXrbhqDOHde63RxcbHfevr66697Dz/8sNezZ0/vF7/4RUZrpPmc+O///m/vpZde8r7whS9kbY0cPXq03x68Zs0avwsq6S2nrU2bNs0bOHBgurXXtKGaVvPvfOc76fsQ5+hdd6Z931zM/97nz5/vf//WW291WlxNB45p7Z0yZYrf2mv+X2reJ7T25uEnP/mJ/yFu1hsxrb6mrxq5MS/0bBez9kiKeYFfd911fhuYebF+8Ytf9AuW1t58803v4osv9vvUzQfSt771Le/QoUMWnlF8ixHi3Hl++9vf+oWb+UNl6NCh3gMPPJDxc9Meefvtt/sfxuY+F1xwgbdp06aM+7z77rv+h7dZO8O0T0+fPt3/nwSOaGxs9F+/5rO3rKzMO/XUU/21MVq3ihLnaJ588smsn8umAOzMuJo1SkwbvPk3TGFpipx8FZn/RB9XAQAAyE8izxkBAAB6UIwAAACrKEYAAIBVFCMAAMAqihEAAGAVxQgAALCKYgQAAFhFMQIAAKyiGAEAAFZRjAAAAKsoRgAAgFUUIwAAQGz6/+A8Fqo+O5a5AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(testfile.get(\"regressors\")[1000:2000, 0], label=testfile.get(\"labels\")[0])\n", + "plt.plot(testfile.get(\"regressors\")[1000:2000, 1], label=testfile.get(\"labels\")[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 386, + "id": "9e5c8754", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 386, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(testfile.get(\"regressors\")[100:600, 1], label=testfile.get(\"labels\")[1]) # nogo stim\n", + "plt.plot(testfile.get(\"regressors\")[100:600, 4], label=testfile.get(\"labels\")[4]) # hold\n", + "plt.plot(testfile.get(\"regressors\")[100:600, 5], label=testfile.get(\"labels\")[5]) # reward\n" + ] + }, + { + "cell_type": "code", + "execution_count": 387, + "id": "c7132a2c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAK9CAYAAABYVS0qAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAC0yklEQVR4nO3dB5wbxdn48UfuNi4YjG0MBtM7xkAgBgIECCVAAryU8OcF00NL6B1M76GFGjrkhdAhoZkQem+mBjDNBIIxxoA7rqf/5xlbOkknrXZ12p2Z3d83n4s5nU67NzM70jMz+0wun8/nBQAAAAAAWNfB9gkAAAAAAID5CNIBAAAAAHAEQToAAAAAAI4gSAcAAAAAwBEE6QAAAAAAOIIgHQAAAAAARxCkAwAAAADgCIJ0AAAAAAAcQZAOAAAAAIAjCNIBAAAAAHAEQToAILPGjh0rhx12mKy44orSo0cP87XqqqvKoYceKu+++65kzZAhQySXyxW/FlpoIVlvvfXktttus31qAABkRi6fz+dtnwQAAEl7+OGHZbfddpNOnTrJHnvsIUOHDpUOHTrIRx99JPfff7/85z//MUH80ksvLVkK0vv27StHH320+f6bb76RG264QT7++GO57rrr5IADDrB9igAApB5BOgAgcz777DMTlC+11FLy5JNPyuKLL17287lz58rVV18tO+64owwePFiyFKSvvvrqZgCj4LvvvpNll13WlMMHH3yQ6PlMnz7dzOb7oqWlRWbPni3dunWzfSoAAI+x3B0AkDkXXnihCQBvvvnmNgG60tn1P/7xj20C9Keeekp+8YtfmMBx4YUXlt/+9rfy4Ycflj3n9NNPN0vFP/30U9l7773N8/r06SP77LOPzJgxo81gwFlnnSXLLbecdO3a1QTJJ510ksyaNatN8KevO2jQILMk/5e//KUJmPX5eoxSn3/+ueyyyy6yyCKLmOf+/Oc/l0ceeaThslpsscVk5ZVXNgMbled02WWXyWqrrWaC0gEDBsjvf/97+fHHHxs691tuucWU27PPPiuHHHKI9O/fX5Zccsnizx977LFi2ffq1Uu23XZb+fe//112rPHjx5ty1t/T8tS61Tr64osvis954403ZKuttpJ+/fpJ9+7dZZlllpF999237HW0behqAq1/fZ2VVlpJ/vSnP0nlvIaer94ucfvtt5ty0OeOGjXK/OzOO++UddZZx5xr7969ZY011pDLL7+84XoAAGRHJ9snAABA0nSmePnll5f1118/9O/861//km222cbMKmvQ+dNPP8kVV1whG264oYwePdoEnaV23XVXEwCed9555ue6bFwDzwsuuKD4nP33319uvfVW2XnnnU1Q+Oqrr5rna+D/wAMPFJ934oknmoGF7bff3gSY77zzjvl35syZZcf89ttvZYMNNjCDATrIsOiii5rX/81vfiP33nuvWRkQlQ4k/Pe//zXL4EtpQK6BtQbFeiy9NeDKK6+Ut956S1588UXp3LlzpHMv0ABdBwZGjhxpgmX117/+VUaMGGF+T8tP/75rrrlGNtpoI3O8Qtn/z//8jwnc//CHP5jHJkyYIE888YR8+eWXxe+33HJL8/onnHCCGUDRAF5vbyjQQFzL6+mnn5b99ttP1lprLXn88cfl2GOPla+//louvfTSNgM3d999twnWNfDX4+gxd999d9l8882L9a11quVy+OGHR64DAEDG6HJ3AACyYvLkyTodmt9hhx3a/OzHH3/Mf/fdd8WvGTNmFH+21lpr5fv375///vvvi4+98847+Q4dOuT32muv4mOnnXaaef1999237LV33HHH/KKLLlr8/u233zbP23///cued8wxx5jHn3rqKfP9+PHj8506dWpzvqeffrp53ogRI4qPHXHEEeax559/vvjY1KlT88sss0x+yJAh+Xnz5gWWzdJLL53fcssti3//e++9l99zzz3Nax566KHF5+nr62O333572e+PGjWq7PEo537zzTebxzbaaKP83Llzy85/4YUXzh9wwAFlr6Gv3adPn+LjWnf6+xdddFHNv++BBx4wz3n99ddrPufBBx80zzn77LPLHt95553zuVwu/+mnnxYf0+dp/f/73/8ue+7hhx+e7927d9nfAQBAWCx3BwBkypQpU8y/PXv2bPOzTTfd1MyyFr6uuuqqYgK1t99+2yzP1mXkBWuuuab86le/kkcffbTNax100EFl3+tS7e+//754/MLvHHXUUWXPKyRtKyxR13vmdTZbZ5hL6WxxJX1NzcauM8wF+nceeOCBZsY4zD3l//znP4t/vy7R1llsnS2/6KKLis+55557zBJ+/dsnTpxY/NLl3Xo8nYWOeu4FmpyuY8eOxe91VnrSpElmZrr0WPocXQlROJYuXe/S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MMiitysMGTKkbLn7M888I7/85S9l1KhRcsIJJ8hHH30kw4cPlzvvvFPefPNNkyzw66+/lu22205uuOEG8/r1bLrpprLmmmtKt27dzO906dJFDjroIDn99NOLz/nyyy/lD3/4gzz55JMmt8HWW28tV1xxhQzo2XHBM3Jy9tlny5///Gf56aefZLfddjOz/3qeb77yknlGS0uLXHrFRfJ/d94iE7+fKKussoqcf/755rXg0PYoxY01eUsJVCyfMNndm1OW8SSOa/5L1j0Obcv/tu3l4s+Mam43lF6J3eXhVkUwSBCubKK2i5wL5Vo8ZwfOJeVCBemnnXaaZJYG6OcOsnPsk8aJdFmo7tN06fruu+8uF154oey4444ydepUef7552WvvfYygfCUKVPk5ptvNs9dZJFFZNy4cVVfRwPoK6+80gThu+66q/nq2rWr3HHHHTJt2jTz2hpEH3/88aFOXwcINMB/9dVX5eWXXzZL7zfccEP51a9+ZYLr3/72t9KzZ0959tlnzfZ9hx56qAnEn3nkXvP7t9/zdznnnHPk6quvNr+ngwaaoFAHGAquu+kaueaGK+Xyi6+QDTZeX2666Sb5zW9+I//+979lhRVWCFnQAAAA6WBrQJ590oHm4Z70FNAgXYPcnXbaSZZeemnz2BprrGH+7d69u8yaNSvU8nadtdZgWO23335y4oknymeffSbLLruseWznnXc2M/Fhg3SdSS8M8GjArAMAOmuuQbr++95778nYsWPNPfLqtttuk9VWW01ef/Mt+dny/eSKG24z57HPPvuYn48cOVL++c9/mgGDgmuuv0IOO+hw2XmnXaTXot3lggsuMOd42WWXyVVXXRWxJDM+iZXC5EbeCpM4ziuMuGOBkH0BCyOCFRK2WUsc52U/ZE/SpcVMth8iX0eVT7dQzVz7Dgfp8+bNk0svvVTuvvtuM0s7e/bssp//8MMPkiq65FxntG0dO4ShQ4fK5ptvbgLzrbbaSrbccksTUPft2zfS4TSoLhgwYICZUS8E6IXHXnvttYZeTy2++OIyYcIE898ffvihCc4LAbpaddVVZeGFF5YPx3xsgvQxn34uh/zxyLLXWG+99eSpp54y/z116hQZ/+03st46Py97jg40vPPOO6HPE8nhg0M9Ecqn0ezuSUQ/VvZJp225jX3S04g+PVhmy4f+OJaicalU2dkhfh2i/oLe93zJJZeYZcmTJ082y5l1BlfvKS693zg1dJRal5zb+Ao5Qq6J4J544gl57LHHTKCrS9JXWmklM0sdRefOnUv+7FzZ94XHdJl6I6/XyO9HQVdRB50pbKL9ISqaTDCuKVTR+qnRcv4ZJDObTXGnWuQg/fbbb5frr79ejj76aOnUqZO5F1oTg+lS5FdeeSWes0RdGgDrDLIOomhCOE3U9sADD5h/dfWDazTB21dffWW+Cj744AOzXdyqK69kvl9p+WXl9ddfL/u90u979eotAwcsLq+9Wd7uXnzxRTNYAQffQPlcaT1xXBL7pCdW0cyk+4PEcenq00kGGko+o4njXDsdl5QWjZ+J47j2nV3uPn78+OL9zpr0S2fTlWb+PvXUU5t/hqhLE7PpPd66zL1///7m+++++84EwjNnzpTHH39cxowZI4suuqj06dNHXLDFFluYdrTHHnuY+8f1nvpDDjlENtlkE1l37bVEJn8lfzhgLzngyJNl3XXXlQ022EDuuusueffdd8uW4B9y4B/losvOkxVWXEE2+MV6JkHe22+/bQaTAAAAssb22A0SQoGnWuQgfckllzSJypZaailZbrnlTCKvtdde28xwaiZwJK93797y3HPPmWBXM7lr8jjNgr7NNtuYAFe3WNN/NeFaYQs2F2b+//73v5st2DbeeOOyLdgK9tjlt/L5hGlyzDHHmMEGzTavGeJL74s/YJ+DzL3pp4w8Qb6b+J2ZQf/HP/5BZvcas6fWt2BDJhPHce8aovcFtJlghT7dDpKBRhVvebUusJr/H1w92WAj5wGXvsNBum7DpbO266+/vgmw/vd//1duvPFGk0TuyCPLk3whGTpjrnuHV7PYYouZgZSgD826p3nlh2gNhvWrlOYcCJt3QAcGKj344INl3+tAjwbqbUz/rvifujqjdIWGZoZffvnli99rcH/MESfIKaecKr0X7R7q3GAPwZoDieMql7vHsk968svdM5ugyRskjksjuvRgSRWPa9VAfxzX5yB3ytWdM0mv0EG6bp+lAfn5559ffEyTx2mgpXtg68zl9ttvH9d5IoNmzPhJrr3lEpOxXpPj/e1vf5N//etfJkkeIuKTFGyi/SEimkwwygfVtC9jSTPPALEqVDD9QKqFThx38skny6BBg8w9xIUtsNTw4cNNhncC9OzQVROaj6DWl/68WcvpHn30UbMcfp111pGHHnpI7rvvPnM/Oxpka0/ddiY7y4wkEsdVfLqPZXWDlS3YkjkkGkRUmdK1p9RruP3s4z2OEwnFSnG9x5I4zg0kjnNuJl0Txt1zzz0mMZcuOdYZ9H333dcsiS7d6xrpp4M1mpwt6OfN0L17NzNzDgAAgHDIVZARFHeqhQ7Su3fvLnvttZf5+vzzz+WWW24x96Lrll86s7nffvvJDjvs0GZvbKSPbr1Xel+4HfRMkSS2DUwt1FeWE8e5NskDi/gQ3xzFGVqSgfog6dLinnA/RE7mW7E9upV65tp3d590pVtgnXnmmTJ27Fh57LHHzNZeOqO+xBJLNP8MAaQHnxusJ45re0SPl7uXnjtL71KAD3++IRlosKyWDs0iA2WTmj8kZUF6gY7g6qyq/qsd9Zw5c5p3ZkAU9BWBGFWHVbyZIyKaTDD6dFSVL9uJLXmMswF2g/SvvvrKzKTrjLrenz5u3Di5/vrrzf7pQPPQ2zefrcRxVg7rsTCJ4wAf0X6by3YyUIRBeaEaH5sFbdnBe9Jnz54t999/v9x0000mu/viiy8uI0aMMMnjNFgHgHpYGtlMzdkn3ed6LjsObcttIeqHfdI9xGUXKLluKd++e52bpPW4NIya8s38ZXt9JjXsUJA+cOBAmTFjhmy33XZmKyzdu7pDh3atlgeQFAIY2ET7Q1S0mWAUD6qwmlAMyaF6MyF0lH3KKaeYZe733nuvbLPNNgTocLLzGTJkiFx22WWSlGeeecYs/Zk0aZL4wN4yJUbXIwUlYeop7/I+6c1/ybrHIahLwRYTzKRHZX/lKdddmNKxXk0JY9VcbaUDKF63C+rYnZn0o446Kt4zAQAAAOAn+6NGmcL94enGdHhKaQ4BoM2Ap7UtdXkjyXbiOEbcUeBj+3V4ptJSf0CfHk3sxUV1eCnqdZRz4LYGrv3kEKSHeCOcMWeGla8oy4U23XRTOeyww+SII46Qfv36mZwB77//vrk1oWfPnjJgwADZc889ZeLEicXf0VsX1lhjDenevbvZ636LLbaQ6dOnm5/pvvc77LCDnHHGGbLYYotJ79695aCDDgod/Le0tMiFF14oyy+/vHTt2lWWWmopOeecc2ouEX/77bfNY1988UXxsRdeeV1+8YtfmPMbPHiw/PGPfyyen/pu4nfyv/vtJkuvNEDWWGcVuf3229uch77mNddcY8pBX0eTHOrfXRDmXP7zn//I9ttvL3379pWFFlpIVlttNXn00UfLjvPmm2/KuuuuKz169JANNthAxowZE6qcsobVUQGSSrZW8aYez5t8QhVN4riUJY6Db1jWXEdi5eNYPdAuYikal3INcO07tNw9q36a+5Osf8f6Vo796v97VXp07hH6+bfeeqscfPDB8uKLL5qgc7PNNpP9999fLr30Uvnpp5/k+OOPl1133dVk59ft8nbffXcTSO+4444ydepUef7558suuieffFK6detmAlkNWPfZZx8TzBeC7SAnnnii2ZZPj73RRhuZ43300Ueh/5bPvvhKtt51Hzn77HPMjgLfffedGYTQr5tvvtk85/BjDpbx346X+/72sCzUu5ucNPI4mTBhQpvXOvXUU+X888+Xyy+/XP7617/K7373O3nvvfdklVVWCXUuhx56qBmceO6550yQ/sEHH5iBj1Inn3yyXHzxxWZAQwczdNcDrQd30JnCHt7MERVNph4KCAGsrZqzc9ysKWTRdyloh+Ugfc6cObLyyivLww8/HDrAQXJWWGEFE3Srs88+W4YNGybnnntu8eca7OqM9McffyzTpk2TuXPnyk477SRLL720+bnOqpfq0qWL+R2dHdbZ4zPPPFOOPfZYOeusswITB2rArwHxlVdeabbpU8stt5wJ1sPJy3lX3ix77PxbszKg8Lf9+c9/lk022cTMjI/95BN58pknZNTfn5JhQ9eRbgt1lhtvvLFqu9xll13MYIXSc3/iiSfkiiuukKuvvjrU2Xz55ZfyP//zP8XyqbbloA5c6LmpE044QbbddluZOXOmGeRwia1tWVrXZvGGUlvYxHG55iaOi+NNPql6LjkOH1ZcR+K4VEZj9OmBineaZaxp0yrClY2XzSJrjdmXIL1z584m8MiS7p26mxltW8eOYp111in+9zvvvCNPP/10mxlf9dlnn8mWW24pm2++uQk8dWm8fr/zzjubJd0FQ4cONQF6wfDhw01wr1n+C4F9NR9++KHMmjXLvH6j3vngY3n3w0/l9nt7lgUXuox+7NixZla+U6dOMnSNYcWf6wDSwgsv3Oa19Lwrv9cl7WHpMntdofDPf/7T3BKgAfuaa65Z9pzS7xdffHHzr87q6zJ/AACA5NjeyQWpnniBm/ek69LfCy64wMzCZoHem6xLzm18RU3OoEux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+yf/2OvTFySPsnR038Sf4M+tmmBgtrZC0TTUIpzoIgtZI22fR/pFDtI1KN9///3N18cffyy//vWvzeP//ve/ZciQIZI22tG0zJhh5StKJ6erGA477DCzZFpvPdBt8t5//33ZZpttzMDKgAEDZM8995SJEycWf+fee++VNdZYw9y+sOiii8oWW2wh06dPNz/be++9ZYcddpAzzjhDFltsMendu7ccdNBBoYN/bQuXXXZZ2WNrrbWWnH766WUfLm644QbZcccdTTLCFVZYQf7xj3+U/Y62q+22284cv1evXvKLX/xCPvvsM/OzHXfbVk4544Sy5+s567kXzJo1S4455hhZYoklZKGFFpL1119fnnnmmTbL25daailzDnouhUGoAj1nPfe//OUvMnjwYPO8XXfdVSZPnhy4XL3yXK6++mrzN+qAltaHrkIp1dLSYnI8LLLIIjJw4MCysgIAAAiHXAVZYH/iBU4td7/qqqvklFNOMcve77vvPhPcqTfffNNsxZY2+Z9+kjFrr2Pl2CuNflNyPXpESup38MEHy4svviiTJk2SzTbbzAymXHrppWaVw/HHH2+Cy6eeekq++eYbU1+aT0AD06lTp8rzzz9fNjDw5JNPmoBSg9ovvvhC9tlnH1Pf55xzTtP+Rh0E0HO46KKL5IorrjBb+f3n36/LIp1Evh43Xjbe+NcmANZz1kBd/7a5c+eGfn0duPjggw/kzjvvlEGDBskDDzwgW2+9tbz33nsmYH711Vdlv/32k/POO88E1aNGjZLTTjutzet8+umncvfdd8tDDz0kU6ZMMb9zyCGHmK0Iw3jjjTfkj3/8o/z1r381SRZ/+OEHU96V9XfUUUeZc9J8Dxrg620khdUq7cGoNqyi+SEq2kwgunRUtaBdsAw6xcpSsVDPaRY5SNeEWposrlqwBbs06NSAV5199tkybNgwk+iv4KabbjIzwboCYtq0aSbY3WmnnWTppZc2P9dZ9VJdunQxv6Mzx6uttpqceeaZcuyxx8pZZ50lHTpEXoRRlQaihcEdPdc///nP8tobb8nWP19ZrrrxNunTp48JsDt37myes+KKK5p/586cWfe1v/zyS7n55pvNvxqgK51V10BcH9fjXX755SZo1xnswuu/9NJL5jmlZs6cKbfddpuZkVc6oLDtttvKxRdfbGa9w5yLzuTrqgBdEaBlrvVT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cNcUfboXki4tZjmzkUzQynurh59BMhOk/+53vzN7b48fP94ss2ppaTH7cR9zzDFmj2gAgLuJ49q+SjoSx/GRNA2J4/jw5x+uvCCZLZ3M/uEZwkCqe0H6ueeeKyuvvLIMHjxYpk2bJquuuqpsvPHGssEGG5iM74AV9BV1UECwiOaHiGgydfABGVXYHuZikjVZpPFIt05Rl1XoDPqf//xnGTlypLk/XQP1YcOGyQorrBDfWQLwfJ90O4f1Fp90kFa07aayttideoyE8kKlhpqEC82ItuxukK5ZvXU/dA3KdTYdqGbTTTeVtdZaSy677LKGX+P08y+VB0c9Hbjd2x+PPlgmT5ksd/7f3Q0fB8nh3uQgEcum0ezu7JMOoEm47OpIqiusPJC1OIqdXOppX9HknRn8oYodW+7eoUMHE5x///338Z0RgKbjDRNW0f4QFU0mEMWDoIZB+0gv53bbgzv3pJ9//vly7LHHyvvvvx/PGaEpZs+eLWlGH9Uga3vqtm9v70woK5sw2d2bs0+6z4NCZX8LbcttxfoJ6oNYRhmZrZm04mG57oIUW33mmjbtot77lqfbpJectwMnk3KRg3TN4P7aa6/J0KFDpXv37rLIIouUfaWNfticM2uela8oH3R1eflhhx0mRxxxhPTr10+22morM5CyzTbbSM+ePWXAgAGy5557lu1lf++998oaa6xh6nHRRReVLbbYQqZPn25+tvfee8sOO+wgZ5xxhiy22GLSu3dvOeiggyIF/5r5/7jjjjPtYuDAgXL66aeX/fzLL7+U3/72t+b89PV33XVX+fbbb2u+3rx58+Soo44y2wAOXGKQnHneqcwQh0UxwSauU0REi6mDawoByFWQDXwGTrdI96Sr9txj7KO5s1vkusOftXLsAy/fRDp37Rj6+bfeeqscfPDBZku8SZMmyWabbSb777+/XHrppfLTTz+ZrfM0EH7qqafMXve77767XHjhhbLjjjvK1KlT5fnnny+74J988knp1q2bPPPMM/LFF1/IPvvsY4L5c845J/T5aFD96quvyssvv2wC/w033FB+9atfmQC+EKA/++yzMnfuXDn00ENlt912k2ceurPq61188cVyyy23yE033STLL7ucXHD+xfLoPx+WjYZvHLqMss7e+ydv3M2rKMoSHuNDfEqCIurRpdKiNjJy7bpQ0fTh7gbpI0aMiOdM0G6aL0CDbnX22WebrPu6ZV6BBrea7O/jjz82Wfk1MN5pp51k6aWXNj/XWfVSXbp0Mb/To0cPWW211eTMM880tzqcddZZJj9BPWuuuaacdtppxXO78sorTeCvQbr+q7sDjB07tpiA8LbbbjPHef3Nt+RnKw6sOkB04oknmnOeM3OWXHTOZfLMc0+1s9QATzUrcZzX+6RbOCYaFGafdPiGmTwHb/1x4DYImkUyieOsBsxUsntB+pQpU2qOCHXt2tUEdmnSqUsHM6Nt69hRrLPOOsX/fuedd+Tpp582M9WVPvvsM9lyyy1l8803N4G5Lo3X73feeWfp27dv8Xl6S4MG6AXDhw83wf1XX31VDOzrBemlFl98cZkwYYL57w8//NAE56U7BKy66qpmKfuHYz5pE6RPnjzZzP6vv/76xcc6deokQ9cYZt4E6SqCUUKwijdzREWbCURwjGqKGUtoH6lVGpbz2S7dIgfpGkQFLdFYcsklzbJmnUENM9vqOv1boyw5t2mhhRYq/rcG09tvv71ccMEFbZ6nwXLHjh3liSeekJdeekn++c9/yhVXXCEnn3yyWZq+zDLLNOV8Onfu3KYsdZk7bLKVOG7+v3xwaGbiuAYPI0lswdb8l6x+HBLHeYPEcTEhGajLkksc51g90C5qCtMT1v9tewrXPlUcv8hRtN4TPGjQIDnppJPkwQcfNF/630sssYRcc801cuCBB8qf//xnkwUe9qy99tpmP/shQ4aYve1LvwrBvF5oeo+4Jod76623zCqIBx54oGw2Xu9lL3jllVfMzHzp7HejVlllFTMjr18FH3zwgbmXftWVV2zz/D59+pjBBR1EKNDl+u++X3sPdZSgN4VVtD8ASG4LNjt9bo6BtgRQxlkReSZdk4FpAi9NQFagM7a6bPovf/mLudd4qaWWMsnFNHiHHZqE7frrrzfJ4QoZ1j/99FO588475YYbbpA33njD1JUuc+/fv78Jfr/77jsTPBdoJvf99ttPTjnlFJM4TldHaAb5ZqyQ0Ezy2mb22GMPc6+5BtyHHHKIbLLJJrLu2kNFpo5v8zuHH364GfzR+9uXW2ZZufCCS2TylMntPpcssZZkiEQj0ZA4DmlFX9BU5I3zRbwFRnV4qKFKo6azJHK0pcujNSFZJX1MM3irjTbayGyvBXt0tYNmeddtyzQQ14BYt2fT2xU0yNYtz5577jn59a9/LSuuuKIJxHXwRbdsK9B71jUg3njjjU3W9d/85jdttlFrT7D497//3dwDr6+vQfuyyy4rd911V81Jt6OPPtpsI6fJCzfedBPpuVAv+fWW2zXlfJAQZvQD5JNJHFe53D2WGZekEsex3D1dieP4AIp0sZFD0wXcK11b+24xc6lcXTqXdIo8k65LnW+88cY2y9n1scIy6O+//74sARnip9ukVdIA+/7776/6fJ0xHzVqVN3X1aXw+tWM89FbI0rpigsN1NuY8o355/QTjpLTz7+0LFGczrrr15yZs+XHb2dGPq+sIn6BTeQiQFQ0mWBcUwhcbm5vo3RLB86Q0rFpAuVUixyk/+lPf5JddtlFHnvsMfnZz35mHtOl0x999JHce++95vvXX3/dzLwCcIy1XVl4427aBx0+BMFrtN+mstQf0Ke7VU3Uhn98rTNrt01mUOQgXZc8a0Cu95/rfttKl0jrLKkmKVMHH3xw888UztBbGXS7tFo0AZzOkgOVGPUNEHlmrMGyrPg1v/dJbz0OLctxYdoElegdZvTdeM9zZ590sv7X076ScaSeufbdDNKVbtFF9vZ00yz+Qfe7v/3224E/h2voTGERb+aIiiYTjGsKAQig0ot90rOjoSD9+eefNzPpn3/+udxzzz1m+7W//vWvJnjXpHFIN703XLdyg3+sLVEsHJb3kwBhC6d9MxVt3tRjyRtH4jhUWlA/7FzQZMyYuqxQPLHXkmOXDs0iRJvwddk417672d3vu+8+2WqrraR79+4yevRomTVrlnl88uTJcu6558ZxjgDaiVF1WEXzQ0TMEAWjdBDE3j7pSFKOjiDVIgfpZ599tlx77bVmD+7OnTsXH99www1N0A40Db19epIM+TpibEWdsqIs4TXabzPZu/WYenSpvKgN//h6CXl62tkI0seMGWP2ta7Up08fmTRpUrPOC5nG0GBaMaNvP3FcEvukJ1bPLHf3R4j6oQb9Q50FS64rzLsxiFI8Li2jtnw6EsdZO3J2RA7SBw4cKJ9++mmbx1944QVZdtllm3VeQDT0FsEoH9hEAI2oaDLBuKYQtPyZ5pFe7JOeGZGD9AMOOEAOP/xwefXVV81I3bhx4+T222+XY445hq3X0GQsqknPEkVG15uTWMs8YcHTG5xJr/i9WGa9Ewogyo5C0OI4Eselcs0s110oWUscR7twIJlgXEgc52529xNOOEFaWlpk8803lxkzZpil7127djVB+h/+8Id4zhKp8swzz8gvf/lL+fHHH2XhhRe2fTqZwGgrrOLNHGgurikEyFvKKEaugviVlTDFnWqdGrkATz75ZDn22GPNsvdp06bJqquuKj179pSffvrJZH0HgDK8cUdA4jikGe03DdtqEoxFQ3EhLdeQr+edieXuBV26dDHB+XrrrWeyvF9yySVmn3S4Yfbs2ek+ByYRvMTkTzYSxyV2fZI4zh8kjkslkoG6Uj6Vx7EbSNEsamtf0bhTsFz7DgXpuh/6iSeeKOuuu65ssMEG8uCDD5rHb775ZhOcX3rppXLkkUfGea4IsOmmm8phhx0mRxxxhPTr18/sZf/+++/LNttsY1Y5DBgwQPbcc0+ZOHGief7DDz9slprPmzfPfP/222+b0TG9naFg//33l//93/81//3999/L7rvvLksssYT06NFD1lhjDfnb3/5W9xzUo48+KiuuuKJZZaHL3L/44osESwYGnSmsov0hGrqsYNzChCC0j2wgUE630EH6yJEj5ZprrpEhQ4aYIGuXXXaRAw880ATnOouujx1//PGSxgtgzsyZVr6iXny33nqrWeHw4osvyvnnny+bbbaZDBs2TN544w0ZNWqUfPvtt7Lrrrua5/7iF7+QqVOnyltvvWW+f/bZZ01grfeLF+hjGnirmTNnyjrrrCOPPPKICf617jXof+2112qew7XXXitfffWV7LTTTrL99tubgQAN/EsHApCVfdIL/8UbivXEcYnMpLMFGxpp3w0v7ssu61ttIUg+sdsSXOv/XDufdCSOc2PwhWvfuXvS77nnHrntttvkN7/5jQnS1lxzTZk7d6688847qb4/Ye6sWfLnETtbOfYfb71XOnfrFvr5K6ywglx44YXmv88++2wToJ977rnFn990000yePBg+fjjj83M9lprrWWCcl0dof/qSogzzjjD5BmYPHmyyTmwySabmN/VGXRNDligSQIff/xxufvuu80tD9XOQZ100kmy3HLLycUXX2y+X2mlleS9996TCy64oJ2lAwAAAHfGbtIbD7jGjYAdcQo9bP3f//7XzKSq1Vdf3WR016CuGRfkVVddZWbou3XrJuuvv36b2dla7rzzTnP8HXbYod3nkAaF+lE6ePL000+bpe6Fr5VXXtn87LPP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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot regressors\n", + "plt.figure(figsize=(12, 8))\n", + "for i, label in enumerate(testfile.get(\"labels\")):\n", + " plt.plot(testfile.get(\"regressors\")[1000:2000, i], label=label)\n", + "plt.legend()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"Regressor Value\")\n", + "plt.title(\"Gonogo Regressors\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 388, + "id": "7cdcd540", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 388, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(testfile.get(\"regressors\")[:, 3], label=testfile.get(\"labels\")[3])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b34e56da", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "828ccf9a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "096be58d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90f454cc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "analysis", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/exploratory/subject-api.ipynb b/exploratory/subject-api.ipynb new file mode 100644 index 0000000..af96fdf --- /dev/null +++ b/exploratory/subject-api.ipynb @@ -0,0 +1,395 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e493393c", + "metadata": {}, + "outputs": [], + "source": [ + "from visiomode_analysis import subject, session\n", + "import glob\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "26289822", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/fromnumeric.py:3824: RuntimeWarning: Mean of empty slice\n", + " return _methods._mean(a, axis=axis, dtype=dtype,\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/_methods.py:142: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/fromnumeric.py:3824: RuntimeWarning: Mean of empty slice\n", + " return _methods._mean(a, axis=axis, dtype=dtype,\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/_methods.py:142: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n" + ] + } + ], + "source": [ + "session_files = glob.glob(\"../*trials.csv\")\n", + "\n", + "subject_sessions = []\n", + "for session_file in session_files:\n", + " subject_sessions.append(session.summary(session_file))\n", + "\n", + "subject_df = pd.DataFrame(subject_sessions)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7425be77", + "metadata": {}, + "outputs": [], + "source": [ + "subject_df = subject_df.sort_values(\"session_date\").reset_index(drop=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a75a4dfa", + "metadata": {}, + "outputs": [], + "source": [ + "subject_df[\"session_id\"] = subject_df.index + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "47220e55", + "metadata": {}, + "outputs": [], + "source": [ + "subject_df[\"task_session\"] = subject_df.groupby([\"animal_id\", \"protocol\"], sort=False)[\"session_id\"].rank(\n", + " ascending=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "30446ba6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
animal_idsession_dateprotocolenvironmentexperimentcorrectcorrect_wcincorrectincorrect_wccorrection_trials...rtrt_wcrt_hitsrt_hits_wcrt_false_alarmsrt_false_alarms_wcrt_iqrrt_iqr_wcsession_idtask_session
0MM2292022-03-01targetonlyunknown109hrb21d166166000...3.5058843.5058843.5058843.505884NaNNaN4.2612294.26122911.0
1MM2292022-03-09gonogounknown109hrb21d61100408141...0.7579960.7752770.8411250.8411250.7244780.7548150.6941140.81463921.0
\n", + "

2 rows × 45 columns

\n", + "
" + ], + "text/plain": [ + " animal_id session_date protocol environment experiment correct \\\n", + "0 MM229 2022-03-01 targetonly unknown 109hrb21d 166 \n", + "1 MM229 2022-03-09 gonogo unknown 109hrb21d 61 \n", + "\n", + " correct_wc incorrect incorrect_wc correction_trials ... rt \\\n", + "0 166 0 0 0 ... 3.505884 \n", + "1 100 40 81 41 ... 0.757996 \n", + "\n", + " rt_wc rt_hits rt_hits_wc rt_false_alarms rt_false_alarms_wc \\\n", + "0 3.505884 3.505884 3.505884 NaN NaN \n", + "1 0.775277 0.841125 0.841125 0.724478 0.754815 \n", + "\n", + " rt_iqr rt_iqr_wc session_id task_session \n", + "0 4.261229 4.261229 1 1.0 \n", + "1 0.694114 0.814639 2 1.0 \n", + "\n", + "[2 rows x 45 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "subject_df" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "77c4ffda", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['../sub-MM229_exp-109hrb21d_ses-20220309_behaviour-gonogo_trials.csv', '../sub-MM229_exp-109hrb21d_ses-20220301_behaviour-targetonly_trials.csv']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/fromnumeric.py:3824: RuntimeWarning: Mean of empty slice\n", + " return _methods._mean(a, axis=axis, dtype=dtype,\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/_methods.py:142: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/fromnumeric.py:3824: RuntimeWarning: Mean of empty slice\n", + " return _methods._mean(a, axis=axis, dtype=dtype,\n", + "/Users/celefthe/Projects/visiomode_analysis/.venv/lib/python3.14/site-packages/numpy/_core/_methods.py:142: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
animal_idsession_dateprotocolenvironmentexperimentcorrectcorrect_wcincorrectincorrect_wccorrection_trials...rtrt_wcrt_hitsrt_hits_wcrt_false_alarmsrt_false_alarms_wcrt_iqrrt_iqr_wcsession_idtask_session
0MM2292022-03-01targetonlyunknown109hrb21d166166000...3.5058843.5058843.5058843.505884NaNNaN4.2612294.26122911.0
1MM2292022-03-09gonogounknown109hrb21d61100408141...0.7579960.7752770.8411250.8411250.7244780.7548150.6941140.81463921.0
\n", + "

2 rows × 45 columns

\n", + "
" + ], + "text/plain": [ + " animal_id session_date protocol environment experiment correct \\\n", + "0 MM229 2022-03-01 targetonly unknown 109hrb21d 166 \n", + "1 MM229 2022-03-09 gonogo unknown 109hrb21d 61 \n", + "\n", + " correct_wc incorrect incorrect_wc correction_trials ... rt \\\n", + "0 166 0 0 0 ... 3.505884 \n", + "1 100 40 81 41 ... 0.757996 \n", + "\n", + " rt_wc rt_hits rt_hits_wc rt_false_alarms rt_false_alarms_wc \\\n", + "0 3.505884 3.505884 3.505884 NaN NaN \n", + "1 0.775277 0.841125 0.841125 0.724478 0.754815 \n", + "\n", + " rt_iqr rt_iqr_wc session_id task_session \n", + "0 4.261229 4.261229 1 1.0 \n", + "1 0.694114 0.814639 2 1.0 \n", + "\n", + "[2 rows x 45 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "subject.collate_sessions(\"../\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a2b2dc5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index 025b641..7b7e3a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "visiomode-analysis" dynamic = ["version"] description = 'Analysis package for Visiomode sessions' readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.11" license = "MIT" keywords = [] authors = [ @@ -17,17 +17,20 @@ authors = [ classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] dependencies = [ + "Click", "pandas", "numpy", - "scipy" + "scipy", + "plotly", + "Jinja2", ] [project.urls] @@ -35,8 +38,11 @@ Documentation = "https://github.com/DuguidLab/visiomode_analysis#readme" Issues = "https://github.com/DuguidLab/visiomode_analysis/issues" Source = "https://github.com/DuguidLab/visiomode_analysis" +[project.scripts] +visiomode-analysis = "visiomode_analysis:cli" + [tool.hatch.envs.default] -python = "3.9" +path = ".venv" # Use uv environment path [tool.hatch.build.targets.wheel] packages = ["src/visiomode_analysis"] @@ -54,8 +60,12 @@ extra-dependencies = [ [tool.hatch.envs.types.scripts] check = "mypy --install-types --non-interactive {args:src/visiomode_analysis tests}" +[tool.pytest.ini_options] +testpaths = ["tests"] +addopts = "-ra" + [tool.coverage.run] -source_pkgs = ["visiomode_analysis", "tests"] +source_pkgs = ["visiomode_analysis"] branch = true parallel = true omit = [ @@ -64,7 +74,6 @@ omit = [ [tool.coverage.paths] visiomode_analysis = ["src/visiomode_analysis", "*/visiomode-analysis/src/visiomode_analysis"] -tests = ["tests", "*/visiomode-analysis/tests"] [tool.coverage.report] exclude_lines = [ diff --git a/release-checklist.md b/release-checklist.md new file mode 100644 index 0000000..969398e --- /dev/null +++ b/release-checklist.md @@ -0,0 +1,21 @@ +# Releasing new visiomode-analysis versions + +## Checklist + +* Make sure all relevant issues for this release are closed and any PRs merged to main. +* Ensure the Changelog is up to date. +* Make sure the CI isn't failing - build, test and docs should all be working properly. +* Test coverage should be >70% for the main project. Go write some tests if not. +* Double check there aren't any rude comments littering the code. +* Pull any changes to `main`. + +## Releasing + +* Create a new branch called `release/` (e.g. `git branch release/v0.1.0`). Make sure you're doing this from the `main` branch. +* Checkout the new release branch. +* Bump the version using `hatch version `. +* Commit the version change. +* Tag the version with git using `git tag ` (e.g. `git tag v0.1.0`). +* Push everything with `git push && git push --tags`. +* Create a pull request for the release branch and merge into main. +* Github Actions should handle making a release and pushing to PyPI. If so happy days! If not, go fix it. diff --git a/src/visiomode_analysis/__init__.py b/src/visiomode_analysis/__init__.py new file mode 100644 index 0000000..d4d8bd1 --- /dev/null +++ b/src/visiomode_analysis/__init__.py @@ -0,0 +1,38 @@ +# Copyright (c) 2026 Constantinos Eleftheriou . +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this +# software and associated documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, subject to the +# following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies +# or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import click + +from visiomode_analysis import session, subject, group +from visiomode_analysis.__about__ import __version__ + + +@click.group() +@click.version_option(__version__) +def cli(): + """Visiomode data processing CLI.""" + + +cli.add_command(session.session_cmd) +cli.add_command(session.regressors_cmd) +cli.add_command(subject.subject_cmd) +cli.add_command(group.group_cmd) diff --git a/src/visiomode_analysis/group/__init__.py b/src/visiomode_analysis/group/__init__.py new file mode 100644 index 0000000..39f79bb --- /dev/null +++ b/src/visiomode_analysis/group/__init__.py @@ -0,0 +1,27 @@ +# Copyright (c) 2026 Constantinos Eleftheriou . +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this +# software and associated documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, subject to the +# following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies +# or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import click + + +@click.command("group") +def group_cmd(): ... diff --git a/src/visiomode_analysis/reports/__init__.py b/src/visiomode_analysis/reports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/visiomode_analysis/reports/templates/base.html b/src/visiomode_analysis/reports/templates/base.html new file mode 100644 index 0000000..7c23df2 --- /dev/null +++ b/src/visiomode_analysis/reports/templates/base.html @@ -0,0 +1,290 @@ + + + + + + + + + Visiomode Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+ {% block content %}{% endblock %} +
+
+
+
+ + + + {% block scripts %}{% endblock %} + + + \ No newline at end of file diff --git a/src/visiomode_analysis/reports/templates/session.html b/src/visiomode_analysis/reports/templates/session.html new file mode 100644 index 0000000..33cad16 --- /dev/null +++ b/src/visiomode_analysis/reports/templates/session.html @@ -0,0 +1,242 @@ +{% extends "base.html" %} + +{% block toc %} + +{% endblock %} + + +{% block content %} +
+

Visiomode Session Report

+

{{ session_id }}

+
+ + +
+

Session metadata

+ +
+
+ Subject ID: {{ subject_id or "Unknown" }} +
+
+ Experiment ID: {{ experiment_id or "Unknown" }} +
+
+ Session duration: {{ duration or "Unknown" }} mins +
+
+
+
+ Session date: {{ session_date or "Unknown" }} +
+
+ Protocol: {{ protocol or "Unknown" }} +
+
+ Number of trials: {{ trials_num or "Unknown" }} +
+
+ +

Protocol spec

+ +
+
+ Inter-trial Interval: {{ iti or "Unknown" }} ms +
+
+ Correction trials: {{ corrections_enabled }} +
+
+ Notes: +
{{ notes }}
+
+
+
+
+ Stimulus interval: {{ stimulus_duration or "Unknown" }} ms +
+
+ Stimuli: +
+ + {% for key, value in stimuli.items() %} + + + + + {% endfor %} +
  {{ key }}: {{ value }}
+
+
+
+
+ + +
+

Session metrics

+ +
+ {% if corrections_enabled %} +
+

Random presentations only

+
+ {% endif %} + +
+
Cue response breakdown
+ {{ fig_success_pie | safe }} +
+ +
+
Cued:uncued response breakdown
+ {{ fig_cued_pie | safe }} +
+ +
+
Median reaction time
+ {{ fig_rt_median | safe }} +
+
+ + {% if corrections_enabled %} +
+
+

All presentations (including correction trials)

+
+ +
+
Cue response breakdown (all trials)
+ {{ fig_success_pie_wc | safe }} +
+ +
+
Cued:uncued response breakdown (all trials)
+ {{ fig_cued_pie_wc | safe }} +
+ +
+
Median reaction time (all trials)
+ {{ fig_rt_median_wc | safe }} +
+
+ +
+ +
+

Correction trial metrics

+ + +
+
+
Presentation breakdown
+ {{ fig_presentation_breakdown | safe }} +
+
+
+
+
Presentation ratio
+ {{ fig_presentation_ratio | safe }} +
+
+
+
+
Perseveration index
+ {{ fig_perseveration_index | safe }} +
+
+
+ {% endif %} +
+ +
+ +{% if protocol != "targetonly"%} +
+

SDT metrics

+ +
+
+
ROC curve
+ {{ fig_roc | safe }} +
+
+
Discriminability index (d')
+ {{ fig_d_prime | safe }} +
+
+
Decision criterion
+ {{ fig_decision_criterion | safe }} +
+
+ +
+
+
+
Response type breakdown
+ {{ fig_response_sdt | safe }} +
+
+ + {% if corrections_enabled %} +
+
+
Response type breakdown (all trials)
+ {{ fig_response_sdt_wc | safe }} +
+
+ {% endif %} +
+ + +
+{% endif %} + +
+

Trial timeseries

+ +
+
+
Response timeseries
+ {{ fig_response_timeseries | safe }} +
+
+ + {% if protocol != "targetonly"%} +
+
+
SDT timeseries
+ {{ fig_sdt_timeseries | safe }} +
+
+ {% endif %} +
+ + + + +{% endblock %} \ No newline at end of file diff --git a/src/visiomode_analysis/session/__init__.py b/src/visiomode_analysis/session/__init__.py new file mode 100644 index 0000000..06a2538 --- /dev/null +++ b/src/visiomode_analysis/session/__init__.py @@ -0,0 +1,714 @@ +# Copyright (c) 2026 Constantinos Eleftheriou . +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this +# software and associated documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, subject to the +# following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies +# or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import os +import json +import click +import datetime +import pandas as pd +import numpy as np +import numpy.typing as npt + +from pathlib import Path +from jinja2 import Environment +from jinja2 import PackageLoader +from jinja2 import select_autoescape + +from collections.abc import Iterator + +from visiomode_analysis.session import metrics, plots +import visiomode_analysis.session.regressor as rgr + + +SESSION_REPORT_TEMPLATE = "session.html" + +HIT = "hit" +MISS = "miss" +FALSE_ALARM = "false_alarm" +CORRECT_REJECTION = "correct_rejection" + + +env = Environment(loader=PackageLoader("visiomode_analysis.reports", "templates"), autoescape=select_autoescape()) + + +@click.command("session") +@click.argument( + "path", + type=click.Path(exists=True, dir_okay=False), +) +@click.option( + "-o", + "--output-dir", + type=click.Path(dir_okay=True), + default=".", + help="Output directory for report and trials files.", +) +@click.option( + "--no-report", + is_flag=True, + default=False, + help="If set, do not generate a session report.", +) +@click.option( + "--with-regressors", + is_flag=True, + default=False, + help="If set, generate regressors for the session.", +) +@click.option( + "--regressor-timestamps", + type=click.Path(exists=True, dir_okay=False), + help="Path to a CSV file containing timestamps for regressor generation.", +) +def session_cmd(**kwargs): + """Generate a session report and extract trials from a Visiomode JSON file.""" + out_dir = preprocess_session(**kwargs) + click.echo(f"Files saved under {out_dir}") + + +@click.command("regressors") +@click.argument( + "path", + type=click.Path(exists=True, dir_okay=False), +) +@click.option( + "-o", + "--output-dir", + type=click.Path(dir_okay=True), + default=".", + help="Output directory for regressors files.", +) +@click.option( + "--regressor-timestamps", + type=click.Path(exists=True, dir_okay=False), + required=True, + help="Path to a CSV file containing timestamps for regressor generation.", +) +def regressors_cmd(**kwargs): + """Generate regressors for a session based on the protocol.""" + trials_df = get_trials(kwargs["path"]) + meta = get_metadata(kwargs["path"]) + generate_regressors(trials_df, meta, kwargs["regressor_timestamps"], output_dir=kwargs["output_dir"]) + click.echo(f"Regressors saved under {kwargs['output_dir']}") + + +def preprocess_session( + path: str, + output_dir: str = ".", + no_report: bool = False, + with_regressors: bool = False, + regressor_timestamps: str | None = None, +) -> str: + """Generate a session summary report and trials file from a raw Visiomode JSON. + + Args: + path (str): Path to Visiomode JSON file. + output_dir (str, optional): Output directory for report and trials files. Defaults to ".". + no_report (bool, optional): Whether to generate a session report. Defaults to False. + with_regressors (bool, optional): Whether to generate regressors for the session. Defaults to False. + regressor_timestamps (str, optional): Path to a CSV file containing timestamps for regressor generation. Defaults to None. + Returns: + str: Returns directory under which files were saved + """ + trials_df = get_trials(path, to_csv=True, output_dir=output_dir) + meta = get_metadata(path) + + if not no_report: + generate_report(path, output_dir=output_dir) + + if with_regressors: + if not regressor_timestamps: + raise ValueError("Regressor timestamps file must be provided when generating regressors.") + generate_regressors(trials_df, meta, regressor_timestamps, output_dir=output_dir) + + return output_dir + + +def get_metadata(path: str) -> dict: + with open(path, "r") as fp: + session_data = json.load(fp) + + # Prefer the JSON for the following + session_start_time = session_data.get("timestamp") + protocol = session_data.get("protocol", "unknown") + version = session_data.get("version", "unknown") + duration = session_data.get("duration", "unknown") + response_device = session_data.get("spec", {}).get("response_device", "unknown") + reward_profile = session_data.get("spec", {}).get("reward_profile", "unknown") + stimulus_duration = float(session_data.get("spec", {}).get("stimulus_duration", -1)) + iti = float(session_data.get("spec", {}).get("iti", -1)) + corrections_enabled = session_data.get("spec", {}).get("corrections_enabled", False) + stimuli = { + "target_id": session_data.get("spec", {}).get("target"), + **{ + f"target_{key.replace('t_', '')}": value + for key, value in session_data.get("spec", {}).items() + if key.startswith("t_") + }, + "distractor_id": session_data.get("spec", {}).get("distractor"), + **{ + f"distractor_{key.replace('d_', '')}": value + for key, value in session_data.get("spec", {}).items() + if key.startswith("d_") + }, + } + device = session_data.get("device", "unknown") + notes = session_data.get("notes") + + # Prefer file name for the following, or defer to JSON if mangled + + if "sub-" in path.split(os.sep)[-1]: + animal_id = path.split(os.sep)[-1].split("_")[0].strip("sub-") + else: + animal_id = session_data.get("animal_id", "unknown") + + if "exp-" in path.split(os.sep)[-1]: + experiment = path.split(os.sep)[-1].split("_")[1].replace("exp-", "") + else: + experiment = session_data.get("experiment", "unknown") + + if "ses-" in path.split(os.sep)[-1]: + session_date = datetime.datetime.strptime( + path.split(os.sep)[-1].split("_")[2].strip("ses-")[:8], "%Y%m%d" + ).date() + else: + session_date = datetime.datetime.fromisoformat(session_start_time).date() + + if "behaviour-" in path.split(os.sep)[-1]: + environment = path.split(os.sep)[-1].split("_")[-1].replace("behaviour-", "").replace(".json", "") + else: + environment = session_data.get("environment", "unknown") + + return { + "animal_id": animal_id, + "experiment": experiment, + "session_date": session_date, + "environment": environment, + "protocol": protocol, + "version": version, + "duration": duration, + "session_start_time": session_start_time, + "response_device": response_device, + "reward_profile": reward_profile, + "stimulus_duration": stimulus_duration, + "iti": iti, + "corrections_enabled": corrections_enabled, + "device": device, + "stimuli": stimuli, + "notes": notes, + } + + +def get_trials(path: str, to_csv: bool = False, output_dir: str = ".") -> pd.DataFrame: + """Parse a Visiomode JSON file and return a trials dataframe. Optionally save to CSV. + + Args: + path (str): Path to Visiomode JSON file. + to_csv (bool, optional): Save trials dataframe as a CSV. If True, indicate which directory to save in via `output_dir`. Defaults to False. + output_dir (str, optional): Output directory for trials CSV file. Only used if `to_csv` is True. Defaults to current directory. + + Returns: + pd.DataFrame: Session trials dataframe, where each row is a trial. + """ + metadata = get_metadata(path) + + trials: Iterator[dict] + with open(path, "r") as fp: + session_data = json.load(fp) + trials = _flatten_trials(session_data, metadata=metadata) + + session = [ + { + "animal_id": metadata.get("animal_id"), + "session_date": metadata.get("session_date"), + "protocol": metadata.get("protocol"), + "environment": metadata.get("environment"), + "experiment": metadata.get("experiment"), + **trial, + } + for trial in trials + ] + + df = pd.DataFrame(session) + + # Convert legacy outcomes if they're still about + df["outcome"] = df["outcome"].replace({"hit": "correct", "false_alarm": "incorrect", "miss": "no_response"}) + + if to_csv: + out_path = f"{output_dir}{os.sep}sub-{metadata.get('animal_id')}_exp-{metadata.get('experiment')}_ses-{str(metadata.get('session_date')).replace('-', '')}_behaviour-{metadata.get('protocol')}_trials.csv" + df.to_csv(out_path) + + return df + + +def get_rts(path: str, sdt_type=None, include_corrections=True) -> npt.NDArray: + trials = get_trials(path=path) + + if not include_corrections: + trials = trials[trials.correction == False] # noqa: E712 + + if sdt_type: + return np.array(trials[(trials.response.notnull()) & (trials.sdt_type == sdt_type)].response_time.values) + + return np.array(trials[(trials.response.notnull()) & (trials.cue_onset.notnull())].response_time.values) + + +def summary(path: str) -> dict: + """Summarise session from a JSON or trials.csv file + + Args: + path (str): Path to (preprocessed) trials.csv or raw JSON + + Returns: + dict: Summary dictionary + """ + if path.endswith(".json"): + metadata = get_metadata(path) + df = get_trials(path) + else: + df = pd.read_csv(path) + metadata = { + "animal_id": df["animal_id"][0], + "session_date": df["session_date"][0], + "protocol": df["protocol"][0], + "environment": df["environment"][0], + "experiment": df["experiment"][0], + } + + # Trial counts + correct = len(df[(df["outcome"] == "correct") & (df["correction"] == False)]) # noqa: E712 + correct_wc = len(df[(df["outcome"] == "correct")]) + incorrect = len(df[(df["outcome"] == "incorrect") & (df["correction"] == False)]) # noqa: E712 + incorrect_wc = len(df[(df["outcome"] == "incorrect")]) + + correction_trials = len(df[(df["outcome"] == "incorrect") & (df["correction"] == True)]) # noqa: E712 + + hits = len(df[(df["sdt_type"] == "hit") & (df["correction"] == False)]) # noqa: E712 + hits_wc = len(df[(df["sdt_type"] == "hit")]) + + false_alarms = len(df[(df["sdt_type"] == "false_alarm") & (df["correction"] == False)]) # noqa: E712 + false_alarms_wc = len(df[(df["sdt_type"] == "false_alarm")]) + + correct_rejections = len(df[(df["sdt_type"] == "correct_rejection") & (df["correction"] == False)]) # noqa: E712 + correct_rejections_wc = len(df[(df["sdt_type"] == "correct_rejection")]) + + misses = len(df[(df["sdt_type"] == "miss") & (df["correction"] == False)]) # noqa: E712 + misses_wc = len(df[(df["sdt_type"] == "miss")]) + + cued = hits + misses + false_alarms + correct_rejections + cued_wc = hits_wc + misses_wc + false_alarms_wc + correct_rejections_wc + + precued = len(df[(df["outcome"] == "precued")]) + + total = cued_wc + precued + + # Trial ratios + percentage_correct = (correct / cued) * 100 if cued > 0 else 100 + percentage_correct_wc = (correct_wc / cued_wc) * 100 if cued_wc > 0 else 100 + + cued_ratio = cued / precued if precued > 0 else 1.0 + correction_ratio = cued / correction_trials if correction_trials > 0 else 0.0 + + # Signal detection theory metrics + _is_2afc = True if "afc" in metadata.get("protocol", "") else False + + hit_rate = (hits + 0.5) / (hits + misses + 1.0) + hit_rate_wc = (hits_wc + 0.5) / (hits_wc + misses_wc + 1.0) + fa_rate = (false_alarms + 0.5) / (correct_rejections + false_alarms + 1.0) + fa_rate_wc = (false_alarms_wc + 0.5) / (correct_rejections_wc + false_alarms_wc + 1.0) + + d_prime = metrics.d_prime(hit_rate, fa_rate, afc_correction=_is_2afc) + d_prime_wc = metrics.d_prime(hit_rate_wc, fa_rate_wc, afc_correction=_is_2afc) + + decision_criterion = metrics.criterion(hit_rate, fa_rate) + decision_criterion_wc = metrics.criterion(hit_rate_wc, fa_rate_wc) + + # Perseveration + perseveration = metrics.perseveration(num_correction_trials=correction_trials, num_incorrect=incorrect_wc) + + # Reaction time metrics + rt = float( + np.median(df[(df.response.notnull()) & (df.outcome != "precued") & (df.correction == False)]["response_time"]) + ) # noqa: E712 + rt_wc = float(np.median(df[(df.response.notnull()) & (df.outcome != "precued")]["response_time"])) + + rt_hits = float(np.median(df[(df.sdt_type == "hit") & (df.correction == False)]["response_time"])) # noqa: E712 + rt_hits_wc = float(np.median(df[(df.sdt_type == "hit")]["response_time"])) + + rt_false_alarms = float(np.median(df[(df.sdt_type == "false_alarm") & (df.correction == False)]["response_time"])) # noqa: E712 + rt_false_alarms_wc = float(np.median(df[(df.sdt_type == "false_alarm")]["response_time"])) + + try: + rt_iqr = float( + np.percentile( + df[(df.response.notnull()) & (df.outcome != "precued") & (df.correction == False)]["response_time"], 75 + ) + - np.percentile( + df[(df.response.notnull()) & (df.outcome != "precued") & (df.correction == False)]["response_time"], + 25, + ) + ) + + rt_iqr_wc = float( + np.percentile(df[(df.response.notnull()) & (df.outcome != "precued")]["response_time"], 75) + - np.percentile( + df[(df.response.notnull()) & (df.outcome != "precued")]["response_time"], + 25, + ) + ) + except IndexError: + rt_iqr = np.nan + rt_iqr_wc = np.nan + + return { + "animal_id": metadata.get("animal_id"), + "session_date": metadata.get("session_date"), + "protocol": metadata.get("protocol"), + "environment": metadata.get("environment"), + "experiment": metadata.get("experiment"), + "correct": correct, + "correct_wc": correct_wc, + "incorrect": incorrect, + "incorrect_wc": incorrect_wc, + "correction_trials": correction_trials, + "hits": hits, + "hits_wc": hits_wc, + "false_alarms": false_alarms, + "false_alarms_wc": false_alarms_wc, + "correct_rejections": correct_rejections, + "correct_rejections_wc": correct_rejections_wc, + "misses": misses, + "misses_wc": misses_wc, + "cued": cued, + "cued_wc": cued_wc, + "precued": precued, + "total": total, + "percentage_correct": percentage_correct, + "percentage_correct_wc": percentage_correct_wc, + "cued_ratio": cued_ratio, + "correction_ratio": correction_ratio, + "hit_rate": hit_rate, + "hit_rate_wc": hit_rate_wc, + "fa_rate": fa_rate, + "fa_rate_wc": fa_rate_wc, + "d_prime": d_prime, + "d_prime_wc": d_prime_wc, + "decision_criterion": decision_criterion, + "decision_criterion_wc": decision_criterion_wc, + "perseveration": perseveration, + "rt": rt, + "rt_wc": rt_wc, + "rt_hits": rt_hits, + "rt_hits_wc": rt_hits_wc, + "rt_false_alarms": rt_false_alarms, + "rt_false_alarms_wc": rt_false_alarms_wc, + "rt_iqr": rt_iqr, + "rt_iqr_wc": rt_iqr_wc, + } + + +def generate_regressors( + trials_df: pd.DataFrame, metadata: dict, regressor_timestamps_path: str, output_dir: str = "." +) -> str: + """Generate regressors for the session based on the protocol. + + Timestamps are recalculated to align to the start of the behaviour session, based on the session start time in the metadata. + + Args: + trials_df (pd.DataFrame): A DataFrame containing trial data with columns for trial type, + start time, and stop time. + metadata (dict): A dictionary containing session metadata. + regressor_timestamps_path (str): Path to a CSV or TXT file containing timestamps for regressor generation. Typically corresponds to the timestamps of an imaging session or other continuous recording and should be in ISO format. + output_dir (str, optional): Output directory for saving regressors. Defaults to ".". + + Returns: + str: Path to the generated regressors file. + + Raises: + NotImplementedError: If the protocol specified in the metadata is not supported for regressor generation. + + Note: + The output regressors are saved as a .npz file which contains the regressors array, labels, and recalculated timestamps. + """ + + if regressor_timestamps_path.endswith(".csv"): + source_timestamps = pd.read_csv(regressor_timestamps_path).to_numpy().flatten() + elif regressor_timestamps_path.endswith(".txt"): + source_timestamps = np.loadtxt(regressor_timestamps_path, dtype=str) + else: + raise ValueError("Regressor timestamps file must be in CSV or TXT format.") + session_start_time = datetime.datetime.fromisoformat(metadata.get("session_start_time", "")) + + # recalculate timestamps to align to behaviour + timestamps = [ + (datetime.datetime.fromisoformat(timestamp) - session_start_time).total_seconds() + for timestamp in source_timestamps + ] + + outpath = f"{output_dir}{os.sep}sub-{metadata.get('animal_id')}_exp-{metadata.get('experiment')}_ses-{str(metadata.get('session_date')).replace('-', '')}_behaviour-{metadata.get('protocol')}_regressors.npz" + + if metadata.get("protocol") == "gonogo": + regressors, labels, trial_idx = rgr.generate_gonogo_regressors(trials_df, timestamps, trial_epoch_only=True) + np.savez( + outpath, + regressors=regressors, + labels=np.array(list(labels.values())), + timestamps=np.array(timestamps), + trial_idx=trial_idx, + ) + else: + raise NotImplementedError(f"Regressor generation not implemented for protocol {metadata.get('protocol')}.") + + return outpath + + +def generate_report(path: str, output_dir: str = ".") -> str: + template = env.get_template(SESSION_REPORT_TEMPLATE) + + metadata = get_metadata(path) + trials = get_trials(path) + session_summary = summary(path=path) + + template_identifiers = { + "subject_id": metadata.get("animal_id"), + "session_date": str(metadata.get("session_date")), + "experiment_id": metadata.get("experiment_id"), + "duration": metadata.get("duration"), + "trials_num": session_summary.get("total"), + "protocol": metadata.get("protocol"), + "response_device": metadata.get("response_device"), + "reward_profile": metadata.get("reward_profile"), + "iti": metadata.get("iti"), + "stimulus_duration": metadata.get("stimulus_duration"), + "corrections_enabled": metadata.get("corrections_enabled"), + "stimuli": metadata.get("stimuli"), + "notes": metadata.get("notes"), + "summary": session_summary, + "fig_success_pie": plots.plot_success_pie( + session_summary.get("correct", 0), + session_summary.get("incorrect", 0), + session_summary.get("miss", 0), + as_html=True, + ), + "fig_success_pie_wc": plots.plot_success_pie( + session_summary.get("correct_wc", 0), + session_summary.get("incorrect_wc", 0), + session_summary.get("miss_wc", 0), + as_html=True, + ), + "fig_cued_pie": plots.plot_cued_pie(session_summary.get("cued"), session_summary.get("precued"), as_html=True), + "fig_cued_pie_wc": plots.plot_cued_pie( + session_summary.get("cued_wc"), session_summary.get("precued"), as_html=True + ), + "fig_rt_median": plots.plot_rt_median( + get_rts(path=path, include_corrections=False), + stimulus_duration=metadata.get("stimulus_duration", 4000) / 1000, + as_html=True, + ) + if metadata.get("protocol") == "targetonly" + else plots.plot_rt_medians_from_dict( + { + "all": get_rts(path=path, include_corrections=False), + "hits": get_rts(path=path, sdt_type="hit", include_corrections=False), + "false_alarms": get_rts(path=path, sdt_type="false_alarm", include_corrections=False), + }, + stimulus_duration=metadata.get("stimulus_duration", 4000) / 1000, + as_html=True, + ), + "fig_rt_median_wc": plots.plot_rt_median( + get_rts(path=path, include_corrections=True), + stimulus_duration=metadata.get("stimulus_duration", 4000) / 1000, + as_html=True, + ) + if metadata.get("protocol") == "targetonly" + else plots.plot_rt_medians_from_dict( + { + "all": get_rts(path=path, include_corrections=True), + "hits": get_rts(path=path, sdt_type="hit", include_corrections=True), + "false_alarms": get_rts(path=path, sdt_type="false_alarm", include_corrections=True), + }, + stimulus_duration=metadata.get("stimulus_duration", 4000) / 1000, + as_html=True, + ), + "fig_presentation_breakdown": plots.plot_correction_pie( + session_summary.get("cued", 0), session_summary.get("correction_trials"), as_html=True + ), + "fig_presentation_ratio": plots.plot_single_yvalue( + session_summary.get("correction_ratio", 0), 0, 5, as_html=True + ), + "fig_perseveration_index": plots.plot_single_yvalue( + session_summary.get("perseveration", 0), 0, 1, as_html=True + ), + "fig_roc": plots.plot_roc( + hit_rate=session_summary.get("hit_rate", 0), + fa_rate=session_summary.get("fa_rate", 0), + hit_rate_wc=session_summary.get("hit_rate_wc", 0), + fa_rate_wc=session_summary.get("fa_rate_wc", 0), + as_html=True, + ), + "fig_d_prime": plots.plot_dprime( + d_prime=session_summary.get("d_prime", 0), d_prime_wc=session_summary.get("d_prime_wc", None), as_html=True + ), + "fig_decision_criterion": plots.plot_criterion( + criterion=session_summary.get("decision_criterion", 0), + criterion_wc=session_summary.get("decision_criterion_wc", None), + as_html=True, + ), + "fig_response_sdt": plots.plot_sdt_pie( + num_hits=session_summary.get("hits", 0), + num_false_alarms=session_summary.get("false_alarms", 0), + num_correct_rejections=session_summary.get("correct_rejections", 0), + num_misses=session_summary.get("misses", 0), + as_html=True, + ), + "fig_response_sdt_wc": plots.plot_sdt_pie( + num_hits=session_summary.get("hits_wc", 0), + num_false_alarms=session_summary.get("false_alarms_wc", 0), + num_correct_rejections=session_summary.get("correct_rejections_wc", 0), + num_misses=session_summary.get("misses_wc", 0), + as_html=True, + ), + "fig_response_timeseries": plots.plot_trial_timeseries(trials=trials, as_html=True), + "fig_sdt_timeseries": plots.plot_trial_timeseries(trials=trials, use_sdt=True, as_html=True), + } + + out_path = Path( + f"{output_dir}{os.sep}sub-{metadata.get('animal_id')}_exp-{metadata.get('experiment')}_ses-{str(metadata.get('session_date')).replace('-', '')}_behaviour-{metadata.get('protocol')}_report-session.html" + ) + out_path.write_text(template.render(template_identifiers), encoding="utf-8") + return str(out_path) + + +def _flatten_trials(session: dict, metadata: dict) -> Iterator[dict]: + session_start_time = datetime.datetime.fromisoformat(metadata.get("session_start_time", "")) + + for trial in session.get("trials", []): + start_time = (datetime.datetime.fromisoformat(trial["timestamp"]) - session_start_time).total_seconds() + + stimulus_duration = metadata.get("stimulus_duration", -1) / 1000 + + stop_time = start_time + trial["iti"] + stimulus_duration + if trial.get("response") and trial.get("response", {}).get("timestamp"): + stop_time = ( + datetime.datetime.fromisoformat(trial["response"]["timestamp"]) - session_start_time + ).total_seconds() + + response = trial.get("response").get("name") or "unknown" if trial.get("response") else None + if response == "unknown": + if metadata.get("environment") == "hf": + response = "leverpush" + elif metadata.get("environment") == "freelymoving": + response = "touch" + + response_time = trial["response_time"] + # disregard negative response times + response_time = np.nan if response_time < 0 else response_time + + pos_x = trial.get("response").get("pos_x", 0) if trial.get("response") else None + pos_y = trial.get("response").get("pos_y", 0) if trial.get("response") else None + dist_x = trial.get("response").get("dist_x", 0) if trial.get("response") else None + dist_y = trial.get("response").get("dist_y", 0) if trial.get("response") else None + + stimulus: dict = {} + if trial.get("stimulus"): + if trial.get("stimulus") == "None": + stimulus = {} + elif trial.get("stimulus").get("common_name"): + # handle single stimulus on screen tasks + stimulus = {f"stim_{key}": value for key, value in trial.get("stimulus").items()} + elif trial.get("stimulus").get("target"): + # 2AFC / nAFC + target_stim = {f"target_{key}": value for key, value in trial.get("stimulus").get("target").items()} + distractor_stim = { + f"distractor_{key}": value for key, value in trial.get("stimulus").get("distractor").items() + } + stimulus = {**target_stim, **distractor_stim} + else: # handle older versions of visiomode + if metadata.get("protocol") == "gonogo": + if (trial.get("response") and trial.get("outcome") == "correct") or ( + not trial.get("response") and trial.get("outcome") == "incorrect" + ): + stimulus = { + **{ + f"stim_{key.replace('target_', '')}": value + for key, value in metadata.get("stimuli", {}).items() + if key.startswith("target_") + }, + } + elif (trial.get("response") and trial.get("outcome") == "incorrect") or ( + not trial.get("response") and trial.get("outcome") == "correct" + ): + stimulus = { + **{ + f"stim_{key.replace('distractor_', '')}": value + for key, value in metadata.get("stimuli", {}).items() + if key.startswith("distractor_") + }, + } + elif metadata.get("protocol") == "targetonly": + if (trial.get("response") and (trial.get("outcome") == "correct")) or ( + trial.get("outcome") == "no_response" + ): + stimulus = { + **{ + f"stim_{key.replace('target_', '')}": value + for key, value in metadata.get("stimuli", {}).items() + if key.startswith("target_") + }, + } + else: # 2AFC + stimulus = {key: value for key, value in metadata.get("stimuli", {}).items()} + + cue_onset = start_time + trial["iti"] if stimulus else np.nan + + sdt_type = None + if trial.get("sdt_type"): + sdt_type = trial.get("sdt_type") + elif metadata.get("protocol") == "gonogo" or metadata.get("protocol") == "targetonly": + if trial.get("response") and trial.get("outcome") == "correct": + sdt_type = HIT + elif trial.get("response") and trial.get("outcome") == "incorrect": + sdt_type = FALSE_ALARM + elif not trial.get("response") and trial.get("outcome") == "correct": + sdt_type = CORRECT_REJECTION + elif not trial.get("response") and ( + trial.get("outcome") == "incorrect" or trial.get("outcome") == "no_response" + ): + sdt_type = MISS + else: + sdt_type = None + + yield { + "start_time": start_time, + "stop_time": stop_time, + "cue_onset": cue_onset, + "response": response, + "response_time": response_time, + "outcome": trial["outcome"], + "correction": trial["correction"], + "pos_x": pos_x, + "pos_y": pos_y, + "dist_x": dist_x, + "dist_y": dist_y, + "sdt_type": sdt_type, + **stimulus, + } diff --git a/src/visiomode_analysis/session/metrics.py b/src/visiomode_analysis/session/metrics.py index 5dafe1b..2400731 100644 --- a/src/visiomode_analysis/session/metrics.py +++ b/src/visiomode_analysis/session/metrics.py @@ -1,197 +1,40 @@ -import pandas as pd +import math from scipy.stats import norm -def d_prime(df, session_type): - """Function to calculate d' from a session dataframe. - - Args: - df: Pandas dataframe with session data. - session_type: Go/NoGo or 2AFC - - Returns: - d_prime: Float representing the session d'. - - Example: - dprime = d_prime(df, session_type="gonogo") - """ - # Calculate the hit rate - hits = len( - df[(df.outcome == "correct") & (df.response.notnull()) & (df.correction == False)] - ) - misses = len( - df[(df.outcome == "incorrect") & (df.response.isnull()) & (df.correction == False)] - ) - hit_rate = (hits + 0.5) / (hits + misses + 1.0) - - # Calculate FA rate - false_alarms = len( - df[(df.outcome == "incorrect") & (df.response.notnull()) & (df.correction == False)] - ) - - correct_reject = len( - df[(df.outcome == "correct") & (df.response.isnull()) & (df.correction == False)] - ) - - fa_rate = (false_alarms + 0.5) / (false_alarms + correct_reject + 1) - - # Calculate d' - # TODO: Switch d' calculation if task is 2afc - if session_type == "gonogo": - d_prime = norm.ppf(hit_rate) - norm.ppf(fa_rate) - else: - d_prime = (1/sqrt(2))*(norm.ppf(hit_rate) - norm.ppf(fa_rate)) - - # Return d' +def d_prime(hit_rate: float, fa_rate: float, afc_correction: bool = False) -> float: + if hit_rate == 0 or fa_rate == 0: + raise ValueError("Cannot calculate a d' with hit or false alarm rate of zero.") + + if hit_rate == 1 or fa_rate == 1: + raise ValueError("Cannot calculate a d' with hit or false alarm rate of one.") + + z_H = norm.ppf(hit_rate) + z_FA = norm.ppf(fa_rate) + + d_prime = float(z_H - z_FA) + + if afc_correction: + d_prime = (1 / math.sqrt(2)) * (d_prime) + return d_prime - -def preservation_index(df): - '''Defines a function to calculate the preservation index for a single session - - Args: - df: Pandas dataframe with session data - - Output: - float representing the preservation index for a single session - - Example: - preservation = preservation_index(df)''' - - if df[df.outcome == "incorrect"].outcome.count() == 0: - return 0 - else: - return df[(df.outcome == "incorrect") & (df.correction == True)].outcome.count() / df[df.outcome == "incorrect"].outcome.count() - - -def rt_mean(df, trial_type="all", correction=False, disregard_correction=True): - '''Defines a function to calculate mean reaction time for different trial types. - - Args: - df: Pandas dataframe with session data. - trial_type: all, hits, false_alarms, cued, precued. Default output is total number of trials. - correction: "True" or "False" to specify correction or random trials, respectively. Default is false (i.e. return only random trials) - disregard_correction: Return trial count irrespective of whether they are correction or random trials. This will override the value of 'correction' if True. Default is True. - - Output: - float representing the mean RT for specified trials in a session - - Example: - hit_mean_RT = rt_mean(df, trial_type='hit')''' - - if not disregard_correction: - df = df[df.correction == correction] - - if trial_type == "all": - return df[df.response.notnull()]["response_time"].mean() - if trial_type == "hits": - return df[(df.outcome == "correct") & (df.response.notnull())]["response_time"].mean() - if trial_type == "false_alarms": - return df[(df.outcome == "incorrect") & (df.response.notnull())].mean() - if trial_type == "cued": - return df[(df.outcome != "precued")].mean() - if trial_type == "precued": - return df[(df.outcome == "precued")].mean() - else: - raise ValueError(f"Invalid trial type {trial_type}") - - -def rt_median(df, trial_type="all", correction=False, disregard_correction=True): - '''Defines a function to calculate median reaction time for different trial types. - - Args: - df: Pandas dataframe with session data. - trial_type: all, hits, false_alarms, cued, precued. Default output is total number of trials. - correction: "True" or "False" to specify correction or random trials, respectively. Default is false (i.e. return only random trials) - disregard_correction: Return trial count irrespective of whether they are correction or random trials. This will override the value of 'correction' if True. Default is True. - - Output: - float representing the median reaction time for specified trials in a session - - Example: - hit_median_RT = rt_median(df, trial_type='hit')''' - - if not disregard_correction: - df = df[df.correction == correction] - - if trial_type == "all": - return df[df.response.notnull()]["response_time"].median() - if trial_type == "hits": - return df[(df.outcome == "correct") & (df.response.notnull())]["response_time"].median() - if trial_type == "false_alarms": - return df[(df.outcome == "incorrect") & (df.response.notnull())].median() - if trial_type == "cued": - return df[(df.outcome != "precued")].median() - if trial_type == "precued": - return df[(df.outcome == "precued")].median() - else: - raise ValueError(f"Invalid trial type {trial_type}") -def response_bias(df): - '''Function to calculate response bias for a single session. - - Args: - df: dataframe containing session data. - - Output: - Float representing bias for a single session. - - Example: - bias = response_bias(df)''' - - hits = len( - df[(df.outcome == "correct") & (df.response.notnull()) & (df.correction == False)] - ) - misses = len( - df[(df.outcome == "incorrect") & (df.response.isnull()) & (df.correction == False)] - ) - hit_rate = (hits + 0.5) / (hits + misses + 1.0) - - false_alarms = len( - df[(df.outcome == "incorrect") & (df.response.notnull()) & (df.correction == False)] - ) - - correct_reject = len( - df[(df.outcome == "correct") & (df.response.isnull()) & (df.correction == False)] - ) - - fa_rate = (false_alarms + 0.5) / (false_alarms + correct_reject + 1) - - return (norm.ppf(hit_rate) + norm.ppf(fa_rate))/-2 - - -def trial_count(df, trial_type="all", correction=False, disregard_correction=True): - ''' Defines a function to return the number of trials, with the option of returning the number of trials for a particular trial type - - Args: - df: dataframe containing session data - trial_type: all, hits, misses, false_alarms, correct_rejections, cued, precued. Default output is total number of trials. - correction: "True" or "False" to specify correction or random trials, respectively. Default is False (i.e. return only random trials). - disregard_correction: Return trial count irrespective of whether they were correction trials. This will override the value of `correction` if True. Default is True - - Output: - float representing the number of trials for the specified trial type. - - Example: - no_of_hits = trial_count(df, hits)''' - - if not disregard_correction: - df = df[df.correction == correction] - - if trial_type == "all": - return df.outcome.count() - if trial_type == "hits": - return df[(df.outcome == "correct") & (df.response.notnull())].outcome.count() - if trial_type == "misses": - return df[(df.outcome == "incorrect") & (df.response.isnull())].outcome.count() - if trial_type == "false_alarms": - return df[(df.outcome == "incorrect") & (df.response.notnull())].outcome.count() - if trial_type == "correct_rejections": - return df[(df.outcome == "correct") & df(df.response.isnull())].outcome.count() - if trial_type == "cued": - return df[(df.outcome != "precued")].outcome.count() - if trial_type == "precued": - return df[(df.outcome == "precued")].outcome.count() - else: - raise ValueError(f"Invalid trial type {trial_type}") - + +def criterion(hit_rate: float, fa_rate: float) -> float: + if hit_rate == 0 and fa_rate == 0: + raise ValueError("Cannot calculate C with hit and false alarm rates of zero.") + + z_H = norm.ppf(hit_rate) + z_FA = norm.ppf(fa_rate) + + decision_criterion = -(z_H + z_FA) / 2 + + return float(decision_criterion) + + +def perseveration(num_correction_trials: int, num_incorrect: int) -> float: + if num_incorrect == 0: + return 0.0 + + return float(num_correction_trials / num_incorrect) diff --git a/src/visiomode_analysis/session/plots.py b/src/visiomode_analysis/session/plots.py index e69de29..3774db3 100644 --- a/src/visiomode_analysis/session/plots.py +++ b/src/visiomode_analysis/session/plots.py @@ -0,0 +1,343 @@ +# Copyright (c) 2026 Constantinos Eleftheriou . +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this +# software and associated documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, subject to the +# following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies +# or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import plotly.express as px +import plotly.graph_objects as go + +import numpy as np + +OUTCOME_COLORS = { + "correct": "green", + "incorrect": "salmon", + "no_response": "gold", + "precued": "violet", +} +SDT_COLORS = { + "hit": "darkgreen", + "false_alarm": "darksalmon", + "correct_rejection": "lightgreen", + "miss": "gold", +} + + +def plot_success_pie(num_correct, num_incorrect, num_miss, as_html=False) -> str | go.Figure: + labels = ["Correct", "Incorrect", "No response"] + values = [num_correct, num_incorrect, num_miss] + fig = go.Figure( + go.Pie( + labels=labels, + values=values, + marker={"colors": ["green", "salmon", "gold"]}, + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + ) + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_cued_pie(num_cued, num_precued, as_html=False) -> str | go.Figure: + labels = ["Cued", "Uncued"] + values = [num_cued, num_precued] + fig = go.Figure( + go.Pie( + labels=labels, + values=values, + marker={ + "colors": [ + "skyblue", + "violet", + ] + }, + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + ) + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_correction_pie(num_random, num_correction, as_html=False) -> str | go.Figure: + labels = ["Random", "Correction"] + values = [num_random, num_correction] + fig = go.Figure( + go.Pie( + labels=labels, + values=values, + marker={ + "colors": [ + "slateblue", + "orange", + ] + }, + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + ) + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_rt_median(rts, stimulus_duration=4, as_html=False) -> str | go.Figure: + fig = go.Figure( + go.Scatter( + y=[np.median(rts)], + error_y=dict( + type="data", + symmetric=False, + array=[np.percentile(rts, 75)], + arrayminus=[ + np.percentile(rts, 25), + ], + ), + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + layout_yaxis_range=[0, stimulus_duration], + ) + fig.update_xaxes(showticklabels=False) + + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_rt_medians_from_dict(rt_dict: dict, stimulus_duration: int = 4, as_html=True) -> str | go.Figure: + fig = go.Figure( + go.Scatter( + y=[np.median(rt) for rt in rt_dict.values()], + x=[key for key in rt_dict.keys()], + error_y=dict( + type="data", + symmetric=False, + array=[np.percentile(rt, 75) for rt in rt_dict.values()], + arrayminus=[np.percentile(rt, 25) for rt in rt_dict.values()], + ), + mode="markers", + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + layout_yaxis_range=[0, stimulus_duration], + ) + + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_rt_distribution(rts, as_html=False) -> str | go.Figure: ... + + +def plot_single_yvalue(value, ymin=0.0, ymax=1.0, as_html=False): + fig = go.Figure( + go.Scatter( + y=[value], + marker={"symbol": "x", "size": 12}, + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + layout_yaxis_range=[ + ymin if ymin < value else value * 1.25, + ymax if value < ymax else value * 1.25, + ], + ) + fig.update_xaxes(showticklabels=False) + + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_roc(hit_rate, fa_rate, hit_rate_wc=None, fa_rate_wc=None, as_html=False) -> str | go.Figure: + fig = go.Figure( + layout=go.Layout( + margin={"l": 40, "r": 40, "t": 40, "b": 40}, + ), + layout_yaxis_range=[0, 1], + layout_xaxis_range=[0, 1], + ) + fig.add_trace( + go.Scatter( + x=[fa_rate], + y=[hit_rate], + marker={"symbol": "x", "size": 12, "color": "slateblue"}, + name="Random", + ), + ) + + fig.update_layout( + shapes=[ + dict( + type="line", + yref="y", + y0=0, + y1=1, + xref="x", + x0=0, + x1=1, + line_dash="dash", + opacity=0.8, + fillcolor="grey", + ) + ], + xaxis={"title": "FA rate"}, + yaxis={"title": "Hit rate"}, + ) + + has_wc = hit_rate_wc is not None and fa_rate_wc is not None + if has_wc: + fig.add_trace( + go.Scatter( + x=[fa_rate_wc], + y=[hit_rate_wc], + marker={"symbol": "x", "size": 12, "color": "orange"}, + name="All", + ), + ) + + fig.update_layout(showlegend=has_wc) + fig.update_xaxes(constrain="domain") + fig.update_yaxes(scaleanchor="x") + + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_dprime(d_prime, d_prime_wc=None, as_html=False): + fig = go.Figure( + go.Scatter( + y=[d_prime], + marker={"symbol": "x", "size": 12, "color": "slateblue"}, + name="d'", + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + layout_yaxis_range=[-0.25, 4.25], + ) + + fig.add_hline(y=1.5, line_color="grey", opacity=0.8, line_dash="dash") + fig.add_hline(y=0.0, line_color="darkred", opacity=0.8) + fig.update_xaxes(showticklabels=False) + + if d_prime_wc is not None: + fig.add_trace( + go.Scatter(y=[d_prime_wc], marker={"symbol": "x", "size": 12, "color": "orange"}, name="d' (all)"), + ) + + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_criterion(criterion, criterion_wc=None, as_html=False): + fig = go.Figure( + go.Scatter( + y=[criterion], + marker={"symbol": "x", "size": 12, "color": "slateblue"}, + name="C", + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + layout_yaxis_range=[-3.25, 3.25], + ) + + fig.add_hline(y=0.0, line_color="grey", opacity=0.8, line_dash="dash") + fig.update_xaxes(showticklabels=False) + + if criterion_wc is not None: + fig.add_trace( + go.Scatter(y=[criterion_wc], marker={"symbol": "x", "size": 12, "color": "orange"}, name="C (all)"), + ) + + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_sdt_pie(num_hits, num_false_alarms, num_correct_rejections, num_misses, as_html=False) -> str | go.Figure: + labels = ["Hits", "False alarms", "Correct rejections", "Misses"] + values = [num_hits, num_false_alarms, num_correct_rejections, num_misses] + fig = go.Figure( + go.Pie( + labels=labels, + values=values, + marker={"colors": ["darkgreen", "darksalmon", "lightgreen", "gold"]}, + ), + layout=go.Layout( + margin={"l": 20, "r": 20, "t": 20, "b": 20}, + ), + ) + if as_html: + return fig.to_html(full_html=False) + return fig + + +def plot_trial_timeseries(trials, use_sdt=False, as_html=True): + fig = go.Figure( + layout=go.Layout( + margin={"l": 10, "r": 10, "t": 10, "b": 10}, + ), + ) + + if use_sdt: + for sdt_type in trials.sdt_type.unique(): + outcome_timestamps = trials[trials.sdt_type == sdt_type].stop_time.values + fig.add_trace( + go.Scatter( + mode="markers", + x=outcome_timestamps, + y=[0 for _ in outcome_timestamps], + marker={"symbol": "line-ns-open", "size": 20, "color": SDT_COLORS.get(sdt_type, "violet")}, + name=sdt_type, + ), + ) + else: + for outcome in trials.outcome.unique(): + outcome_timestamps = trials[trials.outcome == outcome].stop_time.values + fig.add_trace( + go.Scatter( + mode="markers", + x=outcome_timestamps, + y=[0 for _ in outcome_timestamps], + marker={"symbol": "line-ns-open", "size": 20, "color": OUTCOME_COLORS.get(outcome, "violet")}, + name=outcome, + ), + ) + + fig.update_yaxes(showticklabels=False) + fig.update_xaxes( + range=[0, max(trials.stop_time.values)], + ) + if as_html: + return fig.to_html(full_html=False) + return fig diff --git a/src/visiomode_analysis/session/regressor.py b/src/visiomode_analysis/session/regressor.py new file mode 100644 index 0000000..93f250c --- /dev/null +++ b/src/visiomode_analysis/session/regressor.py @@ -0,0 +1,162 @@ +# Copyright (c) 2026 Constantinos Eleftheriou . +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this +# software and associated documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, subject to the +# following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies +# or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import numpy as np +import pandas as pd + + +def generate_gonogo_regressors( + trials_df: pd.DataFrame, + timestamps: np.ndarray | list, + go_stim_id: str = "movinggrating", + nogo_stim_id: str = "isoluminantgray", + uncued_push_id: str = "precued", + correct_outcome_id: str = "correct", + lever_push_duration: float = 0.08, + reward_duration: float = 1.5, + trial_epoch_only: bool = False, +) -> tuple[np.ndarray, dict, np.ndarray]: + """Generate regressors for the Go/NoGo paradigm for a custom set of timestamps. + + Args: + trials (pd.DataFrame): A DataFrame containing trial data with columns for trial type, + start time, and stop time. + timestamps (np.ndarray | list): An array or list of timestamps at which to evaluate the + regressors. This would typically correspond to the timestamps of an imaging session or other continuous recording, relative to the start time of the behavioural session. Timestamps should be in seconds and aligned to the start of the behaviour. + go_stim_id (str, optional): The identifier for the Go stimulus. Defaults to "movinggrating". + nogo_stim_id (str, optional): The identifier for the No-Go stimulus. + Defaults to "isoluminantgray". + uncued_push_id (str, optional): The identifier for uncued push responses. Defaults to "uncued". + correct_outcome_id (str, optional): The identifier for correct trial outcomes. Defaults to "correct". + lever_push_duration (float, optional): The duration of a lever push in seconds. Defaults to 0.08, which is lever push duration from Dacre et al. 2021. + reward_duration (float, optional): The duration of the reward in seconds. Defaults to 1.5. + trial_epoch_only (bool, optional): If True, only timestamps that fall within the trial epochs will be considered for regressor generation. Timestamps outside of trial epochs will be ignored. Defaults to False. + + Returns: + np.ndarray: A 2D array where each row corresponds to a timestamp and each column + corresponds to a regressor (e.g., stimulus, response, reward). + dict: A dictionary mapping regressor names to their corresponding column indices in the + output array. + trial_entries (np.ndarray): A boolean array indicating which timestamps fall within trial epochs. True for timestamps that are within a trial, False otherwise. + """ + timestamps = np.asarray(timestamps, dtype=float) + + response_times = np.array(trials_df[trials_df.sdt_type == "hit"].response_time.values) + leverpush_rt = np.nanmedian(response_times) + + start_time = trials_df["start_time"].to_numpy(dtype=float) + stop_time = trials_df["stop_time"].to_numpy(dtype=float) + cue_onset = trials_df["cue_onset"].to_numpy(dtype=float) + stim_id = trials_df["stim_id"].to_numpy() + outcome = trials_df["outcome"].to_numpy() + leverpush = trials_df["response"].notna().to_numpy() + + # For every timestamp find the index of the trial that contains it (start_time < ts < stop_time). + ts_indexes = np.searchsorted(start_time, timestamps, side="right") - 1 + trial_entries = ts_indexes >= 0 + trial_entries[trial_entries] &= start_time[ts_indexes[trial_entries]] < timestamps[trial_entries] + trial_entries[trial_entries] &= stop_time[ts_indexes[trial_entries]] > timestamps[trial_entries] + + entry_idx = np.nonzero(trial_entries)[0] + + if len(entry_idx) == 0: + raise ValueError("No trials found for the provided timestamps.") + + ts = timestamps[entry_idx] + trial_idx = ts_indexes[entry_idx] + + # Stimulus regressors + regr_stim_go = ( + (stim_id[trial_idx] == go_stim_id) + & (ts >= cue_onset[trial_idx]) + & (ts <= stop_time[trial_idx] - lever_push_duration) + ).astype(int) + regr_stim_nogo = ( + (stim_id[trial_idx] == nogo_stim_id) + & (ts >= cue_onset[trial_idx]) + & (ts <= cue_onset[trial_idx] + leverpush_rt - lever_push_duration) + # & (ts <= stop_time[trial_idx] - (leverpush_rt + lever_push_duration)) + ).astype(int) + + # Response regressors + regr_resp_cuedpush = ( + leverpush[trial_idx] + & ((stim_id[trial_idx] == go_stim_id) | (stim_id[trial_idx] == nogo_stim_id)) + & (ts >= stop_time[trial_idx] - lever_push_duration) + & (ts <= stop_time[trial_idx]) + ).astype(int) + regr_resp_uncuedpush = ( + leverpush[trial_idx] + & (outcome[trial_idx] == uncued_push_id) + & (ts >= stop_time[trial_idx] - lever_push_duration) + & (ts <= stop_time[trial_idx]) + ).astype(int) + + # define hold regressor based on average lever push RT + push_window_start = cue_onset[trial_idx] + leverpush_rt - lever_push_duration + push_window_end = cue_onset[trial_idx] + leverpush_rt + regr_resp_hold = (~leverpush[trial_idx] & (ts >= push_window_start) & (ts <= push_window_end)).astype(int) + + # Reward regressor, depends on previous trial + has_previous = trial_idx > 0 + previous_outcome = np.where(has_previous, outcome[np.maximum(trial_idx - 1, 0)], None) # type: ignore + regr_reward = ( + has_previous & (previous_outcome == correct_outcome_id) & (ts <= start_time[trial_idx] + reward_duration) + ).astype(int) + + if not trial_epoch_only: + # Timestamps that fall outside every trial window (e.g. inter-trial intervals) get all-zero rows, so the output always matches the length of the input timestamps. + regressors = np.zeros((len(timestamps), 6), dtype=int) + regressors[entry_idx] = np.stack( + [ + regr_stim_go, + regr_stim_nogo, + regr_resp_cuedpush, + regr_resp_uncuedpush, + regr_resp_hold, + regr_reward, + ], + axis=1, + ) + else: + # Only return timestamps that fall within trial epochs + regressors = np.stack( + [ + regr_stim_go, + regr_stim_nogo, + regr_resp_cuedpush, + regr_resp_uncuedpush, + regr_resp_hold, + regr_reward, + ], + axis=1, + ) + + regressor_names = { + 0: "stim_go", + 1: "stim_nogo", + 2: "resp_cuedpush", + 3: "resp_uncuedpush", + 4: "resp_hold", + 5: "reward", + } + + return regressors, regressor_names, trial_entries diff --git a/src/visiomode_analysis/subject/__init__.py b/src/visiomode_analysis/subject/__init__.py new file mode 100644 index 0000000..9f185b1 --- /dev/null +++ b/src/visiomode_analysis/subject/__init__.py @@ -0,0 +1,80 @@ +# Copyright (c) 2026 Constantinos Eleftheriou . +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this +# software and associated documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, subject to the +# following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies +# or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import click +import glob +import warnings +import pandas as pd + +import visiomode_analysis.session as session + + +@click.command("subject") +@click.argument( + "directory", + type=click.Path(exists=True, dir_okay=True, file_okay=False), +) +@click.option( + "-o", + "--output-dir", + type=click.Path(dir_okay=True), + default=".", + help="Output directory for report and trials files.", +) +def subject_cmd(**kwargs): + with warnings.catch_warnings(action="ignore"): + out_dir = preprocess_subject(**kwargs) + click.echo(f"Files saved under {out_dir}") + + +def preprocess_subject(directory, output_dir: str = ".") -> str: + collate_sessions(directory=directory, output_dir=output_dir) + return output_dir + + +def collate_sessions(directory, output_dir: str | None) -> pd.DataFrame | tuple[pd.DataFrame, str]: + session_files = glob.glob(f"{directory}{os.sep}*trials.csv") + + if not session_files: + raise FileNotFoundError(f"No trials.csv files found in {directory}, did you forget to preprocess?") + + subject_sessions = [] + for session_file in session_files: + subject_sessions.append(session.summary(session_file)) + + subject_df = pd.DataFrame(subject_sessions) + + subject_df = subject_df.sort_values("session_date").reset_index(drop=True) + subject_df["session_id"] = subject_df.index + 1 + subject_df["task_session"] = subject_df.groupby(["animal_id", "protocol"], sort=False)["session_id"].rank( + ascending=True + ) + + metadata = { + "animal_id": subject_df["animal_id"][0], + "experiment": subject_df["experiment"][0], + } + + if output_dir: + out_path = f"{output_dir}{os.sep}sub-{metadata.get('animal_id')}_exp-{metadata.get('experiment')}_behaviour-summary.csv" + subject_df.to_csv(out_path) + return subject_df diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..6b250b1 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,104 @@ +import datetime +import os +import pathlib + +import numpy as np +import pandas as pd +import pytest + +from visiomode_analysis import session + +REPO_ROOT = pathlib.Path(__file__).resolve().parents[1] + + +@pytest.fixture +def gonogo_session_json_path() -> str: + """Path to a real (anonymised) Go/NoGo session recording, used as an integration fixture.""" + return str(REPO_ROOT / "exploratory" / "test_data" / "example-gonogo-leverpush.json") + + +def _gonogo_regressor_timestamps(gonogo_session_json_path) -> list[str]: + """Absolute ISO timestamps that land just after the cue onset of real trials in + `gonogo_session_json_path`, so regressor generation has something to find.""" + trials = session.get_trials(gonogo_session_json_path) + metadata = session.get_metadata(gonogo_session_json_path) + session_start = datetime.datetime.fromisoformat(metadata["session_start_time"]) + + offsets = trials["cue_onset"].dropna().head(3) + 0.2 + return [(session_start + datetime.timedelta(seconds=offset)).isoformat() for offset in offsets] + + +@pytest.fixture +def gonogo_regressor_timestamps_csv_path(tmp_path, gonogo_session_json_path) -> str: + """A `--regressor-timestamps` CSV built from `_gonogo_regressor_timestamps`.""" + timestamps = _gonogo_regressor_timestamps(gonogo_session_json_path) + + path = tmp_path / "regressor_timestamps.csv" + path.write_text("timestamp\n" + "\n".join(timestamps) + "\n") + return str(path) + + +@pytest.fixture +def gonogo_regressor_timestamps_txt_path(tmp_path, gonogo_session_json_path) -> str: + """The whitespace-delimited TXT equivalent of `gonogo_regressor_timestamps_csv_path`.""" + timestamps = _gonogo_regressor_timestamps(gonogo_session_json_path) + + path = tmp_path / "regressor_timestamps.txt" + path.write_text("\n".join(timestamps) + "\n") + return str(path) + + +@pytest.fixture +def write_trials_csv(): + """Factory fixture that writes a minimal preprocessed trials.csv with just enough columns + for `session.summary` (and therefore `subject.collate_sessions`) to run on.""" + + def _write(directory, filename, animal_id, session_date, protocol, experiment, environment="unknown"): + rows = [ + dict(outcome="correct", correction=False, sdt_type="hit", response_time=0.5, response="leverpush"), + dict( + outcome="incorrect", correction=False, sdt_type="false_alarm", response_time=0.3, response="leverpush" + ), + dict( + outcome="correct", correction=False, sdt_type="correct_rejection", response_time=np.nan, response=None + ), + dict(outcome="incorrect", correction=True, sdt_type=None, response_time=np.nan, response=None), + dict(outcome="precued", correction=False, sdt_type=None, response_time=np.nan, response=None), + ] + df = pd.DataFrame(rows) + df["animal_id"] = animal_id + df["session_date"] = session_date + df["protocol"] = protocol + df["experiment"] = experiment + df["environment"] = environment + + path = os.path.join(directory, filename) + df.to_csv(path, index=False) + return path + + return _write + + +@pytest.fixture +def flatten_trial(): + """Factory fixture that runs a single trial dict through the private + `session._flatten_trials` generator, with sensible default session metadata that individual + tests can override via `metadata_overrides`.""" + + def _flatten(trial, metadata_overrides=None, session_start_time="2022-01-01T00:00:00"): + metadata = { + "session_start_time": session_start_time, + "stimulus_duration": 4000, + "environment": "unknown", + "protocol": "gonogo", + "stimuli": { + "target_id": "movinggrating", + "target_contrast": "1.0", + "distractor_id": "isoluminantgray", + }, + } + if metadata_overrides: + metadata.update(metadata_overrides) + return next(iter(session._flatten_trials({"trials": [trial]}, metadata=metadata))) + + return _flatten diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..c31a745 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,153 @@ +import os + +import pytest +from click.testing import CliRunner + +from visiomode_analysis import cli, group, session, subject +from visiomode_analysis.__about__ import __version__ + + +@pytest.fixture +def runner(): + return CliRunner() + + +# -- `visiomode-analysis session` -- + + +def test_session_cmd_writes_trials_csv_and_report(runner, gonogo_session_json_path, tmp_path): + result = runner.invoke(session.session_cmd, [gonogo_session_json_path, "-o", str(tmp_path)]) + + assert result.exit_code == 0, result.output + assert f"Files saved under {tmp_path}" in result.output + + written = os.listdir(tmp_path) + assert any(name.endswith("_trials.csv") for name in written) + assert any(name.endswith("_report-session.html") for name in written) + + +def test_session_cmd_no_report_skips_report_generation(runner, gonogo_session_json_path, tmp_path): + result = runner.invoke(session.session_cmd, [gonogo_session_json_path, "-o", str(tmp_path), "--no-report"]) + + assert result.exit_code == 0, result.output + + written = os.listdir(tmp_path) + assert any(name.endswith("_trials.csv") for name in written) + assert not any(name.endswith("_report-session.html") for name in written) + + +def test_session_cmd_with_regressors_requires_timestamps_option(runner, gonogo_session_json_path, tmp_path): + result = runner.invoke(session.session_cmd, [gonogo_session_json_path, "-o", str(tmp_path), "--with-regressors"]) + + assert result.exit_code != 0 + assert isinstance(result.exception, ValueError) + + +def test_session_cmd_with_regressors_writes_regressors_file( + runner, gonogo_session_json_path, gonogo_regressor_timestamps_csv_path, tmp_path +): + result = runner.invoke( + session.session_cmd, + [ + gonogo_session_json_path, + "-o", + str(tmp_path), + "--with-regressors", + "--regressor-timestamps", + gonogo_regressor_timestamps_csv_path, + ], + ) + + assert result.exit_code == 0, result.output + assert any(name.endswith("_regressors.npz") for name in os.listdir(tmp_path)) + + +def test_session_cmd_rejects_a_path_that_does_not_exist(runner, tmp_path): + result = runner.invoke(session.session_cmd, [str(tmp_path / "missing.json")]) + + assert result.exit_code == 2 + assert "does not exist" in result.output + + +# -- `visiomode-analysis regressors` -- + + +def test_regressors_cmd_writes_regressors_file( + runner, gonogo_session_json_path, gonogo_regressor_timestamps_csv_path, tmp_path +): + result = runner.invoke( + session.regressors_cmd, + [ + gonogo_session_json_path, + "-o", + str(tmp_path), + "--regressor-timestamps", + gonogo_regressor_timestamps_csv_path, + ], + ) + + assert result.exit_code == 0, result.output + assert f"Regressors saved under {tmp_path}" in result.output + assert any(name.endswith("_regressors.npz") for name in os.listdir(tmp_path)) + + +def test_regressors_cmd_requires_regressor_timestamps_option(runner, gonogo_session_json_path): + result = runner.invoke(session.regressors_cmd, [gonogo_session_json_path]) + + assert result.exit_code == 2 + assert "regressor-timestamps" in result.output.lower() + + +# -- `visiomode-analysis subject` -- + + +def test_subject_cmd_writes_summary_csv(runner, tmp_path, write_trials_csv): + write_trials_csv(tmp_path, "a_trials.csv", "A1", "2022-01-01", "gonogo", "expX") + + result = runner.invoke(subject.subject_cmd, [str(tmp_path), "-o", str(tmp_path)]) + + assert result.exit_code == 0, result.output + assert f"Files saved under {tmp_path}" in result.output + assert (tmp_path / "sub-A1_exp-expX_behaviour-summary.csv").exists() + + +def test_subject_cmd_raises_for_a_directory_with_no_trials_csv(runner, tmp_path): + result = runner.invoke(subject.subject_cmd, [str(tmp_path)]) + + assert result.exit_code != 0 + assert isinstance(result.exception, FileNotFoundError) + + +# -- `visiomode-analysis group` (currently an unimplemented stub) -- + + +def test_group_cmd_is_a_no_op(runner): + result = runner.invoke(group.group_cmd, []) + + assert result.exit_code == 0 + assert result.output == "" + + +# -- Top-level `cli` group wiring -- + + +def test_cli_reports_its_version(runner): + result = runner.invoke(cli, ["--version"]) + + assert result.exit_code == 0 + assert __version__ in result.output + + +def test_cli_lists_all_subcommands(runner): + result = runner.invoke(cli, ["--help"]) + + assert result.exit_code == 0 + for command_name in ("session", "regressors", "subject", "group"): + assert command_name in result.output + + +def test_cli_dispatches_to_session_subcommand(runner, gonogo_session_json_path, tmp_path): + result = runner.invoke(cli, ["session", gonogo_session_json_path, "-o", str(tmp_path), "--no-report"]) + + assert result.exit_code == 0, result.output + assert any(name.endswith("_trials.csv") for name in os.listdir(tmp_path)) diff --git a/tests/test_flatten_trials.py b/tests/test_flatten_trials.py new file mode 100644 index 0000000..072bce3 --- /dev/null +++ b/tests/test_flatten_trials.py @@ -0,0 +1,142 @@ +"""Tests for `session._flatten_trials`'s handling of older Visiomode JSON formats: sessions +recorded before an explicit `stimulus`/`sdt_type` field existed on each trial, where the presented +stimulus and signal-detection classification instead have to be reconstructed from the trial's +`outcome`/`response` and the session-level `stimuli` metadata. +""" + +import numpy as np + +BASE_TRIAL = dict( + timestamp="2022-01-01T00:00:01", + iti=5.0, + response_time=0.5, + outcome="correct", + correction=False, +) + + +def test_unknown_response_name_resolves_via_hf_environment(flatten_trial): + trial = flatten_trial( + {**BASE_TRIAL, "response": {"name": None, "timestamp": "2022-01-01T00:00:02"}, "sdt_type": "hit"}, + metadata_overrides={"environment": "hf"}, + ) + + assert trial["response"] == "leverpush" + # An explicit `sdt_type` on the trial (newer format) is used as-is rather than re-derived. + assert trial["sdt_type"] == "hit" + + +def test_unknown_response_name_resolves_via_freelymoving_environment(flatten_trial): + trial = flatten_trial( + {**BASE_TRIAL, "response": {"name": None, "timestamp": "2022-01-01T00:00:02"}}, + metadata_overrides={"environment": "freelymoving"}, + ) + + assert trial["response"] == "touch" + + +def test_legacy_gonogo_hit_reconstructs_target_stimulus_from_metadata(flatten_trial): + trial = flatten_trial( + {**BASE_TRIAL, "response": {"name": "leverpush", "timestamp": "2022-01-01T00:00:02"}, "outcome": "correct"} + ) + + assert trial["stim_id"] == "movinggrating" + assert trial["stim_contrast"] == "1.0" + + +def test_legacy_gonogo_false_alarm_reconstructs_distractor_stimulus_from_metadata(flatten_trial): + trial = flatten_trial( + {**BASE_TRIAL, "response": {"name": "leverpush", "timestamp": "2022-01-01T00:00:02"}, "outcome": "incorrect"} + ) + + assert trial["stim_id"] == "isoluminantgray" + + +def test_legacy_gonogo_correct_rejection_reconstructs_distractor_stimulus(flatten_trial): + trial = flatten_trial({**BASE_TRIAL, "response": None, "outcome": "correct"}) + + assert trial["sdt_type"] == "correct_rejection" + assert trial["stim_id"] == "isoluminantgray" + + +def test_legacy_gonogo_miss_reconstructs_target_stimulus_and_classifies_as_miss(flatten_trial): + trial = flatten_trial({**BASE_TRIAL, "response": None, "outcome": "incorrect"}) + + assert trial["sdt_type"] == "miss" + assert trial["stim_id"] == "movinggrating" + + +def test_stimulus_literal_none_string_is_treated_as_no_stimulus(flatten_trial): + trial = flatten_trial({**BASE_TRIAL, "response": None, "stimulus": "None"}) + + assert "stim_id" not in trial + # With no stimulus, there's nothing to cue, so cue_onset is left undefined. + assert np.isnan(trial["cue_onset"]) + + +def test_stimulus_with_common_name_uses_single_stimulus_format(flatten_trial): + trial = flatten_trial({**BASE_TRIAL, "response": None, "stimulus": {"common_name": "grating", "contrast": 0.5}}) + + assert trial["stim_common_name"] == "grating" + assert trial["stim_contrast"] == 0.5 + + +def test_stimulus_with_unrecognised_shape_yields_no_stimulus(flatten_trial): + # Neither a "common_name" nor a "target" key: an unrecognised stimulus dict shape is left + # unhandled and produces no stimulus fields, same as if none were presented at all. + trial = flatten_trial({**BASE_TRIAL, "response": None, "stimulus": {"unexpected_key": "value"}}) + + assert not any(key.startswith(("stim_", "target_", "distractor_")) for key in trial) + assert np.isnan(trial["cue_onset"]) + + +def test_stimulus_with_target_and_distractor_keys_uses_2afc_format(flatten_trial): + trial = flatten_trial( + { + **BASE_TRIAL, + "response": None, + "stimulus": {"target": {"id": "left_shape"}, "distractor": {"id": "right_shape"}}, + } + ) + + assert trial["target_id"] == "left_shape" + assert trial["distractor_id"] == "right_shape" + + +def test_legacy_targetonly_hit_reconstructs_target_stimulus(flatten_trial): + trial = flatten_trial( + {**BASE_TRIAL, "response": {"name": "touch", "timestamp": "2022-01-01T00:00:02"}, "outcome": "correct"}, + metadata_overrides={"protocol": "targetonly"}, + ) + + assert trial["stim_id"] == "movinggrating" + + +def test_legacy_targetonly_no_response_reconstructs_target_stimulus(flatten_trial): + trial = flatten_trial( + {**BASE_TRIAL, "response": None, "outcome": "no_response"}, + metadata_overrides={"protocol": "targetonly"}, + ) + + assert trial["stim_id"] == "movinggrating" + + +def test_legacy_targetonly_unmatched_response_outcome_combo_yields_no_stimulus(flatten_trial): + # Neither "response present and correct" nor "no_response": e.g. an incorrect trial with a + # response isn't reconstructed under the legacy targetonly branch, and yields no stimulus. + trial = flatten_trial( + {**BASE_TRIAL, "response": {"name": "touch", "timestamp": "2022-01-01T00:00:02"}, "outcome": "incorrect"}, + metadata_overrides={"protocol": "targetonly"}, + ) + + assert "stim_id" not in trial + assert np.isnan(trial["cue_onset"]) + + +def test_legacy_other_protocol_uses_raw_stimuli_dict_unchanged(flatten_trial): + trial = flatten_trial({**BASE_TRIAL, "response": None}, metadata_overrides={"protocol": "afc2"}) + + # Unlike the gonogo/targetonly branches, this fallback doesn't rename keys to "stim_*". + assert trial["target_id"] == "movinggrating" + assert trial["distractor_id"] == "isoluminantgray" + assert "stim_id" not in trial diff --git a/tests/test_metrics.py b/tests/test_metrics.py new file mode 100644 index 0000000..948f408 --- /dev/null +++ b/tests/test_metrics.py @@ -0,0 +1,46 @@ +import math + +import pytest + +from visiomode_analysis.session import metrics + + +def test_d_prime_of_perfect_and_zero_rates_cancel_out(): + # Symmetric hit/false-alarm rates around 0.5 give equidistant z-scores, so d' is zero. + assert metrics.d_prime(0.5, 0.5) == pytest.approx(0.0) + + +def test_d_prime_matches_known_value(): + # z(0.8) - z(0.2) = 0.8416... - (-0.8416...) = 1.6832... + assert metrics.d_prime(0.8, 0.2) == pytest.approx(1.6832424671458286) + + +def test_d_prime_applies_afc_correction(): + uncorrected = metrics.d_prime(0.8, 0.2, afc_correction=False) + corrected = metrics.d_prime(0.8, 0.2, afc_correction=True) + + assert corrected == pytest.approx(uncorrected * (1 / math.sqrt(2))) + + +@pytest.mark.parametrize("hit_rate,fa_rate", [(0.0, 0.5), (0.5, 0.0), (1.0, 0.5), (0.5, 1.0)]) +def test_d_prime_rejects_boundary_rates(hit_rate, fa_rate): + with pytest.raises(ValueError): + metrics.d_prime(hit_rate, fa_rate) + + +def test_criterion_is_zero_when_rates_are_symmetric(): + assert metrics.criterion(0.8, 0.2) == pytest.approx(0.0) + assert metrics.criterion(0.5, 0.5) == pytest.approx(0.0) + + +def test_criterion_rejects_both_rates_zero(): + with pytest.raises(ValueError): + metrics.criterion(0.0, 0.0) + + +def test_perseveration_is_ratio_of_correction_to_incorrect_trials(): + assert metrics.perseveration(num_correction_trials=5, num_incorrect=10) == pytest.approx(0.5) + + +def test_perseveration_is_zero_when_no_incorrect_trials(): + assert metrics.perseveration(num_correction_trials=5, num_incorrect=0) == 0.0 diff --git a/tests/test_plots.py b/tests/test_plots.py new file mode 100644 index 0000000..4947a62 --- /dev/null +++ b/tests/test_plots.py @@ -0,0 +1,214 @@ +import numpy as np +import pandas as pd +import pytest + +from visiomode_analysis.session import plots + + +def _assert_embeddable_html(html): + assert isinstance(html, str) + assert " pd.DataFrame: + """Three hand-crafted Go/NoGo trials covering a hit, a false alarm, and a correct rejection. + + Trial 0: hit on the "go" stimulus, lever pushed at RT=0.5s (sets the median RT used for + the "hold" and "nogo" windows below). + Trial 1: false alarm on the "nogo" stimulus, lever pushed at RT=0.3s. + Trial 2: correct rejection on the "nogo" stimulus, no lever push. + """ + return pd.DataFrame( + [ + dict( + start_time=0.0, + stop_time=5.0, + cue_onset=1.0, + stim_id="movinggrating", + outcome="correct", + response="leverpush", + sdt_type="hit", + response_time=0.5, + ), + dict( + start_time=5.0, + stop_time=10.0, + cue_onset=6.0, + stim_id="isoluminantgray", + outcome="incorrect", + response="leverpush", + sdt_type="false_alarm", + response_time=0.3, + ), + dict( + start_time=10.0, + stop_time=15.0, + cue_onset=11.0, + stim_id="isoluminantgray", + outcome="correct", + response=None, + sdt_type="correct_rejection", + response_time=np.nan, + ), + ] + ) + + +def test_generate_gonogo_regressors_flags_expected_events(gonogo_trials): + # leverpush_rt = median hit response_time = 0.5s, so windows below are relative to that. + timestamps = [ + 0.5, # trial 0, before cue onset -> nothing + 1.5, # trial 0, during the go stimulus -> stim_go + 4.95, # trial 0, in the final 0.08s before stop -> cued lever push + 5.2, # trial 1, ITI following a correct trial -> reward + 6.3, # trial 1, within the nogo/leverpush-RT window -> stim_nogo (and still within reward window) + 9.95, # trial 1, in the final 0.08s before stop -> cued lever push + 11.45, # trial 2, in the expected-push hold window, but no push -> resp_hold + 20.0, # outside every trial window -> excluded entirely + ] + + regressors, labels, trial_entries = rgr.generate_gonogo_regressors( + gonogo_trials, timestamps, trial_epoch_only=True + ) + + assert labels == { + 0: "stim_go", + 1: "stim_nogo", + 2: "resp_cuedpush", + 3: "resp_uncuedpush", + 4: "resp_hold", + 5: "reward", + } + + # The last timestamp falls after every trial's stop_time, so it's dropped from the entries. + np.testing.assert_array_equal(trial_entries, [True, True, True, True, True, True, True, False]) + + expected = np.array( + [ + [0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 1], + [0, 1, 0, 0, 0, 1], + [0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 1, 0], + ] + ) + np.testing.assert_array_equal(regressors, expected) + + +def test_generate_gonogo_regressors_pads_zero_rows_outside_trial_epochs(gonogo_trials): + timestamps = [0.5, 20.0] + + regressors, _, trial_entries = rgr.generate_gonogo_regressors(gonogo_trials, timestamps, trial_epoch_only=False) + + # Unlike trial_epoch_only=True, every input timestamp gets a row, zero-filled outside trials. + assert regressors.shape == (len(timestamps), 6) + np.testing.assert_array_equal(regressors[1], [0, 0, 0, 0, 0, 0]) + np.testing.assert_array_equal(trial_entries, [True, False]) + + +def test_generate_gonogo_regressors_raises_when_no_timestamp_falls_in_a_trial(gonogo_trials): + with pytest.raises(ValueError, match="No trials found"): + rgr.generate_gonogo_regressors(gonogo_trials, [100.0, 200.0]) diff --git a/tests/test_session.py b/tests/test_session.py new file mode 100644 index 0000000..699ffb8 --- /dev/null +++ b/tests/test_session.py @@ -0,0 +1,145 @@ +import datetime +import json +import shutil + +import numpy as np +import pandas as pd +import pytest + +from visiomode_analysis import session + + +def test_get_metadata_reads_spec_and_filename_derived_fields(gonogo_session_json_path): + metadata = session.get_metadata(gonogo_session_json_path) + + assert metadata["protocol"] == "gonogo" + assert metadata["response_device"] == "leverpush" + assert metadata["reward_profile"] == "waterreward" + assert metadata["stimulus_duration"] == 4000.0 + assert metadata["iti"] == 5000.0 + assert metadata["session_date"] == datetime.date(2022, 3, 9) + assert metadata["stimuli"]["target_id"] == "movinggrating" + assert metadata["stimuli"]["distractor_id"] == "isoluminantgray" + + +def test_get_metadata_prefers_bids_style_filename_over_json_contents(gonogo_session_json_path, tmp_path): + # The example fixture's own filename has none of the sub-/exp-/ses-/behaviour- markers, so + # get_metadata falls back to the JSON's own animal_id/experiment/environment fields for it. + # Copying it to a BIDS-style name exercises the filename-parsing branches instead, which take + # priority over those JSON fields. + bids_path = tmp_path / "sub-ZZ99_exp-testexp_ses-20230115_behaviour-hf.json" + shutil.copy(gonogo_session_json_path, bids_path) + + metadata = session.get_metadata(str(bids_path)) + + assert metadata["animal_id"] == "ZZ99" + assert metadata["experiment"] == "testexp" + assert metadata["session_date"] == datetime.date(2023, 1, 15) + assert metadata["environment"] == "hf" + + +def test_get_trials_returns_one_row_per_input_trial(gonogo_session_json_path): + with open(gonogo_session_json_path) as fp: + num_source_trials = len(json.load(fp)["trials"]) + + trials = session.get_trials(gonogo_session_json_path) + + assert isinstance(trials, pd.DataFrame) + assert len(trials) == num_source_trials + + +def test_get_trials_normalises_legacy_outcome_labels(gonogo_session_json_path): + trials = session.get_trials(gonogo_session_json_path) + + # Legacy "hit"/"miss"/"false_alarm" outcomes are remapped to correct/incorrect/no_response, + # while the finer-grained SDT classification survives separately in `sdt_type`. + assert set(trials["outcome"].unique()) <= {"correct", "incorrect", "precued"} + assert set(trials["sdt_type"].dropna().unique()) <= {"hit", "miss", "false_alarm", "correct_rejection"} + + +def test_get_rts_only_includes_cued_trials_with_a_response(gonogo_session_json_path): + rts = session.get_rts(gonogo_session_json_path) + + assert isinstance(rts, np.ndarray) + assert len(rts) > 0 + assert np.all(rts >= 0) + + +def test_summary_computes_consistent_trial_counts(gonogo_session_json_path): + result = session.summary(gonogo_session_json_path) + + assert result["animal_id"] == "MM229" + assert result["protocol"] == "gonogo" + assert result["total"] == result["cued_wc"] + result["precued"] + assert result["cued_wc"] == result["hits_wc"] + result["misses_wc"] + result["false_alarms_wc"] + result["correct_rejections_wc"] + assert result["correct_wc"] == result["hits_wc"] + result["correct_rejections_wc"] + + # Rates are Hautus-corrected proportions, so they're always strictly between 0 and 1. + assert 0.0 < result["hit_rate"] < 1.0 + assert 0.0 < result["fa_rate"] < 1.0 + + +def test_summary_reports_nan_iqr_when_no_trial_has_a_response(tmp_path): + # The IQR is computed from trials with a non-null response; when there are none at all, + # np.percentile raises on the empty selection and summary() falls back to NaN instead of + # propagating the error. + rows = [ + dict(outcome="correct", correction=False, sdt_type="hit", response_time=np.nan, response=None), + dict(outcome="incorrect", correction=False, sdt_type="false_alarm", response_time=np.nan, response=None), + dict(outcome="correct", correction=False, sdt_type="correct_rejection", response_time=np.nan, response=None), + dict(outcome="precued", correction=False, sdt_type=None, response_time=np.nan, response=None), + ] + df = pd.DataFrame(rows) + df["animal_id"] = "A1" + df["session_date"] = "2022-01-01" + df["protocol"] = "gonogo" + df["experiment"] = "expX" + df["environment"] = "unknown" + + csv_path = tmp_path / "trials.csv" + df.to_csv(csv_path, index=False) + + result = session.summary(str(csv_path)) + + assert np.isnan(result["rt_iqr"]) + assert np.isnan(result["rt_iqr_wc"]) + + +def test_generate_regressors_accepts_txt_timestamps( + gonogo_session_json_path, gonogo_regressor_timestamps_txt_path, tmp_path +): + trials_df = session.get_trials(gonogo_session_json_path) + metadata = session.get_metadata(gonogo_session_json_path) + + out_path = session.generate_regressors(trials_df, metadata, gonogo_regressor_timestamps_txt_path, output_dir=str(tmp_path)) + + assert out_path.endswith("_regressors.npz") + assert (tmp_path / "sub-MM229_exp-109hrb21d_ses-20220309_behaviour-gonogo_regressors.npz").exists() + + +def test_generate_regressors_rejects_unsupported_timestamps_file_extension(gonogo_session_json_path, tmp_path): + trials_df = session.get_trials(gonogo_session_json_path) + metadata = session.get_metadata(gonogo_session_json_path) + bad_path = tmp_path / "timestamps.xyz" + bad_path.write_text("2022-01-01T00:00:01\n") + + with pytest.raises(ValueError, match="CSV or TXT"): + session.generate_regressors(trials_df, metadata, str(bad_path), output_dir=str(tmp_path)) + + +def test_generate_regressors_rejects_unsupported_protocol(tmp_path): + trials_df = pd.DataFrame( + [dict(start_time=0.0, stop_time=1.0, cue_onset=0.5, stim_id="x", outcome="correct", response=None)] + ) + metadata = { + "protocol": "unsupported-protocol", + "animal_id": "MM229", + "experiment": "exp", + "session_date": "20220101", + "session_start_time": "2022-01-01T00:00:00", + } + timestamps_path = tmp_path / "timestamps.csv" + timestamps_path.write_text("2022-01-01T00:00:01\n") + + with pytest.raises(NotImplementedError): + session.generate_regressors(trials_df, metadata, str(timestamps_path), output_dir=str(tmp_path)) diff --git a/tests/test_subject.py b/tests/test_subject.py new file mode 100644 index 0000000..84c2520 --- /dev/null +++ b/tests/test_subject.py @@ -0,0 +1,61 @@ +import os + +import pandas as pd +import pytest + +from visiomode_analysis import subject + + +def test_collate_sessions_raises_when_no_trials_csv_found(tmp_path): + with pytest.raises(FileNotFoundError, match="No trials.csv files found"): + subject.collate_sessions(directory=str(tmp_path), output_dir=None) + + +def test_collate_sessions_orders_by_date_and_ranks_task_sessions_per_protocol(tmp_path, write_trials_csv): + # Sessions are written out of date order, and span two protocols, to exercise both the + # chronological sort and the per-(animal, protocol) task_session ranking. + write_trials_csv(tmp_path, "a_trials.csv", "A1", "2022-01-03", "gonogo", "expX") + write_trials_csv(tmp_path, "b_trials.csv", "A1", "2022-01-01", "gonogo", "expX") + write_trials_csv(tmp_path, "c_trials.csv", "A1", "2022-01-02", "targetonly", "expX") + + subject_df = subject.collate_sessions(directory=str(tmp_path), output_dir=None) + + assert list(subject_df["session_date"]) == ["2022-01-01", "2022-01-02", "2022-01-03"] + assert list(subject_df["session_id"]) == [1, 2, 3] + + by_date = subject_df.set_index("session_date") + # The two gonogo sessions are the 1st and 2nd gonogo sessions chronologically... + assert by_date.loc["2022-01-01", "task_session"] == 1.0 + assert by_date.loc["2022-01-03", "task_session"] == 2.0 + # ...while the lone targetonly session is the 1st (and only) session of its protocol. + assert by_date.loc["2022-01-02", "task_session"] == 1.0 + + +def test_collate_sessions_does_not_write_csv_when_output_dir_is_falsy(tmp_path, write_trials_csv): + write_trials_csv(tmp_path, "a_trials.csv", "A1", "2022-01-01", "gonogo", "expX") + + subject.collate_sessions(directory=str(tmp_path), output_dir=None) + + assert os.listdir(tmp_path) == ["a_trials.csv"] + + +def test_collate_sessions_writes_summary_csv_with_expected_name(tmp_path, write_trials_csv): + write_trials_csv(tmp_path, "a_trials.csv", "A1", "2022-01-01", "gonogo", "expX") + + subject_df = subject.collate_sessions(directory=str(tmp_path), output_dir=str(tmp_path)) + + out_path = tmp_path / "sub-A1_exp-expX_behaviour-summary.csv" + assert out_path.exists() + + written = pd.read_csv(out_path, index_col=0) + assert list(written["animal_id"]) == list(subject_df["animal_id"]) + assert list(written["session_id"]) == list(subject_df["session_id"]) + + +def test_preprocess_subject_returns_output_dir_and_writes_summary(tmp_path, write_trials_csv): + write_trials_csv(tmp_path, "a_trials.csv", "A1", "2022-01-01", "gonogo", "expX") + + out_dir = subject.preprocess_subject(directory=str(tmp_path), output_dir=str(tmp_path)) + + assert out_dir == str(tmp_path) + assert (tmp_path / "sub-A1_exp-expX_behaviour-summary.csv").exists() diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..8d1bed4 --- /dev/null +++ b/uv.lock @@ -0,0 +1,411 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "narwhals" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/6d/b57c64e5038a8cf071bce391bb11551657a74558877ac961e7fa905ece27/narwhals-2.15.0.tar.gz", hash = "sha256:a9585975b99d95084268445a1fdd881311fa26ef1caa18020d959d5b2ff9a965", size = 603479, upload-time = "2026-01-06T08:10:13.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/2e/cf2ffeb386ac3763526151163ad7da9f1b586aac96d2b4f7de1eaebf0c61/narwhals-2.15.0-py3-none-any.whl", hash = "sha256:cbfe21ca19d260d9fd67f995ec75c44592d1f106933b03ddd375df7ac841f9d6", size = 432856, upload-time = "2026-01-06T08:10:11.511Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, + { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, + { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, + { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, + { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, + { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, + { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, + { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, + { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, + { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, + { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, + { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, + { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, + { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, + { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, + { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, + { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, + { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, + { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, + { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, + { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, + { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, + { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, + { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, + { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, + { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, + { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, + { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, + { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, + { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, + { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/da/b1dc0481ab8d55d0f46e343cfe67d4551a0e14fcee52bd38ca1bd73258d8/pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f", size = 4633005, upload-time = "2026-01-21T15:52:04.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/1e/b184654a856e75e975a6ee95d6577b51c271cd92cb2b020c9378f53e0032/pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850", size = 10313247, upload-time = "2026-01-21T15:50:15.775Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/e04a547ad0f0183bf151fd7c7a477468e3b85ff2ad231c566389e6cc9587/pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2", size = 9913131, upload-time = "2026-01-21T15:50:18.611Z" }, + { url = "https://files.pythonhosted.org/packages/a2/93/bb77bfa9fc2aba9f7204db807d5d3fb69832ed2854c60ba91b4c65ba9219/pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5", size = 10741925, upload-time = "2026-01-21T15:50:21.058Z" }, + { url = "https://files.pythonhosted.org/packages/62/fb/89319812eb1d714bfc04b7f177895caeba8ab4a37ef6712db75ed786e2e0/pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae", size = 11245979, upload-time = "2026-01-21T15:50:23.413Z" }, + { url = "https://files.pythonhosted.org/packages/a9/63/684120486f541fc88da3862ed31165b3b3e12b6a1c7b93be4597bc84e26c/pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9", size = 11756337, upload-time = "2026-01-21T15:50:25.932Z" }, + { url = "https://files.pythonhosted.org/packages/39/92/7eb0ad232312b59aec61550c3c81ad0743898d10af5df7f80bc5e5065416/pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d", size = 12325517, upload-time = "2026-01-21T15:50:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/51/27/bf9436dd0a4fc3130acec0828951c7ef96a0631969613a9a35744baf27f6/pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd", size = 9881576, upload-time = "2026-01-21T15:50:30.149Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/c618b871fce0159fd107516336e82891b404e3f340821853c2fc28c7830f/pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b", size = 9140807, upload-time = "2026-01-21T15:50:32.308Z" }, + { url = "https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd", size = 10334013, upload-time = "2026-01-21T15:50:34.771Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740", size = 9874154, upload-time = "2026-01-21T15:50:36.67Z" }, + { url = "https://files.pythonhosted.org/packages/63/d4/726c5a67a13bc66643e66d2e9ff115cead482a44fc56991d0c4014f15aaf/pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801", size = 10384433, upload-time = "2026-01-21T15:50:39.132Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a", size = 10864519, upload-time = "2026-01-21T15:50:41.043Z" }, + { url = "https://files.pythonhosted.org/packages/00/8d/50858522cdc46ac88b9afdc3015e298959a70a08cd21e008a44e9520180c/pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb", size = 11394124, upload-time = "2026-01-21T15:50:43.377Z" }, + { url = "https://files.pythonhosted.org/packages/86/3f/83b2577db02503cd93d8e95b0f794ad9d4be0ba7cb6c8bcdcac964a34a42/pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f", size = 11920444, upload-time = "2026-01-21T15:50:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1", size = 9730970, upload-time = "2026-01-21T15:50:47.962Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/ff571be435cf1e643ca98d0945d76732c0b4e9c37191a89c8550b105eed1/pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0", size = 9041950, upload-time = "2026-01-21T15:50:50.422Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fa/7f0ac4ca8877c57537aaff2a842f8760e630d8e824b730eb2e859ffe96ca/pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6", size = 10307129, upload-time = "2026-01-21T15:50:52.877Z" }, + { url = "https://files.pythonhosted.org/packages/6f/11/28a221815dcea4c0c9414dfc845e34a84a6a7dabc6da3194498ed5ba4361/pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f", size = 9850201, upload-time = "2026-01-21T15:50:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/ba/da/53bbc8c5363b7e5bd10f9ae59ab250fc7a382ea6ba08e4d06d8694370354/pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70", size = 10354031, upload-time = "2026-01-21T15:50:57.463Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a3/51e02ebc2a14974170d51e2410dfdab58870ea9bcd37cda15bd553d24dc4/pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e", size = 10861165, upload-time = "2026-01-21T15:50:59.32Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/05a51e3cac11d161472b8297bd41723ea98013384dd6d76d115ce3482f9b/pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3", size = 11359359, upload-time = "2026-01-21T15:51:02.014Z" }, + { url = "https://files.pythonhosted.org/packages/ee/56/ba620583225f9b85a4d3e69c01df3e3870659cc525f67929b60e9f21dcd1/pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e", size = 11912907, upload-time = "2026-01-21T15:51:05.175Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8c/c6638d9f67e45e07656b3826405c5cc5f57f6fd07c8b2572ade328c86e22/pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e", size = 9732138, upload-time = "2026-01-21T15:51:07.569Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bf/bd1335c3bf1770b6d8fed2799993b11c4971af93bb1b729b9ebbc02ca2ec/pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be", size = 9033568, upload-time = "2026-01-21T15:51:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/f5e2171914d5e29b9171d495344097d54e3ffe41d2d85d8115baba4dc483/pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98", size = 10741936, upload-time = "2026-01-21T15:51:11.693Z" }, + { url = "https://files.pythonhosted.org/packages/51/88/9a0164f99510a1acb9f548691f022c756c2314aad0d8330a24616c14c462/pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327", size = 10393884, upload-time = "2026-01-21T15:51:14.197Z" }, + { url = "https://files.pythonhosted.org/packages/e0/53/b34d78084d88d8ae2b848591229da8826d1e65aacf00b3abe34023467648/pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb", size = 10310740, upload-time = "2026-01-21T15:51:16.093Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d3/bee792e7c3d6930b74468d990604325701412e55d7aaf47460a22311d1a5/pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812", size = 10700014, upload-time = "2026-01-21T15:51:18.818Z" }, + { url = "https://files.pythonhosted.org/packages/55/db/2570bc40fb13aaed1cbc3fbd725c3a60ee162477982123c3adc8971e7ac1/pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08", size = 11323737, upload-time = "2026-01-21T15:51:20.784Z" }, + { url = "https://files.pythonhosted.org/packages/bc/2e/297ac7f21c8181b62a4cccebad0a70caf679adf3ae5e83cb676194c8acc3/pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c", size = 11771558, upload-time = "2026-01-21T15:51:22.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/46/e1c6876d71c14332be70239acce9ad435975a80541086e5ffba2f249bcf6/pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa", size = 10473771, upload-time = "2026-01-21T15:51:25.285Z" }, + { url = "https://files.pythonhosted.org/packages/c0/db/0270ad9d13c344b7a36fa77f5f8344a46501abf413803e885d22864d10bf/pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b", size = 10312075, upload-time = "2026-01-21T15:51:28.5Z" }, + { url = "https://files.pythonhosted.org/packages/09/9f/c176f5e9717f7c91becfe0f55a52ae445d3f7326b4a2cf355978c51b7913/pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe", size = 9900213, upload-time = "2026-01-21T15:51:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e7/63ad4cc10b257b143e0a5ebb04304ad806b4e1a61c5da25f55896d2ca0f4/pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70", size = 10428768, upload-time = "2026-01-21T15:51:33.018Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/4e4c2d8210f20149fd2248ef3fff26623604922bd564d915f935a06dd63d/pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d", size = 10882954, upload-time = "2026-01-21T15:51:35.287Z" }, + { url = "https://files.pythonhosted.org/packages/c6/60/c9de8ac906ba1f4d2250f8a951abe5135b404227a55858a75ad26f84db47/pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986", size = 11430293, upload-time = "2026-01-21T15:51:37.57Z" }, + { url = "https://files.pythonhosted.org/packages/a1/69/806e6637c70920e5787a6d6896fd707f8134c2c55cd761e7249a97b7dc5a/pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49", size = 11952452, upload-time = "2026-01-21T15:51:39.618Z" }, + { url = "https://files.pythonhosted.org/packages/cb/de/918621e46af55164c400ab0ef389c9d969ab85a43d59ad1207d4ddbe30a5/pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7", size = 9851081, upload-time = "2026-01-21T15:51:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/a1/3562a18dd0bd8c73344bfa26ff90c53c72f827df119d6d6b1dacc84d13e3/pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8", size = 9174610, upload-time = "2026-01-21T15:51:44.312Z" }, + { url = "https://files.pythonhosted.org/packages/ce/26/430d91257eaf366f1737d7a1c158677caaf6267f338ec74e3a1ec444111c/pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73", size = 10761999, upload-time = "2026-01-21T15:51:46.899Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/954eb47736c2b7f7fe6a9d56b0cb6987773c00faa3c6451a43db4beb3254/pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2", size = 10410279, upload-time = "2026-01-21T15:51:48.89Z" }, + { url = "https://files.pythonhosted.org/packages/20/fc/b96f3a5a28b250cd1b366eb0108df2501c0f38314a00847242abab71bb3a/pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a", size = 10330198, upload-time = "2026-01-21T15:51:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/90/b3/d0e2952f103b4fbef1ef22d0c2e314e74fc9064b51cee30890b5e3286ee6/pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084", size = 10728513, upload-time = "2026-01-21T15:51:53.387Z" }, + { url = "https://files.pythonhosted.org/packages/76/81/832894f286df828993dc5fd61c63b231b0fb73377e99f6c6c369174cf97e/pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721", size = 11345550, upload-time = "2026-01-21T15:51:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/34/a0/ed160a00fb4f37d806406bc0a79a8b62fe67f29d00950f8d16203ff3409b/pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac", size = 11799386, upload-time = "2026-01-21T15:51:57.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/2ac00d7255252c5e3cf61b35ca92ca25704b0188f7454ca4aec08a33cece/pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb", size = 10873041, upload-time = "2026-01-21T15:52:00.034Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, +] + +[[package]] +name = "plotly" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/4f/8a10a9b9f5192cb6fdef62f1d77fa7d834190b2c50c0cd256bd62879212b/plotly-6.5.2.tar.gz", hash = "sha256:7478555be0198562d1435dee4c308268187553cc15516a2f4dd034453699e393", size = 7015695, upload-time = "2026-01-14T21:26:51.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl", hash = "sha256:91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4", size = 9895973, upload-time = "2026-01-14T21:26:47.135Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/4b/c89c131aa87cad2b77a54eb0fb94d633a842420fa7e919dc2f922037c3d8/scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd", size = 31381316, upload-time = "2026-01-10T21:24:33.42Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5f/a6b38f79a07d74989224d5f11b55267714707582908a5f1ae854cf9a9b84/scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558", size = 27966760, upload-time = "2026-01-10T21:24:38.911Z" }, + { url = "https://files.pythonhosted.org/packages/c1/20/095ad24e031ee8ed3c5975954d816b8e7e2abd731e04f8be573de8740885/scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7", size = 20138701, upload-time = "2026-01-10T21:24:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/89/11/4aad2b3858d0337756f3323f8960755704e530b27eb2a94386c970c32cbe/scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6", size = 22480574, upload-time = "2026-01-10T21:24:47.266Z" }, + { url = "https://files.pythonhosted.org/packages/85/bd/f5af70c28c6da2227e510875cadf64879855193a687fb19951f0f44cfd6b/scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042", size = 32862414, upload-time = "2026-01-10T21:24:52.566Z" }, + { url = "https://files.pythonhosted.org/packages/ef/df/df1457c4df3826e908879fe3d76bc5b6e60aae45f4ee42539512438cfd5d/scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4", size = 35112380, upload-time = "2026-01-10T21:24:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/5f/bb/88e2c16bd1dd4de19d80d7c5e238387182993c2fb13b4b8111e3927ad422/scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0", size = 34922676, upload-time = "2026-01-10T21:25:04.287Z" }, + { url = "https://files.pythonhosted.org/packages/02/ba/5120242cc735f71fc002cff0303d536af4405eb265f7c60742851e7ccfe9/scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449", size = 37507599, upload-time = "2026-01-10T21:25:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/52/c8/08629657ac6c0da198487ce8cd3de78e02cfde42b7f34117d56a3fe249dc/scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea", size = 36380284, upload-time = "2026-01-10T21:25:15.632Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4a/465f96d42c6f33ad324a40049dfd63269891db9324aa66c4a1c108c6f994/scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379", size = 24370427, upload-time = "2026-01-10T21:25:20.514Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, + { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, + { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, + { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, + { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, + { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, + { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, + { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, + { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, + { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, + { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, + { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, + { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, + { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, + { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "visiomode-analysis" +source = { editable = "." } +dependencies = [ + { name = "click" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "plotly" }, + { name = "scipy" }, +] + +[package.metadata] +requires-dist = [ + { name = "click" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "plotly" }, + { name = "scipy" }, +]