Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
e189813
[Tests] Pin current EEGLAB test-port provenance (#329)
suraj-ranganath Sep 19, 2026
c96f1c0
[Tests] Port current popfunc regressions (#330)
suraj-ranganath Sep 19, 2026
8e7d4e7
Port EEGLAB misc and statcond tests (#331)
suraj-ranganath Sep 19, 2026
0b6f3fa
Port core preprocessing workflow tests (#332)
suraj-ranganath Sep 19, 2026
7390d02
Port interpolation and event editing tests (#333)
suraj-ranganath Sep 19, 2026
108b46a
Port current EEGLAB admin and GUI tests (#334)
suraj-ranganath Sep 19, 2026
6f566bb
Port current EEGLAB signal-processing tests (#335)
suraj-ranganath Sep 19, 2026
9dd8824
Port applicable EEGLAB binary tests (#336)
suraj-ranganath Sep 19, 2026
815cf3d
Port current rejection workflow tests (#337)
suraj-ranganath Sep 19, 2026
922cbe3
Port current clean_rawdata tests (#338)
suraj-ranganath Sep 19, 2026
a72f2f8
Port EEGLAB STUDY workflow tests (#339)
suraj-ranganath Sep 19, 2026
e6ae5c3
Port current event and epoch import tests (#340)
suraj-ranganath Sep 19, 2026
8efb9b6
Port current file workflow tests (#341)
suraj-ranganath Sep 19, 2026
bcc537a
Port current core event helper tests (#342)
suraj-ranganath Sep 19, 2026
7cbec7e
Port current dataset workflow tests (#343)
suraj-ranganath Sep 19, 2026
e88cb9b
Port current EEGLAB GUI helper tests (#344)
suraj-ranganath Sep 19, 2026
bb375de
test: port current visual popfunc suite (#345)
suraj-ranganath Sep 19, 2026
66c8c2e
Port administrative data access tests (#346)
suraj-ranganath Sep 19, 2026
439e661
Port current EEGLAB numerical utility tests (#347)
suraj-ranganath Sep 19, 2026
c32ddca
feat: add safe eeglab_execmenu dispatch (#348)
suraj-ranganath Sep 19, 2026
0bd5af2
test: port misc data and event utilities (#349)
suraj-ranganath Sep 19, 2026
7ed4d13
feat: port legacy signal and text helpers (#350)
suraj-ranganath Sep 19, 2026
bd98f53
feat: complete mmo memmap parity (#351)
suraj-ranganath Sep 19, 2026
6690e67
feat: port low-level BDF record tests (#352)
suraj-ranganath Sep 19, 2026
0787dd0
feat: port legacy ICA decomposition tests (#353)
suraj-ranganath Sep 19, 2026
5a22f48
feat: add Neuroscan CNT loading parity (#354)
suraj-ranganath Sep 19, 2026
f5f7761
Add validated GDF export (#355)
suraj-ranganath Sep 19, 2026
b76d797
feat: add standalone BrainVision loader (#356)
suraj-ranganath Sep 19, 2026
90d137e
feat: import ERPSS raw recordings (#357)
suraj-ranganath Sep 19, 2026
7fc9ded
Port EGI RAW loading tests (#358)
suraj-ranganath Sep 19, 2026
37b5ac9
Port segmented EGI MATLAB import tests (#359)
suraj-ranganath Sep 19, 2026
3384ceb
Add statcond arraycomp compatibility (#360)
suraj-ranganath Sep 19, 2026
ba69010
test: lock statcond unpaired factor order (#361)
suraj-ranganath Sep 19, 2026
2d67072
feat: port low-level plotting helpers (#362)
suraj-ranganath Sep 19, 2026
7d7e71c
feat: add CORRMAP component (#363)
suraj-ranganath Sep 19, 2026
bdde52c
feat: add statcondfieldtrip backend (#364)
suraj-ranganath Sep 19, 2026
14dce15
Port miscellaneous visualization test families (#365)
suraj-ranganath Sep 19, 2026
1d4525c
Add grouped STUDY plotting parity (#366)
suraj-ranganath Sep 19, 2026
6137b84
feat: port STUDY dipole plotting (#367)
suraj-ranganath Sep 19, 2026
dfbf07f
feat: support trial-level STUDY factor cells (#368)
suraj-ranganath Sep 19, 2026
2614f87
Implement standalone LIMO workflows (#369)
suraj-ranganath Sep 19, 2026
9955545
feat: add cluster permutation statistics (#370)
suraj-ranganath Sep 19, 2026
2f00919
Complete current EEGLAB test-port coverage (#372)
suraj-ranganath Sep 19, 2026
e8ac563
Fix the resampling ratio for non-integer sampling rates, and drop sym…
neuromechanist Sep 20, 2026
aca0a22
Require Python 3.12, and bound every dependency floor by what Pyodide…
neuromechanist Sep 21, 2026
1e363a7
Merge develop into the browser epic
neuromechanist Sep 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
uses: astral-sh/setup-uv@v5

- name: Install Python
run: uv python install 3.11
run: uv python install 3.12

- name: Run Claude Code
id: claude
Expand Down Expand Up @@ -98,7 +98,7 @@ jobs:
uses: astral-sh/setup-uv@v5

- name: Install Python
run: uv python install 3.11
run: uv python install 3.12

- name: Triage Issue
uses: anthropics/claude-code-action@v1
Expand Down Expand Up @@ -193,7 +193,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Install Python
run: uv python install 3.11
run: uv python install 3.12
- name: Apply Autofix
uses: anthropics/claude-code-action@v1
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ jobs:

- name: Install dependencies
run: |
uv python install 3.11
uv python install 3.12
# ICLabel runs through the packaged ONNX network and raises ImportError
# without its runtime extra rather than degrading to a skip.
uv sync --python 3.11 --extra docs --extra iclabel
uv sync --python 3.12 --extra docs --extra iclabel

- name: Build HTML documentation
run: |
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ jobs:
enable-cache: true
cache-dependency-glob: "uv.lock"

- name: Install Python 3.11
run: uv python install 3.11
- name: Install Python 3.12
run: uv python install 3.12

- name: Install Linux GUI runtime libraries
# PySide6 needs these to import at all; without them the GUI tests fail
Expand All @@ -62,7 +62,7 @@ jobs:
echo "QT_QPA_PLATFORM=offscreen" >> "$GITHUB_ENV"

- name: Install dependencies
run: uv sync --python 3.11 --all-extras --group dev
run: uv sync --python 3.12 --all-extras --group dev

- name: Run Ruff lint
run: uv run --no-sync ruff check .
Expand Down Expand Up @@ -95,8 +95,8 @@ jobs:
enable-cache: true
cache-dependency-glob: "uv.lock"

- name: Install Python 3.11
run: uv python install 3.11
- name: Install Python 3.12
run: uv python install 3.12

- name: Build sdist and wheel
# `uv build`, not `python -m build`: the repo's build/ output directory
Expand Down Expand Up @@ -175,7 +175,7 @@ jobs:
run: |
# shellcheck disable=SC1087
set -euo pipefail
uv venv --python 3.11 /tmp/relcheck
uv venv --python 3.12 /tmp/relcheck
wheel=$(ls dist/*.whl)
VIRTUAL_ENV=/tmp/relcheck uv pip install "${wheel}[iclabel]" "onnxruntime==1.30.0"
VIRTUAL_ENV=/tmp/relcheck uv run --no-project python - <<'PY'
Expand Down Expand Up @@ -208,7 +208,7 @@ jobs:
run: |
# shellcheck disable=SC1087
set -euo pipefail
uv venv --python 3.11 /tmp/relcheck-sdist
uv venv --python 3.12 /tmp/relcheck-sdist
sdist=$(ls dist/*.tar.gz)
VIRTUAL_ENV=/tmp/relcheck-sdist uv pip install "${sdist}[iclabel]" "onnxruntime==1.30.0"
VIRTUAL_ENV=/tmp/relcheck-sdist uv run --no-project python - <<'PY'
Expand Down
27 changes: 19 additions & 8 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ jobs:
enable-cache: true
cache-dependency-glob: "uv.lock"

- name: Install Python 3.11
- name: Install Python 3.12
run: |
uv python install 3.11
uv python install 3.12

- name: Install dependencies
run: |
uv sync --python 3.11 --all-extras --group dev
uv sync --python 3.12 --all-extras --group dev

- name: Run Ruff lint
run: |
Expand All @@ -83,7 +83,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-22.04]
python-version: ["3.10", "3.11", "3.12"]
python-version: ["3.12", "3.13"]
include:
# Test on macOS and Windows for Python 3.12 only
- os: macos-latest
Expand Down Expand Up @@ -172,7 +172,18 @@ jobs:
if: steps.matlab-availability.outputs.available == 'true'
shell: bash
run: |
uv pip install "${MATLAB_ROOT}/extern/engines/python"
# Each MATLAB release ships one engine build covering a fixed set of Python
# versions, and R2024b stops at 3.12:
# "MATLAB Engine for Python supports Python version 3.9, 3.10, 3.11, and
# 3.12, but your version of Python is 3.13"
# A Python version the pinned release does not cover is not a CI failure. It
# means the MATLAB parity tests cannot run, which the availability check below
# already handles by falling through to the plain pytest step. Letting the
# install decide keeps this working automatically once a newer MATLAB release
# covers the version, instead of encoding a compatibility table here.
if ! uv pip install "${MATLAB_ROOT}/extern/engines/python"; then
echo "MATLAB engine does not support Python ${{ matrix.python-version }}; MATLAB parity tests will be skipped"
fi

- name: Check MATLAB Engine availability
id: matlab-engine-availability
Expand Down Expand Up @@ -236,13 +247,13 @@ jobs:
with:
node-version: 22

- name: Install Python 3.11
- name: Install Python 3.12
run: |
uv python install 3.11
uv python install 3.12

- name: Install benchmark dependencies
run: |
uv sync --python 3.11 --group dev --extra iclabel --extra torch
uv sync --python 3.12 --group dev --extra iclabel --extra torch

- name: Build EEGPrep wheel from the working tree
run: |
Expand Down
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.11
3.12
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,9 @@ Primary references:

## Dependencies

- Python support starts at 3.10 per `pyproject.toml`.
- Python support starts at 3.12 per `pyproject.toml`.
- `uv` is the default package and environment manager for development, CI, and agent workflows.
- `.python-version` sets the default development interpreter to Python 3.11.
- `.python-version` sets the default development interpreter to Python 3.12.
- Use `uv sync --group dev` after cloning or when dependencies change.
- Use `uv run python ...` for Python commands so tests run inside the project environment.
- Do not add dependencies for tiny helpers. If a dependency is justified, update `pyproject.toml`, docs, and any CI/install notes.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

[![Tests](https://github.com/sccn/eegprep/actions/workflows/test.yml/badge.svg)](https://github.com/sccn/eegprep/actions/workflows/test.yml)
[![Documentation Status](https://github.com/sccn/eegprep/actions/workflows/docs.yml/badge.svg)](https://github.com/sccn/eegprep/actions/workflows/docs.yml)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/)
[![License](https://img.shields.io/badge/license-BSD--3--Clause-blue)](LICENSE)

EEGPrep is an EEGLAB-compatible, Python-native toolkit for loading, cleaning,
Expand Down
99 changes: 48 additions & 51 deletions docs/parity/eeglab_core_parity_matrix.json
Original file line number Diff line number Diff line change
Expand Up @@ -415,13 +415,16 @@
{
"eeglab_path": "functions/adminfunc/eeglab_execmenu.m",
"eeglab_name": "eeglab_execmenu",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/adminfunc/eeglab_execmenu.py",
"gap_category": "1_long_tail_helper_coverage",
"status": "matlab_runtime_skip",
"rationale": "MATLAB-specific path, help-generation, GUI shim, compatibility, or deployment behavior that should not be recreated in standalone EEGPrep runtime code.",
"status": "implemented",
"rationale": "EEGPrep exposes a safe session-bound dispatcher for registered menu labels and explicit noninteractive parameters without reproducing EEGLAB's global-workspace callback evaluation.",
"responsible_phase": "none",
"user_facing_surface": [],
"test_notes": "No runtime parity tests required; validation should continue proving package code does not depend on the vendored EEGLAB tree."
"user_facing_surface": [
"api",
"console"
],
"test_notes": "Current eeglab_tests workflow coverage verifies menu/function resolution, state synchronization, file and metadata operations, numerical resampling, and deterministic structured replay."
},
{
"eeglab_path": "functions/adminfunc/eeglab_new.m",
Expand Down Expand Up @@ -5031,15 +5034,15 @@
{
"eeglab_path": "functions/sigprocfunc/cbar.m",
"eeglab_name": "cbar",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/cbar.py",
"gap_category": "1_long_tail_helper_coverage",
"status": "matlab_runtime_skip",
"rationale": "Phase 7 triage classified this as MATLAB figure/GUI/runtime support not reached by EEGPrep Qt, matplotlib, console, or tested preprocessing workflows.",
"status": "implemented",
"rationale": "EEGPrep provides standalone vertical, horizontal, positive, full-colormap, partial-colormap, and labelled Matplotlib color bars.",
"responsible_phase": "none",
"user_facing_surface": [
"helper"
],
"test_notes": "No runtime port; covered by parity matrix validation and absence from menu/action workflows."
"test_notes": "Covered by all five current eeglab_tests cbar wrapper methods in tests/test_sigprocfunc_plotting_eeglab_tests.py, with artist arrays, layout, orientation, and ticks asserted."
},
{
"eeglab_path": "functions/sigprocfunc/celltomat.m",
Expand Down Expand Up @@ -5148,15 +5151,15 @@
{
"eeglab_path": "functions/sigprocfunc/copyaxis.m",
"eeglab_name": "copyaxis",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/copyaxis.py",
"gap_category": "1_long_tail_helper_coverage",
"status": "matlab_runtime_skip",
"rationale": "Phase 7 triage classified this as MATLAB figure/GUI/runtime support not reached by EEGPrep Qt, matplotlib, console, or tested preprocessing workflows.",
"status": "implemented",
"rationale": "EEGPrep copies current or explicit Matplotlib axes into standalone figures, preserving common scientific line/image content and axes metadata.",
"responsible_phase": "none",
"user_facing_surface": [
"helper"
],
"test_notes": "No runtime port; covered by parity matrix validation and absence from menu/action workflows."
"test_notes": "Covered by the current copyaxis wrapper method in tests/test_sigprocfunc_plotting_eeglab_tests.py with line, image, labels, limits, styles, and legend assertions."
},
{
"eeglab_path": "functions/sigprocfunc/coregister.m",
Expand Down Expand Up @@ -5465,21 +5468,16 @@
{
"eeglab_path": "functions/sigprocfunc/forcelocs.m",
"eeglab_name": "forcelocs",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/forcelocs.py",
"gap_category": "7_file_format_channel_location",
"status": "stale_skip",
"rationale": "Manual channel-rotation GUI helper has no in-scope caller or deterministic workflow; Phase 2 covers recentering and coordinate conversion through pop_chancenter/convertlocs.",
"status": "implemented",
"rationale": "EEGPrep performs deterministic X-Z and Y-Z whole-montage rotations and refreshes Cartesian, spherical, BESA, and topographic coordinate fields.",
"responsible_phase": "none",
"user_facing_surface": [],
"test_notes": "No runtime parity test required for stale helper classification; matrix validator enforces stale policy fields.",
"stale_policy": {
"menu_reachable": false,
"documented_user_api": false,
"called_by_in_scope_workflow": false,
"required_by_parity_tests": false,
"needed_as_phase_helper": false,
"likely_user_alias": false
}
"user_facing_surface": [
"helper",
"file_channel"
],
"test_notes": "Covered by both current forcelocs wrapper methods in tests/test_sigprocfunc_plotting_eeglab_tests.py against their exact expected 3-D and derived coordinate values."
},
{
"eeglab_path": "functions/sigprocfunc/gettempfolder.m",
Expand Down Expand Up @@ -5508,12 +5506,12 @@
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/headplot.py",
"gap_category": "3_unsupported_options",
"status": "implemented",
"rationale": "Phase 5 implemented plotmeshonly head/sphere preview and orilocs setup behavior for standalone headplot spline setup.",
"rationale": "EEGPrep implements standalone spline setup and 3-D rendering, mesh/original-location options, wireframe lighting-off mode, and the spherical/cartesian example commands.",
"responsible_phase": "none",
"user_facing_surface": [
"helper"
],
"test_notes": "Covered by tests/test_phase4_plot_wrappers.py spline reuse, plotmeshonly preview, orilocs metadata, sample headplot rendering, GUI setup replay, and MATLAB parity tests when available."
"test_notes": "All five current headplot wrapper methods carry provenance across tests/test_phase4_plot_wrappers.py and tests/test_sigprocfunc_plotting_eeglab_tests.py; spline/interpolation MATLAB parity tests run when available."
},
{
"eeglab_path": "functions/sigprocfunc/icaact.m",
Expand Down Expand Up @@ -5873,15 +5871,15 @@
{
"eeglab_path": "functions/sigprocfunc/plotcurve.m",
"eeglab_name": "plotcurve",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/plotcurve.py",
"gap_category": "1_long_tail_helper_coverage",
"status": "matlab_runtime_skip",
"rationale": "Phase 7 triage classified this as MATLAB figure/GUI/runtime support not reached by EEGPrep Qt, matplotlib, console, or tested preprocessing workflows.",
"status": "implemented",
"rationale": "EEGPrep provides standalone multi-curve, mean, error-band, significance-region, labelled, marker, and scalp-inset plotting on Matplotlib axes.",
"responsible_phase": "none",
"user_facing_surface": [
"helper"
],
"test_notes": "No runtime port; covered by parity matrix validation and absence from menu/action workflows."
"test_notes": "The current plotcurve wrapper's eight active cases are covered together in tests/test_sigprocfunc_plotting_eeglab_tests.py with numerical line, mean, mask-region, marker, label, legend, and limit assertions."
},
{
"eeglab_path": "functions/sigprocfunc/plotdata.m",
Expand Down Expand Up @@ -6298,15 +6296,15 @@
{
"eeglab_path": "functions/sigprocfunc/sbplot.m",
"eeglab_name": "sbplot",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/sbplot.py",
"gap_category": "1_long_tail_helper_coverage",
"status": "matlab_runtime_skip",
"rationale": "Phase 7 triage classified this as MATLAB figure/GUI/runtime support not reached by EEGPrep Qt, matplotlib, console, or tested preprocessing workflows.",
"status": "implemented",
"rationale": "EEGPrep creates non-destructive Matplotlib axes in one-based grid cells or spanning opposite corner cells, including tiling within explicit parent bounds.",
"responsible_phase": "none",
"user_facing_surface": [
"helper"
],
"test_notes": "No runtime port; covered by parity matrix validation and absence from menu/action workflows."
"test_notes": "The current sbplot wrapper's grid, spanning, property, and parent-axis cases are covered in tests/test_sigprocfunc_plotting_eeglab_tests.py with concrete bounds and face-color assertions."
},
{
"eeglab_path": "functions/sigprocfunc/shuffle.m",
Expand Down Expand Up @@ -6345,15 +6343,15 @@
{
"eeglab_path": "functions/sigprocfunc/slider.m",
"eeglab_name": "slider",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/sigprocfunc/slider.py",
"gap_category": "1_long_tail_helper_coverage",
"status": "matlab_runtime_skip",
"rationale": "Phase 7 triage classified this as MATLAB figure/GUI/runtime support not reached by EEGPrep Qt, matplotlib, console, or tested preprocessing workflows.",
"status": "implemented",
"rationale": "EEGPrep adds Matplotlib horizontal/vertical viewport widgets, applies EEGLAB's magnification transform, and supports exact layout restoration and optional dismissal suppression.",
"responsible_phase": "none",
"user_facing_surface": [
"helper"
],
"test_notes": "No runtime port; covered by parity matrix validation and absence from menu/action workflows."
"test_notes": "The current slider wrapper's four active control combinations are covered in tests/test_sigprocfunc_plotting_eeglab_tests.py with widget, panning, magnification, suppression, and restoration assertions."
},
{
"eeglab_path": "functions/sigprocfunc/snapread.m",
Expand Down Expand Up @@ -6761,16 +6759,16 @@
{
"eeglab_path": "functions/statistics/statcondfieldtrip.m",
"eeglab_name": "statcondfieldtrip",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/statistics/statcondfieldtrip.py",
"gap_category": "5_statistics_package",
"status": "external_dependency_skip",
"rationale": "Depends on an external MATLAB toolbox, plugin, or web/path integration outside this core parity epic.",
"responsible_phase": "none",
"status": "implemented",
"rationale": "Implemented as a standalone analytic and permutation backend for the maintained paired/unpaired t-test and unpaired one-way ANOVA contract, including pointwise, max-statistic, and explicit-adjacency max-cluster-mass corrections. Automatic FieldTrip structure conversion and neighbour construction remain explicit unsupported boundaries.",
"responsible_phase": "phase_3",
"user_facing_surface": [
"helper",
"statistics"
],
"test_notes": "No standalone parity test required unless a later phase supplies a real Python dependency and reclassifies the row."
"test_notes": "Covered by deterministic SciPy references, seeded Monte Carlo tests, exhaustively enumerated paired and unpaired cluster-null fixtures, and the active calls in the current eeglab_tests statcondfieldtrip wrapper; the wrapper's kmean guard typo is not reproduced."
},
{
"eeglab_path": "functions/statistics/surrogdistrib.m",
Expand Down Expand Up @@ -7580,17 +7578,16 @@
{
"eeglab_path": "functions/studyfunc/std_dipplot.m",
"eeglab_name": "std_dipplot",
"eegprep_equivalent": null,
"eegprep_equivalent": "src/eegprep/functions/studyfunc/std_dipplot.py",
"gap_category": "4_study_group_depth",
"status": "external_dependency_skip",
"rationale": "Dipole plotting depends on DIPFIT/dipole model outputs outside EEGPrep core.",
"responsible_phase": "phase_6",
"status": "implemented",
"rationale": "EEGPrep selects already-localized DIPFIT models through 1-based STUDY cluster membership, computes inspectable centroids, and renders standalone matplotlib views without EEGLAB or FieldTrip at runtime.",
"responsible_phase": "none",
"user_facing_surface": [
"api",
"study"
],
"test_notes": "No standalone parity test required unless a later phase supplies the external dependency and reclassifies this row.",
"follow_up_issue": "https://github.com/sccn/eegprep/issues/149"
"test_notes": "The current std_dipplot wrapper method is provenance-linked to behavioral tests that assert selected dataset/component indices, bilateral coordinates, moments, residual variance, centroids, plot labels, and the joined and centroid modes."
},
{
"eeglab_path": "functions/studyfunc/std_editset.m",
Expand Down
Loading
Loading