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 989e855144aa7b59ecef7a29033d147615117839 Author: Alexandre Gramfort <[email protected]> Date: Fri Mar 9 12:31:57 2012 +0100 API: read cov now form .fif with mne.read_cov and mne.fiff.read_cov is used to read from file id --- mne/__init__.py | 2 +- mne/cov.py | 197 ++++++-------------------------------------- mne/fiff/__init__.py | 1 + mne/fiff/cov.py | 174 ++++++++++++++++++++++++++++++++++++++ mne/minimum_norm/inverse.py | 3 +- mne/tests/test_cov.py | 17 ++-- 6 files changed, 207 insertions(+), 187 deletions(-) diff --git a/mne/__init__.py b/mne/__init__.py index 89f389a..8044dcc 100644 --- a/mne/__init__.py +++ b/mne/__init__.py @@ -1,6 +1,6 @@ __version__ = '0.2.git' -from .cov import read_cov, write_cov, write_cov_file, Covariance, \ +from .cov import read_cov, write_cov, Covariance, \ compute_raw_data_covariance, compute_covariance from .event import read_events, write_events, find_events, merge_events, \ pick_events diff --git a/mne/cov.py b/mne/cov.py index 02edf48..e91acba 100644 --- a/mne/cov.py +++ b/mne/cov.py @@ -9,15 +9,9 @@ from math import floor, ceil import numpy as np from scipy import linalg -from .fiff.constants import FIFF -from .fiff.tag import find_tag -from .fiff.tree import dir_tree_find -from .fiff.proj import read_proj -from .fiff.channels import _read_bad_channels - -from .fiff.write import start_block, end_block, write_int, write_name_list, \ - write_double, write_float_matrix, start_file, end_file -from .fiff.proj import write_proj, make_projector +from . import fiff +from .fiff.write import start_file, end_file +from .fiff.proj import make_projector from .fiff import fiff_open from .fiff.pick import pick_types, channel_indices_by_type from .epochs import _is_good @@ -75,7 +69,7 @@ class Covariance(object): # Reading fid, tree, _ = fiff_open(fname) - cov = read_cov(fid, tree, cov_kind) + cov = fiff.read_cov(fid, tree, cov_kind) fid.close() self._cov = cov @@ -85,7 +79,15 @@ class Covariance(object): def save(self, fname): """save covariance matrix in a FIF file""" - write_cov_file(fname, self._cov) + fid = start_file(fname) + + try: + fiff.write_cov(fid, self._cov) + except Exception as inst: + os.remove(fname) + raise '%s', inst + + end_file(fid) def __repr__(self): s = "kind : %s" % self.kind @@ -118,114 +120,20 @@ class Covariance(object): ############################################################################### # IO -def read_cov(fid, node, cov_kind): - """Read a noise covariance matrix +def read_cov(fname): + """Read covariance from a FIF file. Parameters ---------- - fid: file - The file descriptor - - node: dict - The node in the FIF tree - - cov_kind: int - The type of covariance. XXX : clarify + fname: string + The name of file containing the covariance matrix. Returns ------- - data: dict - The noise covariance + projs: list + The list of projection vectors. """ - # 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 int(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 (' %d x %d diagonal covariance (kind = %d) found.' - % (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)) - data[np.tril(np.ones((dim, dim))) > 0] = vals - data = data + data.T - data.flat[::dim + 1] /= 2.0 - diagmat = False - print ' %d x %d full covariance (kind = %d) found.' \ - % (dim, dim, cov_kind) - else: - diagmat = False - data = tag.data - print ' %d x %d sparse covariance (kind = %d) found.' \ - % (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 - - print 'Did not find the desired covariance matrix' - - return None - + return Covariance(fname) ############################################################################### # Estimate from data @@ -397,58 +305,7 @@ def compute_covariance(epochs, keep_sample_mean=True): ############################################################################### # Writing -def write_cov(fid, cov): - """Write a noise covariance matrix - - Parameters - ---------- - fid: file - The file descriptor - - cov: dict - The noise covariance matrix to write - """ - start_block(fid, FIFF.FIFFB_MNE_COV) - - # Dimensions etc. - write_int(fid, FIFF.FIFF_MNE_COV_KIND, cov['kind']) - write_int(fid, FIFF.FIFF_MNE_COV_DIM, cov['dim']) - if cov['nfree'] > 0: - write_int(fid, FIFF.FIFF_MNE_COV_NFREE, cov['nfree']) - - # Channel names - if cov['names'] is not None and len(cov['names']) > 0: - write_name_list(fid, FIFF.FIFF_MNE_ROW_NAMES, cov['names']) - - # Data - if cov['diag']: - write_double(fid, FIFF.FIFF_MNE_COV_DIAG, cov['data']) - else: - # Store only lower part of covariance matrix - dim = cov['dim'] - mask = np.tril(np.ones((dim, dim), dtype=np.bool)) > 0 - vals = cov['data'][mask].ravel() - write_double(fid, FIFF.FIFF_MNE_COV, vals) - - # Eigenvalues and vectors if present - if cov['eig'] is not None and cov['eigvec'] is not None: - write_float_matrix(fid, FIFF.FIFF_MNE_COV_EIGENVECTORS, cov['eigvec']) - write_double(fid, FIFF.FIFF_MNE_COV_EIGENVALUES, cov['eig']) - - # Projection operator - write_proj(fid, cov['projs']) - - # Bad channels - if cov['bads'] is not None: - start_block(fid, FIFF.FIFFB_MNE_BAD_CHANNELS) - write_name_list(fid, FIFF.FIFF_MNE_CH_NAME_LIST, cov['bads']) - end_block(fid, FIFF.FIFFB_MNE_BAD_CHANNELS) - - # Done! - end_block(fid, FIFF.FIFFB_MNE_COV) - - -def write_cov_file(fname, cov): +def write_cov(fname, cov): """Write a noise covariance matrix Parameters @@ -456,18 +313,10 @@ def write_cov_file(fname, cov): fname: string The name of the file - cov: dict + cov: Covariance The noise covariance """ - fid = start_file(fname) - - try: - write_cov(fid, cov) - except Exception as inst: - os.remove(fname) - raise '%s', inst - - end_file(fid) + cov.save(fname) ############################################################################### diff --git a/mne/fiff/__init__.py b/mne/fiff/__init__.py index 7d5b666..1e0fc1c 100644 --- a/mne/fiff/__init__.py +++ b/mne/fiff/__init__.py @@ -16,3 +16,4 @@ from .pick import pick_types, pick_channels, pick_types_evoked, \ from .compensator import get_current_comp from .proj import compute_spatial_vectors +from .cov import read_cov, write_cov diff --git a/mne/fiff/cov.py b/mne/fiff/cov.py new file mode 100644 index 0000000..f92d0ac --- /dev/null +++ b/mne/fiff/cov.py @@ -0,0 +1,174 @@ +# Authors: Alexandre Gramfort <[email protected]> +# Matti Hamalainen <[email protected]> +# +# License: BSD (3-clause) + +import numpy as np + +from .constants import FIFF +from .write import start_block, end_block, write_int, write_name_list, \ + write_double, write_float_matrix +from .tag import find_tag +from .tree import dir_tree_find +from .proj import read_proj, write_proj +from .channels import _read_bad_channels + + +def read_cov(fid, node, cov_kind): + """Read a noise covariance matrix + + Parameters + ---------- + fid: file + The file descriptor + + node: dict + The node in the FIF tree + + cov_kind: int + The type of covariance. XXX : clarify + + Returns + ------- + data: dict + The noise covariance + """ + # 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 int(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 (' %d x %d diagonal covariance (kind = %d) found.' + % (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)) + data[np.tril(np.ones((dim, dim))) > 0] = vals + data = data + data.T + data.flat[::dim + 1] /= 2.0 + diagmat = False + print ' %d x %d full covariance (kind = %d) found.' \ + % (dim, dim, cov_kind) + else: + diagmat = False + data = tag.data + print ' %d x %d sparse covariance (kind = %d) found.' \ + % (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 + + print 'Did not find the desired covariance matrix' + + return None + + +def write_cov(fid, cov): + """Write a noise covariance matrix + + Parameters + ---------- + fid: file + The file descriptor + + cov: dict + The noise covariance matrix to write + """ + start_block(fid, FIFF.FIFFB_MNE_COV) + + # Dimensions etc. + write_int(fid, FIFF.FIFF_MNE_COV_KIND, cov['kind']) + write_int(fid, FIFF.FIFF_MNE_COV_DIM, cov['dim']) + if cov['nfree'] > 0: + write_int(fid, FIFF.FIFF_MNE_COV_NFREE, cov['nfree']) + + # Channel names + if cov['names'] is not None and len(cov['names']) > 0: + write_name_list(fid, FIFF.FIFF_MNE_ROW_NAMES, cov['names']) + + # Data + if cov['diag']: + write_double(fid, FIFF.FIFF_MNE_COV_DIAG, cov['data']) + else: + # Store only lower part of covariance matrix + dim = cov['dim'] + mask = np.tril(np.ones((dim, dim), dtype=np.bool)) > 0 + vals = cov['data'][mask].ravel() + write_double(fid, FIFF.FIFF_MNE_COV, vals) + + # Eigenvalues and vectors if present + if cov['eig'] is not None and cov['eigvec'] is not None: + write_float_matrix(fid, FIFF.FIFF_MNE_COV_EIGENVECTORS, cov['eigvec']) + write_double(fid, FIFF.FIFF_MNE_COV_EIGENVALUES, cov['eig']) + + # Projection operator + write_proj(fid, cov['projs']) + + # Bad channels + if cov['bads'] is not None: + start_block(fid, FIFF.FIFFB_MNE_BAD_CHANNELS) + write_name_list(fid, FIFF.FIFF_MNE_CH_NAME_LIST, cov['bads']) + end_block(fid, FIFF.FIFFB_MNE_BAD_CHANNELS) + + # Done! + end_block(fid, FIFF.FIFFB_MNE_COV) diff --git a/mne/minimum_norm/inverse.py b/mne/minimum_norm/inverse.py index 4765ed4..9399d06 100644 --- a/mne/minimum_norm/inverse.py +++ b/mne/minimum_norm/inverse.py @@ -20,7 +20,8 @@ from ..fiff.write import write_int, write_float_matrix, start_file, \ start_block, end_block, end_file, write_float, \ write_coord_trans -from ..cov import read_cov, prepare_noise_cov, write_cov +from ..fiff.cov import read_cov, write_cov +from ..cov import prepare_noise_cov from ..forward import compute_depth_prior, compute_depth_prior_fixed from ..source_space import read_source_spaces_from_tree, \ find_source_space_hemi, _get_vertno, \ diff --git a/mne/tests/test_cov.py b/mne/tests/test_cov.py index ab28ab1..af405a5 100644 --- a/mne/tests/test_cov.py +++ b/mne/tests/test_cov.py @@ -4,10 +4,10 @@ from nose.tools import assert_true from numpy.testing import assert_array_almost_equal from scipy import linalg -from .. import Covariance, read_cov, Epochs, merge_events, \ - find_events, write_cov_file, compute_raw_data_covariance, \ +from .. import Covariance, Epochs, merge_events, \ + find_events, compute_raw_data_covariance, \ compute_covariance -from ..fiff import fiff_open, Raw +from ..fiff import Raw cov_fname = op.join(op.dirname(__file__), '..', 'fiff', 'tests', 'data', 'test-cov.fif') @@ -22,15 +22,10 @@ erm_cov_fname = op.join('mne', 'fiff', 'tests', 'data', def test_io_cov(): """Test IO for noise covariance matrices """ - fid, tree, _ = fiff_open(cov_fname) - cov_type = 1 - cov = read_cov(fid, tree, cov_type) - fid.close() - - write_cov_file('cov.fif', cov) - + cov = Covariance(cov_fname) + cov.save('cov.fif') cov2 = Covariance('cov.fif') - assert_array_almost_equal(cov['data'], cov2.data) + assert_array_almost_equal(cov.data, cov2.data) def test_cov_estimation_on_raw_segment(): -- 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
