diff --git a/doc/changes/latest.inc b/doc/changes/latest.inc index 4553c597e97..40e31e1066a 100644 --- a/doc/changes/latest.inc +++ b/doc/changes/latest.inc @@ -287,6 +287,8 @@ Bugs - :func:`mne.preprocessing.find_ecg_events` now correctly handles situation where no ECG activity could be detected, and correctly returns an empty array of ECG events (:gh:`9236` by `Richard Höchenberger`_) +- `mne.preprocessing.compute_proj_eog` and `mne.preprocessing.compute_proj_ecg` now return empty lists if no EOG or ECG events, respectively, could be found. Previously, we'd return ``None`` in these situations, which does not match the documented behavior of returning a list of projectors (:gh:`9277` by `Richard Höchenberger`_) + API changes ~~~~~~~~~~~ - Introduced new ``'auto'`` settings for ``ICA.max_iter``. The old default ``max_iter=200`` will be removed in MNE-Python 0.24 (:gh:`9099` **by new contributor** |Cora Kim|_) diff --git a/mne/preprocessing/ssp.py b/mne/preprocessing/ssp.py index 373c24488e9..bd49d6bfa4f 100644 --- a/mne/preprocessing/ssp.py +++ b/mne/preprocessing/ssp.py @@ -69,8 +69,8 @@ def _compute_exg_proj(mode, raw, raw_event, tmin, tmax, # Check to make sure we actually got at least one usable event if events.shape[0] < 1: - warn('No %s events found, returning None for projs' % mode) - return (None, events) + (([],) if return_drop_log else ()) + warn(f'No {mode} events found') + return ([], events) + (([],) if return_drop_log else ()) logger.info('Computing projector') my_info = cp.deepcopy(raw.info) @@ -120,8 +120,8 @@ def _compute_exg_proj(mode, raw, raw_event, tmin, tmax, drop_log = epochs.drop_log if epochs.events.shape[0] < 1: - warn('No good epochs found, returning None for projs') - return (None, events) + ((drop_log,) if return_drop_log else ()) + warn('No good epochs found') + return ([], events) + ((drop_log,) if return_drop_log else ()) if average: evoked = epochs.average() diff --git a/mne/preprocessing/tests/test_ssp.py b/mne/preprocessing/tests/test_ssp.py index b16f5190a16..4307dc9f6ea 100644 --- a/mne/preprocessing/tests/test_ssp.py +++ b/mne/preprocessing/tests/test_ssp.py @@ -63,8 +63,12 @@ def test_compute_proj_ecg(short_raw, average): projs, events, drop_log = compute_proj_ecg( raw, n_mag=2, n_grad=2, n_eeg=2, ch_name='MEG 1531', bads=[], average=average, avg_ref=True, no_proj=True, l_freq=None, - h_freq=None, tmax=dur_use, return_drop_log=True) - assert projs is None + h_freq=None, tmax=dur_use, return_drop_log=True, + # XXX can be removed once + # XXX https://github.com/mne-tools/mne-python/issues/9273 + # XXX has been resolved: + qrs_threshold=1e-15) + assert projs == [] assert len(events) == len(drop_log) @@ -100,7 +104,12 @@ def test_compute_proj_eog(average, short_raw): raw, n_mag=2, n_grad=2, n_eeg=2, average=average, bads=[], avg_ref=True, no_proj=False, l_freq=None, h_freq=None, tmax=dur_use) - assert projs is None + assert projs == [] + + raw._data[raw.ch_names.index('EOG 061'), :] = 1. + with pytest.warns(RuntimeWarning, match='filter.*longer than the signal'): + projs, events = compute_proj_eog(raw=raw, tmax=dur_use, + ch_name='EOG 061') @pytest.mark.slowtest # can be slow on OSX