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 0793fb0e3628978517006ad6445d6a610835bd6c Author: Alexandre Gramfort <[email protected]> Date: Mon Jul 16 16:50:10 2012 +0200 ENH : simplify evoked data generate + some docstring updaes --- examples/plot_simulate_evoked_data.py | 18 +++----- mne/simulation/__init__.py | 2 +- mne/simulation/sim_evoked.py | 86 +++++++++++++++++++++++++++++------ 3 files changed, 81 insertions(+), 25 deletions(-) diff --git a/examples/plot_simulate_evoked_data.py b/examples/plot_simulate_evoked_data.py index 788a12a..e68de68 100644 --- a/examples/plot_simulate_evoked_data.py +++ b/examples/plot_simulate_evoked_data.py @@ -14,12 +14,10 @@ import pylab as pl import mne from mne.fiff.pick import pick_types_evoked, pick_types_forward -from mne.forward import apply_forward from mne.datasets import sample from mne.time_frequency import fir_filter_raw, morlet from mne.viz import plot_evoked, plot_sparse_source_estimates -from mne.simulation import generate_stc, generate_noise_evoked, \ - add_noise_evoked +from mne.simulation import generate_stc, generate_evoked ############################################################################### # Load real data as templates @@ -37,7 +35,7 @@ cov_fname = data_path + '/MEG/sample/sample_audvis-cov.fif' fwd = mne.read_forward_solution(fwd_fname, force_fixed=True, surf_ori=True) fwd = pick_types_forward(fwd, meg=True, eeg=True, exclude=raw.info['bads']) -noise_cov = mne.read_cov(cov_fname) +cov = mne.read_cov(cov_fname) evoked_template = mne.fiff.read_evoked(ave_fname, setno=0, baseline=None) evoked_template = pick_types_evoked(evoked_template, meg=True, eeg=True, @@ -65,16 +63,14 @@ stc_data *= 100 * 1e-9 # use nAm as unit # time translation stc_data[1] = np.roll(stc_data[1], 80) - stc = generate_stc(fwd, labels, stc_data, tmin, tstep, random_state=0) -evoked = apply_forward(fwd, stc, evoked_template) ############################################################################### -# Add noise +# Generate noisy evoked data picks = mne.fiff.pick_types(raw.info, meg=True) fir_filter = fir_filter_raw(raw, order=5, picks=picks, tmin=60, tmax=180) -noise = generate_noise_evoked(evoked, noise_cov, n_samples, fir_filter) -evoked_noise = add_noise_evoked(evoked, noise, snr, times, tmin=0.0, tmax=0.2) +evoked = generate_evoked(fwd, stc, evoked_template, cov, snr, + tmin=0.0, tmax=0.2, fir_filter=fir_filter) ############################################################################### # Plot @@ -82,7 +78,7 @@ plot_sparse_source_estimates(fwd['src'], stc, bgcolor=(1, 1, 1), opacity=0.5, high_resolution=True) pl.figure() -pl.psd(evoked_noise.data[0]) +pl.psd(evoked.data[0]) pl.figure() -plot_evoked(evoked_noise) +plot_evoked(evoked) diff --git a/mne/simulation/__init__.py b/mne/simulation/__init__.py index 64fdc38..975658a 100644 --- a/mne/simulation/__init__.py +++ b/mne/simulation/__init__.py @@ -2,4 +2,4 @@ """ from .sim_evoked import select_source_in_label, generate_stc, \ - generate_noise_evoked, add_noise_evoked + generate_evoked diff --git a/mne/simulation/sim_evoked.py b/mne/simulation/sim_evoked.py index 4924517..b4f9135 100644 --- a/mne/simulation/sim_evoked.py +++ b/mne/simulation/sim_evoked.py @@ -11,9 +11,49 @@ import copy from ..fiff.pick import pick_channels_cov from ..minimum_norm.inverse import _make_stc from ..utils import check_random_state +from ..forward import apply_forward -def generate_noise_evoked(evoked, noise_cov, n_samples, fir_filter=None, +def generate_evoked(fwd, stc, evoked, cov, snr=3, tmin=None, tmax=None, + fir_filter=None, random_state=None): + """Generate noisy evoked data + + Parameters + ---------- + fwd : dict + a forward solution + stc : SourceEstimate object + The source time courses + evoked : Evoked object + An instance of evoked used as template + cov : Covariance object + The noise covariance + snr : float + signal to noise ratio in dB. It corresponds to + 10 * log10( var(signal) / var(noise) ) + tmin : float | None + start of time interval to estimate SNR. If None first time point + is used. + tmax : float + start of time interval to estimate SNR. If None last time point + is used. + fir_filter : None | array + FIR filter coefficients e.g. [1, -1, 0.2] + random_state : None | int | np.random.RandomState + To specify the random generator state. + + Returns + ------- + evoked : Evoked object + The simulated evoked data + """ + evoked = apply_forward(fwd, stc, evoked) + noise = generate_noise_evoked(evoked, cov, fir_filter) + evoked_noise = add_noise_evoked(evoked, noise, snr, tmin=tmin, tmax=tmax) + return evoked_noise + + +def generate_noise_evoked(evoked, noise_cov, fir_filter=None, random_state=None): """Creates noise as a multivariate Gaussian @@ -23,10 +63,8 @@ def generate_noise_evoked(evoked, noise_cov, n_samples, fir_filter=None, ---------- evoked : evoked object an instance of evoked used as template - noise_cov : cov object - an instance of cov - n_samples : int - number of time samples to generate + cov : Covariance object + The noise covariance fir_filter : None | array FIR filter coefficients random_state : None | int | np.random.RandomState @@ -41,6 +79,7 @@ def generate_noise_evoked(evoked, noise_cov, n_samples, fir_filter=None, noise_cov = pick_channels_cov(noise_cov, include=noise.info['ch_names']) rng = check_random_state(random_state) n_channels = np.zeros(noise.info['nchan']) + n_samples = evoked.data.shape[1] noise.data = rng.multivariate_normal(n_channels, noise_cov.data, n_samples).T if fir_filter is not None: @@ -48,22 +87,20 @@ def generate_noise_evoked(evoked, noise_cov, n_samples, fir_filter=None, return noise -def add_noise_evoked(evoked, noise, snr, times, tmin=None, tmax=None): +def add_noise_evoked(evoked, noise, snr, tmin=None, tmax=None): """Adds noise to evoked object with specified SNR. SNR is computed in the interval from tmin to tmax. Parameters ---------- - evoked : evoked object - an instance of evoked with signal - noise : evoked object - an instance of evoked with noise + evoked : Evoked object + An instance of evoked with signal + noise : Evoked object + An instance of evoked with noise snr : float signal to noise ratio in dB. It corresponds to 10 * log10( var(signal) / var(noise) ) - timesamples : array - samples in seconds tmin : float start time before event tmax : float @@ -71,10 +108,11 @@ def add_noise_evoked(evoked, noise, snr, times, tmin=None, tmax=None): Returns ------- - evoked : evoked object + evoked_noise : Evoked object An instance of evoked corrupted by noise """ evoked = copy.deepcopy(evoked) + times = evoked.times if tmin is None: tmin = np.min(times) if tmax is None: @@ -125,6 +163,28 @@ def select_source_in_label(fwd, label, random_state=None): def generate_stc(fwd, labels, stc_data, tmin, tstep, random_state=0): + """Generate sources time courses from waveforms and labels + + Parameters + ---------- + fwd : dict + a forward solution + labels : list of dict + The labels + stc_data : array + The waveforms + tmin : float + The beginning of the timeseries + tstep : float + The time step (1 / sampling frequency) + random_state : None | int | np.random.RandomState + To specify the random generator state. + + Returns + ------- + stc : SourceEstimate + The generated source time courses. + """ rng = check_random_state(random_state) vertno = [[], []] for label in labels: -- 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
