"""
=======================
Explore Paradigm Object
=======================
A paradigm defines how the raw data will be converted to trials ready
to be processed by a decoding algorithm. This is a function of the paradigm
used, i.e. in motor imagery one can have two-class, multi-class,
or continuous paradigms; similarly, different preprocessing is necessary
for ERP vs ERD paradigms.
A paradigm also defines the appropriate evaluation metric, for example AUC
for binary classification problems, accuracy for multiclass, or kappa
coefficients for continuous paradigms.
This tutorial explores the paradigm object, with 3 examples of paradigm :
- MotorImagery
- FilterBankMotorImagery
- LeftRightImagery
"""
# Authors: Alexandre Barachant
# Sylvain Chevallier
#
# License: BSD (3-clause)
import numpy as np
from moabb.datasets import BNCI2014001
from moabb.paradigms import FilterBankMotorImagery, LeftRightImagery, MotorImagery
print(__doc__)
###############################################################################
# MotorImagery
# -----------------
#
# First, let's take an example of the MotorImagery paradigm.
paradigm = MotorImagery(n_classes=4)
print(paradigm.__doc__)
###############################################################################
# The function `get_data` allow you to access preprocessed data from a dataset.
# this function will return 3 objects. A numpy array containing the
# preprocessed EEG data, the labels, and a dataframe with metadata.
print(paradigm.get_data.__doc__)
###############################################################################
# Lets take the example of the BNCI2014001 dataset, known as the dataset IIa
# from the BCI competition IV. We will load the data from the subject 1.
# When calling `get_data`, the paradigm will retrieve the data from the
# specified list of subjects, apply preprocessing (by default, a bandpass
# between 7 and 35 Hz), epoch the data (with interval specified by the dataset,
# unless superseded by the paradigm) and return the corresponding objects.
dataset = BNCI2014001()
subjects = [1]
X, y, metadata = paradigm.get_data(dataset=dataset, subjects=subjects)
###############################################################################
# The epoched data is a 3D array, with epochs on the first dimension (here
# 576 trials), channels on the second (22 channels) and time sample on the last
# one.
print(X.shape)
###############################################################################
# Labels contains the labels corresponding to each trial. in the case of this
# dataset, we have the 4 types of motor imagery that was performed.
print(np.unique(y))
###############################################################################
# Metadata have at least 3 columns: subject, session and run.
#
# - subject is the subject id of the corresponding trial
# - session is the session id. A session denotes a recording made without
# removing the EEG cap.
# - run is the individual continuous recording made during a session. A session
# may or may not contain multiple runs.
#
print(metadata.head())
###############################################################################
# For this data, we have one subject, 2 sessions (2 different recording days)
# and 6 runs per session.
print(metadata.describe(include="all"))
###############################################################################
# Paradigm objects can also return the list of all dataset compatible. Here
# it will return the list all the imagery datasets from the MOABB.
compatible_datasets = paradigm.datasets
print([dataset.code for dataset in compatible_datasets])
###############################################################################
# FilterBank MotorImagery
# -----------------------
#
# FilterBankMotorImagery is the same paradigm, but with a different
# preprocessing. In this case, it applies a bank of 6 bandpass filter on the data
# before concatenating the output.
paradigm = FilterBankMotorImagery()
print(paradigm.__doc__)
###############################################################################
# Therefore, the output X is a 4D array, with trial x channel x time x filter
X, y, metadata = paradigm.get_data(dataset=dataset, subjects=subjects)
print(X.shape)
###############################################################################
# LeftRight MotorImagery
# ----------------------
#
# LeftRightImagery is a variation over the BaseMotorImagery paradigm,
# restricted to left- and right-hand events.
paradigm = LeftRightImagery()
print(paradigm.__doc__)
###############################################################################
# The compatible dataset list is a subset of motor imagery dataset that
# contains at least left and right hand events.
compatible_datasets = paradigm.datasets
print([dataset.code for dataset in compatible_datasets])
###############################################################################
# So if we apply this to our original dataset, it will only return trials
# corresponding to left- and right-hand motor imagination.
X, y, metadata = paradigm.get_data(dataset=dataset, subjects=subjects)
print(np.unique(y))