From 5d5a3664a59ffe97b126c0f617bbb166500aa430 Mon Sep 17 00:00:00 2001 From: Sara04 Date: Wed, 21 Jun 2023 14:49:16 +0200 Subject: [PATCH 01/14] Adding a new dataset --- moabb/datasets/Dreyer2023.py | 72 ++++++++++++++++++++++++++++++++++++ moabb/datasets/__init__.py | 1 + 2 files changed, 73 insertions(+) create mode 100644 moabb/datasets/Dreyer2023.py diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py new file mode 100644 index 000000000..0aebb5bf3 --- /dev/null +++ b/moabb/datasets/Dreyer2023.py @@ -0,0 +1,72 @@ +""" +A large EEG right-left hand motor imagery dataset. +It is organized into three A, B, C datasets. +https://zenodo.org/record/7554429 +""" + +from functools import partialmethod +import logging +import os +import shutil +from moabb.datasets import download as dl +from pooch import Unzip, retrieve +import zipfile + +from .base import BaseDataset +from .download import get_dataset_path +from pathlib import Path + + +DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" + + +class Dreyer2023(BaseDataset): + def __init__(self, db_id='A', subjects=[]): + assert db_id in ['A', 'B', 'C'], "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." + self.db_id = db_id + self.db_off = dict(A=0, B=60, C=81) + super().__init__(subjects, + sessions_per_subject=1, + events=dict(left_hand=1, right_hand=2), + code='Dreyer2023', + interval=[3, 8], + paradigm='imagery') + + def _get_single_subject_data(self, subject): + + subj_dir_path = self.data_path(subject) + subj_files = os.listdir(subj_dir_path) + print(subj_files) + + + def data_path( + self, subject, path=None, force_update=False, update_path=None, verbose=None + ): + if subject not in self.subject_list: + raise (ValueError("Invalid subject number")) + path = get_dataset_path("DREYER", path) + basepath = os.path.join(path, "MNE-dreyer-2023") + if not os.path.isdir(basepath): + os.makedirs(basepath) + + #dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) + dlpath = '/home/sara/mne_data_test/MNE-dreyer_2023-data/record/7554429/files/BCI Database.zip' + if not os.path.exists(os.path.join(os.path.dirname(dlpath), 'BCI Database')): + with zipfile.ZipFile(dlpath) as zip_file: + zip_file.extractall(os.path.dirname(dlpath)) + + subj_template_path = os.path.join(os.path.dirname(dlpath), 'BCI Database', 'Signals/DATA {0}/{0}{1}') + return subj_template_path.format(self.db_id, subject + self.db_off[self.db_id]) + +class Dreyer2023A(Dreyer2023): + __init__ = partialmethod(Dreyer2023.__init__, "A", subjects=list(range(1, 61))) + +class Dreyer2023B(Dreyer2023): + __init__ = partialmethod(Dreyer2023.__init__, "B", subjects=list(range(1, 22))) + +class Dreyer2023C(Dreyer2023): + __init__ = partialmethod(Dreyer2023.__init__, "C", subjects=list(range(1, 7))) + + + + diff --git a/moabb/datasets/__init__.py b/moabb/datasets/__init__.py index 62ebc2ee4..787d0c1fa 100644 --- a/moabb/datasets/__init__.py +++ b/moabb/datasets/__init__.py @@ -29,6 +29,7 @@ bi2015a, bi2015b, ) +from .Dreyer2023 import Dreyer2023A, Dreyer2023B, Dreyer2023C from .epfl import EPFLP300 from .gigadb import Cho2017 from .huebner_llp import Huebner2017, Huebner2018 From cc5de0ca5e6510bf739e2f86cc3a9e17367a7d5e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 12:54:29 +0000 Subject: [PATCH 02/14] [pre-commit.ci] auto fixes from pre-commit.com hooks --- moabb/datasets/Dreyer2023.py | 51 ++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index 0aebb5bf3..86e954b16 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -4,41 +4,47 @@ https://zenodo.org/record/7554429 """ -from functools import partialmethod import logging import os import shutil -from moabb.datasets import download as dl -from pooch import Unzip, retrieve import zipfile +from functools import partialmethod +from pathlib import Path + +from pooch import Unzip, retrieve + +from moabb.datasets import download as dl from .base import BaseDataset from .download import get_dataset_path -from pathlib import Path DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" class Dreyer2023(BaseDataset): - def __init__(self, db_id='A', subjects=[]): - assert db_id in ['A', 'B', 'C'], "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." + def __init__(self, db_id="A", subjects=[]): + assert db_id in [ + "A", + "B", + "C", + ], "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." self.db_id = db_id self.db_off = dict(A=0, B=60, C=81) - super().__init__(subjects, - sessions_per_subject=1, - events=dict(left_hand=1, right_hand=2), - code='Dreyer2023', - interval=[3, 8], - paradigm='imagery') + super().__init__( + subjects, + sessions_per_subject=1, + events=dict(left_hand=1, right_hand=2), + code="Dreyer2023", + interval=[3, 8], + paradigm="imagery", + ) def _get_single_subject_data(self, subject): - subj_dir_path = self.data_path(subject) subj_files = os.listdir(subj_dir_path) print(subj_files) - def data_path( self, subject, path=None, force_update=False, update_path=None, verbose=None ): @@ -49,24 +55,25 @@ def data_path( if not os.path.isdir(basepath): os.makedirs(basepath) - #dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) - dlpath = '/home/sara/mne_data_test/MNE-dreyer_2023-data/record/7554429/files/BCI Database.zip' - if not os.path.exists(os.path.join(os.path.dirname(dlpath), 'BCI Database')): + # dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) + dlpath = "/home/sara/mne_data_test/MNE-dreyer_2023-data/record/7554429/files/BCI Database.zip" + if not os.path.exists(os.path.join(os.path.dirname(dlpath), "BCI Database")): with zipfile.ZipFile(dlpath) as zip_file: zip_file.extractall(os.path.dirname(dlpath)) - subj_template_path = os.path.join(os.path.dirname(dlpath), 'BCI Database', 'Signals/DATA {0}/{0}{1}') + subj_template_path = os.path.join( + os.path.dirname(dlpath), "BCI Database", "Signals/DATA {0}/{0}{1}" + ) return subj_template_path.format(self.db_id, subject + self.db_off[self.db_id]) + class Dreyer2023A(Dreyer2023): __init__ = partialmethod(Dreyer2023.__init__, "A", subjects=list(range(1, 61))) + class Dreyer2023B(Dreyer2023): __init__ = partialmethod(Dreyer2023.__init__, "B", subjects=list(range(1, 22))) + class Dreyer2023C(Dreyer2023): __init__ = partialmethod(Dreyer2023.__init__, "C", subjects=list(range(1, 7))) - - - - From 4c4ec423de446d295a73e8c5aa1df5057bb855bd Mon Sep 17 00:00:00 2001 From: Sara04 Date: Fri, 23 Jun 2023 18:13:25 +0200 Subject: [PATCH 03/14] Add data loading, update docstring --- moabb/datasets/Dreyer2023.py | 95 ++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index 0aebb5bf3..049e9c1b1 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -15,28 +15,86 @@ from .base import BaseDataset from .download import get_dataset_path from pathlib import Path - - +from mne.io import read_raw_gdf +from os.path import join, dirname +from mne.channels import make_standard_montage +import mne DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" class Dreyer2023(BaseDataset): + """Class for Dreyer2023 dataset management. MI dataset. + + .. admonition:: Dataset summary + + ========== ======= ======= ========== ================= ============ =============== =========== + Name #Subj #Chan #Classes #Trials / class Trials len Sampling rate #Sessions + ========== ======= ======= ========== ================= ============ =============== =========== + Dreyer2023 87 27 2 512 Hz 6 + ========== ======= ======= ========== ================= ============ =============== =========== + + =================== + Dataset description + =================== + A large EEG database with users' profile information for motor imagery + Brain-Computer Interface research + + Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; + Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; + Dreyer Pauline; Pillette Léa + Data manager : Dreyer Pauline + Project leader : Lotte Fabien + Project members : Rimbert Sébastien; Monseigne Thibaut + + """ def __init__(self, db_id='A', subjects=[]): - assert db_id in ['A', 'B', 'C'], "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." + assert db_id in ['A', 'B', 'C'], \ + "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." self.db_id = db_id - self.db_off = dict(A=0, B=60, C=81) - super().__init__(subjects, - sessions_per_subject=1, + self.db_idx_off = dict(A=0, B=60, C=81) + super().__init__(subjects, sessions_per_subject=1, events=dict(left_hand=1, right_hand=2), - code='Dreyer2023', - interval=[3, 8], - paradigm='imagery') + code='Dreyer2023', interval=[3, 8], paradigm='imagery', + doi='10.5281/zenodo.7554429') def _get_single_subject_data(self, subject): - subj_dir_path = self.data_path(subject) - subj_files = os.listdir(subj_dir_path) - print(subj_files) + subj_dir = self.data_path(subject) + subj_id = self.db_id + str(subject + self.db_idx_off[self.db_id]) + + ch_names = ['Fz', 'FCz', 'Cz', 'CPz', 'Pz', 'C1', 'C3', 'C5', + 'C2', 'C4', 'C6', 'EOG1', 'EOG2', 'EOG3', 'EMGg', 'EMGd', + 'F4', 'FC2', 'FC4', 'FC6', 'CP2', 'CP4', 'CP6', 'P4', + 'F3', 'FC1', 'FC3', 'FC5', 'CP1', 'CP3', 'CP5', 'P3'] + + ch_types = ["eeg"] * 11 + ["eog"] * 3 + ["emg"] * 2 + ["eeg"] * 16 + + montage = make_standard_montage("biosemi32") + + # Closed and open eyes baselines + baselines = {} + baselines['ce'] = \ + read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('CE'), + eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) + baselines['oe'] = \ + read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('OE'), + eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) + + # Recordings + recordings = {} + # i - index, n - name, t - type + for r_i, (r_n, r_t) in enumerate(zip(['R1', 'R2', 'R3', 'R4', 'R5', 'R6'], + ['acquisition'] * 2 + ['onlineT'] * 4)): + + # One subject of dataset A has 4 recordings + if r_i > 3 and self.db_id == 'A' and subject == 59: + continue + + recordings['run_%d' % r_i] = \ + read_raw_gdf(join(subj_dir, subj_id + '_{0}_{1}.gdf'.format(r_n, r_t)), + eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) + + return {"session_0": recordings} def data_path( @@ -45,18 +103,17 @@ def data_path( if subject not in self.subject_list: raise (ValueError("Invalid subject number")) path = get_dataset_path("DREYER", path) - basepath = os.path.join(path, "MNE-dreyer-2023") + basepath = join(path, "MNE-dreyer-2023") if not os.path.isdir(basepath): os.makedirs(basepath) - #dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) - dlpath = '/home/sara/mne_data_test/MNE-dreyer_2023-data/record/7554429/files/BCI Database.zip' - if not os.path.exists(os.path.join(os.path.dirname(dlpath), 'BCI Database')): + dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) + if not os.path.exists(join(dirname(dlpath), 'BCI Database')): with zipfile.ZipFile(dlpath) as zip_file: - zip_file.extractall(os.path.dirname(dlpath)) + zip_file.extractall(dirname(dlpath)) - subj_template_path = os.path.join(os.path.dirname(dlpath), 'BCI Database', 'Signals/DATA {0}/{0}{1}') - return subj_template_path.format(self.db_id, subject + self.db_off[self.db_id]) + subj_temp_path = join(dirname(dlpath), 'BCI Database', 'Signals/DATA {0}/{0}{1}') + return subj_temp_path.format(self.db_id, subject + self.db_idx_off[self.db_id]) class Dreyer2023A(Dreyer2023): __init__ = partialmethod(Dreyer2023.__init__, "A", subjects=list(range(1, 61))) From 7efaf94374e4a7a14977c8a1cf0489769dbe2364 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Jun 2023 16:20:40 +0000 Subject: [PATCH 04/14] [pre-commit.ci] auto fixes from pre-commit.com hooks --- moabb/datasets/Dreyer2023.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index c03cf812d..d10813309 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -9,8 +9,12 @@ import shutil import zipfile from functools import partialmethod +from os.path import dirname, join from pathlib import Path +import mne +from mne.channels import make_standard_montage +from mne.io import read_raw_gdf from pooch import Unzip, retrieve from moabb.datasets import download as dl @@ -18,11 +22,6 @@ from .base import BaseDataset from .download import get_dataset_path -from pathlib import Path -from mne.io import read_raw_gdf -from os.path import join, dirname -from mne.channels import make_standard_montage -import mne DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" @@ -41,11 +40,11 @@ class Dreyer2023(BaseDataset): =================== Dataset description =================== - A large EEG database with users' profile information for motor imagery + A large EEG database with users' profile information for motor imagery Brain-Computer Interface research - Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; - Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; + Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; + Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; Dreyer Pauline; Pillette Léa Data manager : Dreyer Pauline Project leader : Lotte Fabien @@ -57,9 +56,9 @@ def __init__(self, db_id='A', subjects=[]): "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." self.db_id = db_id self.db_idx_off = dict(A=0, B=60, C=81) - super().__init__(subjects, sessions_per_subject=1, - events=dict(left_hand=1, right_hand=2), - code='Dreyer2023', interval=[3, 8], paradigm='imagery', + super().__init__(subjects, sessions_per_subject=1, + events=dict(left_hand=1, right_hand=2), + code='Dreyer2023', interval=[3, 8], paradigm='imagery', doi='10.5281/zenodo.7554429') def _get_single_subject_data(self, subject): @@ -68,8 +67,8 @@ def _get_single_subject_data(self, subject): subj_id = self.db_id + str(subject + self.db_idx_off[self.db_id]) ch_names = ['Fz', 'FCz', 'Cz', 'CPz', 'Pz', 'C1', 'C3', 'C5', - 'C2', 'C4', 'C6', 'EOG1', 'EOG2', 'EOG3', 'EMGg', 'EMGd', - 'F4', 'FC2', 'FC4', 'FC6', 'CP2', 'CP4', 'CP6', 'P4', + 'C2', 'C4', 'C6', 'EOG1', 'EOG2', 'EOG3', 'EMGg', 'EMGd', + 'F4', 'FC2', 'FC4', 'FC6', 'CP2', 'CP4', 'CP6', 'P4', 'F3', 'FC1', 'FC3', 'FC5', 'CP1', 'CP3', 'CP5', 'P3'] ch_types = ["eeg"] * 11 + ["eog"] * 3 + ["emg"] * 2 + ["eeg"] * 16 @@ -79,10 +78,10 @@ def _get_single_subject_data(self, subject): # Closed and open eyes baselines baselines = {} baselines['ce'] = \ - read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('CE'), + read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('CE'), eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) baselines['oe'] = \ - read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('OE'), + read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('OE'), eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) # Recordings @@ -90,13 +89,13 @@ def _get_single_subject_data(self, subject): # i - index, n - name, t - type for r_i, (r_n, r_t) in enumerate(zip(['R1', 'R2', 'R3', 'R4', 'R5', 'R6'], ['acquisition'] * 2 + ['onlineT'] * 4)): - + # One subject of dataset A has 4 recordings if r_i > 3 and self.db_id == 'A' and subject == 59: continue recordings['run_%d' % r_i] = \ - read_raw_gdf(join(subj_dir, subj_id + '_{0}_{1}.gdf'.format(r_n, r_t)), + read_raw_gdf(join(subj_dir, subj_id + '_{0}_{1}.gdf'.format(r_n, r_t)), eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) return {"session_0": recordings} From 8bcbb06659b8071ce038cc06355a0c6ea341862f Mon Sep 17 00:00:00 2001 From: Sara04 Date: Tue, 27 Jun 2023 02:03:31 +0200 Subject: [PATCH 05/14] Update dataset and add example --- .../plot_Dreyer_clf_scores_vs_subj_info.py | 55 ++++++++++++++ moabb/datasets/Dreyer2023.py | 73 ++++++++++++++++++- 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 examples/plot_Dreyer_clf_scores_vs_subj_info.py diff --git a/examples/plot_Dreyer_clf_scores_vs_subj_info.py b/examples/plot_Dreyer_clf_scores_vs_subj_info.py new file mode 100644 index 000000000..cebced852 --- /dev/null +++ b/examples/plot_Dreyer_clf_scores_vs_subj_info.py @@ -0,0 +1,55 @@ +import moabb +from moabb.datasets import Dreyer2023A, Dreyer2023B, Dreyer2023C + +import moabb +from moabb.datasets import Dreyer2023A +from moabb.evaluations import WithinSessionEvaluation +from moabb.paradigms import MotorImagery +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA + +from pyriemann.estimation import Covariances +from pyriemann.spatialfilters import CSP +from sklearn.pipeline import make_pipeline +from mne.decoding import Vectorizer +import matplotlib.pyplot as plt +import seaborn as sb +import pandas as pd +dreyer2023 = Dreyer2023A() +paradigm = MotorImagery() +pipelines = {} +pipelines['CSP+LDA'] = make_pipeline(Covariances(estimator="oas"), + CSP(nfilter=6), + LDA(solver="lsqr", shrinkage="auto")) + +evaluation = WithinSessionEvaluation(paradigm=paradigm, datasets=[dreyer2023], + suffix="examples", overwrite=False) +results = evaluation.process(pipelines) + + +############################################################################## +info = dreyer2023.get_subject_info(infos=['Demo_Bio']) +results_info = pd.concat([info, results], axis=1) +fig, ax = plt.subplots(facecolor="white", figsize=[8, 4]) +plt.figure(1) +sb.stripplot( + data=results_info, + y="score", + x="SUJ_gender", + ax=ax, + jitter=True, + alpha=0.5, + zorder=1, + palette="Set1", +) + +sb.pointplot(data=results_info, y="score", x="SUJ_gender", ax=ax, palette="Set1") +ax.set_xticklabels(['Man', 'Woman']) +ax.set_ylabel("ROC AUC") +ax.set_ylim(0.5, 1) + +fig, ax2 = plt.subplots(facecolor="white", figsize=[8, 4]) + +sb.regplot(data=results_info[['score', 'Birth_year']].astype('float32'), + y="score", x="Birth_year", ax=ax2, + scatter_kws = {"color": "black", "alpha": 0.5}, line_kws = {"color": "red"},) +plt.show() \ No newline at end of file diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index d10813309..b61255bf3 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -11,6 +11,7 @@ from functools import partialmethod from os.path import dirname, join from pathlib import Path +import pandas as pd import mne from mne.channels import make_standard_montage @@ -25,6 +26,29 @@ DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" +SUBJ_INFO = \ +{"Demo_Bio": ["SUJ_gender", "Birth_year", "Vision", "Vision_assistance", + "Symptoms_TXT", "Level of study", "Level_knowledge neuro", + "Meditation practice", "Laterality answered", + "Manual activity", "Manual activity TXT"], + "OpenVibe_Perf": ["Perf_RUN_3", "Perf_RUN_4", "Perf_RUN_5", "Perf_RUN_6"], + "Mental_Rotation": ["score", "time_1", "time_2"], + "PRE_session": ["PRE_Mood", "PRE_Mindfulness", "PRE_Motivation", + "PRE_Hours_sleep_last_night", "PRE_Usual_sleep", + "PRE_Level_of_alertness", "PRE_Stimulant_doses_12h", + "PRE_Stimulant_doses_2h", "PRE_Stim_normal", "PRE_Tabacco", + "PRE_Tabacco_normal", "PRE_Alcohol", "PRE_Last_meal", + "PRE_Last_pills", "PRE_Pills_TXT", "PRE_Nervousness", + "PRE_Awakening", "PRE_Concentration"], + "POST_session": ["POST_Mood", "POST_Mindfulness", "POST_Motivation", + "POST_Cognitive load", "POST_Agentivity", + "POST_Expectations_filled"], + "Index_of_Learnig_Style": ["active", "reflexive", "sensory", "intuitive", "visual", + "verbal", "sequential", "global"], + "16Pf5": ["A", "B", "C_", "E", "F", "G", "H", "I", "L", "M", "N", "O", + "Q1", "Q2", "Q3", "Q4", "IM", "EX", "AX", "TM", "IN", "SC", + "Interrogation"] +} class Dreyer2023(BaseDataset): """Class for Dreyer2023 dataset management. MI dataset. @@ -34,7 +58,7 @@ class Dreyer2023(BaseDataset): ========== ======= ======= ========== ================= ============ =============== =========== Name #Subj #Chan #Classes #Trials / class Trials len Sampling rate #Sessions ========== ======= ======= ========== ================= ============ =============== =========== - Dreyer2023 87 27 2 512 Hz 6 + Dreyer2023 87 27 2 20 5s 512 Hz 6 ========== ======= ======= ========== ================= ============ =============== =========== =================== @@ -56,14 +80,55 @@ def __init__(self, db_id='A', subjects=[]): "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." self.db_id = db_id self.db_idx_off = dict(A=0, B=60, C=81) + super().__init__(subjects, sessions_per_subject=1, events=dict(left_hand=1, right_hand=2), code='Dreyer2023', interval=[3, 8], paradigm='imagery', doi='10.5281/zenodo.7554429') + def get_subject_info(self, subjects=[], infos=['Demo_Bio']): + + path = get_dataset_path("DREYER", path=None) + dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) + perform_path = join(dirname(dlpath), 'BCI Database', 'Perfomances.xlsx') + + df = pd.read_excel(perform_path) + + if self.db_id == 'A': + df.columns = df.iloc[1, :] + df = df.iloc[list(range(2,62)), :] + if self.db_id == 'B': + df.columns = df.iloc[65] + df = df.iloc[list(range(66,87)), :] + if self.db_id == 'C': + df.columns = df.iloc[90] + df = df.iloc[list(range(91,97)), :] + df.reset_index(drop=True, inplace=True) + df.columns.name = None + if len(subjects): + subjects = [self.db_id + str(s) + if not str(s).startswith(self.db_id) else str(s) + for s in subjects] + assert not any([s for s in subjects if s not in df['SUJ_ID'].tolist()]),\ + "Invalid subject selection." + df = df.loc[df['SUJ_ID'].isin(subjects)] + + info_select = ['SUJ_ID'] + for i in infos: + if i in SUBJ_INFO.keys(): + for j in SUBJ_INFO[i]: + if j in df.columns: + info_select.append(j) + elif i in df.columns: + info_select.append(i) + else: + raise "Ivalid info selection." + return df[info_select] + def _get_single_subject_data(self, subject): subj_dir = self.data_path(subject) + subj_id = self.db_id + str(subject + self.db_idx_off[self.db_id]) ch_names = ['Fz', 'FCz', 'Cz', 'CPz', 'Pz', 'C1', 'C3', 'C5', @@ -96,8 +161,12 @@ def _get_single_subject_data(self, subject): recordings['run_%d' % r_i] = \ read_raw_gdf(join(subj_dir, subj_id + '_{0}_{1}.gdf'.format(r_n, r_t)), + preload=True, eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) + recordings['run_%d' % r_i].annotations.rename({'769':'left_hand', + '770':'right_hand'}) + return {"session_0": recordings} def data_path( @@ -112,6 +181,8 @@ def data_path( dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) if not os.path.exists(join(dirname(dlpath), 'BCI Database')): + with zipfile.ZipFile(dlpath) as zip_file: + zip_file.extractall(dirname(dlpath)) subj_temp_path = join(dirname(dlpath), 'BCI Database', 'Signals/DATA {0}/{0}{1}') return subj_temp_path.format(self.db_id, subject + self.db_idx_off[self.db_id]) From 8e6eef0d262d94fad7a9d7d2c4ba58bb4d17a719 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 00:06:51 +0000 Subject: [PATCH 06/14] [pre-commit.ci] auto fixes from pre-commit.com hooks --- .../plot_Dreyer_clf_scores_vs_subj_info.py | 51 ++-- moabb/datasets/Dreyer2023.py | 251 +++++++++++++----- 2 files changed, 207 insertions(+), 95 deletions(-) diff --git a/examples/plot_Dreyer_clf_scores_vs_subj_info.py b/examples/plot_Dreyer_clf_scores_vs_subj_info.py index cebced852..b2696ef63 100644 --- a/examples/plot_Dreyer_clf_scores_vs_subj_info.py +++ b/examples/plot_Dreyer_clf_scores_vs_subj_info.py @@ -1,33 +1,33 @@ -import moabb -from moabb.datasets import Dreyer2023A, Dreyer2023B, Dreyer2023C +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sb +from mne.decoding import Vectorizer +from pyriemann.estimation import Covariances +from pyriemann.spatialfilters import CSP +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA +from sklearn.pipeline import make_pipeline import moabb -from moabb.datasets import Dreyer2023A +from moabb.datasets import Dreyer2023A, Dreyer2023B, Dreyer2023C from moabb.evaluations import WithinSessionEvaluation from moabb.paradigms import MotorImagery -from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA -from pyriemann.estimation import Covariances -from pyriemann.spatialfilters import CSP -from sklearn.pipeline import make_pipeline -from mne.decoding import Vectorizer -import matplotlib.pyplot as plt -import seaborn as sb -import pandas as pd + dreyer2023 = Dreyer2023A() paradigm = MotorImagery() pipelines = {} -pipelines['CSP+LDA'] = make_pipeline(Covariances(estimator="oas"), - CSP(nfilter=6), - LDA(solver="lsqr", shrinkage="auto")) - -evaluation = WithinSessionEvaluation(paradigm=paradigm, datasets=[dreyer2023], - suffix="examples", overwrite=False) +pipelines["CSP+LDA"] = make_pipeline( + Covariances(estimator="oas"), CSP(nfilter=6), LDA(solver="lsqr", shrinkage="auto") +) + +evaluation = WithinSessionEvaluation( + paradigm=paradigm, datasets=[dreyer2023], suffix="examples", overwrite=False +) results = evaluation.process(pipelines) ############################################################################## -info = dreyer2023.get_subject_info(infos=['Demo_Bio']) +info = dreyer2023.get_subject_info(infos=["Demo_Bio"]) results_info = pd.concat([info, results], axis=1) fig, ax = plt.subplots(facecolor="white", figsize=[8, 4]) plt.figure(1) @@ -43,13 +43,18 @@ ) sb.pointplot(data=results_info, y="score", x="SUJ_gender", ax=ax, palette="Set1") -ax.set_xticklabels(['Man', 'Woman']) +ax.set_xticklabels(["Man", "Woman"]) ax.set_ylabel("ROC AUC") ax.set_ylim(0.5, 1) fig, ax2 = plt.subplots(facecolor="white", figsize=[8, 4]) -sb.regplot(data=results_info[['score', 'Birth_year']].astype('float32'), - y="score", x="Birth_year", ax=ax2, - scatter_kws = {"color": "black", "alpha": 0.5}, line_kws = {"color": "red"},) -plt.show() \ No newline at end of file +sb.regplot( + data=results_info[["score", "Birth_year"]].astype("float32"), + y="score", + x="Birth_year", + ax=ax2, + scatter_kws={"color": "black", "alpha": 0.5}, + line_kws={"color": "red"}, +) +plt.show() diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index b61255bf3..da6a68a5b 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -11,9 +11,9 @@ from functools import partialmethod from os.path import dirname, join from pathlib import Path -import pandas as pd import mne +import pandas as pd from mne.channels import make_standard_montage from mne.io import read_raw_gdf from pooch import Unzip, retrieve @@ -26,30 +26,88 @@ DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" -SUBJ_INFO = \ -{"Demo_Bio": ["SUJ_gender", "Birth_year", "Vision", "Vision_assistance", - "Symptoms_TXT", "Level of study", "Level_knowledge neuro", - "Meditation practice", "Laterality answered", - "Manual activity", "Manual activity TXT"], - "OpenVibe_Perf": ["Perf_RUN_3", "Perf_RUN_4", "Perf_RUN_5", "Perf_RUN_6"], - "Mental_Rotation": ["score", "time_1", "time_2"], - "PRE_session": ["PRE_Mood", "PRE_Mindfulness", "PRE_Motivation", - "PRE_Hours_sleep_last_night", "PRE_Usual_sleep", - "PRE_Level_of_alertness", "PRE_Stimulant_doses_12h", - "PRE_Stimulant_doses_2h", "PRE_Stim_normal", "PRE_Tabacco", - "PRE_Tabacco_normal", "PRE_Alcohol", "PRE_Last_meal", - "PRE_Last_pills", "PRE_Pills_TXT", "PRE_Nervousness", - "PRE_Awakening", "PRE_Concentration"], - "POST_session": ["POST_Mood", "POST_Mindfulness", "POST_Motivation", - "POST_Cognitive load", "POST_Agentivity", - "POST_Expectations_filled"], - "Index_of_Learnig_Style": ["active", "reflexive", "sensory", "intuitive", "visual", - "verbal", "sequential", "global"], - "16Pf5": ["A", "B", "C_", "E", "F", "G", "H", "I", "L", "M", "N", "O", - "Q1", "Q2", "Q3", "Q4", "IM", "EX", "AX", "TM", "IN", "SC", - "Interrogation"] +SUBJ_INFO = { + "Demo_Bio": [ + "SUJ_gender", + "Birth_year", + "Vision", + "Vision_assistance", + "Symptoms_TXT", + "Level of study", + "Level_knowledge neuro", + "Meditation practice", + "Laterality answered", + "Manual activity", + "Manual activity TXT", + ], + "OpenVibe_Perf": ["Perf_RUN_3", "Perf_RUN_4", "Perf_RUN_5", "Perf_RUN_6"], + "Mental_Rotation": ["score", "time_1", "time_2"], + "PRE_session": [ + "PRE_Mood", + "PRE_Mindfulness", + "PRE_Motivation", + "PRE_Hours_sleep_last_night", + "PRE_Usual_sleep", + "PRE_Level_of_alertness", + "PRE_Stimulant_doses_12h", + "PRE_Stimulant_doses_2h", + "PRE_Stim_normal", + "PRE_Tabacco", + "PRE_Tabacco_normal", + "PRE_Alcohol", + "PRE_Last_meal", + "PRE_Last_pills", + "PRE_Pills_TXT", + "PRE_Nervousness", + "PRE_Awakening", + "PRE_Concentration", + ], + "POST_session": [ + "POST_Mood", + "POST_Mindfulness", + "POST_Motivation", + "POST_Cognitive load", + "POST_Agentivity", + "POST_Expectations_filled", + ], + "Index_of_Learnig_Style": [ + "active", + "reflexive", + "sensory", + "intuitive", + "visual", + "verbal", + "sequential", + "global", + ], + "16Pf5": [ + "A", + "B", + "C_", + "E", + "F", + "G", + "H", + "I", + "L", + "M", + "N", + "O", + "Q1", + "Q2", + "Q3", + "Q4", + "IM", + "EX", + "AX", + "TM", + "IN", + "SC", + "Interrogation", + ], } + class Dreyer2023(BaseDataset): """Class for Dreyer2023 dataset management. MI dataset. @@ -75,45 +133,55 @@ class Dreyer2023(BaseDataset): Project members : Rimbert Sébastien; Monseigne Thibaut """ - def __init__(self, db_id='A', subjects=[]): - assert db_id in ['A', 'B', 'C'], \ - "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." + + def __init__(self, db_id="A", subjects=[]): + assert db_id in [ + "A", + "B", + "C", + ], "Invalid dataset selection! Existing Dreyer2023 datasets: A, B, and C." self.db_id = db_id self.db_idx_off = dict(A=0, B=60, C=81) - super().__init__(subjects, sessions_per_subject=1, - events=dict(left_hand=1, right_hand=2), - code='Dreyer2023', interval=[3, 8], paradigm='imagery', - doi='10.5281/zenodo.7554429') - - def get_subject_info(self, subjects=[], infos=['Demo_Bio']): - + super().__init__( + subjects, + sessions_per_subject=1, + events=dict(left_hand=1, right_hand=2), + code="Dreyer2023", + interval=[3, 8], + paradigm="imagery", + doi="10.5281/zenodo.7554429", + ) + + def get_subject_info(self, subjects=[], infos=["Demo_Bio"]): path = get_dataset_path("DREYER", path=None) dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) - perform_path = join(dirname(dlpath), 'BCI Database', 'Perfomances.xlsx') + perform_path = join(dirname(dlpath), "BCI Database", "Perfomances.xlsx") df = pd.read_excel(perform_path) - if self.db_id == 'A': + if self.db_id == "A": df.columns = df.iloc[1, :] - df = df.iloc[list(range(2,62)), :] - if self.db_id == 'B': + df = df.iloc[list(range(2, 62)), :] + if self.db_id == "B": df.columns = df.iloc[65] - df = df.iloc[list(range(66,87)), :] - if self.db_id == 'C': + df = df.iloc[list(range(66, 87)), :] + if self.db_id == "C": df.columns = df.iloc[90] - df = df.iloc[list(range(91,97)), :] + df = df.iloc[list(range(91, 97)), :] df.reset_index(drop=True, inplace=True) df.columns.name = None if len(subjects): - subjects = [self.db_id + str(s) - if not str(s).startswith(self.db_id) else str(s) - for s in subjects] - assert not any([s for s in subjects if s not in df['SUJ_ID'].tolist()]),\ - "Invalid subject selection." - df = df.loc[df['SUJ_ID'].isin(subjects)] - - info_select = ['SUJ_ID'] + subjects = [ + self.db_id + str(s) if not str(s).startswith(self.db_id) else str(s) + for s in subjects + ] + assert not any( + [s for s in subjects if s not in df["SUJ_ID"].tolist()] + ), "Invalid subject selection." + df = df.loc[df["SUJ_ID"].isin(subjects)] + + info_select = ["SUJ_ID"] for i in infos: if i in SUBJ_INFO.keys(): for j in SUBJ_INFO[i]: @@ -126,15 +194,44 @@ def get_subject_info(self, subjects=[], infos=['Demo_Bio']): return df[info_select] def _get_single_subject_data(self, subject): - subj_dir = self.data_path(subject) subj_id = self.db_id + str(subject + self.db_idx_off[self.db_id]) - ch_names = ['Fz', 'FCz', 'Cz', 'CPz', 'Pz', 'C1', 'C3', 'C5', - 'C2', 'C4', 'C6', 'EOG1', 'EOG2', 'EOG3', 'EMGg', 'EMGd', - 'F4', 'FC2', 'FC4', 'FC6', 'CP2', 'CP4', 'CP6', 'P4', - 'F3', 'FC1', 'FC3', 'FC5', 'CP1', 'CP3', 'CP5', 'P3'] + ch_names = [ + "Fz", + "FCz", + "Cz", + "CPz", + "Pz", + "C1", + "C3", + "C5", + "C2", + "C4", + "C6", + "EOG1", + "EOG2", + "EOG3", + "EMGg", + "EMGd", + "F4", + "FC2", + "FC4", + "FC6", + "CP2", + "CP4", + "CP6", + "P4", + "F3", + "FC1", + "FC3", + "FC5", + "CP1", + "CP3", + "CP5", + "P3", + ] ch_types = ["eeg"] * 11 + ["eog"] * 3 + ["emg"] * 2 + ["eeg"] * 16 @@ -142,30 +239,40 @@ def _get_single_subject_data(self, subject): # Closed and open eyes baselines baselines = {} - baselines['ce'] = \ - read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('CE'), - eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) - baselines['oe'] = \ - read_raw_gdf(join(subj_dir, subj_id + '_{0}_baseline.gdf').format('OE'), - eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) + baselines["ce"] = read_raw_gdf( + join(subj_dir, subj_id + "_{0}_baseline.gdf").format("CE"), + eog=["EOG1", "EOG2", "EOG3"], + misc=["EMGg", "EMGd"], + ) + baselines["oe"] = read_raw_gdf( + join(subj_dir, subj_id + "_{0}_baseline.gdf").format("OE"), + eog=["EOG1", "EOG2", "EOG3"], + misc=["EMGg", "EMGd"], + ) # Recordings recordings = {} # i - index, n - name, t - type - for r_i, (r_n, r_t) in enumerate(zip(['R1', 'R2', 'R3', 'R4', 'R5', 'R6'], - ['acquisition'] * 2 + ['onlineT'] * 4)): - + for r_i, (r_n, r_t) in enumerate( + zip( + ["R1", "R2", "R3", "R4", "R5", "R6"], + ["acquisition"] * 2 + ["onlineT"] * 4, + ) + ): # One subject of dataset A has 4 recordings - if r_i > 3 and self.db_id == 'A' and subject == 59: + if r_i > 3 and self.db_id == "A" and subject == 59: continue - recordings['run_%d' % r_i] = \ - read_raw_gdf(join(subj_dir, subj_id + '_{0}_{1}.gdf'.format(r_n, r_t)), - preload=True, - eog=['EOG1', 'EOG2', 'EOG3'], misc=['EMGg', 'EMGd']) + recordings["run_%d" % r_i] = read_raw_gdf( + join(subj_dir, subj_id + "_{0}_{1}.gdf".format(r_n, r_t)), + preload=True, + eog=["EOG1", "EOG2", "EOG3"], + misc=["EMGg", "EMGd"], + ) - recordings['run_%d' % r_i].annotations.rename({'769':'left_hand', - '770':'right_hand'}) + recordings["run_%d" % r_i].annotations.rename( + {"769": "left_hand", "770": "right_hand"} + ) return {"session_0": recordings} @@ -180,11 +287,11 @@ def data_path( os.makedirs(basepath) dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) - if not os.path.exists(join(dirname(dlpath), 'BCI Database')): - with zipfile.ZipFile(dlpath) as zip_file: + if not os.path.exists(join(dirname(dlpath), "BCI Database")): + with zipfile.ZipFile(dlpath) as zip_file: zip_file.extractall(dirname(dlpath)) - subj_temp_path = join(dirname(dlpath), 'BCI Database', 'Signals/DATA {0}/{0}{1}') + subj_temp_path = join(dirname(dlpath), "BCI Database", "Signals/DATA {0}/{0}{1}") return subj_temp_path.format(self.db_id, subject + self.db_idx_off[self.db_id]) From c4ce3eb5749ad9acbd65c7995bc91dbe3cd52179 Mon Sep 17 00:00:00 2001 From: Sara04 Date: Wed, 5 Jul 2023 18:23:53 +0200 Subject: [PATCH 07/14] Update Dreyer 2023 dataset class and example --- docs/source/datasets.rst | 3 + docs/source/whats_new.rst | 1 + .../plot_Dreyer_clf_scores_vs_subj_info.py | 121 +++- moabb/datasets/Dreyer2023.py | 575 ++++++++++++------ 4 files changed, 497 insertions(+), 203 deletions(-) diff --git a/docs/source/datasets.rst b/docs/source/datasets.rst index 345496196..ea790779e 100644 --- a/docs/source/datasets.rst +++ b/docs/source/datasets.rst @@ -21,6 +21,9 @@ Motor Imagery Datasets BNCI2015001 BNCI2015004 Cho2017 + Dreyer2023A + Dreyer2023B + Dreyer2023C Lee2019_MI MunichMI Ofner2017 diff --git a/docs/source/whats_new.rst b/docs/source/whats_new.rst index 43274be37..9ba82bcae 100644 --- a/docs/source/whats_new.rst +++ b/docs/source/whats_new.rst @@ -28,6 +28,7 @@ Enhancements - Adding saving option for the models (:gh:`401` by `Bruno Aristimunha`_ and `Igor Carrara`_) - Adding example to load different type of models (:gh:`401` by `Bruno Aristimunha`_ and `Igor Carrara`_) - Add resting state paradigm with dataset and example (:gh:`400` by `Gregoire Cattan`_ and `Pedro L. C. Rodrigues`_) +- Add Dreyer 2023 Left-Right Motor Imagery dataset (:gh:`404` by `Sara Sedlar`_ and `Sylvain Chevallier`_) Bugs ~~~~ diff --git a/examples/plot_Dreyer_clf_scores_vs_subj_info.py b/examples/plot_Dreyer_clf_scores_vs_subj_info.py index b2696ef63..497290bb5 100644 --- a/examples/plot_Dreyer_clf_scores_vs_subj_info.py +++ b/examples/plot_Dreyer_clf_scores_vs_subj_info.py @@ -1,60 +1,135 @@ +""" +=============================================== +Examples of analysis of a Dreyer2023 A dataset. +=============================================== + +This example shows how to plot Dreyer2023A Left-Right Imagery ROC AUC scores +obtained with CSP+LDA pipeline versus demographic information of the examined +subjects (gender and age) and experimenters (gender). + +To reduce computational time, the example is provided for four subjects. + +""" +# Authors: Sara Sedlar +# Sylvain Chevallier +# License: BSD (3-clause) + +import matplotlib.patches as mpatches import matplotlib.pyplot as plt import pandas as pd import seaborn as sb -from mne.decoding import Vectorizer from pyriemann.estimation import Covariances from pyriemann.spatialfilters import CSP from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA from sklearn.pipeline import make_pipeline -import moabb -from moabb.datasets import Dreyer2023A, Dreyer2023B, Dreyer2023C +from moabb.datasets import Dreyer2023A from moabb.evaluations import WithinSessionEvaluation from moabb.paradigms import MotorImagery +# 1. Defining dataset, selecting subject for analysis and getting data +######################################################################################## dreyer2023 = Dreyer2023A() +info = dreyer2023.get_subject_info().rename(columns={"score": "score_MR"}) +dreyer2023.subject_list = [1, 5, 7, 45] +dreyer2023.get_data() +######################################################################################## +# 2. Defining MotorImagery paradigm and CSP+LDA pipeline paradigm = MotorImagery() pipelines = {} pipelines["CSP+LDA"] = make_pipeline( Covariances(estimator="oas"), CSP(nfilter=6), LDA(solver="lsqr", shrinkage="auto") ) - +######################################################################################## +# 3. Within session evaluation of the pipeline evaluation = WithinSessionEvaluation( paradigm=paradigm, datasets=[dreyer2023], suffix="examples", overwrite=False ) results = evaluation.process(pipelines) - - -############################################################################## -info = dreyer2023.get_subject_info(infos=["Demo_Bio"]) +results = results.loc[results["subject"].isin([str(s) for s in dreyer2023.subject_list])] +######################################################################################## +# 4. Loading dataset info and concatenation with the obtained results +info = dreyer2023.get_subject_info().rename(columns={"score": "score_MR"}) results_info = pd.concat([info, results], axis=1) -fig, ax = plt.subplots(facecolor="white", figsize=[8, 4]) -plt.figure(1) +results_info["Age"] = 2019 - results_info["Birth_year"] +######################################################################################## +# 5.1 Plotting subject AUC ROC scores vs subject's gender +fig, ax = plt.subplots(nrows=2, ncols=2, facecolor="white", figsize=[16, 8], sharey=True) +fig.subplots_adjust(wspace=0.0, hspace=0.5) sb.stripplot( data=results_info, y="score", x="SUJ_gender", - ax=ax, + ax=ax[0, 0], jitter=True, alpha=0.5, zorder=1, palette="Set1", ) - -sb.pointplot(data=results_info, y="score", x="SUJ_gender", ax=ax, palette="Set1") -ax.set_xticklabels(["Man", "Woman"]) -ax.set_ylabel("ROC AUC") -ax.set_ylim(0.5, 1) - -fig, ax2 = plt.subplots(facecolor="white", figsize=[8, 4]) - +sb.pointplot(data=results_info, y="score", x="SUJ_gender", ax=ax[0, 0], palette="Set1") +ax[0, 0].set_title("AUC ROC scores vs. subject gender") +ax[0, 0].set_xticklabels(["Man", "Woman"]) +ax[0, 0].set_ylabel("ROC AUC") +ax[0, 0].set_xlabel(None) +ax[0, 0].set_ylim(0.3, 1) +######################################################################################## +# 5.2 Plotting subject AUC ROC scores vs experimenter's gender +sb.regplot( + data=results_info[results_info["SUJ_gender"] == 1][["score", "Age"]].astype( + "float32" + ), + y="score", + x="Age", + ax=ax[0, 1], + scatter_kws={"color": "#e41a1c", "alpha": 0.5}, + line_kws={"color": "#e41a1c"}, +) +sb.regplot( + data=results_info[results_info["SUJ_gender"] == 2][["score", "Age"]].astype( + "float32" + ), + y="score", + x="Age", + ax=ax[0, 1], + scatter_kws={"color": "#377eb8", "alpha": 0.5}, + line_kws={"color": "#377eb8"}, +) +ax[0, 1].set_title("AUC ROC scores vs. subject age per gender") +ax[0, 1].set_ylabel(None) +ax[0, 1].set_xlabel(None) +red_man = mpatches.Patch(color="#e41a1c", label="Man") +blue_woman = mpatches.Patch(color="#377eb8", label="Woman") +ax[0, 1].legend(handles=[red_man, blue_woman]) +######################################################################################## +# 5.3 Plotting subject AUC ROC scores vs experimenter's gender +sb.stripplot( + data=results_info, + y="score", + x="EXP_gender", + ax=ax[1, 0], + jitter=True, + alpha=0.5, + zorder=1, + palette="Set1", +) +sb.pointplot(data=results_info, y="score", x="EXP_gender", ax=ax[1, 0], palette="Set1") +ax[1, 0].set_title("AUC ROC scores vs. experimenter gender") +ax[1, 0].set_xticklabels(["Man", "Woman"]) +ax[1, 0].set_ylabel("ROC AUC") +ax[1, 0].set_xlabel(None) +ax[1, 0].set_ylim(0.3, 1) +######################################################################################## +# 5.4 Plotting subject AUC ROC scores vs subject's age sb.regplot( - data=results_info[["score", "Birth_year"]].astype("float32"), + data=results_info[["score", "Age"]].astype("float32"), y="score", - x="Birth_year", - ax=ax2, + x="Age", + ax=ax[1, 1], scatter_kws={"color": "black", "alpha": 0.5}, - line_kws={"color": "red"}, + line_kws={"color": "black"}, ) +ax[1, 1].set_title("AUC ROC scores vs. subject age") +ax[1, 1].set_ylabel(None) +######################################################################################## plt.show() diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index da6a68a5b..d86da0c41 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -1,140 +1,84 @@ """ A large EEG right-left hand motor imagery dataset. It is organized into three A, B, C datasets. -https://zenodo.org/record/7554429 +URL PATH: https://zenodo.org/record/7554429 """ -import logging import os -import shutil import zipfile from functools import partialmethod -from os.path import dirname, join -from pathlib import Path +from os.path import exists, join -import mne import pandas as pd -from mne.channels import make_standard_montage from mne.io import read_raw_gdf -from pooch import Unzip, retrieve - -from moabb.datasets import download as dl +from pooch import retrieve from .base import BaseDataset from .download import get_dataset_path -DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" - -SUBJ_INFO = { - "Demo_Bio": [ - "SUJ_gender", - "Birth_year", - "Vision", - "Vision_assistance", - "Symptoms_TXT", - "Level of study", - "Level_knowledge neuro", - "Meditation practice", - "Laterality answered", - "Manual activity", - "Manual activity TXT", - ], +# fmt: off +RECORD_INFO = { + "Demo_Bio": ["SUJ_gender", "Birth_year", "Vision", "Vision_assistance", + "Symptoms_TXT", "Level of study", "Level_knowledge neuro", + "Meditation practice", "Laterality answered", "Manual activity", + "Manual activity TXT"], "OpenVibe_Perf": ["Perf_RUN_3", "Perf_RUN_4", "Perf_RUN_5", "Perf_RUN_6"], "Mental_Rotation": ["score", "time_1", "time_2"], - "PRE_session": [ - "PRE_Mood", - "PRE_Mindfulness", - "PRE_Motivation", - "PRE_Hours_sleep_last_night", - "PRE_Usual_sleep", - "PRE_Level_of_alertness", - "PRE_Stimulant_doses_12h", - "PRE_Stimulant_doses_2h", - "PRE_Stim_normal", - "PRE_Tabacco", - "PRE_Tabacco_normal", - "PRE_Alcohol", - "PRE_Last_meal", - "PRE_Last_pills", - "PRE_Pills_TXT", - "PRE_Nervousness", - "PRE_Awakening", - "PRE_Concentration", - ], - "POST_session": [ - "POST_Mood", - "POST_Mindfulness", - "POST_Motivation", - "POST_Cognitive load", - "POST_Agentivity", - "POST_Expectations_filled", - ], - "Index_of_Learnig_Style": [ - "active", - "reflexive", - "sensory", - "intuitive", - "visual", - "verbal", - "sequential", - "global", - ], - "16Pf5": [ - "A", - "B", - "C_", - "E", - "F", - "G", - "H", - "I", - "L", - "M", - "N", - "O", - "Q1", - "Q2", - "Q3", - "Q4", - "IM", - "EX", - "AX", - "TM", - "IN", - "SC", - "Interrogation", - ], + "PRE_session": ["PRE_Mood", "PRE_Mindfulness", "PRE_Motivation", + "PRE_Hours_sleep_last_night", "PRE_Usual_sleep", + "PRE_Level_of_alertness", "PRE_Stimulant_doses_12h", + "PRE_Stimulant_doses_2h", "PRE_Stim_normal", "PRE_Tabacco", + "PRE_Tabacco_normal", "PRE_Alcohol", "PRE_Last_meal", + "PRE_Last_pills", "PRE_Pills_TXT", "PRE_Nervousness", + "PRE_Awakening", "PRE_Concentration"], + "POST_session": ["POST_Mood", "POST_Mindfulness", "POST_Motivation", + "POST_Cognitive load", "POST_Agentivity", + "POST_Expectations_filled"], + "Index_of_Learnig_Style": ["active", "reflexive", "sensory", "intuitive", "visual", + "verbal", "sequential", "global"], + "16Pf5": ["A", "B", "C_", "E", "F", "G", "H", "I", "L", "M", "N", "O", "Q1", "Q2", + "Q3", "Q4", "IM", "EX", "AX", "TM", "IN", "SC", "Interrogation"], + "Experimenter_Gender": ['EXP_gender'] } +# fmt: on +DREYER2023_URL = "https://zenodo.org/record/7554429/files/BCI Database.zip" -class Dreyer2023(BaseDataset): - """Class for Dreyer2023 dataset management. MI dataset. - .. admonition:: Dataset summary +def dreyer2023_subject_path(basepath, db_id, subject): + """Returns subject path. If it does not exist, it downloads data first.""" + """ + Arguments: + basepath [str]: path to the datasets + db_id [str]: database ID (options A, B, C) + subject [int]: subject number + Returns: + str: path to the subject's data + """ + subj_path = join(basepath, "BCI Database", "Signals", "DATA {0}", "{0}{1}").format( + db_id, subject + ) + if not exists(subj_path): + if not exists(join(basepath, "data.zip")): + retrieve( + DREYER2023_URL, None, fname="data.zip", path=basepath, progressbar=True + ) + with zipfile.ZipFile(os.path.join(basepath, "data.zip"), "r") as f: + f.extractall(basepath) + os.remove(join(basepath, "data.zip")) + return subj_path - ========== ======= ======= ========== ================= ============ =============== =========== - Name #Subj #Chan #Classes #Trials / class Trials len Sampling rate #Sessions - ========== ======= ======= ========== ================= ============ =============== =========== - Dreyer2023 87 27 2 20 5s 512 Hz 6 - ========== ======= ======= ========== ================= ============ =============== =========== - =================== - Dataset description - =================== - A large EEG database with users' profile information for motor imagery - Brain-Computer Interface research - - Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; - Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; - Dreyer Pauline; Pillette Léa - Data manager : Dreyer Pauline - Project leader : Lotte Fabien - Project members : Rimbert Sébastien; Monseigne Thibaut +class Dreyer2023Base(BaseDataset): + """Class for Dreyer2023 dataset management. MI dataset.""" + """ + Parent class of Dreyer2023A, Dreyer2023B and Dreyer2023C. + Should not be instantiated. """ - def __init__(self, db_id="A", subjects=[]): + def __init__(self, subjects, db_id="A"): assert db_id in [ "A", "B", @@ -147,21 +91,39 @@ def __init__(self, db_id="A", subjects=[]): subjects, sessions_per_subject=1, events=dict(left_hand=1, right_hand=2), - code="Dreyer2023", + code="Dreyer2023" + self.db_id, interval=[3, 8], paradigm="imagery", doi="10.5281/zenodo.7554429", ) - def get_subject_info(self, subjects=[], infos=["Demo_Bio"]): - path = get_dataset_path("DREYER", path=None) - dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) - perform_path = join(dirname(dlpath), "BCI Database", "Perfomances.xlsx") + def get_subject_info(self, path=None, subjects=None, infos=None): + """Loads subject info.""" + """ + Arguments: + path: path to the dataset + subjects: list of subjects + infos: list of recording infos to load + Returns: + DataFrame: selected recording info for given subjects + """ + if isinstance(subjects, type(None)): + subjects = self.subject_list + if len([s for s in subjects if s not in self.subject_list]): + raise ValueError("Ivalid subject selection") + + if isinstance(infos, type(None)): + infos = list(RECORD_INFO.keys()) + + path = get_dataset_path("DREYER", path) + basepath = join(path, "MNE-dreyer-2023") + + perform_path = join(basepath, "BCI Database", "Perfomances.xlsx") df = pd.read_excel(perform_path) if self.db_id == "A": - df.columns = df.iloc[1, :] + df.columns = df.iloc[1] df = df.iloc[list(range(2, 62)), :] if self.db_id == "B": df.columns = df.iloc[65] @@ -171,71 +133,44 @@ def get_subject_info(self, subjects=[], infos=["Demo_Bio"]): df = df.iloc[list(range(91, 97)), :] df.reset_index(drop=True, inplace=True) df.columns.name = None - if len(subjects): - subjects = [ - self.db_id + str(s) if not str(s).startswith(self.db_id) else str(s) - for s in subjects - ] - assert not any( - [s for s in subjects if s not in df["SUJ_ID"].tolist()] - ), "Invalid subject selection." - df = df.loc[df["SUJ_ID"].isin(subjects)] + + subjects = [ + self.db_id + str(s + self.db_idx_off[self.db_id]) + if not str(s).startswith(self.db_id) + else str(s) + for s in subjects + ] + + assert not any( + [s for s in subjects if s not in df["SUJ_ID"].tolist()] + ), "Invalid subject selection." + df = df.loc[df["SUJ_ID"].isin(subjects)] info_select = ["SUJ_ID"] for i in infos: - if i in SUBJ_INFO.keys(): - for j in SUBJ_INFO[i]: + if i in RECORD_INFO.keys(): + for j in RECORD_INFO[i]: if j in df.columns: info_select.append(j) elif i in df.columns: info_select.append(i) else: - raise "Ivalid info selection." - return df[info_select] + raise ValueError("Ivalid info selection.") + + return df[info_select].reset_index(drop=True) def _get_single_subject_data(self, subject): subj_dir = self.data_path(subject) subj_id = self.db_id + str(subject + self.db_idx_off[self.db_id]) - - ch_names = [ - "Fz", - "FCz", - "Cz", - "CPz", - "Pz", - "C1", - "C3", - "C5", - "C2", - "C4", - "C6", - "EOG1", - "EOG2", - "EOG3", - "EMGg", - "EMGd", - "F4", - "FC2", - "FC4", - "FC6", - "CP2", - "CP4", - "CP6", - "P4", - "F3", - "FC1", - "FC3", - "FC5", - "CP1", - "CP3", - "CP5", - "P3", - ] - + # fmt: off + ch_names = ["Fz", "FCz", "Cz", "CPz", "Pz", "C1", "C3", "C5", "C2", "C4", "C6", + "EOG1", "EOG2", "EOG3", "EMGg", "EMGd", "F4", "FC2", "FC4", "FC6", + "CP2", "CP4", "CP6", "P4", "F3", "FC1", "FC3", "FC5", "CP1", "CP3", + "CP5", "P3"] + # fmt: on ch_types = ["eeg"] * 11 + ["eog"] * 3 + ["emg"] * 2 + ["eeg"] * 16 - - montage = make_standard_montage("biosemi32") + ch_map = dict(zip(ch_names, ch_types)) # Closed and open eyes baselines baselines = {} @@ -243,13 +178,16 @@ def _get_single_subject_data(self, subject): join(subj_dir, subj_id + "_{0}_baseline.gdf").format("CE"), eog=["EOG1", "EOG2", "EOG3"], misc=["EMGg", "EMGd"], + verbose="WARNING", ) + baselines["ce"].set_channel_types(ch_map) baselines["oe"] = read_raw_gdf( join(subj_dir, subj_id + "_{0}_baseline.gdf").format("OE"), eog=["EOG1", "EOG2", "EOG3"], misc=["EMGg", "EMGd"], + verbose="WARNING", ) - + baselines["oe"].set_channel_types(ch_map) # Recordings recordings = {} # i - index, n - name, t - type @@ -268,7 +206,9 @@ def _get_single_subject_data(self, subject): preload=True, eog=["EOG1", "EOG2", "EOG3"], misc=["EMGg", "EMGd"], + verbose="WARNING", ) + recordings["run_%d" % r_i].set_channel_types(ch_map) recordings["run_%d" % r_i].annotations.rename( {"769": "left_hand", "770": "right_hand"} @@ -285,23 +225,298 @@ def data_path( basepath = join(path, "MNE-dreyer-2023") if not os.path.isdir(basepath): os.makedirs(basepath) + return dreyer2023_subject_path( + basepath, self.db_id, subject + self.db_idx_off[self.db_id] + ) - dlpath = dl.data_dl(DREYER2023_URL, "DREYER_2023", path) - if not os.path.exists(join(dirname(dlpath), "BCI Database")): - with zipfile.ZipFile(dlpath) as zip_file: - zip_file.extractall(dirname(dlpath)) - subj_temp_path = join(dirname(dlpath), "BCI Database", "Signals/DATA {0}/{0}{1}") - return subj_temp_path.format(self.db_id, subject + self.db_idx_off[self.db_id]) +class Dreyer2023A(Dreyer2023Base): + """Class for Dreyer2023A dataset management. MI dataset. + .. admonition:: Dataset summary -class Dreyer2023A(Dreyer2023): - __init__ = partialmethod(Dreyer2023.__init__, "A", subjects=list(range(1, 61))) + =========== ======= ======= ========== ================= ============ =============== =========== + Name #Subj #Chan #Classes #Trials / class Trials len Sampling rate #Sessions + =========== ======= ======= ========== ================= ============ =============== =========== + Dreyer2023A 60 27 2 20 5s 512 Hz 6 + =========== ======= ======= ========== ================= ============ =============== =========== + Dataset description: -class Dreyer2023B(Dreyer2023): - __init__ = partialmethod(Dreyer2023.__init__, "B", subjects=list(range(1, 22))) + "A large EEG database with users' profile information for motor imagery + Brain-Computer Interface research" [1, 2] + Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; + Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; + Dreyer Pauline; Pillette Léa + Data manager : Dreyer Pauline + Project leader : Lotte Fabien + Project members : Rimbert Sébastien; Monseigne Thibaut + + Dataset Dreyer2023A contains EEG, EOG and EMG signals recorded on 60 healthy subjects + performing Left-Right Motor Imagery experiments + (29 women, age 19-59, M = 29, SD = 9.32) [1]. + Experiments were conducted by six experimenters. In addition, for each recording + the following pieces of information are provided: + subject's demographic, personality and cognitive profiles, the OpenViBE experimental + instructions and codes, and experimenter's gender. + + The experiment is designed for the investigation of the impact of the participant's + and experimenter's gender on MI BCI performance [1]. + + A recording contains open and closed eyes baseline recordings and 6 runs of the MI + experiments. First 2 runs (acquisition runs) were used to train system and + the following 4 runs (training runs) to train the participant. Each run contained + 40 trials [1]. + + Each trial was recorded as follows [1]: + - t=0.00s cross displayed on screen + - t=2.00s accoustic signal announced appearance of a red arrow + - t=3.00s a red arrow appears (subject starts to perform task) + - t=4.25s the red arrow disapears + - t=4.25s the feedback on performance is given in form of a blue bar + with update frequency of 16 Hz + - t=8.00s cross turns off (subject stops to perform task) + + EEG signals [1]: + - recorded with 27 electrodes, namely: + Fz, FCz, Cz, CPz, Pz, C1, C3, C5, C2, C4, C6, F4, FC2, FC4, FC6, CP2, + CP4, CP6, P4, F3, FC1, FC3, FC5, CP1, CP3, CP5, P3 (10-20 system), + referenced to the left earlobe. + + EOG signals [1]: + - recorded with 3 electrodes, namely: EOG1, EOG2, EOG3 + placed below, above and on the side of one eye. + + EMG signals [1]: + - recorded with 2 electrodes, namely: EMGg, EMGd + placed 2.5cm below the skinfold on each wrist. + + Demographic and biosocial information includes: + - gender, birth year, laterality + - vision, vision assistance + - familiarity to cognitive science or neurology, level of education + - physical activity, meditation + - attentional, neurological, psychiatrics symptoms + + Personality and the cognitive profile [1]: + - evaluated via 5th edition of the 16 Personality Factors (16PF5) test + - and mental rotation test + - index of learning style + + Pre and post experiment questionnaires [1]: + - evaluation of pre and post mood, mindfulness and motivational states + + The online OpenViBE BCI classification performance [1]: + - only performance measure used to give the feedback to the participants + + * Subject 59 contains only 4 runs + + # TO DO: + * Article [1] states there is 29/60 women, in the excel file it is 30/60 + * Sampling frequency? 256 Hz in [1], 512 in loaded info and at URL + + [1] Pillette, L., Roc, A., N’kaoua, B., & Lotte, F. (2021). + Experimenters' influence on mental-imagery based brain-computer interface user training. + International Journal of Human-Computer Studies, 149, 102603. + [2] Benaroch, C., Yamamoto, M. S., Roc, A., Dreyer, P., Jeunet, C., & Lotte, F. (2022). + When should MI-BCI feature optimization include prior knowledge, and which one?. + Brain-Computer Interfaces, 9(2), 115-128. + """ + + __init__ = partialmethod( + Dreyer2023Base.__init__, subjects=list(range(1, 61)), db_id="A" + ) + + +class Dreyer2023B(Dreyer2023Base): + """Class for Dreyer2023B dataset management. MI dataset. + + .. admonition:: Dataset summary + + =========== ======= ======= ========== ================= ============ =============== =========== + Name #Subj #Chan #Classes #Trials / class Trials len Sampling rate #Sessions + =========== ======= ======= ========== ================= ============ =============== =========== + Dreyer2023B 21 27 2 20 5s 512 Hz 6 + =========== ======= ======= ========== ================= ============ =============== =========== + + Dataset description: + + "A large EEG database with users' profile information for motor imagery + Brain-Computer Interface research" [1, 2] + + Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; + Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; + Dreyer Pauline; Pillette Léa + Data manager : Dreyer Pauline + Project leader : Lotte Fabien + Project members : Rimbert Sébastien; Monseigne Thibaut + + Dataset Dreyer2023B contains EEG, EOG and EMG signals recorded on 21 healthy subjects + performing Left-Right Motor Imagery experiments + (8 women, age 19-37, M = 29, SD = 9.318) [2]. + Experiments were conducted by female experimenters. In addition, for each recording + the following pieces of information are provided: + subject's demographic, personality and cognitive profiles, the OpenViBE experimental + instructions and codes, and experimenter's gender. + + The experiment is designed for the investigation of the relation between MI-BCI online + performance and Most Discriminant Frequency Band (MDFB) [2]. + + A recording contains open and closed eyes baseline recordings and 6 runs of the MI + experiments. First 2 runs (acquisition runs) were used to train system and + the following 4 runs (training runs) to train the participant. Each run contained + 40 trials [1]. + + Each trial was recorded as follows [1]: + - t=0.00s cross displayed on screen + - t=2.00s accoustic signal announced appearance of a red arrow + - t=3.00s a red arrow appears (subject starts to perform task) + - t=4.25s the red arrow disapears + - t=4.25s the feedback on performance is given in form of a blue bar + with update frequency of 16 Hz + - t=8.00s cross turns off (subject stops to perform task) + + EEG signals [1]: + - recorded with 27 electrodes, namely: + Fz, FCz, Cz, CPz, Pz, C1, C3, C5, C2, C4, C6, F4, FC2, FC4, FC6, CP2, + CP4, CP6, P4, F3, FC1, FC3, FC5, CP1, CP3, CP5, P3 (10-20 system), + referenced to the left earlobe. + + EOG signals [1]: + - recorded with 3 electrodes, namely: EOG1, EOG2, EOG3 + placed below, above and on the side of one eye. + + EMG signals [1]: + - recorded with 2 electrodes, namely: EMGg, EMGd + placed 2.5cm below the skinfold on each wrist. + + Demographic and biosocial information includes: + - gender, birth year, laterality + - vision, vision assistance + - familiarity to cognitive science or neurology, level of education + - physical activity, meditation + - attentional, neurological, psychiatrics symptoms + + Personality and the cognitive profile [1]: + - evaluated via 5th edition of the 16 Personality Factors (16PF5) test + - and mental rotation test + - index of learning style + + Pre and post experiment questionnaires [1]: + - evaluation of pre and post mood, mindfulness and motivational states + + The online OpenViBE BCI classification performance [1]: + - only performance measure used to give the feedback to the participants + + # TO DO: + * Sampling frequency? 256 Hz in [1], 512 in loaded info and at URL + Mapping based on MDFB as in [2] + database_B = ['B' + str(i) for i in range(61, 82)] + database_A = ['A' + str(i) for i in [43, 44, 6, 10, 52, 23, 48, 24, 40, 43, 2, 1, + 13, 22, 25, 29, 3, 11, 30, 19, 21]] + cross_database_mapping = dict(zip(database_B, database_A)) + + [1] Pillette, L., Roc, A., N’kaoua, B., & Lotte, F. (2021). + Experimenters' influence on mental-imagery based brain-computer interface user training. + International Journal of Human-Computer Studies, 149, 102603. + [2] Benaroch, C., Yamamoto, M. S., Roc, A., Dreyer, P., Jeunet, C., & Lotte, F. (2022). + When should MI-BCI feature optimization include prior knowledge, and which one?. + Brain-Computer Interfaces, 9(2), 115-128. + """ + + __init__ = partialmethod( + Dreyer2023Base.__init__, subjects=list(range(1, 22)), db_id="B" + ) + + +class Dreyer2023C(Dreyer2023Base): + """Class for Dreyer2023C dataset management. MI dataset. + + .. admonition:: Dataset summary + + =========== ======= ======= ========== ================= ============ =============== =========== + Name #Subj #Chan #Classes #Trials / class Trials len Sampling rate #Sessions + =========== ======= ======= ========== ================= ============ =============== =========== + Dreyer2023C 6 27 2 20 5s 512 Hz 6 + =========== ======= ======= ========== ================= ============ =============== =========== + + Dataset description: + + "A large EEG database with users' profile information for motor imagery + Brain-Computer Interface research" [1, 2] + + Data collectors : Appriou Aurélien; Caselli Damien; Benaroch Camille; + Yamamoto Sayu Maria; Roc Aline; Lotte Fabien; + Dreyer Pauline; Pillette Léa + Data manager : Dreyer Pauline + Project leader : Lotte Fabien + Project members : Rimbert Sébastien; Monseigne Thibaut + + Dataset Dreyer2023C contains EEG, EOG and EMG signals recorded on 6 healthy subjects + performing Left-Right Motor Imagery experiments (4 women) who participated in datasets + A or B. + In addition, for each recording the following pieces of information are provided: + subject's demographic, personality and cognitive profiles, the OpenViBE experimental + instructions and codes, and experimenter's gender. + + A recording contains open and closed eyes baseline recordings and 6 runs of the MI + experiments. First 2 runs (acquisition runs) were used to train system and + the following 4 runs (training runs) to train the participant. Each run contained + 40 trials [1]. + + Each trial was recorded as follows [1]: + - t=0.00s cross displayed on screen + - t=2.00s accoustic signal announced appearance of a red arrow + - t=3.00s a red arrow appears (subject starts to perform task) + - t=4.25s the red arrow disapears + - t=4.25s the feedback on performance is given in form of a blue bar + with update frequency of 16 Hz + - t=8.00s cross turns off (subject stops to perform task) + + EEG signals [1]: + - recorded with 27 electrodes, namely: + Fz, FCz, Cz, CPz, Pz, C1, C3, C5, C2, C4, C6, F4, FC2, FC4, FC6, CP2, + CP4, CP6, P4, F3, FC1, FC3, FC5, CP1, CP3, CP5, P3 (10-20 system), + referenced to the left earlobe. + + EOG signals [1]: + - recorded with 3 electrodes, namely: EOG1, EOG2, EOG3 + placed below, above and on the side of one eye. + + EMG signals [1]: + - recorded with 2 electrodes, namely: EMGg, EMGd + placed 2.5cm below the skinfold on each wrist. + + Demographic and biosocial information includes: + - gender, birth year, laterality + - vision, vision assistance + - familiarity to cognitive science or neurology, level of education + - physical activity, meditation + - attentional, neurological, psychiatrics symptoms + + Personality and the cognitive profile [1]: + - evaluated via 5th edition of the 16 Personality Factors (16PF5) test + - and mental rotation test + - index of learning style + + Pre and post experiment questionnaires [1]: + - evaluation of pre and post mood, mindfulness and motivational states + + The online OpenViBE BCI classification performance [1]: + - only performance measure used to give the feedback to the participants + + # TO DO: + * Sampling frequency? 256 Hz in [1], 512 in loaded info and at URL + + [1] Pillette, L., Roc, A., N’kaoua, B., & Lotte, F. (2021). + Experimenters' influence on mental-imagery based brain-computer interface user training. + International Journal of Human-Computer Studies, 149, 102603. + [2] Benaroch, C., Yamamoto, M. S., Roc, A., Dreyer, P., Jeunet, C., & Lotte, F. (2022). + When should MI-BCI feature optimization include prior knowledge, and which one?. + Brain-Computer Interfaces, 9(2), 115-128. + """ -class Dreyer2023C(Dreyer2023): - __init__ = partialmethod(Dreyer2023.__init__, "C", subjects=list(range(1, 7))) + __init__ = partialmethod( + Dreyer2023Base.__init__, subjects=list(range(1, 7)), db_id="C" + ) From d5e7b8fc4acf657cf6a39ba14d3f68efddd62458 Mon Sep 17 00:00:00 2001 From: Sara04 Date: Wed, 5 Jul 2023 19:11:40 +0200 Subject: [PATCH 08/14] Remove loading info before db is downloaded --- examples/plot_Dreyer_clf_scores_vs_subj_info.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/plot_Dreyer_clf_scores_vs_subj_info.py b/examples/plot_Dreyer_clf_scores_vs_subj_info.py index 497290bb5..9a1113430 100644 --- a/examples/plot_Dreyer_clf_scores_vs_subj_info.py +++ b/examples/plot_Dreyer_clf_scores_vs_subj_info.py @@ -31,7 +31,6 @@ # 1. Defining dataset, selecting subject for analysis and getting data ######################################################################################## dreyer2023 = Dreyer2023A() -info = dreyer2023.get_subject_info().rename(columns={"score": "score_MR"}) dreyer2023.subject_list = [1, 5, 7, 45] dreyer2023.get_data() ######################################################################################## From 2386c9644ef7a38c188b9bd5fe2cbafccb170d82 Mon Sep 17 00:00:00 2001 From: Sara04 Date: Sat, 18 Nov 2023 12:50:46 +0100 Subject: [PATCH 09/14] Update dataset session and run naming; update plotting --- ...o.py => Dreyer_clf_scores_vs_subj_info.py} | 54 +++++++++++++----- .../4_selected_subjects.png | Bin 0 -> 72289 bytes .../all_subjects.png | Bin 0 -> 106840 bytes moabb/datasets/Dreyer2023.py | 24 ++++---- 4 files changed, 51 insertions(+), 27 deletions(-) rename examples/{plot_Dreyer_clf_scores_vs_subj_info.py => Dreyer_clf_scores_vs_subj_info.py} (80%) create mode 100644 examples/images/Dreyer_clf_scores_vs_subj_info/4_selected_subjects.png create mode 100644 examples/images/Dreyer_clf_scores_vs_subj_info/all_subjects.png diff --git a/examples/plot_Dreyer_clf_scores_vs_subj_info.py b/examples/Dreyer_clf_scores_vs_subj_info.py similarity index 80% rename from examples/plot_Dreyer_clf_scores_vs_subj_info.py rename to examples/Dreyer_clf_scores_vs_subj_info.py index 9a1113430..fe12d2df6 100644 --- a/examples/plot_Dreyer_clf_scores_vs_subj_info.py +++ b/examples/Dreyer_clf_scores_vs_subj_info.py @@ -31,7 +31,7 @@ # 1. Defining dataset, selecting subject for analysis and getting data ######################################################################################## dreyer2023 = Dreyer2023A() -dreyer2023.subject_list = [1, 5, 7, 45] +dreyer2023.subject_list = [1, 5, 7, 35] dreyer2023.get_data() ######################################################################################## # 2. Defining MotorImagery paradigm and CSP+LDA pipeline @@ -43,7 +43,7 @@ ######################################################################################## # 3. Within session evaluation of the pipeline evaluation = WithinSessionEvaluation( - paradigm=paradigm, datasets=[dreyer2023], suffix="examples", overwrite=False + paradigm=paradigm, datasets=[dreyer2023], suffix="examples", overwrite=True ) results = evaluation.process(pipelines) results = results.loc[results["subject"].isin([str(s) for s in dreyer2023.subject_list])] @@ -56,24 +56,28 @@ # 5.1 Plotting subject AUC ROC scores vs subject's gender fig, ax = plt.subplots(nrows=2, ncols=2, facecolor="white", figsize=[16, 8], sharey=True) fig.subplots_adjust(wspace=0.0, hspace=0.5) +sb.boxplot( + data=results_info, y="score", x="SUJ_gender", ax=ax[0, 0], palette="Set1", width=0.3 +) sb.stripplot( data=results_info, y="score", x="SUJ_gender", ax=ax[0, 0], - jitter=True, - alpha=0.5, - zorder=1, palette="Set1", + linewidth=1, + edgecolor="k", + size=3, + alpha=0.3, + zorder=1, ) -sb.pointplot(data=results_info, y="score", x="SUJ_gender", ax=ax[0, 0], palette="Set1") ax[0, 0].set_title("AUC ROC scores vs. subject gender") ax[0, 0].set_xticklabels(["Man", "Woman"]) ax[0, 0].set_ylabel("ROC AUC") ax[0, 0].set_xlabel(None) ax[0, 0].set_ylim(0.3, 1) ######################################################################################## -# 5.2 Plotting subject AUC ROC scores vs experimenter's gender +# 5.2 Plotting subject AUC ROC scores vs subjects's age per gender sb.regplot( data=results_info[results_info["SUJ_gender"] == 1][["score", "Age"]].astype( "float32" @@ -97,22 +101,29 @@ ax[0, 1].set_title("AUC ROC scores vs. subject age per gender") ax[0, 1].set_ylabel(None) ax[0, 1].set_xlabel(None) -red_man = mpatches.Patch(color="#e41a1c", label="Man") -blue_woman = mpatches.Patch(color="#377eb8", label="Woman") -ax[0, 1].legend(handles=[red_man, blue_woman]) +ax[0, 1].legend( + handles=[ + mpatches.Patch(color="#e41a1c", label="Man"), + mpatches.Patch(color="#377eb8", label="Woman"), + ] +) ######################################################################################## # 5.3 Plotting subject AUC ROC scores vs experimenter's gender +sb.boxplot( + data=results_info, y="score", x="EXP_gender", ax=ax[1, 0], palette="Set1", width=0.3 +) sb.stripplot( data=results_info, y="score", x="EXP_gender", ax=ax[1, 0], - jitter=True, - alpha=0.5, - zorder=1, palette="Set1", + linewidth=1, + edgecolor="k", + size=3, + alpha=0.3, + zorder=1, ) -sb.pointplot(data=results_info, y="score", x="EXP_gender", ax=ax[1, 0], palette="Set1") ax[1, 0].set_title("AUC ROC scores vs. experimenter gender") ax[1, 0].set_xticklabels(["Man", "Woman"]) ax[1, 0].set_ylabel("ROC AUC") @@ -130,5 +141,18 @@ ) ax[1, 1].set_title("AUC ROC scores vs. subject age") ax[1, 1].set_ylabel(None) -######################################################################################## plt.show() +######################################################################################## +# 5.5 Obtained results for four selected subjects correspond to the following figure. +# +# .. image:: images/Dreyer_clf_scores_vs_subj_info/4_selected_subjects.png +# :align: center +# :alt: 4_selected_subjects +# +# Obtained results for all subjects correspond to the following figure. +# +# .. image:: images/Dreyer_clf_scores_vs_subj_info/all_subjects.png +# :align: center +# :alt: all_subjects +# +######################################################################################## diff --git a/examples/images/Dreyer_clf_scores_vs_subj_info/4_selected_subjects.png b/examples/images/Dreyer_clf_scores_vs_subj_info/4_selected_subjects.png new file mode 100644 index 0000000000000000000000000000000000000000..15cb02d4c3c2cbecb38047314e660035f283b701 GIT binary patch literal 72289 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

BqcX7jjaw9l$Oj7R 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 literal 0 HcmV?d00001 diff --git a/examples/images/Dreyer_clf_scores_vs_subj_info/all_subjects.png b/examples/images/Dreyer_clf_scores_vs_subj_info/all_subjects.png new file mode 100644 index 0000000000000000000000000000000000000000..f52f8bef6c0b18242f3fbd517bcffbf45d42756c GIT binary patch literal 106840 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 literal 0 HcmV?d00001 diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index d86da0c41..5dbbb8b70 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -110,7 +110,7 @@ def get_subject_info(self, path=None, subjects=None, infos=None): if isinstance(subjects, type(None)): subjects = self.subject_list if len([s for s in subjects if s not in self.subject_list]): - raise ValueError("Ivalid subject selection") + raise ValueError("Invalid subject selection") if isinstance(infos, type(None)): infos = list(RECORD_INFO.keys()) @@ -155,7 +155,7 @@ def get_subject_info(self, path=None, subjects=None, infos=None): elif i in df.columns: info_select.append(i) else: - raise ValueError("Ivalid info selection.") + raise ValueError("Invalid info selection.") return df[info_select].reset_index(drop=True) @@ -201,20 +201,20 @@ def _get_single_subject_data(self, subject): if r_i > 3 and self.db_id == "A" and subject == 59: continue - recordings["run_%d" % r_i] = read_raw_gdf( + recordings["%d" % r_i] = read_raw_gdf( join(subj_dir, subj_id + "_{0}_{1}.gdf".format(r_n, r_t)), preload=True, eog=["EOG1", "EOG2", "EOG3"], misc=["EMGg", "EMGd"], verbose="WARNING", ) - recordings["run_%d" % r_i].set_channel_types(ch_map) + recordings["%d" % r_i].set_channel_types(ch_map) - recordings["run_%d" % r_i].annotations.rename( + recordings["%d" % r_i].annotations.rename( {"769": "left_hand", "770": "right_hand"} ) - return {"session_0": recordings} + return {"0": recordings} def data_path( self, subject, path=None, force_update=False, update_path=None, verbose=None @@ -271,9 +271,9 @@ class Dreyer2023A(Dreyer2023Base): Each trial was recorded as follows [1]: - t=0.00s cross displayed on screen - - t=2.00s accoustic signal announced appearance of a red arrow + - t=2.00s acoustic signal announced appearance of a red arrow - t=3.00s a red arrow appears (subject starts to perform task) - - t=4.25s the red arrow disapears + - t=4.25s the red arrow disappears - t=4.25s the feedback on performance is given in form of a blue bar with update frequency of 16 Hz - t=8.00s cross turns off (subject stops to perform task) @@ -370,9 +370,9 @@ class Dreyer2023B(Dreyer2023Base): Each trial was recorded as follows [1]: - t=0.00s cross displayed on screen - - t=2.00s accoustic signal announced appearance of a red arrow + - t=2.00s acoustic signal announced appearance of a red arrow - t=3.00s a red arrow appears (subject starts to perform task) - - t=4.25s the red arrow disapears + - t=4.25s the red arrow disappears - t=4.25s the feedback on performance is given in form of a blue bar with update frequency of 16 Hz - t=8.00s cross turns off (subject stops to perform task) @@ -467,9 +467,9 @@ class Dreyer2023C(Dreyer2023Base): Each trial was recorded as follows [1]: - t=0.00s cross displayed on screen - - t=2.00s accoustic signal announced appearance of a red arrow + - t=2.00s acoustic signal announced appearance of a red arrow - t=3.00s a red arrow appears (subject starts to perform task) - - t=4.25s the red arrow disapears + - t=4.25s the red arrow disappears - t=4.25s the feedback on performance is given in form of a blue bar with update frequency of 16 Hz - t=8.00s cross turns off (subject stops to perform task) From c35308078534fc0a0e0e8a6e28f9f43cacdbc721 Mon Sep 17 00:00:00 2001 From: Sara04 Date: Sat, 18 Nov 2023 13:29:42 +0100 Subject: [PATCH 10/14] Add whats_new --- docs/source/whats_new.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/whats_new.rst b/docs/source/whats_new.rst index b361f18c5..0731731f0 100644 --- a/docs/source/whats_new.rst +++ b/docs/source/whats_new.rst @@ -20,12 +20,14 @@ Enhancements - Adding cache option to the evaluation (:gh:`517` by `Bruno Aristimunha`_) - Option to interpolate channel in paradigms' `match_all` method (:gh:`480` by `Gregoire Cattan`_) +- Adding new motor imagery dataset, Dreyer2023 (PR :gh: `404` by `Sara Sedlar`_ and `Sylvain Chevallier`_) Bugs ~~~~ - Fix TRCA implementation for different stimulation freqs and for signal filtering (:gh:522 by `Sylvain Chevallier`_) - Fix saving to BIDS runs with a description string in their name (:gh:`530` by `Pierre Guetschel`_) +- Fix issue with WithinSessionEvaluation with multiple datasets (PR :gh: `521`, issue :gh: `514` by `Sara Sedlar`_) API changes ~~~~~~~~~~~ From 3e21b6608f477ccf8972a5e20fb6f468ac8ceee3 Mon Sep 17 00:00:00 2001 From: Sara04 Date: Sat, 18 Nov 2023 14:11:18 +0100 Subject: [PATCH 11/14] Add words to ignore in pre commit config --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eeffc2f95..0e5a28e77 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -79,7 +79,7 @@ repos: hooks: - id: codespell args: - - --ignore-words-list=additionals,alle,alot,bund,currenty,datas,farenheit,falsy,fo,haa,hass,iif,incomfort,ines,ist,nam,nd,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,withing,zar + - --ignore-words-list=additionals,alle,Aline,alot,bund,currenty,datas,farenheit,falsy,fo,haa,hass,iif,incomfort,ines,ist,nam,nd,Perfomances,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,withing,zar - --skip="./.*,*.csv,*.json,*.ambr" - --quiet-level=2 exclude_types: [ csv, json, svg ] From 77620b40046f17f287590185f869f4a4e17b6c6c Mon Sep 17 00:00:00 2001 From: Sara04 Date: Sat, 18 Nov 2023 14:45:20 +0100 Subject: [PATCH 12/14] Add words to ignore in pre commit config --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e5a28e77..48bff4f01 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -79,7 +79,7 @@ repos: hooks: - id: codespell args: - - --ignore-words-list=additionals,alle,Aline,alot,bund,currenty,datas,farenheit,falsy,fo,haa,hass,iif,incomfort,ines,ist,nam,nd,Perfomances,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,withing,zar + - --ignore-words-list=additionals,alle,aline,alot,bund,currenty,datas,farenheit,falsy,fo,haa,hass,iif,incomfort,ines,ist,nam,nd,perfomances,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,withing,zar - --skip="./.*,*.csv,*.json,*.ambr" - --quiet-level=2 exclude_types: [ csv, json, svg ] From fac087d6d177404d9d7df013299dff6379205f6d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:02:14 +0000 Subject: [PATCH 13/14] [pre-commit.ci] auto fixes from pre-commit.com hooks --- examples/Dreyer_clf_scores_vs_subj_info.py | 1 + moabb/datasets/Dreyer2023.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/Dreyer_clf_scores_vs_subj_info.py b/examples/Dreyer_clf_scores_vs_subj_info.py index fe12d2df6..aae9c2cfe 100644 --- a/examples/Dreyer_clf_scores_vs_subj_info.py +++ b/examples/Dreyer_clf_scores_vs_subj_info.py @@ -10,6 +10,7 @@ To reduce computational time, the example is provided for four subjects. """ + # Authors: Sara Sedlar # Sylvain Chevallier # License: BSD (3-clause) diff --git a/moabb/datasets/Dreyer2023.py b/moabb/datasets/Dreyer2023.py index 5dbbb8b70..02713d035 100644 --- a/moabb/datasets/Dreyer2023.py +++ b/moabb/datasets/Dreyer2023.py @@ -135,9 +135,11 @@ def get_subject_info(self, path=None, subjects=None, infos=None): df.columns.name = None subjects = [ - self.db_id + str(s + self.db_idx_off[self.db_id]) - if not str(s).startswith(self.db_id) - else str(s) + ( + self.db_id + str(s + self.db_idx_off[self.db_id]) + if not str(s).startswith(self.db_id) + else str(s) + ) for s in subjects ] From 09ed4b6ff4a66b5871d9bcbe0c3d124065806bba Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 17:23:47 +0000 Subject: [PATCH 14/14] [pre-commit.ci] auto fixes from pre-commit.com hooks --- moabb/datasets/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/moabb/datasets/__init__.py b/moabb/datasets/__init__.py index d362e28db..515294686 100644 --- a/moabb/datasets/__init__.py +++ b/moabb/datasets/__init__.py @@ -48,14 +48,13 @@ BI2015b, Cattan2019_VR, ) -from .Dreyer2023 import Dreyer2023A, Dreyer2023B, Dreyer2023C - from .castillos2023 import ( CastillosBurstVEP40, CastillosBurstVEP100, CastillosCVEP40, CastillosCVEP100, ) +from .Dreyer2023 import Dreyer2023A, Dreyer2023B, Dreyer2023C from .epfl import EPFLP300 from .fake import FakeDataset, FakeVirtualRealityDataset from .gigadb import Cho2017