From c914327e7a034e676001a7daf9208684dab4d96d Mon Sep 17 00:00:00 2001 From: Ernie Pedapati Date: Tue, 9 Jul 2024 14:42:05 -0400 Subject: [PATCH 1/6] updated eeglab.py to account for SET files that contain trials but no epochs --- mne/io/eeglab/eeglab.py | 45 ++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/mne/io/eeglab/eeglab.py b/mne/io/eeglab/eeglab.py index 7e006275c20..d9d90d9b0ba 100644 --- a/mne/io/eeglab/eeglab.py +++ b/mne/io/eeglab/eeglab.py @@ -619,6 +619,29 @@ def __init__( "You should try using read_raw_eeglab function." ) + def generate_boundary_events(n_trials): + """ + Generate boundary events for epoched data without events. + + Parameters: + n_trials (int): Number of trials (epochs) + + Returns: + numpy.ndarray: Array of boundary events + dict: Event id dictionary + """ + events = np.zeros((n_trials, 3), dtype=np.int64) # Explicitly use int64 + events[:, 0] = np.arange(n_trials, dtype=np.int64) # Start from 0 for sample numbers + events[:, 1] = 0 # Previous event value + events[:, 2] = 1 # Boundary marker + + event_id = {'boundary': 1} + + # Double-check the array type + assert events.dtype == np.int64, f"Events dtype is {events.dtype}, expected np.int64" + + return events, event_id + if events is None and eeg.trials > 1: # first extract the events and construct an event_id dict event_name, event_latencies, unique_ev = list(), list(), list() @@ -656,15 +679,19 @@ def __init__( ) # now fill up the event array - events = np.zeros((eeg.trials, 3), dtype=int) - for idx in range(0, eeg.trials): - if idx == 0: - prev_stim = 0 - elif idx > 0 and event_latencies[idx] - event_latencies[idx - 1] == 1: - prev_stim = event_id[event_name[idx - 1]] - events[idx, 0] = event_latencies[idx] - events[idx, 1] = prev_stim - events[idx, 2] = event_id[event_name[idx]] + if event_id is None and not event_name and not event_latencies: + # account for EEGLAB with trials but no events + events,event_id = generate_boundary_events(eeg.trials) + else: + events = np.zeros((eeg.trials, 3), dtype=int) + for idx in range(0, eeg.trials): + if idx == 0: + prev_stim = 0 + elif idx > 0 and event_latencies[idx] - event_latencies[idx - 1] == 1: + prev_stim = event_id[event_name[idx - 1]] + events[idx, 0] = event_latencies[idx] + events[idx, 1] = prev_stim + events[idx, 2] = event_id[event_name[idx]] elif isinstance(events, (str, Path, PathLike)): events = read_events(events) From 609418d8fc790e86af661d2cd4415824897bb389 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:45:58 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mne/io/eeglab/eeglab.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/mne/io/eeglab/eeglab.py b/mne/io/eeglab/eeglab.py index d9d90d9b0ba..8af6b880e43 100644 --- a/mne/io/eeglab/eeglab.py +++ b/mne/io/eeglab/eeglab.py @@ -623,22 +623,28 @@ def generate_boundary_events(n_trials): """ Generate boundary events for epoched data without events. - Parameters: + Parameters + ---------- n_trials (int): Number of trials (epochs) - Returns: + Returns + ------- numpy.ndarray: Array of boundary events dict: Event id dictionary """ events = np.zeros((n_trials, 3), dtype=np.int64) # Explicitly use int64 - events[:, 0] = np.arange(n_trials, dtype=np.int64) # Start from 0 for sample numbers + events[:, 0] = np.arange( + n_trials, dtype=np.int64 + ) # Start from 0 for sample numbers events[:, 1] = 0 # Previous event value events[:, 2] = 1 # Boundary marker - event_id = {'boundary': 1} + event_id = {"boundary": 1} # Double-check the array type - assert events.dtype == np.int64, f"Events dtype is {events.dtype}, expected np.int64" + assert ( + events.dtype == np.int64 + ), f"Events dtype is {events.dtype}, expected np.int64" return events, event_id @@ -681,13 +687,15 @@ def generate_boundary_events(n_trials): # now fill up the event array if event_id is None and not event_name and not event_latencies: # account for EEGLAB with trials but no events - events,event_id = generate_boundary_events(eeg.trials) + events, event_id = generate_boundary_events(eeg.trials) else: events = np.zeros((eeg.trials, 3), dtype=int) for idx in range(0, eeg.trials): if idx == 0: prev_stim = 0 - elif idx > 0 and event_latencies[idx] - event_latencies[idx - 1] == 1: + elif ( + idx > 0 and event_latencies[idx] - event_latencies[idx - 1] == 1 + ): prev_stim = event_id[event_name[idx - 1]] events[idx, 0] = event_latencies[idx] events[idx, 1] = prev_stim From 6950026815d51f2c67db66788c8d087256d76e0c Mon Sep 17 00:00:00 2001 From: Ernie Pedapati Date: Sat, 13 Jul 2024 18:58:38 -0400 Subject: [PATCH 3/6] Update mne/io/eeglab/eeglab.py Co-authored-by: Alexandre Gramfort --- mne/io/eeglab/eeglab.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mne/io/eeglab/eeglab.py b/mne/io/eeglab/eeglab.py index 8af6b880e43..ad574d27fb5 100644 --- a/mne/io/eeglab/eeglab.py +++ b/mne/io/eeglab/eeglab.py @@ -625,7 +625,8 @@ def generate_boundary_events(n_trials): Parameters ---------- - n_trials (int): Number of trials (epochs) + n_epochs: int + Number of epochs (trials). Returns ------- From 1d6f4be8ca7747c5b506f048ada11fc6c06ae7f9 Mon Sep 17 00:00:00 2001 From: Ernie Pedapati Date: Sat, 13 Jul 2024 18:58:48 -0400 Subject: [PATCH 4/6] Update mne/io/eeglab/eeglab.py Co-authored-by: Alexandre Gramfort --- mne/io/eeglab/eeglab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mne/io/eeglab/eeglab.py b/mne/io/eeglab/eeglab.py index ad574d27fb5..03b0573a7be 100644 --- a/mne/io/eeglab/eeglab.py +++ b/mne/io/eeglab/eeglab.py @@ -619,7 +619,7 @@ def __init__( "You should try using read_raw_eeglab function." ) - def generate_boundary_events(n_trials): + def _generate_boundary_events(n_trials): """ Generate boundary events for epoched data without events. From 1482a80f353b5f94eaa87b16135774d34403507a Mon Sep 17 00:00:00 2001 From: Ernie Pedapati Date: Sat, 13 Jul 2024 18:58:55 -0400 Subject: [PATCH 5/6] Update mne/io/eeglab/eeglab.py Co-authored-by: Alexandre Gramfort --- mne/io/eeglab/eeglab.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mne/io/eeglab/eeglab.py b/mne/io/eeglab/eeglab.py index 03b0573a7be..413a6660226 100644 --- a/mne/io/eeglab/eeglab.py +++ b/mne/io/eeglab/eeglab.py @@ -630,8 +630,10 @@ def _generate_boundary_events(n_trials): Returns ------- - numpy.ndarray: Array of boundary events - dict: Event id dictionary + events: ndarray + Array of boundary events + event_id: dict + Event id dictionary """ events = np.zeros((n_trials, 3), dtype=np.int64) # Explicitly use int64 events[:, 0] = np.arange( From f96f9f0bf6dca164725cb4b80c26ef9336f09e8c Mon Sep 17 00:00:00 2001 From: Ernie Pedapati Date: Sat, 13 Jul 2024 18:59:06 -0400 Subject: [PATCH 6/6] Update mne/io/eeglab/eeglab.py Co-authored-by: Alexandre Gramfort --- mne/io/eeglab/eeglab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mne/io/eeglab/eeglab.py b/mne/io/eeglab/eeglab.py index 413a6660226..2e7784925a5 100644 --- a/mne/io/eeglab/eeglab.py +++ b/mne/io/eeglab/eeglab.py @@ -690,7 +690,7 @@ def _generate_boundary_events(n_trials): # now fill up the event array if event_id is None and not event_name and not event_latencies: # account for EEGLAB with trials but no events - events, event_id = generate_boundary_events(eeg.trials) + events, event_id = _generate_boundary_events(eeg.trials) else: events = np.zeros((eeg.trials, 3), dtype=int) for idx in range(0, eeg.trials):