[med-svn] [python-mne] 170/376: fix epoch rejection

Yaroslav Halchenko debian at onerussian.com
Fri Nov 27 17:22:29 UTC 2015


This is an automated email from the git hooks/post-receive script.

yoh pushed a commit to annotated tag v0.1
in repository python-mne.

commit a6a18189771f6c8306eb72fc449d20c66ce522ea
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date:   Tue Mar 29 14:29:30 2011 -0400

    fix epoch rejection
---
 mne/epochs.py                    |  54 +++++++++++++++++++++++++--------------
 mne/fiff/pick.py                 |  18 ++++++++++---
 mne/fiff/tests/data/test-ave.fif | Bin 5546473 -> 5546473 bytes
 mne/tests/test_epochs.py         |  32 +++++++++++++++--------
 4 files changed, 71 insertions(+), 33 deletions(-)

diff --git a/mne/epochs.py b/mne/epochs.py
index 2838039..ef167ee 100644
--- a/mne/epochs.py
+++ b/mne/epochs.py
@@ -227,16 +227,16 @@ class Epochs(object):
         Parameters
         ----------
         grad : float
-            Max value for gradiometers. (about 5000e-13).
+            Max value for gradiometers. (about 4000 fT / cm = 4000e-13 T / m).
             If None do not reject based on gradiometers.
         mag : float
-            Max value for magnetometers. (about  6e-12)
+            Max value for magnetometers. (about  4000 fT = 4e-12 T)
             If None do not reject based on magnetometers.
         eeg : float
-            Max value for EEG. (about 40e-6)
+            Max value for EEG. (about 40e-6 uV)
             If None do not reject based on EEG.
         eog : float
-            Max value for EEG. (about 250e-6)
+            Max value for EEG. (about 250e-6 uV)
             If None do not reject based on EOG.
 
         Returns
@@ -258,24 +258,40 @@ class Epochs(object):
             if eog is not None and channel_type(self.info, idx) == 'eog':
                 eog_idx.append(idx)
 
-        if len(eog_idx) == 0:
-            print "No EOG channel found. Do not rejecting based on EOG."
+        if grad is not None and len(grad_idx) == 0:
+            raise ValueError("No GRAD channel found. Cannot reject based on GRAD.")
+        elif grad is not None:
+            print "grad reject : %s fT/cm" % (1e13*grad)
+        if mag is not None and len(mag_idx) == 0:
+            raise ValueError("No MAG channel found. Cannot reject based on MAG.")
+        elif mag is not None:
+            print "mag  reject : %s fT" % (1e15*mag)
+        if eeg is not None and len(eeg_idx) == 0:
+            raise ValueError("No EEG channel found. Cannot reject based on EEG.")
+        elif eeg is not None:
+            print "EEG  reject : %s uV" % (1e6*eeg)
+        if eog is not None and len(eog_idx) == 0:
+            raise ValueError("No EOG channel found. Cannot reject based on EOG.")
+        elif eog is not None:
+            print "EOG  reject : %s uV" % (1e6*eog)
 
         good_epochs = []
         for k, e in enumerate(self):
-            if len(grad_idx) > 0 and np.max(e[grad_idx]) > grad:
-                print 'Rejecting epoch based on gradiometers.'
-                continue
-            if len(mag_idx) > 0 and np.max(e[mag_idx]) > mag:
-                print 'Rejecting epoch based on magnetometers.'
-                continue
-            if len(eeg_idx) > 0 and np.max(e[eeg_idx]) > eeg:
-                print 'Rejecting epoch based on EEG.'
-                continue
-            if len(eog_idx) > 0 and np.max(e[eog_idx]) > eog:
-                print 'Rejecting epoch based on EOG.'
-                continue
-            good_epochs.append(k)
+            for thresh, idx, name in zip([grad, mag, eeg, eog],
+                                         [grad_idx, mag_idx, eeg_idx, eog_idx],
+                                         ['GRAD', 'MAG', 'EEG', 'EOG']):
+                if len(idx) > 0:
+                    e_idx = e[idx]
+                    deltas = np.max(e_idx, axis=1) - np.min(e_idx, axis=1)
+                    idx_max_delta = np.argmax(deltas)
+                    delta = deltas[idx_max_delta]
+                    if delta > thresh:
+                        ch_name = self.ch_names[idx[idx_max_delta]]
+                        print '\tRejecting epoch based on %s : %s (%s > %s).' \
+                                    % (name, ch_name, delta, thresh)
+                        break
+            else:
+                good_epochs.append(k)
 
         n_good_epochs = len(good_epochs)
         print "Keeping %d epochs (%d bad)" % (n_good_epochs,
diff --git a/mne/fiff/pick.py b/mne/fiff/pick.py
index b25c544..2a045fa 100644
--- a/mne/fiff/pick.py
+++ b/mne/fiff/pick.py
@@ -72,22 +72,26 @@ def pick_channels(ch_names, include, exclude=[]):
     return sel
 
 
-def pick_types(info, meg=True, eeg=False, stim=False, include=[], exclude=[]):
+def pick_types(info, meg=True, eeg=False, stim=False, eog=False, ecg=False,
+               emg=False, include=[], exclude=[]):
     """Pick channels by type and names
 
     Parameters
     ----------
     info : dict
         The measurement info
-
     meg : bool or string
         Is True include MEG channels or False include None
         If string it can be 'mag' or 'grad' to select only gradiometers
         or magnetometers.
-
     eeg : bool
         Is True include EEG channels
-
+    eog : bool
+        Is True include EOG channels
+    ecg : bool
+        Is True include ECG channels
+    emg : bool
+        Is True include EMG channels
     stim : bool
         Is True include stimulus channels
 
@@ -120,6 +124,12 @@ def pick_types(info, meg=True, eeg=False, stim=False, include=[], exclude=[]):
             pick[k] = True
         elif kind == FIFF.FIFFV_STIM_CH and stim:
             pick[k] = True
+        elif kind == FIFF.FIFFV_EOG_CH and eog:
+            pick[k] = True
+        elif kind == FIFF.FIFFV_ECG_CH and ecg:
+            pick[k] = True
+        elif kind == FIFF.FIFFV_EMG_CH and emg:
+            pick[k] = True
 
     myinclude = [info['ch_names'][k] for k in range(nchan) if pick[k]]
     myinclude += include
diff --git a/mne/fiff/tests/data/test-ave.fif b/mne/fiff/tests/data/test-ave.fif
index 0ff74c8..67a3db6 100644
Binary files a/mne/fiff/tests/data/test-ave.fif and b/mne/fiff/tests/data/test-ave.fif differ
diff --git a/mne/tests/test_epochs.py b/mne/tests/test_epochs.py
index 85ebc01..ee0c851 100644
--- a/mne/tests/test_epochs.py
+++ b/mne/tests/test_epochs.py
@@ -18,19 +18,31 @@ def test_read_epochs():
     tmin = -0.2
     tmax = 0.5
 
-    #   Setup for reading the raw data
+    # Setup for reading the raw data
     raw = fiff.Raw(raw_fname)
     events = mne.read_events(event_name)
+    picks = fiff.pick_types(raw.info, meg=True, eeg=False, stim=False,
+                            eog=True, include=['STI 014'])
+    epochs = mne.Epochs(raw, events, event_id, tmin, tmax, picks=picks,
+                        baseline=(None, 0))
+    epochs.average()
 
-    # Set up pick list: MEG + STI 014 - bad channels (modify to your needs)
-    include = ['STI 014'];
-    want_meg = True
-    want_eeg = False
-    want_stim = False
-    picks = fiff.pick_types(raw.info, want_meg, want_eeg, want_stim,
-                            include, raw.info['bads'])
 
+def test_reject_epochs():
+    event_id = 1
+    tmin = -0.2
+    tmax = 0.5
+
+    # Setup for reading the raw data
+    raw = fiff.Raw(raw_fname)
+    events = mne.read_events(event_name)
+
+    picks = fiff.pick_types(raw.info, meg=True, eeg=True, stim=True,
+                            eog=True, include=['STI 014'])
     epochs = mne.Epochs(raw, events, event_id, tmin, tmax, picks=picks,
                         baseline=(None, 0))
-    epochs.reject(grad=4000e-13, mag=4e-12, eeg=40e-6, eog=150e-6)
-    epochs.average()
+    n_epochs = len(epochs)
+    epochs.reject(grad=1000e-12, mag=4e-12, eeg=80e-6, eog=150e-6)
+    n_clean_epochs = len(epochs)
+    assert n_epochs > n_clean_epochs
+    assert n_clean_epochs == 3

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git



More information about the debian-med-commit mailing list