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 ef97d5164ba98f43c931764ec8d4fd041dde30b1 Author: Alexandre Gramfort <[email protected]> Date: Mon Jun 13 17:11:57 2011 -0400 ENH : first support for CTF data --- mne/fiff/ctf.py | 228 +++++++++++++++++++++++++------------------------- mne/fiff/meas_info.py | 3 +- mne/fiff/pick.py | 5 +- mne/fiff/write.py | 27 +++--- mne/viz.py | 2 +- 5 files changed, 131 insertions(+), 134 deletions(-) diff --git a/mne/fiff/ctf.py b/mne/fiff/ctf.py index 6b36816..b7a6683 100644 --- a/mne/fiff/ctf.py +++ b/mne/fiff/ctf.py @@ -15,12 +15,22 @@ def hex2dec(s): def _read_named_matrix(fid, node, matkind): - """ - % - % [mat] = fiff__read_named_matrix(fid,node) - % - % Read named matrix from the given node - % + """read_named_matrix(fid,node) + + Read named matrix from the given node + + Parameters + ---------- + fid : file + The file descriptor + node : dict + Node + matkind : mat kind + XXX + Returns + ------- + mat : dict + The matrix with row and col names. """ # Descend one level if necessary @@ -110,91 +120,87 @@ def read_ctf_comp(fid, node, chs): comps = dir_tree_find(node, FIFF.FIFFB_MNE_CTF_COMP_DATA) for node in comps: - # XXX - raise NotImplementedError("CTF data processing is not supported yet") - - # - # # Read the data we need - # mat = _read_named_matrix(fid, node, FIFF.FIFF_MNE_CTF_COMP_DATA) - # for p in range(node['nent']): - # kind = node['dir'][p].kind - # pos = node['dir'][p].pos - # if kind == FIFF.FIFF_MNE_CTF_COMP_KIND: - # tag = read_tag(fid, pos) - # break - # else: - # raise ValueError, 'Compensation type not found' - # - # # Get the compensation kind and map it to a simple number - # one = dict(ctfkind=tag.data, kind=-1) - # del tag - # - # if one.ctfkind == int('47314252', 16): # hex2dec('47314252'): - # one.kind = 1 - # elif one.ctfkind == int('47324252', 16): # hex2dec('47324252'): - # one.kind = 2 - # elif one.ctfkind == int('47334252', 16): # hex2dec('47334252'): - # one.kind = 3 - # else: - # one.kind = one.ctfkind - # - # for p in range(node['nent']): - # kind = node['dir'][p].kind - # pos = node['dir'][p].pos - # if kind == FIFF.FIFF_MNE_CTF_COMP_CALIBRATED: - # tag = read_tag(fid, pos) - # calibrated = tag.data - # break - # else: - # calibrated = False - # - # one['save_calibrated'] = calibrated - # one['rowcals'] = np.ones(1, mat.shape[0]) - # one['colcals'] = np.ones(1, mat.shape[1]) - # if not calibrated: - # # - # # Calibrate... - # # - # # Do the columns first - # # - # ch_names = [] - # for p in range(len(chs)): - # ch_names.append(chs[p]['ch_name']) - # - # col_cals = np.zeros(mat.data.shape[1]) - # for col in range(mat.data.shape[1]): - # p = ch_names.count(mat.col_names[col]) - # if p == 0: - # raise ValueError, 'Channel %s is not available in data' \ - # % mat.col_names[col] - # elif p > 1: - # raise ValueError, 'Ambiguous channel %s' % \ - # mat.col_names[col] - # - # col_cals[col] = 1.0 / (chs[p]['range'] * chs[p]['cal']) - # - # # Then the rows - # row_cals = np.zeros(mat.data.shape[0]) - # for row in range(mat.data.shape[0]): - # p = ch_names.count(mat.row_names[row]) - # if p == 0: - # raise ValueError, 'Channel %s is not available in data' \ - # % mat.row_names[row] - # elif p > 1: - # raise ValueError, 'Ambiguous channel %s' % \ - # mat.row_names[row] - # - # row_cals[row] = chs[p]['range'] * chs[p]['cal'] - # - # mat.data = np.dot(np.diag(row_cals), np.dot(mat.data, - # np.diag(col_cals))) - # one.rowcals = row_cals - # one.colcals = col_cals - # - # one.data = mat - # compdata.append(one) - # del row_cals - # del col_cals + # Read the data we need + mat = _read_named_matrix(fid, node, FIFF.FIFF_MNE_CTF_COMP_DATA) + for p in range(node['nent']): + kind = node['directory'][p].kind + pos = node['directory'][p].pos + if kind == FIFF.FIFF_MNE_CTF_COMP_KIND: + tag = read_tag(fid, pos) + break + else: + raise Exception('Compensation type not found') + + # Get the compensation kind and map it to a simple number + one = dict(ctfkind=tag.data, kind=-1) + del tag + + if one['ctfkind'] == int('47314252', 16): # hex2dec('47314252'): + one['kind'] = 1 + elif one['ctfkind'] == int('47324252', 16): # hex2dec('47324252'): + one['kind'] = 2 + elif one['ctfkind'] == int('47334252', 16): # hex2dec('47334252'): + one['kind'] = 3 + else: + one['kind'] = one['ctfkind'] + + for p in range(node['nent']): + kind = node['directory'][p].kind + pos = node['directory'][p].pos + if kind == FIFF.FIFF_MNE_CTF_COMP_CALIBRATED: + tag = read_tag(fid, pos) + calibrated = tag.data + break + else: + calibrated = False + + one['save_calibrated'] = calibrated + one['rowcals'] = np.ones(mat['data'].shape[0], dtype=np.float) + one['colcals'] = np.ones(mat['data'].shape[1], dtype=np.float) + if not calibrated: + # + # Calibrate... + # + # Do the columns first + # + ch_names = [] + for p in range(len(chs)): + ch_names.append(chs[p]['ch_name']) + + col_cals = np.zeros(mat['data'].shape[1], dtype=np.float) + for col in range(mat['data'].shape[1]): + p = ch_names.count(mat['col_names'][col]) + if p == 0: + raise Exception('Channel %s is not available in data' + % mat['col_names'][col]) + elif p > 1: + raise Exception('Ambiguous channel %s' % + mat['col_names'][col]) + + col_cals[col] = 1.0 / (chs[p]['range'] * chs[p]['cal']) + + # Then the rows + row_cals = np.zeros(mat['data'].shape[0]) + for row in range(mat['data'].shape[0]): + p = ch_names.count(mat['row_names'][row]) + if p == 0: + raise Exception('Channel %s is not available in data' + % mat['row_names'][row]) + elif p > 1: + raise Exception('Ambiguous channel %s' % + mat['row_names'][row]) + + row_cals[row] = chs[p]['range'] * chs[p]['cal'] + + mat['data'] = np.dot(np.diag(row_cals), np.dot(mat['data'], + np.diag(col_cals))) + one['rowcals'] = row_cals + one['colcals'] = col_cals + + one['data'] = mat + compdata.append(one) + del row_cals + del col_cals if len(compdata) > 0: print '\tRead %d compensation matrices' % len(compdata) @@ -205,7 +211,6 @@ def read_ctf_comp(fid, node, chs): ############################################################################### # Writing -from scipy import linalg from .write import start_block, end_block, write_int, write_named_matrix @@ -223,26 +228,19 @@ def write_ctf_comp(fid, comps): if len(comps) <= 0: return - # XXX - raise NotImplementedError("CTF data processing is not supported yet") - - # # This is very simple in fact - # start_block(fid, FIFF.FIFFB_MNE_CTF_COMP) - # for comp in comps: - # start_block(fid, FIFF.FIFFB_MNE_CTF_COMP_DATA) - # # Write the compensation kind - # write_int(fid, FIFF.FIFF_MNE_CTF_COMP_KIND, comp['ctfkind']) - # write_int(fid, FIFF.FIFF_MNE_CTF_COMP_CALIBRATED, - # comp['save_calibrated']) - # - # # Write an uncalibrated or calibrated matrix - # import pdb; pdb.set_trace() - # - # comp['data']['data'] = linalg.inv( - # np.dot(np.diag(comp['rowcals'].ravel())), - # np.dot(comp.data.data, - # linalg.inv(np.diag(comp.colcals.ravel())))) - # write_named_matrix(fid, FIFF.FIFF_MNE_CTF_COMP_DATA, comp['data']) - # end_block(fid, FIFF.FIFFB_MNE_CTF_COMP_DATA) - # - # end_block(fid, FIFF.FIFFB_MNE_CTF_COMP) + # This is very simple in fact + start_block(fid, FIFF.FIFFB_MNE_CTF_COMP) + for comp in comps: + start_block(fid, FIFF.FIFFB_MNE_CTF_COMP_DATA) + # Write the compensation kind + write_int(fid, FIFF.FIFF_MNE_CTF_COMP_KIND, comp['ctfkind']) + write_int(fid, FIFF.FIFF_MNE_CTF_COMP_CALIBRATED, + comp['save_calibrated']) + + # Write an uncalibrated or calibrated matrix + comp['data']['data'] = (comp['rowcals'][:, None] * comp['data']['data'] + * comp['colcals'][None, :]) + write_named_matrix(fid, FIFF.FIFF_MNE_CTF_COMP_DATA, comp['data']) + end_block(fid, FIFF.FIFFB_MNE_CTF_COMP_DATA) + + end_block(fid, FIFF.FIFFB_MNE_CTF_COMP) diff --git a/mne/fiff/meas_info.py b/mne/fiff/meas_info.py index a9afd67..61efcf3 100644 --- a/mne/fiff/meas_info.py +++ b/mne/fiff/meas_info.py @@ -4,6 +4,7 @@ # License: BSD (3-clause) import numpy as np +from scipy import linalg from .open import fiff_open from .tree import dir_tree_find, copy_tree @@ -216,7 +217,7 @@ def read_meas_info(fid, tree): if dev_head_t is not None and ctf_head_t is not None: info['dev_ctf_t'] = info['dev_head_t'] info['dev_ctf_t']['to'] = info['ctf_head_t']['from'] - info['dev_ctf_t']['trans'] = np.dot(np.inv(ctf_head_t['trans']), + info['dev_ctf_t']['trans'] = np.dot(linalg.inv(ctf_head_t['trans']), info['dev_ctf_t']['trans']) else: info['dev_ctf_t'] = [] diff --git a/mne/fiff/pick.py b/mne/fiff/pick.py index d615655..306ab5c 100644 --- a/mne/fiff/pick.py +++ b/mne/fiff/pick.py @@ -26,11 +26,13 @@ def channel_type(info, idx): """ kind = info['chs'][idx]['kind'] - if (kind == FIFF.FIFFV_MEG_CH or kind == FIFF.FIFFV_REF_MEG_CH): + if kind == FIFF.FIFFV_MEG_CH: if info['chs'][idx]['unit'] == FIFF.FIFF_UNIT_T_M: return 'grad' elif info['chs'][idx]['unit'] == FIFF.FIFF_UNIT_T: return 'mag' + elif kind == FIFF.FIFFV_REF_MEG_CH: + return 'ref_meg' elif kind == FIFF.FIFFV_EEG_CH: return 'eeg' elif kind == FIFF.FIFFV_STIM_CH: @@ -41,6 +43,7 @@ def channel_type(info, idx): return 'emg' elif kind == FIFF.FIFFV_ECG_CH: return 'ecg' + raise Exception('Unknown channel type') def pick_channels(ch_names, include, exclude=[]): diff --git a/mne/fiff/write.py b/mne/fiff/write.py index e50679b..d255944 100644 --- a/mne/fiff/write.py +++ b/mne/fiff/write.py @@ -290,20 +290,15 @@ def write_dig_point(fid, dig): def write_named_matrix(fid, kind, mat): """Writes a named single-precision floating-point matrix""" + start_block(fid, FIFF.FIFFB_MNE_NAMED_MATRIX) + write_int(fid, FIFF.FIFF_MNE_NROW, mat['nrow']) + write_int(fid, FIFF.FIFF_MNE_NCOL, mat['ncol']) - raise NotImplementedError("CTF data processing is not supported yet") - - # start_block(fid, FIFF.FIFFB_MNE_NAMED_MATRIX) - # write_int(fid, FIFF.FIFF_MNE_NROW, mat['nrow']) - # write_int(fid, FIFF.FIFF_MNE_NCOL, mat['ncol']) - # - # if len(mat['row_names']) > 0: - # write_name_list(fid, FIFF.FIFF_MNE_ROW_NAMES, mat['row_names']) - # - # if len(mat['col_names']) > 0: - # write_name_list(fid, FIFF.FIFF_MNE_COL_NAMES, mat['col_names']) - # - # write_float_matrix(fid,kind, mat.data) - # end_block(fid, FIFF.FIFFB_MNE_NAMED_MATRIX) - # - # return; + if len(mat['row_names']) > 0: + write_name_list(fid, FIFF.FIFF_MNE_ROW_NAMES, mat['row_names']) + + if len(mat['col_names']) > 0: + write_name_list(fid, FIFF.FIFF_MNE_COL_NAMES, mat['col_names']) + + write_float_matrix(fid, kind, mat['data']) + end_block(fid, FIFF.FIFFB_MNE_NAMED_MATRIX) diff --git a/mne/viz.py b/mne/viz.py index acb80b6..8670b2a 100644 --- a/mne/viz.py +++ b/mne/viz.py @@ -65,7 +65,7 @@ def plot_evoked(evoked, picks=None, unit=True, show=True): if unit is False: scaling = 1.0 ch_unit = 'NA' # no unit - idx = [picks[i] for i in range(len(picks)) if types[i] is t] + idx = [picks[i] for i in range(len(picks)) if types[i] == t] if len(idx) > 0: pl.subplot(n_channel_types, 1, counter) pl.plot(times, scaling * evoked.data[idx, :].T) -- 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
