Number of events 199
Events stimulus/non-target/12: 7
stimulus/non-target/13: 5
stimulus/non-target/14: 9
stimulus/non-target/15: 11
stimulus/non-target/21: 7
stimulus/non-target/23: 5
stimulus/non-target/24: 11
stimulus/non-target/25: 9
stimulus/non-target/31: 6
stimulus/non-target/32: 10
stimulus/non-target/34: 6
stimulus/non-target/35: 10
stimulus/non-target/41: 7
stimulus/non-target/42: 3
stimulus/non-target/43: 14
stimulus/non-target/45: 8
stimulus/non-target/51: 10
stimulus/non-target/52: 5
stimulus/non-target/53: 6
stimulus/non-target/54: 10
stimulus/target/11: 8
stimulus/target/22: 8
stimulus/target/33: 8
stimulus/target/44: 8
stimulus/target/55: 8
Time range -0.203 – 0.797 s
Baseline off
Epoch #
event_name
response/correct
response/incorrect
stimulus/non-target/12
stimulus/non-target/13
stimulus/non-target/14
stimulus/non-target/15
stimulus/non-target/21
stimulus/non-target/23
stimulus/non-target/24
stimulus/non-target/25
stimulus/non-target/31
stimulus/non-target/32
stimulus/non-target/34
stimulus/non-target/35
stimulus/non-target/41
stimulus/non-target/42
stimulus/non-target/43
stimulus/non-target/45
stimulus/non-target/51
stimulus/non-target/52
stimulus/non-target/53
stimulus/non-target/54
stimulus/target/11
stimulus/target/22
stimulus/target/33
stimulus/target/44
stimulus/target/55
Loading, please wait
Epoch #
event_name
response/correct
response/incorrect
stimulus/non-target/12
stimulus/non-target/13
stimulus/non-target/14
stimulus/non-target/15
stimulus/non-target/21
stimulus/non-target/23
stimulus/non-target/24
stimulus/non-target/25
stimulus/non-target/31
stimulus/non-target/32
stimulus/non-target/34
stimulus/non-target/35
stimulus/non-target/41
stimulus/non-target/42
stimulus/non-target/43
stimulus/non-target/45
stimulus/non-target/51
stimulus/non-target/52
stimulus/non-target/53
stimulus/non-target/54
stimulus/target/11
stimulus/target/22
stimulus/target/33
stimulus/target/44
stimulus/target/55
0stimulus/non-target/310.3980.000
1stimulus/non-target/350.5550.000
2stimulus/non-target/310.4530.000
3stimulus/non-target/350.3670.000
4stimulus/target/330.3280.000
5stimulus/non-target/350.4060.000
6stimulus/non-target/350.4060.000
7stimulus/non-target/350.3440.000
8stimulus/target/330.3360.000
9stimulus/non-target/320.4380.000
10stimulus/non-target/320.3200.000
11stimulus/target/330.4220.000
12stimulus/non-target/320.4060.000
13stimulus/target/330.3670.000
14stimulus/non-target/340.4380.000
15stimulus/non-target/350.5700.000
16stimulus/target/330.3360.000
17stimulus/non-target/340.4140.000
18stimulus/non-target/350.4450.000
19stimulus/non-target/320.5390.000
20stimulus/non-target/350.4060.000
21stimulus/non-target/310.4380.000
22stimulus/non-target/320.3910.000
23stimulus/non-target/320.4920.000
24stimulus/non-target/320.4610.000
25stimulus/non-target/340.5230.000
26stimulus/non-target/340.4530.000
27stimulus/non-target/310.4380.000
28stimulus/non-target/320.4060.000
29stimulus/non-target/320.3200.000
30stimulus/non-target/350.3360.000
31stimulus/target/330.3590.000
32stimulus/target/330.3670.000
33stimulus/non-target/340.3360.000
34stimulus/non-target/350.3520.000
35stimulus/non-target/320.3830.000
36stimulus/target/330.4450.000
37stimulus/non-target/340.4380.000
38stimulus/non-target/310.3590.000
39stimulus/non-target/310.3670.000
40stimulus/non-target/120.5080.000
41stimulus/non-target/150.3980.000
42stimulus/non-target/130.3440.000
43stimulus/target/110.3910.000
44stimulus/non-target/120.3360.000
45stimulus/non-target/140.5620.000
46stimulus/non-target/150.5160.000
47stimulus/non-target/140.3360.000
48stimulus/non-target/130.3520.000
49stimulus/non-target/150.6560.000
50stimulus/non-target/150.3590.000
51stimulus/non-target/120.3830.000
52stimulus/target/110.4840.000
53stimulus/target/110.3670.000
54stimulus/non-target/140.3120.000
55stimulus/non-target/140.3440.000
56stimulus/non-target/120.3280.000
57stimulus/target/110.3670.000
58stimulus/non-target/140.3440.000
59stimulus/non-target/150.3200.000
60stimulus/non-target/150.3120.000
61stimulus/non-target/130.3360.000
62stimulus/non-target/150.3670.000
63stimulus/non-target/140.3050.000
64stimulus/target/110.3440.000
65stimulus/non-target/120.4060.000
66stimulus/non-target/150.3520.000
67stimulus/target/110.3750.000
68stimulus/non-target/140.3440.000
69stimulus/target/110.4530.000
70stimulus/non-target/150.3440.000
71stimulus/non-target/150.3050.000
72stimulus/non-target/130.3280.000
73stimulus/target/110.3120.000
74stimulus/non-target/130.3360.000
75stimulus/non-target/140.3980.000
76stimulus/non-target/120.3590.000
77stimulus/non-target/140.3750.000
78stimulus/non-target/120.4140.000
79stimulus/non-target/150.3980.000
80stimulus/non-target/230.3830.000
81stimulus/target/220.4220.000
82stimulus/target/220.4610.000
83stimulus/non-target/230.4140.000
84stimulus/non-target/250.4610.000
85stimulus/non-target/210.3520.000
86stimulus/target/220.3980.000
87stimulus/non-target/240.3910.000
88stimulus/non-target/250.3440.000
89stimulus/non-target/210.3750.000
90stimulus/non-target/230.3750.000
91stimulus/non-target/250.3280.000
92stimulus/non-target/250.4220.000
93stimulus/non-target/240.5620.000
94stimulus/non-target/250.4380.000
95stimulus/non-target/240.4060.000
96stimulus/target/220.4060.000
97stimulus/non-target/240.3670.000
98stimulus/non-target/210.3980.000
99stimulus/non-target/230.4920.000
100stimulus/target/220.4610.000
101stimulus/non-target/240.3440.000
102stimulus/non-target/240.3280.000
103stimulus/non-target/250.3750.000
104stimulus/non-target/230.4380.000
105stimulus/non-target/250.3830.000
106stimulus/non-target/240.3750.000
107stimulus/non-target/210.3360.000
108stimulus/non-target/240.3200.000
109stimulus/non-target/210.2890.000
110stimulus/non-target/240.4140.000
111stimulus/non-target/250.3520.000
112stimulus/non-target/250.2890.000
113stimulus/target/220.2660.000
114stimulus/target/220.4060.000
115stimulus/non-target/240.3440.000
116stimulus/non-target/240.3120.000
117stimulus/non-target/210.3520.000
118stimulus/target/220.3910.000
119stimulus/non-target/210.3280.000
120stimulus/non-target/410.4300.000
121stimulus/non-target/410.3050.000
122stimulus/non-target/430.3200.000
123stimulus/non-target/430.3120.000
124stimulus/target/440.3050.000
125stimulus/target/440.4060.000
126stimulus/non-target/410.3750.000
127stimulus/non-target/430.3200.000
128stimulus/non-target/410.3120.000
129stimulus/non-target/430.2810.000
130stimulus/non-target/430.3050.000
131stimulus/non-target/450.3120.000
132stimulus/non-target/450.2660.000
133stimulus/non-target/430.3590.000
134stimulus/target/440.3440.000
135stimulus/non-target/410.3280.000
136stimulus/non-target/420.3440.000
137stimulus/non-target/450.3120.000
138stimulus/non-target/430.2970.000
139stimulus/target/440.4140.000
140stimulus/non-target/420.3750.000
141stimulus/non-target/450.3520.000
142stimulus/non-target/420.3830.000
143stimulus/target/440.3440.000
144stimulus/non-target/410.3910.000
145stimulus/non-target/430.3200.000
146stimulus/non-target/430.3520.000
147stimulus/non-target/430.3200.000
148stimulus/target/440.4300.000
149stimulus/non-target/450.3050.000
150stimulus/target/440.4450.000
151stimulus/non-target/450.3910.000
152stimulus/non-target/430.3440.000
153stimulus/non-target/450.3360.000
154stimulus/non-target/410.3120.000
155stimulus/non-target/430.3520.000
156stimulus/non-target/430.4140.000
157stimulus/non-target/450.3670.000
158stimulus/non-target/430.4220.000
159stimulus/target/440.3520.000
160stimulus/non-target/540.3830.000
161stimulus/non-target/510.3200.000
162stimulus/non-target/520.3050.000
163stimulus/non-target/540.2810.000
164stimulus/non-target/540.3440.000
165stimulus/non-target/510.3280.000
166stimulus/non-target/520.3280.000
167stimulus/non-target/510.3120.000
168stimulus/non-target/540.3440.000
169stimulus/non-target/510.3670.000
170stimulus/non-target/530.3830.000
171stimulus/target/550.3590.000
172stimulus/non-target/510.3830.000
173stimulus/non-target/510.2890.000
174stimulus/non-target/540.3440.000
175stimulus/non-target/530.3830.000
176stimulus/non-target/530.3280.000
177stimulus/non-target/520.3280.000
178stimulus/non-target/540.3120.000
179stimulus/target/550.4840.000
180stimulus/target/550.4300.000
181stimulus/non-target/540.3360.000
182stimulus/non-target/510.2660.000
184stimulus/target/550.4530.000
185stimulus/non-target/510.6800.000
186stimulus/non-target/530.4380.000
187stimulus/non-target/540.3120.000
188stimulus/target/550.3520.000
189stimulus/target/550.4140.000
190stimulus/target/550.3830.000
191stimulus/non-target/510.4450.000
192stimulus/non-target/520.3670.000
193stimulus/target/550.3980.000
194stimulus/non-target/540.2730.000
195stimulus/non-target/540.4220.000
196stimulus/non-target/510.3440.000
197stimulus/non-target/530.4450.000
198stimulus/non-target/530.3520.000
199stimulus/non-target/520.3830.000

199 rows × 29 columns

Drop log
PSD
PSD calculated from 199 epochs (199.0 s).
Method picard
Fit parameters fastica_it=5
max_iter=1000
Fit 110 iterations on epochs (12935 samples)
ICA components 29
Available PCA components 30
Channel types eeg
ICA components marked for exclusion ICA000
ICA001
ICA002
ICA004
ICA013
ICA019
ICA020
ICA023
  """ERP CORE.

This example demonstrate how to process 5 participants from the
[ERP CORE](https://erpinfo.org/erp-core) dataset. It shows how to obtain 7 ERP
components from a total of 6 experimental tasks:

- N170 (face perception)
- MMN (passive auditory oddball)
- N2pc (visual search)
- N400 (word pair judgment)
- P3b (active visual oddball)
- LRP and ERN (flankers task)

## Dataset information

- **Authors:** Emily S. Kappenman, Jaclyn L. Farrens, Wendy Zhang,
                       Andrew X. Stewart, and Steven J. Luck
- **License:** CC-BY-4.0
- **URL:** [https://erpinfo.org/erp-core](https://erpinfo.org/erp-core)
- **Citation:** Kappenman, E., Farrens, J., Zhang, W., Stewart, A. X.,
                & Luck, S. J. (2021). ERP CORE: An open resource for human
                event-related potential research. *NeuroImage* 225: 117465.
                [https://doi.org/10.1016/j.neuroimage.2020.117465](https://doi.org/10.1016/j.neuroimage.2020.117465)
"""

import argparse
import sys

import mne

bids_root = "~/mne_data/ERP_CORE"
deriv_root = "~/mne_data/derivatives/mne-bids-pipeline/ERP_CORE"

# Find the --task option
args = [arg for arg in sys.argv if arg.startswith("--task") or not arg.startswith("-")]
parser = argparse.ArgumentParser()
parser.add_argument("ignored", nargs="*")
parser.add_argument(
    "--task", choices=("N400", "ERN", "LRP", "MMN", "N2pc", "N170", "P3"), required=True
)
task = parser.parse_args(args).task
sessions = [task]

subjects = ["015", "016", "017", "018", "019"]

ch_types = ["eeg"]
interactive = False

raw_resample_sfreq = 128
# Suppress "Data file name in EEG.data (sub-019_task-ERN_eeg.fdt) is incorrect..."
read_raw_bids_verbose = "error"

eeg_template_montage = mne.channels.make_standard_montage("standard_1005")
eeg_bipolar_channels = {
    "HEOG": ("HEOG_left", "HEOG_right"),
    "VEOG": ("VEOG_lower", "FP2"),
}
drop_channels = ["HEOG_left", "HEOG_right", "VEOG_lower"]
eog_channels = ["HEOG", "VEOG"]

l_freq = 0.1
h_freq = None
notch_freq = 60

decode = True
decoding_time_generalization = True
decoding_time_generalization_decim = 2

find_breaks = True
min_break_duration = 10
t_break_annot_start_after_previous_event = 3.0
t_break_annot_stop_before_next_event = 1.5

if task == "N400":  # test autoreject local without ICA
    spatial_filter = None
    reject = "autoreject_local"
    autoreject_n_interpolate = [2, 4]
elif task == "N170":  # test autoreject local before ICA
    spatial_filter = "ica"
    ica_reject = "autoreject_local"
    reject = "autoreject_global"
    autoreject_n_interpolate = [2, 4]
else:
    spatial_filter = "ica"
    ica_reject = dict(eeg=350e-6, eog=500e-6)
    reject = "autoreject_global"

# These settings are only used for the cases where spatial_filter="ica"
ica_max_iterations = 1000
ica_eog_threshold = 2
ica_decim = 2  # speed up ICA fitting

run_source_estimation = False
on_rename_missing_events = "ignore"

parallel_backend = "dask"
dask_worker_memory_limit = "2.5G"
n_jobs = 4

if task == "N400":
    dask_open_dashboard = True

    rename_events = {
        "response/201": "response/correct",
        "response/202": "response/error",
        "stimulus/111": "stimulus/prime/related",
        "stimulus/112": "stimulus/prime/related",
        "stimulus/121": "stimulus/prime/unrelated",
        "stimulus/122": "stimulus/prime/unrelated",
        "stimulus/211": "stimulus/target/related",
        "stimulus/212": "stimulus/target/related",
        "stimulus/221": "stimulus/target/unrelated",
        "stimulus/222": "stimulus/target/unrelated",
    }

    eeg_reference = ["P9", "P10"]
    epochs_tmin = -0.2
    epochs_tmax = 0.8
    epochs_metadata_tmin = 0
    epochs_metadata_tmax = 1.5
    epochs_metadata_keep_first = ["stimulus/target", "response"]
    baseline = (None, 0)

    conditions = {
        "related": '`first_stimulus/target` == "related" and '
        'first_response == "correct"',
        "unrelated": '`first_stimulus/target` == "unrelated" and '
        'first_response == "correct"',
    }
    contrasts = [("unrelated", "related")]
    cluster_forming_t_threshold = 1.5  # Only for testing!
    cluster_permutation_p_threshold = 0.2  # Only for testing!
elif task == "ERN":
    rename_events = {
        "stimulus/11": "compatible/left",
        "stimulus/12": "compatible/right",
        "stimulus/21": "incompatible/left",
        "stimulus/22": "incompatible/right",
        "response/111": "response/correct",
        "response/112": "response/incorrect",
        "response/121": "response/correct",
        "response/122": "response/incorrect",
        "response/211": "response/incorrect",
        "response/212": "response/correct",
        "response/221": "response/incorrect",
        "response/222": "response/correct",
    }

    eeg_reference = ["P9", "P10"]
    epochs_tmin = -0.6
    epochs_tmax = 0.4
    baseline = (-0.4, -0.2)
    conditions = ["response/correct", "response/incorrect"]
    contrasts = [("response/incorrect", "response/correct")]
    cluster_forming_t_threshold = 5  # Only for testing!
    cluster_permutation_p_threshold = 0.2  # Only for testing!
    decoding_csp = True
    decoding_csp_freqs = {
        "theta": [4, 7],
        "alpha": [8, 12],
        "beta": [13, 20, 30],
        "gamma": [50, 63],
    }
    decoding_csp_times = [-0.2, 0.0, 0.2, 0.4]
elif task == "LRP":
    rename_events = {
        "stimulus/11": "compatible/left",
        "stimulus/12": "compatible/right",
        "stimulus/21": "incompatible/left",
        "stimulus/22": "incompatible/right",
        "response/111": "response/left/correct",
        "response/112": "response/left/incorrect",
        "response/121": "response/left/correct",
        "response/122": "response/left/incorrect",
        "response/211": "response/right/incorrect",
        "response/212": "response/right/correct",
        "response/221": "response/right/incorrect",
        "response/222": "response/right/correct",
    }

    eeg_reference = ["P9", "P10"]
    epochs_tmin = -0.8
    epochs_tmax = 0.2
    baseline = (None, -0.6)
    conditions = ["response/left", "response/right"]
    contrasts = [("response/right", "response/left")]  # contralateral vs ipsi
elif task == "MMN":
    rename_events = {
        "stimulus/70": "stimulus/deviant",
        "stimulus/80": "stimulus/standard",
    }

    eeg_reference = ["P9", "P10"]
    epochs_tmin = -0.2
    epochs_tmax = 0.8
    baseline = (None, 0)
    conditions = ["stimulus/standard", "stimulus/deviant"]
    contrasts = [("stimulus/deviant", "stimulus/standard")]
elif task == "N2pc":
    rename_events = {
        "response/201": "response/correct",
        "response/202": "response/error",
        "stimulus/111": "stimulus/blue/left",
        "stimulus/112": "stimulus/blue/left",
        "stimulus/121": "stimulus/blue/right",
        "stimulus/122": "stimulus/blue/right",
        "stimulus/211": "stimulus/pink/left",
        "stimulus/212": "stimulus/pink/left",
        "stimulus/221": "stimulus/pink/right",
        "stimulus/222": "stimulus/pink/right",
    }

    eeg_reference = ["P9", "P10"]
    # Analyze all EEG channels -- we only specify the channels here for the purpose of
    # demonstration
    analyze_channels = [
        "FP1",
        "F3",
        "F7",
        "FC3",
        "C3",
        "C5",
        "P3",
        "P7",
        "P9",
        "PO7",
        "PO3",
        "O1",
        "Oz",
        "Pz",
        "CPz",
        "FP2",
        "Fz",
        "F4",
        "F8",
        "FC4",
        "FCz",
        "Cz",
        "C4",
        "C6",
        "P4",
        "P8",
        "P10",
        "PO8",
        "PO4",
        "O2",
    ]

    epochs_tmin = -0.2
    epochs_tmax = 0.8
    baseline = (None, 0)
    conditions = ["stimulus/right", "stimulus/left"]
    contrasts = [("stimulus/right", "stimulus/left")]  # Contralteral vs ipsi
elif task == "N170":
    rename_events = {
        "response/201": "response/correct",
        "response/202": "response/error",
    }

    eeg_reference = "average"
    # Analyze all EEG channels -- we only specify the channels here for the purpose of
    # demonstration
    analyze_channels = [
        "FP1",
        "F3",
        "F7",
        "FC3",
        "C3",
        "C5",
        "P3",
        "P7",
        "P9",
        "PO7",
        "PO3",
        "O1",
        "Oz",
        "Pz",
        "CPz",
        "FP2",
        "Fz",
        "F4",
        "F8",
        "FC4",
        "FCz",
        "Cz",
        "C4",
        "C6",
        "P4",
        "P8",
        "P10",
        "PO8",
        "PO4",
        "O2",
    ]

    ica_n_components = 30 - 1
    for i in range(1, 180 + 1):
        orig_name = f"stimulus/{i}"

        if 1 <= i <= 40:
            new_name = "stimulus/face/normal"
        elif 41 <= i <= 80:
            new_name = "stimulus/car/normal"
        elif 101 <= i <= 140:
            new_name = "stimulus/face/scrambled"
        elif 141 <= i <= 180:
            new_name = "stimulus/car/scrambled"
        else:
            continue

        rename_events[orig_name] = new_name

    epochs_tmin = -0.2
    epochs_tmax = 0.8
    baseline = (None, 0)
    conditions = ["stimulus/face/normal", "stimulus/car/normal"]
    contrasts = [("stimulus/face/normal", "stimulus/car/normal")]
elif task == "P3":
    rename_events = {
        "response/201": "response/correct",
        "response/202": "response/incorrect",
        "stimulus/11": "stimulus/target/11",
        "stimulus/22": "stimulus/target/22",
        "stimulus/33": "stimulus/target/33",
        "stimulus/44": "stimulus/target/44",
        "stimulus/55": "stimulus/target/55",
        "stimulus/21": "stimulus/non-target/21",
        "stimulus/31": "stimulus/non-target/31",
        "stimulus/41": "stimulus/non-target/41",
        "stimulus/51": "stimulus/non-target/51",
        "stimulus/12": "stimulus/non-target/12",
        "stimulus/32": "stimulus/non-target/32",
        "stimulus/42": "stimulus/non-target/42",
        "stimulus/52": "stimulus/non-target/52",
        "stimulus/13": "stimulus/non-target/13",
        "stimulus/23": "stimulus/non-target/23",
        "stimulus/43": "stimulus/non-target/43",
        "stimulus/53": "stimulus/non-target/53",
        "stimulus/14": "stimulus/non-target/14",
        "stimulus/24": "stimulus/non-target/24",
        "stimulus/34": "stimulus/non-target/34",
        "stimulus/54": "stimulus/non-target/54",
        "stimulus/15": "stimulus/non-target/15",
        "stimulus/25": "stimulus/non-target/25",
        "stimulus/35": "stimulus/non-target/35",
        "stimulus/45": "stimulus/non-target/45",
    }

    eeg_reference = ["P9", "P10"]
    epochs_tmin = -0.2
    epochs_tmax = 0.8
    baseline = (None, 0)
    conditions = ["stimulus/target", "stimulus/non-target"]
    contrasts = [("stimulus/target", "stimulus/non-target")]
    cluster_forming_t_threshold = 0.8  # Only for testing!
    cluster_permutation_p_threshold = 0.2  # Only for testing!
else:
    raise RuntimeError(f"Task {task} not currently supported")

  Platform             Linux-5.15.0-1053-aws-x86_64-with-glibc2.35
Python               3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
Executable           /home/circleci/python_env/bin/python3.10
CPU                  x86_64 (36 cores)
Memory               68.6 GB

Core
├☑ mne               1.7.0.dev156+g415e7f68e (devel, latest release is 1.6.1)
├☑ numpy             1.26.4 (OpenBLAS 0.3.23.dev with 2 threads)
├☑ scipy             1.12.0
└☑ matplotlib        3.8.3 (backend=agg)

Numerical (optional)
├☑ sklearn           1.4.1.post1
├☑ numba             0.59.1
├☑ nibabel           5.2.1
├☑ pandas            2.2.1
└☐ unavailable       nilearn, dipy, openmeeg, cupy

Visualization (optional)
├☑ pyvista           0.43.4 (OpenGL 4.5 (Core Profile) Mesa 23.2.1-1ubuntu3.1~22.04.2 via llvmpipe (LLVM 15.0.7, 256 bits))
├☑ pyvistaqt         0.11.0
├☑ vtk               9.3.0
├☑ qtpy              2.4.1 (PyQt6=6.6.0)
└☐ unavailable       ipympl, pyqtgraph, mne-qt-browser, ipywidgets, trame_client, trame_server, trame_vtk, trame_vuetify

Ecosystem (optional)
├☑ mne-bids          0.15.0.dev43+g17d20c132
├☑ mne-bids-pipeline 1.8.0
└☐ unavailable       mne-nirs, mne-features, mne-connectivity, mne-icalabel, neo