NeuroTechX / NeuroTechX/moabb

[Dataset][Bug] Zhou2020 S-subjects (1–12) loaded as generic EEG1–EEG41 with no montage

Open
#1,120 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
1.1k
Forks
264
Avg merge
1d 13m
Merged PRs (30d)
23

Description

Summary

For Zhou2020, the S-subjects (1–12, 41 EEG channels) are loaded with placeholder channel names EEG1EEG41 and no montage, whereas the A-subjects (13–20, 26 EEG channels) get real 10–20 names and standard_1005. Any channel-name- or position-based analysis (selecting C3/Cz/C4, sensorimotor ROIs, montage/topographies, Laplacian, etc.) therefore silently fails for 12 of the 20 subjects.

Where

moabb/datasets/zhou2020.py, _get_single_subject_data:

if subject <= 12:
    n_eeg = _S_N_EEG               # 41
    ch_names = [f"EEG{i + 1}" for i in range(n_eeg)]   # <-- generic placeholders
else:
    n_eeg = _A_N_EEG               # 26
    ch_names = list(_26CH_NAMES)   # real 10-20 names

and in _npz_to_raw the montage is only set when names are non-generic:

if ch_names[0] != "EEG1":
    raw.set_montage(make_standard_montage("standard_1005"), on_missing="warn")

So the S-cohort has neither names nor positions.

Impact

12/20 subjects are unusable for any spatial/sensorimotor analysis. Downstream tooling that locates C3/Cz/C4 (or a sensorimotor strip) skips these subjects entirely.

What I checked (the names are genuinely not in the distributed data)

  • Raw NPZ (Zenodo record 18988317): the signal array is positional (46 cols = 41 EEG + 4 EOG + 1 trigger); there is no channel-name array.
  • NEMAR BIDS mirror (nm000237): sub-01/..._channels.tsv lists EEG1…EEG41 generically and there is no electrodes.tsv. (sub-13, an A-subject, correctly has 26 named channels.)
  • Paper (Zhou et al., 2021, Front. Hum. Neurosci. 15:701091): documents only the 26 prior-selected electrodes (== the A-cohort _26CH_NAMES), grouped into SMA/PMC/M1/S1 in Fig 1B. The full 41-channel layout for S-subjects is not given.
  • IEEE DataPort / Zenodo description: only "41 EEG + 4 EOG".

Empirical note

I tested the natural guess that the 41 = the 26 selected + 15 extra (i.e. EEG1–26 == _26CH_NAMES, so C3=EEG14, Cz=EEG16, C4=EEG18). A μ-band (8–12 Hz) ERD lateralisation analysis (left- vs right-hand MI) refutes it: EEG14/16/18 are middle-ranked, not the motor channels, whereas an A-subject positive control (real names) shows the expected contralateral C3/C4 pattern. The lateralising channels in the S-cohort sit later in the sequence (≈EEG26–30), consistent with a standard front-to-back acquisition order (e.g. the 64-ch Neuroscan Quik-Cap default), but this cannot be confirmed from the distributed data alone.

Ask

Could the maintainers / data authors provide the ordered 41-channel montage used for the S-subjects (or confirm they follow the Neuroscan 64-ch Quik-Cap default order)? With that, zhou2020.py can set real names + standard_1005 for S-subjects and the whole dataset becomes spatially usable. I'm happy to open the PR once the layout is confirmed.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in moabb/datasets/zhou2020.py, especially _get_single_subject_data and _npz_to_raw, and review how S- and A-subject channel metadata is currently handled. The issue is ready to proceed only after the ordered 41-channel S-subject montage is confirmed by the maintainers or data authors; done means that layout is documented well enough to support real channel names and positions.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.