[Dataset][Bug] Zhou2020 S-subjects (1–12) loaded as generic EEG1–EEG41 with no montage
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 EEG1…EEG41 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
signalarray is positional (46 cols = 41 EEG + 4 EOG + 1 trigger); there is no channel-name array. - NEMAR BIDS mirror (nm000237):
sub-01/..._channels.tsvlistsEEG1…EEG41generically and there is noelectrodes.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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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