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 fd29a5b8282df2517d89f2a98d3237f13d809d7a Author: Alexandre Gramfort <[email protected]> Date: Thu Dec 30 17:45:31 2010 -0500 starting to write functions doc + increasing coverage --- README.rst | 7 +- fiff/forward.py | 269 ++++++++++++++++++++++++--------------------- fiff/inverse.py | 6 +- fiff/meas_info.py | 76 +++++++------ fiff/open.py | 23 ++++ fiff/proj.py | 34 ++++-- fiff/raw.py | 108 +++++++++++------- fiff/tests/test_forward.py | 1 + 8 files changed, 307 insertions(+), 217 deletions(-) diff --git a/README.rst b/README.rst index eec0a48..d57af32 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,8 @@ About pyfiff is a python module for reading and writing the fif files produced by Neuromag MEG systems. +It is mainly a reimplementation of the Matlab code written by Matti Hämäläinen. + Download ======== @@ -59,4 +61,7 @@ [email protected] Testing ------- -You can launch the test suite using nosetest from the source folder. \ No newline at end of file +You can launch the test suite using nosetest from the source folder. + +You'll need before to have run the MNE tutorial to have the required files +on your drive. diff --git a/fiff/forward.py b/fiff/forward.py index 489e717..887b7af 100644 --- a/fiff/forward.py +++ b/fiff/forward.py @@ -11,20 +11,20 @@ from .source_space import read_source_spaces, find_source_space_hemi from .matrix import read_named_matrix, transpose_named_matrix -def block_diag(A, n): - """ - % - % function bd = mne_block_diag(A,n) - % - % Make or extract a sparse block diagonal matrix - % - % If A is not sparse, then returns a sparse block diagonal "bd", diagonalized from the +def _block_diag(A, n): + """Constructs a block diagonal from a packed structure + + You have to try it on a matrix to see what it's doing. + + % If A is not sparse, then returns a sparse block diagonal "bd", + % diagonalized from the % elements in "A". % "A" is ma x na, comprising bdn=(na/"n") blocks of submatrices. % Each submatrix is ma x "n", and these submatrices are % placed down the diagonal of the matrix. % - % If A is already sparse, then the operation is reversed, yielding a block + % If A is already sparse, then the operation is reversed, yielding + # a block % row matrix, where each set of n columns corresponds to a block element % from the block diagonal. % @@ -32,56 +32,52 @@ def block_diag(A, n): """ from scipy import sparse - import pdb; pdb.set_trace() - - # if not sparse.issparse(A): # then make block sparse - # ma, na = A.shape - # bdn = na / float(n) # number of submatrices - # - # if bdn > int(bdn): - # raise ValueError, 'Width of matrix must be even multiple of n' - # - # tmp = reshape([1:(ma*bdn)]',ma,bdn); - # i = zeros(ma*n,bdn); - # for iblock = 1:n: - # i((iblock-1)*ma+[1:ma],:) = tmp - # - # i = i.ravel() # row indices foreach sparse bd - # - # j = [1:na]; - # j = j(ones(ma,1),:); - # j = j(:) # column indices foreach sparse bd - # - # bd = sparse(i,j,A(:)); - # else: # already is sparse, unblock it - # [mA,na] = size(A); % matrix always has na columns - # % how many entries in the first column? - # bdn = na/n; % number of blocks - # ma = mA/bdn; % rows in first block - # - # % blocks may themselves contain zero entries. Build indexing as above - # tmp = reshape([1:(ma*bdn)]',ma,bdn); - # i = zeros(ma*n,bdn); - # for iblock = 1:n, - # i((iblock-1)*ma+[1:ma],:) = tmp; - # end - # - # i = i(:); % row indices foreach sparse bd - # - # - # j = [0:mA:(mA*(na-1))]; - # j = j(ones(ma,1),:); - # j = j.ravel() - # - # i += j - # - # bd = full(A(i)); % column vector - # bd = reshape(bd,ma,na); % full matrix + if not sparse.issparse(A): # then make block sparse + ma, na = A.shape + bdn = na / int(n) # number of submatrices + + if na % n > 0: + raise ValueError, 'Width of matrix must be a multiple of n' + + tmp = np.arange(ma*bdn, dtype=np.int).reshape(bdn, ma) + tmp = np.tile(tmp, (1, n)) + ii = tmp.ravel() + + jj = np.arange(na, dtype=np.int)[None,:] + jj = jj * np.ones(ma, dtype=np.int)[:,None] + jj = jj.T.ravel() # column indices foreach sparse bd + + bd = sparse.coo_matrix((A.T.ravel(), np.c_[ii, jj].T)) + else: # already is sparse, unblock it + import pdb; pdb.set_trace() + # [mA,na] = size(A); % matrix always has na columns + # % how many entries in the first column? + # bdn = na/n; % number of blocks + # ma = mA/bdn; % rows in first block + # + # % blocks may themselves contain zero entries. Build indexing as above + # tmp = reshape([1:(ma*bdn)]',ma,bdn); + # i = zeros(ma*n,bdn); + # for iblock = 1:n, + # i((iblock-1)*ma+[1:ma],:) = tmp; + # end + # + # i = i(:); % row indices foreach sparse bd + # + # + # j = [0:mA:(mA*(na-1))]; + # j = j(ones(ma,1),:); + # j = j.ravel() + # + # i += j + # + # bd = full(A(i)); % column vector + # bd = reshape(bd,ma,na); % full matrix return bd -def transform_source_space_to(src, dest, trans): +def _transform_source_space_to(src, dest, trans): """ % % [res] = mne_transform_source_space_to(src,dest,trans) @@ -99,9 +95,10 @@ def transform_source_space_to(src, dest, trans): return res if trans['to'] == src['coord_frame'] and trans['from_'] == dest: - trans = invert_transform(trans) + trans = _invert_transform(trans) elif trans['from_'] != src['coord_frame'] or trans['to'] != dest: - raise ValueError, 'Cannot transform the source space using this coordinate transformation' + raise ValueError, 'Cannot transform the source space using this ' \ + 'coordinate transformation' t = trans['trans'][:3,:] res = src @@ -112,13 +109,8 @@ def transform_source_space_to(src, dest, trans): return res -def invert_transform(trans): - """ - % - % [itrans] = fiff_invert_transform(trans) - % - % Invert a coordinate transformation - % +def _invert_transform(trans): + """Invert a transformation between coordinate systems """ itrans = copy.copy(trans) aux = itrans['from_'] @@ -128,11 +120,8 @@ def invert_transform(trans): return itrans -def read_one(fid, node): - """ - % - % Read all interesting stuff for one forward solution - % +def _read_one(fid, node): + """Read all interesting stuff for one forward solution """ if node is None: return None @@ -163,14 +152,16 @@ def read_one(fid, node): one['nchan'] = tag.data try: - one['sol'] = read_named_matrix(fid, node, FIFF.FIFF_MNE_FORWARD_SOLUTION) + one['sol'] = read_named_matrix(fid, node, + FIFF.FIFF_MNE_FORWARD_SOLUTION) one['sol'] = transpose_named_matrix(one['sol']) except Exception as inst: fid.close() raise 'Forward solution data not found (%s)' % inst try: - one['sol_grad'] = read_named_matrix(fid,node,FIFF.FIFF_MNE_FORWARD_SOLUTION_GRAD) + one['sol_grad'] = read_named_matrix(fid, node, + FIFF.FIFF_MNE_FORWARD_SOLUTION_GRAD) one['sol_grad'] = transpose_named_matrix(one['sol_grad']) except Exception as inst: one['sol_grad'] = None @@ -185,26 +176,39 @@ def read_one(fid, node): if one['sol_grad']['data'].shape[0] != one['nchan'] or \ (one['sol_grad']['data'].shape[1] != 3*one['nsource'] and one['sol_grad']['data'].shape[1] != 3*3*one['nsource']): - fid.close() - raise ValueError, 'Forward solution gradient matrix has wrong dimensions' + fid.close() + raise ValueError, 'Forward solution gradient matrix has ' \ + 'wrong dimensions' return one def read_forward_solution(fname, force_fixed=False, surf_ori=False, include=None, exclude=None): - """ - % - % [fwd] = mne_read_forward_solution(fname,force_fixed,surf_ori,include,exclude) - % - % A forward solution from a fif file - % - % fname - The name of the file - % force_fixed - Force fixed source orientation mode? (optional) - % surf_ori - Use surface based source coordinate system? (optional) - % include - Include these channels (optional) - % exclude - Exclude these channels (optional) - % + """Read a forward solution a.k.a. lead field + + Parameters + ---------- + fname: string + The file name. + + force_fixed: bool, optional (default False) + Force fixed source orientation mode? + + surf_ori: bool, optional (default False) + Use surface based source coordinate system? + + include: list, optional + List of names of channels to include + + exclude: list, optional + List of names of channels to exclude + + Returns + ------- + fwt: dict + The forward solution + """ # Open the file, create directory @@ -218,7 +222,7 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, raise ValueError, 'No forward solutions in %s' % fname # Parent MRI data - parent_mri = dir_tree_find(tree,FIFF.FIFFB_MNE_PARENT_MRI_FILE) + parent_mri = dir_tree_find(tree, FIFF.FIFFB_MNE_PARENT_MRI_FILE) if len(fwds) == 0: fid.close() raise ValueError, 'No parent MRI information in %s' % fname @@ -231,7 +235,7 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, raise ValueError, 'Could not read the source spaces (%s)' % inst for s in src: - s['id'] = find_source_space_hemi(s) + s['id'] = find_source_space_hemi(s) fwd = None @@ -247,36 +251,37 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, tag = find_tag(fid, fwds[k], FIFF.FIFF_MNE_INCLUDED_METHODS) if tag is None: fid.close() - raise ValueError, 'Methods not listed for one of the forward solutions' + raise ValueError, 'Methods not listed for one of the forward ' \ + 'solutions' if tag.data == FIFF.FIFFV_MNE_MEG: megnode = fwds[k] elif tag.data == FIFF.FIFFV_MNE_EEG: eegnode = fwds[k] - megfwd = read_one(fid, megnode) + megfwd = _read_one(fid, megnode) if megfwd is not None: if megfwd['source_ori'] == FIFF.FIFFV_MNE_FIXED_ORI: ori = 'fixed' else: ori = 'free' - print '\tRead MEG forward solution (%d sources, %d channels, %s orientations)' % ( - megfwd['nsource'], megfwd['nchan'], ori) + print '\tRead MEG forward solution (%d sources, %d channels, ' \ + '%s orientations)' % (megfwd['nsource'], megfwd['nchan'], ori) - eegfwd = read_one(fid, eegnode) + eegfwd = _read_one(fid, eegnode) if eegfwd is not None: if eegfwd['source_ori'] == FIFF.FIFFV_MNE_FIXED_ORI: ori = 'fixed' else: ori = 'free' - print '\tRead EEG forward solution (%d sources, %d channels, %s orientations)' % ( - eegfwd['nsource'], eegfwd['nchan'], ori) + print '\tRead EEG forward solution (%d sources, %d channels, ' \ + '%s orientations)' % (eegfwd['nsource'], eegfwd['nchan'], ori) # Merge the MEG and EEG solutions together if megfwd is not None and eegfwd is not None: - if (megfwd['sol']['data'].shape[1] != eegfwd['sol']['data'].shape[1] or + if (megfwd['sol']['data'].shape[1] != eegfwd['sol']['data'].shape[1] or megfwd['source_ori'] != eegfwd['source_ori'] or megfwd['nsource'] != eegfwd['nsource'] or megfwd['coord_frame'] != eegfwd['coord_frame']): @@ -285,20 +290,24 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, fwd = megfwd fwd['sol']['data'] = np.r_[fwd['sol']['data'], eegfwd['sol']['data']] - fwd['sol']['nrow'] = fwd['sol']['nrow'] + eegfwd['sol']['nrow']; + fwd['sol']['nrow'] = fwd['sol']['nrow'] + eegfwd['sol']['nrow'] - fwd['sol']['row_names'] = fwd['sol']['row_names'] + eegfwd['sol']['row_names'] + fwd['sol']['row_names'] = fwd['sol']['row_names'] + \ + eegfwd['sol']['row_names'] if fwd['sol_grad'] is not None: - fwd['sol_grad']['data'] = np.r_[fwd['sol_grad']['data'], eegfwd['sol_grad']['data']] - fwd['sol_grad']['nrow'] = fwd['sol_grad']['nrow'] + eegfwd['sol_grad']['nrow'] - fwd['sol_grad']['row_names'] = fwd['sol_grad']['row_names'] + eegfwd['sol_grad']['row_names'] + fwd['sol_grad']['data'] = np.r_[fwd['sol_grad']['data'], + eegfwd['sol_grad']['data']] + fwd['sol_grad']['nrow'] = fwd['sol_grad']['nrow'] + \ + eegfwd['sol_grad']['nrow'] + fwd['sol_grad']['row_names'] = fwd['sol_grad']['row_names'] + \ + eegfwd['sol_grad']['row_names'] fwd['nchan'] = fwd['nchan'] + eegfwd['nchan'] print '\tMEG and EEG forward solutions combined' elif megfwd is not None: - fwd = megfwd; + fwd = megfwd else: - fwd = eegfwd; + fwd = eegfwd del megfwd del eegfwd @@ -312,36 +321,39 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, mri_head_t = tag.data; if (mri_head_t['from_'] != FIFF.FIFFV_COORD_MRI or mri_head_t['to'] != FIFF.FIFFV_COORD_HEAD): - mri_head_t = invert_transform(mri_head_t) + mri_head_t = _invert_transform(mri_head_t) if (mri_head_t['from_'] != FIFF.FIFFV_COORD_MRI or mri_head_t['to'] != FIFF.FIFFV_COORD_HEAD): fid.close() - raise ValueError, 'MRI/head coordinate transformation not found' + raise ValueError, 'MRI/head coordinate transformation not ' \ + 'found' fid.close() - fwd['mri_head_t'] = mri_head_t; + fwd['mri_head_t'] = mri_head_t # Transform the source spaces to the correct coordinate frame # if necessary if (fwd['coord_frame'] != FIFF.FIFFV_COORD_MRI and fwd['coord_frame'] != FIFF.FIFFV_COORD_HEAD): - raise ValueError, 'Only forward solutions computed in MRI or head coordinates are acceptable' + raise ValueError, 'Only forward solutions computed in MRI or head ' \ + 'coordinates are acceptable' nuse = 0 for s in src: - try: - s = transform_source_space_to(s, fwd['coord_frame'], mri_head_t) - except Exception as inst: - raise ValueError, 'Could not transform source space (%s)' % inst + try: + s = _transform_source_space_to(s, fwd['coord_frame'], mri_head_t) + except Exception as inst: + raise ValueError, 'Could not transform source space (%s)' % inst - nuse += s['nuse'] + nuse += s['nuse'] if nuse != fwd['nsource']: raise ValueError, 'Source spaces do not match the forward solution.' - print '\tSource spaces transformed to the forward solution coordinate frame' + print '\tSource spaces transformed to the forward solution ' \ + 'coordinate frame' fwd['src'] = src; # Handle the source locations and orientations @@ -357,14 +369,15 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, # Modify the forward solution for fixed source orientations if fwd['source_ori'] != FIFF.FIFFV_MNE_FIXED_ORI: print '\tChanging to fixed-orientation forward solution...' - fix_rot = block_diag(fwd['source_nn'].T, 1) + fix_rot = _block_diag(fwd['source_nn'].T, 1) fwd['sol']['data'] *= fix_rot fwd['sol']['ncol'] = fwd['nsource'] fwd['source_ori'] = FIFF.FIFFV_MNE_FIXED_ORI if fwd['sol_grad'] is not None: - fwd['sol_grad']['data'] = np.dot(fwd['sol_grad']['data'], np.kron(fix_rot, np.eye(3))) - fwd['sol_grad']['ncol'] = 3*fwd['nsource'] + fwd['sol_grad']['data'] = np.dot(fwd['sol_grad']['data'], + np.kron(fix_rot, np.eye(3))) + fwd['sol_grad']['ncol'] = 3*fwd['nsource'] print '[done]' else: @@ -375,12 +388,13 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, pp = 1 fwd['source_rr'] = np.zeros(fwd['nsource'], 3) for s in src: - fwd['source_rr'][nuse+1:nuse + s['nuse'],:] = s['rr'][s['vertno'],:] + fwd['source_rr'][nuse+1:nuse + s['nuse'],:] = \ + s['rr'][s['vertno'],:] for p in range(s['nuse']): # Project out the surface normal and compute SVD nn = s['nn'][s['vertno'][p],:].T nn = nn[:,None] - [ U, S, V ] = linalg.svd(np.eye(3,3) - nn*nn.T) + U, S, _ = linalg.svd(np.eye(3,3) - nn*nn.T) # Make sure that ez is in the direction of nn if np.sum(nn*U[:,2]) < 0: U *= -1 @@ -388,10 +402,11 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, pp += 3 nuse += s['nuse'] - surf_rot = block_diag(fwd['source_nn'].T, 3) + surf_rot = _block_diag(fwd['source_nn'].T, 3) fwd['sol']['data'] = np.dot(fwd['sol']['data'], surf_rot) if fwd['sol_grad'] is not None: - fwd['sol_grad']['data'] = np.dot(fwd['sol_grad']['data'] * np.kron(surf_rot, np.eye(3))) + fwd['sol_grad']['data'] = np.dot(fwd['sol_grad']['data'] * \ + np.kron(surf_rot, np.eye(3))) print '[done]' else: @@ -399,10 +414,11 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, nuse = 0 fwd['source_rr'] = np.zeros((fwd['nsource'], 3)) for s in src: - fwd['source_rr'][nuse:nuse+s['nuse'],:] = s['rr'][s['vertno'],:] + fwd['source_rr'][nuse:nuse+s['nuse'],:] = \ + s['rr'][s['vertno'],:] nuse += s['nuse'] - fwd['source_nn'] = np.kron(np.ones((fwd['nsource'], 1)), np.eye(3)); + fwd['source_nn'] = np.kron(np.ones((fwd['nsource'], 1)), np.eye(3)) print '[done]' # Do the channel selection @@ -427,15 +443,16 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, pick[p] = False # Do we have something? - nuse = pick.sum(); + nuse = pick.sum() if nuse == 0: raise ValueError, 'Nothing remains after picking' - print '\t%d out of %d channels remain after picking\n' % (nuse, fwd['nchan']) + print '\t%d out of %d channels remain after picking\n' % (nuse, + fwd['nchan']) # Pick the correct rows of the forward operator fwd['nchan'] = nuse - fwd['sol']['data'] = fwd['sol']['data'][pick == 1,:] + fwd['sol']['data'] = fwd['sol']['data'][pick == 1, :] fwd['sol']['nrow'] = nuse fwd['sol']['row_names'] = [fwd['sol']['row_names'][k] for k in range(len(pick)) if pick[k]] @@ -444,6 +461,6 @@ def read_forward_solution(fname, force_fixed=False, surf_ori=False, fwd['sol_grad']['data'] = fwd['sol_grad']['data'][pick == 1, :] fwd['sol_grad']['nrow'] = nuse fwd['sol_grad']['row_names'] = [fwd['sol_grad']['row_names'][k] - for k in range(len(pick)) if pick[k]] + for k in range(len(pick)) if pick[k]] - return fwd \ No newline at end of file + return fwd diff --git a/fiff/inverse.py b/fiff/inverse.py index 5d516d1..6ce1fac 100644 --- a/fiff/inverse.py +++ b/fiff/inverse.py @@ -6,7 +6,7 @@ from .cov import read_cov from .proj import read_proj from .tree import dir_tree_find from .source_space import read_source_spaces, find_source_space_hemi -from .forward import invert_transform, transform_source_space_to +from .forward import _invert_transform, _transform_source_space_to def read_inverse_operator(fname): @@ -181,7 +181,7 @@ def read_inverse_operator(fname): mri_head_t = tag.data; if mri_head_t['from_'] != FIFF.FIFFV_COORD_MRI or \ mri_head_t['to'] != FIFF.FIFFV_COORD_HEAD: - mri_head_t = invert_transform(mri_head_t) + mri_head_t = _invert_transform(mri_head_t) if mri_head_t['from_'] != FIFF.FIFFV_COORD_MRI or \ mri_head_t['to'] != FIFF.FIFFV_COORD_HEAD: fid.close() @@ -218,7 +218,7 @@ def read_inverse_operator(fname): nuse = 0 for k in range(len(inv['src'])): try: - inv['src'][k] = transform_source_space_to(inv['src'][k], + inv['src'][k] = _transform_source_space_to(inv['src'][k], inv['coord_frame'], mri_head_t) except Exception as inst: fid.close() diff --git a/fiff/meas_info.py b/fiff/meas_info.py index 2f6aa9d..9858fed 100644 --- a/fiff/meas_info.py +++ b/fiff/meas_info.py @@ -10,13 +10,25 @@ from .channels import read_bad_channels def read_meas_info(source, tree=None): - """[info,meas] = fiff_read_meas_info(source,tree) + """Read the measurement info - Read the measurement info + Parameters + ---------- + source: string or file + If string it is the file name otherwise it's the file descriptor. + If tree is missing, the meas output argument is None + + tree: tree + FIF tree structure + + Returns + ------- + info: dict + Info on dataset + + meas: dict + Node in tree that contains the info. - If tree is specified, source is assumed to be an open file id, - otherwise a the name of the file to read. If tree is missing, the - meas output argument should not be specified. """ if tree is None: fid, tree, _ = fiff_open(source) @@ -83,39 +95,33 @@ def read_meas_info(source, tree=None): elif kind == FIFF.FIFF_COORD_TRANS: tag = read_tag(fid, pos) cand = tag.data - if cand.from_ == FIFF.FIFFV_COORD_DEVICE and \ - cand.to == FIFF.FIFFV_COORD_HEAD: # XXX : from + if cand['from_'] == FIFF.FIFFV_COORD_DEVICE and \ + cand['to'] == FIFF.FIFFV_COORD_HEAD: # XXX : from dev_head_t = cand - elif cand.from_ == FIFF.FIFFV_MNE_COORD_CTF_HEAD and \ - cand.to == FIFF.FIFFV_COORD_HEAD: + elif cand['from_'] == FIFF.FIFFV_MNE_COORD_CTF_HEAD and \ + cand['to'] == FIFF.FIFFV_COORD_HEAD: ctf_head_t = cand - # XXX : fix - # Check that we have everything we need - # if ~exist('nchan','var') - # if open_here - # fclose(fid); - # end - # error(me,'Number of channels in not defined'); - # end - # if ~exist('sfreq','var') - # if open_here - # fclose(fid); - # end - # error(me,'Sampling frequency is not defined'); - # end - # if ~exist('chs','var') - # if open_here - # fclose(fid); - # end - # error(me,'Channel information not defined'); - # end - # if length(chs) ~= nchan - # if open_here - # fclose(fid); - # end - # error(me,'Incorrect number of channel definitions found'); - # end + # Check that we have everything we need + if nchan is None: + if open_here: + fid.close() + raise ValueError, 'Number of channels in not defined' + + if sfreq is None: + if open_here: + fid.close() + raise ValueError, 'Sampling frequency is not defined' + + if len(chs) == 0: + if open_here: + fid.close() + raise ValueError, 'Channel information not defined' + + if len(chs) != nchan: + if open_here: + fid.close() + raise ValueError, 'Incorrect number of channel definitions found' if dev_head_t is None or ctf_head_t is None: hpi_result = dir_tree_find(meas_info, FIFF.FIFFB_HPI_RESULT) diff --git a/fiff/open.py b/fiff/open.py index 5feaa90..93c2db0 100644 --- a/fiff/open.py +++ b/fiff/open.py @@ -4,6 +4,29 @@ from .constants import FIFF def fiff_open(fname, verbose=False): + """Open a FIF file. + + Parameters + ---------- + fname: string + name of the fif file + + verbose: bool + verbose mode if True + + Returns + ------- + fid: file + The file descriptor of the open file + + tree: fif tree + The tree is a complex structure filled with dictionaries, + lists and tags. + + directory: list + list of nodes. + + """ fid = open(fname, "rb") # Open in binary mode diff --git a/fiff/proj.py b/fiff/proj.py index a531592..caf17b5 100644 --- a/fiff/proj.py +++ b/fiff/proj.py @@ -5,11 +5,20 @@ from .bunch import Bunch def read_proj(fid, node): - """ - [ projdata ] = fiff_read_proj(fid,node) + """Read a projection operator from a FIF file. + + Parameters + ---------- + fid: file + The file descriptor of the open file - Read the SSP data under a given directory node + node: tree node + The node of the tree where to look + Returns + ------- + projdata: dict + The projection operator """ projdata = [] @@ -111,15 +120,16 @@ from .write import write_int, write_float, write_string, write_name_list, \ write_float_matrix, end_block, start_block def write_proj(fid, projs): - """ - % - % fiff_write_proj(fid,projs) - % - % Writes the projection data into a fif file - % - % fid An open fif file descriptor - % projs The compensation data to write - % + """Write a projection operator to a file. + + Parameters + ---------- + fid: file + The file descriptor of the open file + + projs: dict + The projection operator + """ start_block(fid, FIFF.FIFFB_PROJ) diff --git a/fiff/raw.py b/fiff/raw.py index a69e802..7687b61 100644 --- a/fiff/raw.py +++ b/fiff/raw.py @@ -9,15 +9,20 @@ from .tag import read_tag def setup_read_raw(fname, allow_maxshield=False): - """ - % - % [data] = setup_read_raw(fname,allow_maxshield) - % - % Read information about raw data file - % - % fname Name of the file to read - % allow_maxshield Accept unprocessed MaxShield data - % + """Read information about raw data file + + Parameters + ---------- + fname: string + The name of the raw file + + allow_maxshield: bool, (default False) + allow_maxshield if True XXX ??? + + Returns + ------- + data: dict + Infos about raw data """ # Open the file @@ -135,22 +140,34 @@ def setup_read_raw(fname, allow_maxshield=False): def read_raw_segment(raw, from_=None, to=None, sel=None): - """ - % - % [data,times] = fiff_read_raw_segment(raw,from_,to,sel) - % - % Read a specific raw data segment - % - % raw - structure returned by fiff_setup_read_raw - % from_ - first sample to include. If omitted, defaults to the - % first sample in data - % to - last sample to include. If omitted, defaults to the last - % sample in data - % sel - optional channel selection vector - % - % data - returns the data matrix (channels x samples) - % times - returns the time values corresponding to the samples (optional) - % + """Read a chunck of raw data + + Parameters + ---------- + raw: dict + The dict returned by setup_read_raw + + from_: int + first sample to include. If omitted, defaults to the first + sample in data + + to: int + Last sample to include. If omitted, defaults to the last sample in data + + sel: array, optional + Indices of channels to select + + node: tree node + The node of the tree where to look + + Returns + ------- + data: array, [channels x samples] + the data matrix (channels x samples) + + times: array, [samples] + returns the time values corresponding to the samples + """ if to is None: @@ -285,22 +302,33 @@ def read_raw_segment(raw, from_=None, to=None, sel=None): def read_raw_segment_times(raw, from_, to, sel=None): - """ - % - % [data,times] = fiff_read_raw_segment_times(raw,from,to) - % - % Read a specific raw data segment - % - % raw - structure returned by fiff_setup_read_raw - % from - starting time of the segment in seconds - % to - end time of the segment in seconds - % sel - optional channel selection vector - % - % data - returns the data matrix (channels x samples) - % times - returns the time values corresponding to the samples (optional) - % - """ + """Read a chunck of raw data + + Parameters + ---------- + raw: dict + The dict returned by setup_read_raw + + from_: float + Starting time of the segment in seconds + to: float + End time of the segment in seconds + + sel: array, optional + Indices of channels to select + + node: tree node + The node of the tree where to look + + Returns + ------- + data: array, [channels x samples] + the data matrix (channels x samples) + + times: array, [samples] + returns the time values corresponding to the samples + """ # Convert to samples from_ = floor(from_ * raw['info']['sfreq']) to = ceil(to * raw['info']['sfreq']) diff --git a/fiff/tests/test_forward.py b/fiff/tests/test_forward.py index 82bd638..4693c0f 100644 --- a/fiff/tests/test_forward.py +++ b/fiff/tests/test_forward.py @@ -14,4 +14,5 @@ def test_io_forward(): """Test IO for forward solutions """ fwd = fiff.read_forward_solution(fname) + fwd = fiff.read_forward_solution(fname, force_fixed=True) leadfield = fwd['sol']['data'] -- 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
