Skip to content

v1.6.1

Choose a tag to compare

@bruAristimunha bruAristimunha released this 27 Aug 07:13
· 17 commits to develop since this release
ad1ec68

MOABB 1.6.1 β€” a bug-fix release: 8 changelog entries since v1.6.0.

πŸ“– Full changelog β€” this is a summary.

The one that matters

BNCI2025_001 was leaking its labels. read_raw_eeglab types any channel it does not recognise as eeg, and this dataset ships seven that it does not: x, y, vx, vy, validity, targetPosX and targetPoxY β€” the hand kinematics and the target position of the reaching task. Every paradigm picked them as EEG and handed them to classifiers as features, so models could read the answer instead of decoding it. They are now typed misc. Accuracies reported on this dataset will fall, and that is the correction. Its declared n_channels also disagreed with its own 60-electrode montage; it is now 71, with channel_types={"eeg": 60, "eog": 4, "misc": 7}.

Montages that #700 announced but never shipped

Rodrigues2017, Cattan2019_PHMD and Cattan2019_VR share a 16-electrode setup, and all three spelled the two frontal-central electrodes Fc5/Fc6 β€” the only two of the sixteen names standard_1020 cannot resolve. None of the three loaders called set_montage at all; #700 had fixed only the unit scaling. All three now carry the montage. Rodrigues2017 also declared standard_1010 in its METADATA, which is not a montage MNE can build.

Cattan2019_PHMD's interval said [0, 1] while each marker starts a one-minute relaxation block β€” as the dataset's own block_duration_s=60.0 records. Since SetRawAnnotations derives annotation durations from interval, every block was annotated as lasting one second. It is now [0, 60]; interval[0] is unchanged, so onsets do not move.

Other fixes

  • import moabb no longer restyles your matplotlib. moabb.analysis.plotting applies a seaborn theme to the global rcParams on import, and moabb/analysis/__init__.py imported it eagerly β€” so import moabb.datasets alone changed font.family, axes.grid and axes.spines.* for every figure you drew afterwards, values matplotlib reads at axes creation and a caller therefore cannot undo. The path was indirect: bids_interface imports analysis.results for get_digest, which runs that __init__. Plotting imports are now deferred; every public name still resolves, and an explicit import moabb.analysis.plotting still applies the theme.
  • The monthly download job tested nothing. It ran pytest download.py β€” a file that does not exist β€” so it collected nothing, failed every month since March, and no @pytest.mark.download test ran anywhere in CI. It now points at moabb/tests/test_download.py (537 tests).
  • The NEMAR prefetch guard returned too early. It stopped as soon as the sourcedata store held anything, and the deposit's provenance manifest lands inside it β€” so a store holding only a manifest counted as complete. Presence is now settled per subject from the cached manifest, at no extra network cost.

API change

AcquisitionMetadata.n_channels is now derived from channel_types rather than stored beside it. The two could disagree, and for 34 of the 147 catalogued datasets they did: the field was being used with two meanings, some datasets counting EEG electrodes only and others every recorded channel. It now consistently means the total β€” what each dataset's own sensors list and test_n_channels_matches_raw_data already assumed. Dreyer2023A, for instance, reported 27 against its own 32 sensors and now reports 32. Passing n_channels= to the constructor is no longer accepted.

Install

pip install moabb==1.6.1