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 bcccd7cb7d92a80c765197cb5d3e1155a62c60ab Author: Alexandre Gramfort <[email protected]> Date: Mon Dec 27 19:37:42 2010 -0500 first working version of read_cov --- examples/read_cov.py | 14 ++++++ fiff/__init__.py | 1 + fiff/channels.py | 27 +++++++++++ fiff/cov.py | 111 +++++++++++++++++++++++++++++++++++++++++++++ fiff/evoked.py | 125 +-------------------------------------------------- fiff/proj.py | 104 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 259 insertions(+), 123 deletions(-) diff --git a/examples/read_cov.py b/examples/read_cov.py new file mode 100644 index 0000000..ee771f1 --- /dev/null +++ b/examples/read_cov.py @@ -0,0 +1,14 @@ +import pylab as pl +import fiff + +fname = 'sm02a1-cov.fif' + +fid, tree, _ = fiff.fiff_open(fname) + +cov_type = 1 +cov = fiff.read_cov(fid, tree, cov_type) + +print "cov size: %s x %s" % cov['data'].shape + +pl.matshow(cov['data']) +pl.show() diff --git a/fiff/__init__.py b/fiff/__init__.py index 51e92f4..b32fefb 100644 --- a/fiff/__init__.py +++ b/fiff/__init__.py @@ -1,3 +1,4 @@ from .open import fiff_open from .evoked import read_evoked +from .cov import read_cov from .constants import FIFF diff --git a/fiff/channels.py b/fiff/channels.py new file mode 100644 index 0000000..dcf2838 --- /dev/null +++ b/fiff/channels.py @@ -0,0 +1,27 @@ +from .tree import dir_tree_find +from .tag import find_tag +from .constants import FIFF + + +def read_bad_channels(fid, node): + """ + % + % [bads] = fiff_read_bad_channels(fid,node) + % + % Reas the bad channel list from a node if it exists + % + % fid - The file id + % node - The node of interes + % + """ + + nodes = dir_tree_find(node, FIFF.FIFFB_MNE_BAD_CHANNELS) + + bads = []; + if len(nodes) > 0: + for node in nodes: + tag = find_tag(fid, node, FIFF.FIFF_MNE_CH_NAME_LIST) + if tag is not None: + bads = tag.data.split(':') + return bads + diff --git a/fiff/cov.py b/fiff/cov.py new file mode 100644 index 0000000..3b6dabf --- /dev/null +++ b/fiff/cov.py @@ -0,0 +1,111 @@ +import numpy as np + +from .constants import FIFF +from .tag import find_tag +from .tree import dir_tree_find +from .proj import read_proj +from .channels import read_bad_channels + + +def read_cov(fid, node, cov_kind): + """ + % + % [cov] = mne_read_cov(fid, node, kind) + % + % Reads a covariance matrix from a fiff file + % + % fid - an open file descriptor + % node - look for the matrix in here + % cov_kind - what kind of a covariance matrix do we want? + % + """ + + # Find all covariance matrices + covs = dir_tree_find(node, FIFF.FIFFB_MNE_COV) + if len(covs) == 0: + raise ValueError, 'No covariance matrices found' + + # Is any of the covariance matrices a noise covariance + for p in range(len(covs)): + tag = find_tag(fid, covs[p], FIFF.FIFF_MNE_COV_KIND) + if tag is not None and tag.data == cov_kind: + this = covs[p] + + # Find all the necessary data + tag = find_tag(fid, this, FIFF.FIFF_MNE_COV_DIM) + if tag is None: + raise ValueError, 'Covariance matrix dimension not found' + + dim = tag.data + tag = find_tag(fid, this, FIFF.FIFF_MNE_COV_NFREE) + if tag is None: + nfree = -1 + else: + nfree = tag.data + + tag = find_tag(fid, this, FIFF.FIFF_MNE_ROW_NAMES) + if tag is None: + names = [] + else: + names = tag.data.split(':') + if len(names) != dim: + raise ValueError, 'Number of names does not match covariance matrix dimension' + + tag = find_tag(fid, this, FIFF.FIFF_MNE_COV) + if tag is None: + tag = find_tag(fid, this, FIFF.FIFF_MNE_COV_DIAG) + if tag is None: + raise ValueError, 'No covariance matrix data found' + else: + # Diagonal is stored + data = tag.data + diagmat = True + print '\t%d x %d diagonal covariance (kind = %d) found.\n' % (dim, dim, cov_kind) + + else: + from scipy import sparse + if not sparse.issparse(tag.data): + # Lower diagonal is stored + vals = tag.data + data = np.zeros((dim, dim)) + q = 0 + for j in range(dim): + for k in range(j): + data[j, k] = vals[q]; + q += 1 + data = data + data.T + data.flat[::dim+1] /= 2.0 + + diagmat = False; + print '\t%d x %d full covariance (kind = %d) found.\n' % (dim, dim, cov_kind) + else: + diagmat = False + data = tag.data + print '\t%d x %d sparse covariance (kind = %d) found.\n' % (dim, dim, cov_kind) + + # Read the possibly precomputed decomposition + tag1 = find_tag(fid, this, FIFF.FIFF_MNE_COV_EIGENVALUES) + tag2 = find_tag(fid, this, FIFF.FIFF_MNE_COV_EIGENVECTORS) + if tag1 is not None and tag2 is not None: + eig = tag1.data + eigvec = tag2.data + else: + eig = None + eigvec = None + + + # Read the projection operator + projs = read_proj(fid, this) + + # Read the bad channel list + bads = read_bad_channels(fid, this) + + # Put it together + cov = dict(kind=cov_kind, diag=diagmat, dim=dim, names=names, + data=data, projs=projs, bads=bads, nfree=nfree, eig=eig, + eigvec=eigvec) + return cov + + raise ValueError, 'Did not find the desired covariance matrix' + + return None diff --git a/fiff/evoked.py b/fiff/evoked.py index 81f7dca..d9048dd 100644 --- a/fiff/evoked.py +++ b/fiff/evoked.py @@ -6,129 +6,8 @@ from .open import fiff_open from .ctf import read_ctf_comp from .tag import read_tag, find_tag from .tree import dir_tree_find - - -def read_proj(fid, node): - """ - [ projdata ] = fiff_read_proj(fid,node) - - Read the SSP data under a given directory node - - """ - - projdata = [] - - # Locate the projection data - nodes = dir_tree_find(node, FIFF.FIFFB_PROJ) - if len(nodes) == 0: - return projdata - - tag = find_tag(fid, nodes[0], FIFF.FIFF_NCHAN) - if tag is not None: - global_nchan = tag.data - - items = dir_tree_find(nodes[0], FIFF.FIFFB_PROJ_ITEM) - for i in range(len(items)): - - # Find all desired tags in one item - item = items[i] - tag = find_tag(fid, item, FIFF.FIFF_NCHAN) - if tag is not None: - nchan = tag.data - else: - nchan = global_nchan - - tag = find_tag(fid, item, FIFF.FIFF_DESCRIPTION) - if tag is not None: - desc = tag.data - else: - tag = find_tag(fid, item, FIFF.FIFF_NAME) - if tag is not None: - desc = tag.data - else: - raise ValueError, 'Projection item description missing' - - tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_CH_NAME_LIST) - if tag is not None: - namelist = tag.data; - else: - raise ValueError, 'Projection item channel list missing' - - tag = find_tag(fid, item,FIFF.FIFF_PROJ_ITEM_KIND); - if tag is not None: - kind = tag.data; - else: - raise ValueError, 'Projection item kind missing' - - tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_NVEC) - if tag is not None: - nvec = tag.data - else: - raise ValueError, 'Number of projection vectors not specified' - - tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_CH_NAME_LIST) - if tag is not None: - names = tag.data.split(':') - else: - raise ValueError, 'Projection item channel list missing' - - tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_VECTORS); - if tag is not None: - data = tag.data; - else: - raise ValueError, 'Projection item data missing' - - tag = find_tag(fid, item, FIFF.FIFF_MNE_PROJ_ITEM_ACTIVE); - if tag is not None: - active = tag.data; - else: - active = False; - - if data.shape[1] != len(names): - raise ValueError, 'Number of channel names does not match the size of data matrix' - - # Use exactly the same fields in data as in a named matrix - one = Bunch(kind=kind, active=active, desc=desc, - data=Bunch(nrow=nvec, ncol=nchan, row_names=None, - col_names=names, data=data)) - - projdata.append(one) - - if len(projdata) > 0: - print '\tRead a total of %d projection items:\n', len(projdata) - for k in range(len(projdata)): - print '\t\t%s (%d x %d)' % (projdata[k].desc, - projdata[k].data.nrow, - projdata[k].data.ncol) - if projdata[k].active: - print ' active\n' - else: - print ' idle\n' - - return projdata - - -def read_bad_channels(fid, node): - """ - % - % [bads] = fiff_read_bad_channels(fid,node) - % - % Reas the bad channel list from a node if it exists - % - % fid - The file id - % node - The node of interes - % - """ - - nodes = dir_tree_find(node, FIFF.FIFFB_MNE_BAD_CHANNELS) - - bads = []; - if len(nodes) > 0: - for node in nodes: - tag = find_tag(fid, node, FIFF.FIFF_MNE_CH_NAME_LIST) - if tag is not None: - bads = tag.data.split(':') - return bads +from .proj import read_proj +from .channels import read_bad_channels def read_meas_info(source, tree=None): diff --git a/fiff/proj.py b/fiff/proj.py new file mode 100644 index 0000000..089d07b --- /dev/null +++ b/fiff/proj.py @@ -0,0 +1,104 @@ +from .tree import dir_tree_find +from .constants import FIFF +from .tag import find_tag +from .bunch import Bunch + + +def read_proj(fid, node): + """ + [ projdata ] = fiff_read_proj(fid,node) + + Read the SSP data under a given directory node + + """ + + projdata = [] + + # Locate the projection data + nodes = dir_tree_find(node, FIFF.FIFFB_PROJ) + if len(nodes) == 0: + return projdata + + tag = find_tag(fid, nodes[0], FIFF.FIFF_NCHAN) + if tag is not None: + global_nchan = tag.data + + items = dir_tree_find(nodes[0], FIFF.FIFFB_PROJ_ITEM) + for i in range(len(items)): + + # Find all desired tags in one item + item = items[i] + tag = find_tag(fid, item, FIFF.FIFF_NCHAN) + if tag is not None: + nchan = tag.data + else: + nchan = global_nchan + + tag = find_tag(fid, item, FIFF.FIFF_DESCRIPTION) + if tag is not None: + desc = tag.data + else: + tag = find_tag(fid, item, FIFF.FIFF_NAME) + if tag is not None: + desc = tag.data + else: + raise ValueError, 'Projection item description missing' + + tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_CH_NAME_LIST) + if tag is not None: + namelist = tag.data; + else: + raise ValueError, 'Projection item channel list missing' + + tag = find_tag(fid, item,FIFF.FIFF_PROJ_ITEM_KIND); + if tag is not None: + kind = tag.data; + else: + raise ValueError, 'Projection item kind missing' + + tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_NVEC) + if tag is not None: + nvec = tag.data + else: + raise ValueError, 'Number of projection vectors not specified' + + tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_CH_NAME_LIST) + if tag is not None: + names = tag.data.split(':') + else: + raise ValueError, 'Projection item channel list missing' + + tag = find_tag(fid, item, FIFF.FIFF_PROJ_ITEM_VECTORS); + if tag is not None: + data = tag.data; + else: + raise ValueError, 'Projection item data missing' + + tag = find_tag(fid, item, FIFF.FIFF_MNE_PROJ_ITEM_ACTIVE); + if tag is not None: + active = tag.data; + else: + active = False; + + if data.shape[1] != len(names): + raise ValueError, 'Number of channel names does not match the size of data matrix' + + # Use exactly the same fields in data as in a named matrix + one = Bunch(kind=kind, active=active, desc=desc, + data=Bunch(nrow=nvec, ncol=nchan, row_names=None, + col_names=names, data=data)) + + projdata.append(one) + + if len(projdata) > 0: + print '\tRead a total of %d projection items:\n', len(projdata) + for k in range(len(projdata)): + print '\t\t%s (%d x %d)' % (projdata[k].desc, + projdata[k].data.nrow, + projdata[k].data.ncol) + if projdata[k].active: + print ' active\n' + else: + print ' idle\n' + + return projdata -- 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
