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 e193348ea42d0701b430d3a108468ba4d5a0d147 Author: Alexandre Gramfort <[email protected]> Date: Tue Apr 12 15:28:46 2011 -0400 API : change access to raw data to hide the first_samp mess API : rename cov estimation methods FIX : write of raw data FIX : some tests --- examples/plot_estimate_covariance_matrix.py | 2 +- examples/plot_read_and_write_raw_data.py | 12 ++--- examples/plot_whitened_evoked_data.py | 6 +-- mne/__init__.py | 2 +- mne/cov.py | 15 ++++--- mne/epochs.py | 8 ++-- mne/event.py | 2 + mne/fiff/raw.py | 70 +++++++++++++---------------- mne/fiff/tests/test_raw.py | 20 +++++++-- mne/fiff/write.py | 6 +-- mne/tests/test_cov.py | 8 ++-- 11 files changed, 80 insertions(+), 71 deletions(-) diff --git a/examples/plot_estimate_covariance_matrix.py b/examples/plot_estimate_covariance_matrix.py index 7f595db..6b0c6f9 100755 --- a/examples/plot_estimate_covariance_matrix.py +++ b/examples/plot_estimate_covariance_matrix.py @@ -20,7 +20,7 @@ fname = data_path + '/MEG/sample/sample_audvis_raw.fif' raw = fiff.Raw(fname) # Set up pick list: MEG + STI 014 - bad channels -cov = mne.noise_covariance_segment(raw, reject=dict(eeg=40e-6, eog=150e-6)) +cov = mne.compute_raw_data_covariance(raw, reject=dict(eeg=40e-6, eog=150e-6)) print cov ############################################################################### diff --git a/examples/plot_read_and_write_raw_data.py b/examples/plot_read_and_write_raw_data.py index aca8e04..6a6b9e5 100755 --- a/examples/plot_read_and_write_raw_data.py +++ b/examples/plot_read_and_write_raw_data.py @@ -29,15 +29,15 @@ include = ['STI 014'] exclude = raw.info['bads'] + ['MEG 2443', 'EEG 053'] # bad channels + 2 more picks = fiff.pick_types(raw.info, meg=want_meg, eeg=want_eeg, - stim=want_stim, include=include, - exclude=exclude) + stim=want_stim, include=include, + exclude=exclude) some_picks = picks[:5] # take 5 first -start, stop = raw.time_to_index(100, 115) # 100 s to 115 s data segment -data, times = raw[some_picks, start:stop] +start, stop = raw.time_to_index(0, 15) # read the first 15s of data +data, times = raw[some_picks, start:(stop+1)] -raw.save('sample_audvis_meg_raw.fif', picks=picks, first_samp=start, - last_samp=stop-1) # save MEG data in FIF file +# save 150s of MEG data in FIF file +raw.save('sample_audvis_meg_raw.fif', tmin=0, tmax=150, picks=picks) ############################################################################### # Show MEG data diff --git a/examples/plot_whitened_evoked_data.py b/examples/plot_whitened_evoked_data.py index c1e5db4..cd88035 100755 --- a/examples/plot_whitened_evoked_data.py +++ b/examples/plot_whitened_evoked_data.py @@ -44,9 +44,9 @@ evoked = epochs.average() # average epochs and get an Evoked dataset. cov = mne.Covariance(cov_fname) # Whiten data -W, ch_names = cov.whitener(evoked.info, pca=False) # get whitening matrix -sel = mne.fiff.pick_channels(evoked.ch_names, include=ch_names) # channels id -whitened_data = np.dot(W, evoked.data[sel]) # apply whitening +whitener = cov.get_whitener(evoked.info, pca=False) # get whitening matrix +sel = mne.fiff.pick_channels(evoked.ch_names, include=whitener.ch_names) +whitened_data = np.dot(whitener.W, evoked.data[sel]) # apply whitening ############################################################################### # Show result diff --git a/mne/__init__.py b/mne/__init__.py index c471729..47aba8d 100755 --- a/mne/__init__.py +++ b/mne/__init__.py @@ -1,7 +1,7 @@ __version__ = '0.1.git' from .cov import read_cov, write_cov, write_cov_file, Covariance, \ - noise_covariance_segment, noise_covariance + compute_raw_data_covariance, compute_covariance from .event import read_events, write_events, find_events from .forward import read_forward_solution from .stc import read_stc, write_stc diff --git a/mne/cov.py b/mne/cov.py index b7c345c..a3b7da4 100755 --- a/mne/cov.py +++ b/mne/cov.py @@ -338,7 +338,7 @@ def read_cov(fid, node, cov_kind): ############################################################################### # Estimate from data -def _estimate_noise_covariance_from_epochs(epochs, bmin, bmax, reject, flat, +def _estimate_compute_covariance_from_epochs(epochs, bmin, bmax, reject, flat, keep_sample_mean): """Estimate noise covariance matrix from epochs """ @@ -374,7 +374,7 @@ def _estimate_noise_covariance_from_epochs(epochs, bmin, bmax, reject, flat, return data, n_samples, ch_names -def noise_covariance_segment(raw, tmin=None, tmax=None, tstep=0.2, +def compute_raw_data_covariance(raw, tmin=None, tmax=None, tstep=0.2, reject=None, flat=None, keep_sample_mean=True): """Estimate noise covariance matrix from a continuous segment of raw data @@ -418,8 +418,11 @@ def noise_covariance_segment(raw, tmin=None, tmax=None, tstep=0.2, sfreq = raw.info['sfreq'] # Convert to samples - start = raw.first_samp if tmin is None else int(floor(tmin * sfreq)) - stop = raw.last_samp if tmax is None else int(ceil(tmax * sfreq)) + start = 0 if tmin is None else int(floor(tmin * sfreq)) + if tmax is None: + stop = raw.last_samp - raw.first_samp + else: + stop = int(ceil(tmax * sfreq)) step = int(ceil(tstep * raw.info['sfreq'])) picks = pick_types(raw.info, meg=True, eeg=True, eog=True) @@ -461,7 +464,7 @@ def noise_covariance_segment(raw, tmin=None, tmax=None, tstep=0.2, return cov -def noise_covariance(raw, events, event_ids, tmin, tmax, +def compute_covariance(raw, events, event_ids, tmin, tmax, bmin=None, bmax=None, reject=None, flat=None, keep_sample_mean=True): """Estimate noise covariance matrix from raw file and events. @@ -521,7 +524,7 @@ def noise_covariance(raw, events, event_ids, tmin, tmax, print "Processing event : %d" % event_id epochs = Epochs(raw, events, event_id, tmin, tmax, picks=picks, baseline=(None, 0)) - d, n, ch_names = _estimate_noise_covariance_from_epochs(epochs, + d, n, ch_names = _estimate_compute_covariance_from_epochs(epochs, bmin=bmin, bmax=bmax, reject=reject, flat=flat, keep_sample_mean=keep_sample_mean) data += d diff --git a/mne/epochs.py b/mne/epochs.py index 982ca6a..1b0d629 100755 --- a/mne/epochs.py +++ b/mne/epochs.py @@ -178,7 +178,6 @@ class Epochs(object): self.picks = [self.picks[k] for k in idx] # XXX : could maybe be factorized - n_channels = self.info['nchan'] self.info['chs'] = [self.info['chs'][k] for k in idx] self.info['ch_names'] = [self.info['ch_names'][k] for k in idx] self.info['nchan'] = len(idx) @@ -207,7 +206,8 @@ class Epochs(object): event_samp = self.events[idx, 0] # Read a data segment - start = int(round(event_samp + self.tmin*sfreq)) + first_samp = self.raw.first_samp + start = int(round(event_samp + self.tmin*sfreq)) - first_samp stop = start + len(self.times) epoch, _ = self.raw[self.picks, start:stop] @@ -332,8 +332,8 @@ class Epochs(object): evoked.comment = self.name evoked.aspect_kind = np.array([100]) # for standard average file evoked.nave = n_events - evoked.first = - np.sum(self.times < 0) - evoked.last = np.sum(self.times > 0) + evoked.first = - int(np.sum(self.times < 0)) + evoked.last = int(np.sum(self.times > 0)) # dropping EOG, ECG and STIM channels. Keeping only data data_picks = pick_types(evoked.info, meg=True, eeg=True, diff --git a/mne/event.py b/mne/event.py index fc5abd3..68cbb1c 100755 --- a/mne/event.py +++ b/mne/event.py @@ -97,6 +97,8 @@ def find_events(raw, stim_channel='STI 014'): pick = pick_channels(raw.info['ch_names'], include=['STI 014'], exclude=[]) + if len(pick) == 0: + raise ValueError('No stim channel found to extract event triggers.') data, times = raw[pick,:] data = data.ravel() idx = np.where(np.diff(data.ravel()) > 0)[0] diff --git a/mne/fiff/raw.py b/mne/fiff/raw.py index 4bc609f..4ee74b9 100755 --- a/mne/fiff/raw.py +++ b/mne/fiff/raw.py @@ -55,10 +55,10 @@ class Raw(dict): if allow_maxshield: raw_node = dir_tree_find(meas, FIFF.FIFFB_SMSH_RAW_DATA) if len(raw_node) == 0: - raise ValueError, 'No raw data in %s' % fname + raise ValueError('No raw data in %s' % fname) else: if len(raw_node) == 0: - raise ValueError, 'No raw data in %s' % fname + raise ValueError('No raw data in %s' % fname) if len(raw_node) == 1: raw_node = raw_node[0] @@ -82,7 +82,7 @@ class Raw(dict): # Omit initial skip if directory[first].kind == FIFF.FIFF_DATA_SKIP: - # This first skip can be applied only after we know the buffer size + # This first skip can be applied only after we know the buffer size tag = read_tag(fid, directory[first].pos) first_skip = int(tag.data) first += 1 @@ -109,8 +109,8 @@ class Raw(dict): nsamp = ent.size / (4*nchan) else: fid.close() - raise ValueError, 'Cannot handle data buffers of type %d' % ( - ent.type) + raise ValueError('Cannot handle data buffers of type %d' % + ent.type) # Do we have an initial skip pending? if first_skip > 0: @@ -154,7 +154,6 @@ class Raw(dict): self.fid = fid self.info = info - def __getitem__(self, item): """getting raw data content with python slicing""" if isinstance(item, tuple): # slicing required @@ -173,15 +172,15 @@ class Raw(dict): sel = None start, stop, step = time_slice.start, time_slice.stop, \ time_slice.step + if start is None: + start = 0 if step is not None: raise ValueError('step needs to be 1 : %d given' % step) return read_raw_segment(self, start=start, stop=stop, sel=sel) else: return super(Raw, self).__getitem__(item) - - def save(self, fname, picks=None, quantum_sec=10, first_samp=None, - last_samp=None): + def save(self, fname, picks=None, tmin=0, tmax=None, quantum_sec=10): """Save raw data to file Parameters @@ -192,33 +191,34 @@ class Raw(dict): picks : list of int Indices of channels to include + tmin : float + Time in seconds of first sample to save + + tmax : int + Time in seconds of last sample to save + quantum_sec : float Size of data chuncks in seconds. - first_samp : int - Index of first sample to save - - last_samp : int - Index of last sample to save """ outfid, cals = start_writing_raw(fname, self.info, picks) # # Set up the reading parameters # - if first_samp is None: - start = self.first_samp - else: - start = first_samp - if last_samp is None: - stop = self.last_samp + 1 + # Convert to samples + start = int(floor(tmin * self.info['sfreq'])) + + if tmax is None: + stop = self.last_samp + 1 - self.first_samp else: - stop = last_samp + 1 + stop = int(floor(tmax * self.info['sfreq'])) quantum = int(ceil(quantum_sec * self.info['sfreq'])) # # Read and write all the data # + write_int(outfid, FIFF.FIFF_FIRST_SAMPLE, start) for first in range(start, stop, quantum): last = first + quantum if last >= stop: @@ -231,8 +231,6 @@ class Raw(dict): print '[done]' finish_writing_raw(outfid) - self.close() - def time_to_index(self, *args): indices = [] @@ -241,18 +239,16 @@ class Raw(dict): indices.append(ind) return indices - def close(self): self.fid.close() - def __repr__(self): s = "n_channels x n_times : %s x %s" % (len(self.info['ch_names']), - self.last_samp - self.first_samp + 1) + self.last_samp - self.first_samp + 1) return "Raw (%s)" % s -def read_raw_segment(raw, start=None, stop=None, sel=None): +def read_raw_segment(raw, start=0, stop=None, sel=None): """Read a chunck of raw data Parameters @@ -286,20 +282,16 @@ def read_raw_segment(raw, start=None, stop=None, sel=None): if stop is None: stop = raw.last_samp + 1 - if start is None: - start = raw.first_samp # Initial checks - start = int(start) - stop = int(stop) - if start < raw.first_samp: - start = raw.first_samp + start = int(start + raw.first_samp) + stop = int(stop + raw.first_samp) if stop >= raw.last_samp: stop = raw.last_samp + 1 if start >= stop: - raise ValueError, 'No data in this range' + raise ValueError('No data in this range') print 'Reading %d ... %d = %9.3f ... %9.3f secs...' % ( start, stop - 1, start / float(raw.info['sfreq']), @@ -345,8 +337,7 @@ def read_raw_segment(raw, start=None, stop=None, sel=None): from scipy import sparse mult = sparse.csr_matrix(mult) - for k in range(len(raw.rawdir)): - this = raw.rawdir[k] + for this in raw.rawdir: # Do we need this buffer if this['last'] >= start: @@ -413,7 +404,7 @@ def read_raw_segment(raw, start=None, stop=None, sel=None): print ' [done]' break - times = np.arange(start, stop) / raw.info['sfreq'] + times = (np.arange(start, stop) - raw.first_samp) / raw.info['sfreq'] raw.fid.seek(0, 0) # Go back to beginning of the file @@ -618,9 +609,9 @@ def write_raw_buffer(fid, buf, cals): Calibration factors """ if buf.shape[0] != len(cals): - raise ValueError, 'buffer and calibration sizes do not match' + raise ValueError('buffer and calibration sizes do not match') - write_float(fid, FIFF.FIFF_DATA_BUFFER, + write_float(fid, FIFF.FIFF_DATA_BUFFER, # XXX can do better np.dot(np.diag(1.0 / np.ravel(cals)), buf)) @@ -635,4 +626,3 @@ def finish_writing_raw(fid): end_block(fid, FIFF.FIFFB_RAW_DATA) end_block(fid, FIFF.FIFFB_MEAS) end_file(fid) - diff --git a/mne/fiff/tests/test_raw.py b/mne/fiff/tests/test_raw.py index 9cf74b3..3ecbf15 100755 --- a/mne/fiff/tests/test_raw.py +++ b/mne/fiff/tests/test_raw.py @@ -1,11 +1,12 @@ import os.path as op -# from numpy.testing import assert_array_almost_equal, assert_equal +from numpy.testing import assert_array_almost_equal from .. import Raw, pick_types fname = op.join(op.dirname(__file__), 'data', 'test_raw.fif') + def test_io_raw(): """Test IO for raw data """ @@ -16,8 +17,8 @@ def test_io_raw(): meg_channels_idx = [k for k in range(nchan) if ch_names[k][:3] == 'MEG'] meg_channels_idx = meg_channels_idx[:5] - start, stop = raw.time_to_index(45, 50) # 100 s to 115 s data segment - data, times = raw[meg_channels_idx, start:stop] + start, stop = raw.time_to_index(0, 5) + data, times = raw[meg_channels_idx, start:(stop+1)] # Set up pick list: MEG + STI 014 - bad channels want_meg = True @@ -28,8 +29,19 @@ def test_io_raw(): picks = pick_types(raw.info, meg=want_meg, eeg=want_eeg, stim=want_stim, include=include, exclude=raw.info['bads']) + picks = picks[:5] # take 5 first print "Number of picked channels : %d" % len(picks) # Writing - raw.save('raw.fif', picks) + raw.save('raw.fif', picks, tmin=0, tmax=5) + + raw2 = Raw('raw.fif') + + data2, times2 = raw2[:,:] + + assert_array_almost_equal(data, data2) + assert_array_almost_equal(times, times2) + assert_array_almost_equal(raw.info['dev_head_t']['trans'], + raw2.info['dev_head_t']['trans']) + assert_array_almost_equal(raw.info['sfreq'], raw2.info['sfreq']) diff --git a/mne/fiff/write.py b/mne/fiff/write.py index 12b24fb..d96b6ff 100755 --- a/mne/fiff/write.py +++ b/mne/fiff/write.py @@ -28,7 +28,7 @@ def write_int(fid, kind, data): """Writes a 32-bit integer tag to a fif file""" FIFFT_INT = 3 data_size = 4 - data = np.array(data, dtype='>i4') + data = np.array(data, dtype='>i4').T _write(fid, data, kind, data_size, FIFFT_INT, '>i4') @@ -36,7 +36,7 @@ def write_double(fid, kind, data): """Writes a double-precision floating point tag to a fif file""" FIFFT_DOUBLE = 5 data_size = 8 - data = np.array(data, dtype='>f8') + data = np.array(data, dtype='>f8').T _write(fid, data, kind, data_size, FIFFT_DOUBLE, '>f8') @@ -44,7 +44,7 @@ def write_float(fid, kind, data): """Writes a single-precision floating point tag to a fif file""" FIFFT_FLOAT = 4 data_size = 4 - data = np.array(data, dtype='>f4') + data = np.array(data, dtype='>f4').T _write(fid, data, kind, data_size, FIFFT_FLOAT, '>f4') diff --git a/mne/tests/test_cov.py b/mne/tests/test_cov.py index a833db8..fe425bf 100755 --- a/mne/tests/test_cov.py +++ b/mne/tests/test_cov.py @@ -36,9 +36,11 @@ def test_cov_estimation_on_raw_segment(): """Estimate raw on continuous recordings (typically empty room) """ raw = Raw(raw_fname) - cov = mne.noise_covariance_segment(raw) + cov = mne.compute_raw_data_covariance(raw) cov_mne = mne.Covariance(erm_cov_fname) assert cov_mne.ch_names == cov.ch_names + print (linalg.norm(cov.data - cov_mne.data, ord='fro') + / linalg.norm(cov.data, ord='fro')) assert (linalg.norm(cov.data - cov_mne.data, ord='fro') / linalg.norm(cov.data, ord='fro')) < 1e-6 @@ -49,7 +51,7 @@ def test_cov_estimation_with_triggers(): raw = Raw(raw_fname) events = mne.find_events(raw) event_ids = [1, 2, 3, 4] - cov = mne.noise_covariance(raw, events, event_ids, tmin=-0.2, tmax=0, + cov = mne.compute_covariance(raw, events, event_ids, tmin=-0.2, tmax=0, reject=dict(grad=10000e-13, mag=4e-12, eeg=80e-6, eog=150e-6), keep_sample_mean=True) @@ -72,6 +74,6 @@ def test_whitening_cov(): evoked = read_evoked(ave_fname, setno=0, baseline=(None, 0)) cov = mne.Covariance(cov_fname) - cov.whitener(evoked.info) + cov.get_whitener(evoked.info) # XXX : test something -- 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
