This is an automated email from the git hooks/post-receive script. yoh pushed a commit to tag 0.4 in repository python-mne.
commit 16832ebf65116eff8ad3b1b822ec399a51dd40ec Author: [email protected] <[email protected]> Date: Wed Jun 20 03:38:37 2012 -0400 ENH: rework of selection --- mne/__init__.py | 1 + mne/fiff/__init__.py | 2 +- mne/fiff/pick.py | 90 ++++++++------------------------------------- mne/fiff/tests/test_pick.py | 16 +------- mne/tests/test_selection.py | 28 ++++++++++++++ 5 files changed, 46 insertions(+), 91 deletions(-) diff --git a/mne/__init__.py b/mne/__init__.py index 7cfab2e..abdfe55 100644 --- a/mne/__init__.py +++ b/mne/__init__.py @@ -22,6 +22,7 @@ from .misc import parse_config, read_reject_parameters from .transforms import transform_coordinates from .proj import read_proj, write_proj, compute_proj_epochs, \ compute_proj_evoked +from .selection import read_selection from . import fiff from . import artifacts from . import stats diff --git a/mne/fiff/__init__.py b/mne/fiff/__init__.py index 1afb60c..3418624 100644 --- a/mne/fiff/__init__.py +++ b/mne/fiff/__init__.py @@ -12,7 +12,7 @@ from .raw import Raw, read_raw_segment, read_raw_segment_times, \ start_writing_raw, write_raw_buffer, finish_writing_raw from .pick import pick_types, pick_channels, pick_types_evoked, \ pick_channels_regexp, pick_channels_forward, \ - pick_types_forward, pick_channels_cov, pick_selection + pick_types_forward, pick_channels_cov from .compensator import get_current_comp from .proj import compute_spatial_vectors, proj_equal, \ diff --git a/mne/fiff/pick.py b/mne/fiff/pick.py index 503bacc..2d6dbe6 100644 --- a/mne/fiff/pick.py +++ b/mne/fiff/pick.py @@ -1,9 +1,9 @@ # Authors: Alexandre Gramfort <[email protected]> # Matti Hamalainen <[email protected]> +# Martin Luessi <[email protected]> # # License: BSD (3-clause) -from os import path from copy import deepcopy import re @@ -110,80 +110,8 @@ def pick_channels_regexp(ch_names, regexp): return [k for k, name in enumerate(ch_names) if r.match(name)] -def _load_selections_file(fname): - """Load selections from file""" - fid = open(fname, 'r') - - selections = {} - - for line in fid: - line = line.strip() - - # skip blank lines and comments - if len(line) == 0 or line[0] == '#': - continue - - # read the channel names into a list - pos = line.find(':') - if pos < 0: - print '":" delimiter not found in selections file, '\ - 'skipping line' - continue - selections[line[:pos]] = line[pos + 1:].split('|') - - fid.close() - - return selections - - -def pick_selection(ch_names, sel_name, sel_fname=None): - """Pick channels using a named selection - - By default, the selections used in mne_browse_raw are supported*. - Additional selections can be added by specifying a selection file (e.g. - produced using mne_browse_raw) using the sel_fname parameter. - - * The included selections are: "Vertex", "Left-temporal", "Right-temporal", - "Left-parietal", "Right-parietal", "Left-occipital", "Right-occipital", - "Left-frontal", and "Right-frontal" - - Parameters - ---------- - ch_names : list of string - List of channels - - sel_name : string - Name of the selection - - self_fname : string - Filename of the selection file (if None, built-in selections are used) - - Returns - ------- - sel : array of int - Indices of channels in selection. - """ - - if sel_fname is None: - sel_fname = path.join(path.dirname(__file__), '..', 'data', - 'mne_analyze.sel') - - if not path.exists(sel_fname): - raise ValueError('The file %s does not exist.' % sel_fname) - - selections = _load_selections_file(sel_fname) - - if sel_name not in selections: - raise ValueError('Selection "%s" not in %s' % (sel_name, sel_fname)) - - # get the channel indices of the selection - sel = pick_channels(ch_names, selections[sel_name]) - - return sel - - def pick_types(info, meg=True, eeg=False, stim=False, eog=False, ecg=False, - emg=False, misc=False, include=[], exclude=[]): + emg=False, misc=False, include=[], exclude=[], selection=None): """Pick channels by type and names Parameters @@ -209,9 +137,10 @@ def pick_types(info, meg=True, eeg=False, stim=False, eog=False, ecg=False, If True include miscellaneous analog channels include : list of string List of additional channels to include. If empty do not include any. - exclude : list of string List of channels to exclude. If empty do not include any. + selection : list of string + Restrict sensor channels (MEG, EEG) to this list of channel names. Returns ------- @@ -247,6 +176,17 @@ def pick_types(info, meg=True, eeg=False, stim=False, eog=False, ecg=False, elif kind == FIFF.FIFFV_MISC_CH and misc: pick[k] = True + # restrict channels to selection if provided + if selection is not None: + # the selection only restricts these types of channels + sel_kind = [FIFF.FIFFV_MEG_CH, FIFF.FIFFV_REF_MEG_CH, + FIFF.FIFFV_EEG_CH] + for k in np.where(pick == True)[0]: + if info['chs'][k]['kind'] not in sel_kind: + continue + if info['ch_names'][k] not in selection: + pick[k] = False + myinclude = [info['ch_names'][k] for k in range(nchan) if pick[k]] myinclude += include diff --git a/mne/fiff/tests/test_pick.py b/mne/fiff/tests/test_pick.py index 71442a8..d3ddb5d 100644 --- a/mne/fiff/tests/test_pick.py +++ b/mne/fiff/tests/test_pick.py @@ -1,5 +1,5 @@ from numpy.testing import assert_array_equal -from ..pick import pick_channels_regexp, pick_selection +from ..pick import pick_channels_regexp def test_pick_channels_regexp(): @@ -8,17 +8,3 @@ def test_pick_channels_regexp(): assert_array_equal(pick_channels_regexp(ch_names, 'MEG ...1'), [0]) assert_array_equal(pick_channels_regexp(ch_names, 'MEG ...[2-3]'), [1, 2]) assert_array_equal(pick_channels_regexp(ch_names, 'MEG *'), [0, 1, 2]) - - -def test_pick_selection(): - """Test pick using named selection""" - # test one channel for each selection - ch_names = ['MEG 2211', 'MEG 0223', 'MEG 1312', 'MEG 0412', 'MEG 1043', - 'MEG 2042', 'MEG 2032', 'MEG 0522', 'MEG 1031'] - sel_names = ['Vertex', 'Left-temporal', 'Right-temporal', 'Left-parietal', - 'Right-parietal', 'Left-occipital', 'Right-occipital', - 'Left-frontal', 'Right-frontal'] - - for i, sel in enumerate(sel_names): - picks = pick_selection(ch_names, sel) - assert(i in picks) diff --git a/mne/tests/test_selection.py b/mne/tests/test_selection.py new file mode 100644 index 0000000..db8e71c --- /dev/null +++ b/mne/tests/test_selection.py @@ -0,0 +1,28 @@ +from sets import Set +from .. import read_selection + + +def test_read_selection(): + """Test reading of selections""" + # test one channel for each selection + ch_names = ['MEG 2211', 'MEG 0223', 'MEG 1312', 'MEG 0412', 'MEG 1043', + 'MEG 2042', 'MEG 2032', 'MEG 0522', 'MEG 1031'] + sel_names = ['Vertex', 'Left-temporal', 'Right-temporal', 'Left-parietal', + 'Right-parietal', 'Left-occipital', 'Right-occipital', + 'Left-frontal', 'Right-frontal'] + + for i, name in enumerate(sel_names): + sel = read_selection(name) + assert(ch_names[i] in sel) + + # test some combinations + all_ch = read_selection(['L', 'R']) + left = read_selection('L') + right = read_selection('R') + + assert(len(all_ch) == len(left) + len(right)) + assert(len(Set(left).intersection(Set(right))) == 0) + + frontal = read_selection('frontal') + occipital = read_selection('Right-occipital') + assert(len(Set(frontal).intersection(Set(occipital))) == 0) -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
