Note

Go to the end to download the full example code.

Generate simulated raw data#

This example generates raw data by repeating a desired source activation multiple times.

# Authors: Yousra Bekhti <yousra.bekhti@gmail.com>
# Mark Wronkiewicz <wronk.mark@gmail.com>
# Eric Larson <larson.eric.d@gmail.com>
#
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
importmatplotlib.pyplotasplt
importnumpyasnp
importmne
frommneimport Epochs , compute_covariance , find_events , make_ad_hoc_cov
frommne.datasetsimport sample
frommne.simulationimport (
 add_ecg ,
 add_eog ,
 add_noise ,
 simulate_raw ,
 simulate_sparse_stc ,
)
data_path = sample.data_path ()
meg_path = data_path / "MEG" / "sample"
raw_fname = meg_path / "sample_audvis_raw.fif"
fwd_fname = meg_path / "sample_audvis-meg-eeg-oct-6-fwd.fif"
# Load real data as the template
raw = mne.io.read_raw_fif (raw_fname )
raw.set_eeg_reference (projection=True)
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif...
 Read a total of 3 projection items:
 PCA-v1 (1 x 102) idle
 PCA-v2 (1 x 102) idle
 PCA-v3 (1 x 102) idle
 Range : 25800 ... 192599 = 42.956 ... 320.670 secs
Ready.
EEG channel type selected for re-referencing
Adding average EEG reference projection.
1 projection items deactivated
General
Filename(s) sample_audvis_raw.fif
MNE object type Raw
Measurement date 2002年12月03日 at 19:01:10 UTC
Participant Unknown
Experimenter MEG
Acquisition
Duration 00:04:38 (HH:MM:SS)
Sampling frequency 600.61 Hz
Time points 166,800
Channels
Magnetometers
Gradiometers and
EEG and
EOG
Stimulus
Head & sensor digitization 146 points
Filters
Highpass 0.10 Hz
Lowpass 172.18 Hz
Projections PCA-v1 (off)
PCA-v2 (off)
PCA-v3 (off)
Average EEG reference (off)


Generate dipole time series

n_dipoles = 4 # number of dipoles to create
epoch_duration = 2.0 # duration of each epoch/event
n = 0 # harmonic number
rng = np.random.RandomState (0) # random state (make reproducible)
defdata_fun(times ):
"""Generate time-staggered sinusoids at harmonics of 10Hz."""
 global n
 n_samp = len(times )
 window = np.zeros (n_samp)
 start, stop = (
 int(ii * float(n_samp) / (2 * n_dipoles )) for ii in (2 * n , 2 * n + 1)
 )
 window[start:stop] = 1.0
 n += 1
 data = 25e-9 * np.sin (2.0 * np.pi * 10.0 * n * times )
 data *= window
 return data
times = raw.times [: int(raw.info ["sfreq"] * epoch_duration )]
fwd = mne.read_forward_solution (fwd_fname )
src = fwd ["src"]
stc = simulate_sparse_stc (
 src , n_dipoles =n_dipoles , times =times , data_fun=data_fun, random_state=rng
)
# look at our source data
fig , ax = plt.subplots (1)
ax.plot (times , 1e9 * stc.data.T )
ax.set (ylabel="Amplitude (nAm)", xlabel="Time (s)")
mne.viz.utils.plt_show()
simulate raw data
Reading forward solution from /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif...
 Reading a source space...
 Computing patch statistics...
 Patch information added...
 Distance information added...
 [done]
 Reading a source space...
 Computing patch statistics...
 Patch information added...
 Distance information added...
 [done]
 2 source spaces read
 Desired named matrix (kind = 3523 (FIFF_MNE_FORWARD_SOLUTION_GRAD)) not available
 Read MEG forward solution (7498 sources, 306 channels, free orientations)
 Desired named matrix (kind = 3523 (FIFF_MNE_FORWARD_SOLUTION_GRAD)) not available
 Read EEG forward solution (7498 sources, 60 channels, free orientations)
 Forward solutions combined: MEG, EEG
 Source spaces transformed to the forward solution coordinate frame

Simulate raw data

raw_sim = simulate_raw (raw.info , [stc ] * 10, forward=fwd , verbose=True)
cov = make_ad_hoc_cov (raw_sim.info )
add_noise (raw_sim , cov , iir_filter=[0.2, -0.2, 0.04], random_state=rng )
add_ecg (raw_sim , random_state=rng )
add_eog (raw_sim , random_state=rng )
raw_sim.plot ()
Raw plot
Setting up raw simulation: 1 position, "cos2" interpolation
Event information stored on channel: STI 014
 Interval 0.000–2.000 s
Setting up forward solutions
Computing gain matrix for transform #1/1
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 Interval 0.000–2.000 s
 10 STC iterations provided
[done]
Adding noise to 366/376 channels (366 channels in cov)
Sphere : origin at (0.0 0.0 0.0) mm
 radius : 0.1 mm
Source location file : dict()
Assuming input in millimeters
Assuming input in MRI coordinates
Positions (in meters) and orientations
1 sources
ecg simulated and trace not stored
Setting up forward solutions
Computing gain matrix for transform #1/1
Sphere : origin at (0.0 0.0 0.0) mm
 radius : 0.1 mm
Source location file : dict()
Assuming input in millimeters
Assuming input in MRI coordinates
Positions (in meters) and orientations
2 sources
blink simulated and trace stored on channel: EOG 061
Setting up forward solutions
Computing gain matrix for transform #1/1

Plot evoked data

events = find_events (raw_sim ) # only 1 pos, so event number == 1
epochs = Epochs (raw_sim , events , 1, tmin=-0.2, tmax=epoch_duration )
cov = compute_covariance (
 epochs , tmax=0.0, method="empirical", verbose="error"
) # quick calc
evoked = epochs.average ()
evoked.plot_white (cov , time_unit="s")
EEG (59 channels), Gradiometers (203 channels), Magnetometers (102 channels), Whitened GFP, method =
Finding events on: STI 014
Trigger channel STI 014 has a non-zero initial value of 1 (consider using initial_event=True to detect this event)
Removing orphaned offset at the beginning of the file.
9 events found on stim channel STI 014
Event IDs: [1]
Not setting metadata
9 matching events found
Setting baseline interval to [-0.19979521315838786, 0.0] s
Applying baseline correction (mode: mean)
Created an SSP operator (subspace dimension = 4)
4 projection items activated
NOTE: pick_types() is a legacy function. New code should use inst.pick(...).
Computing rank from covariance with rank=None
 Using tolerance 1.2e-14 (2.2e-16 eps * 59 dim * 0.92 max singular value)
 Estimated rank (eeg): 58
 EEG: rank 58 computed from 59 data channels with 1 projector
Computing rank from covariance with rank=None
 Using tolerance 2.1e-13 (2.2e-16 eps * 203 dim * 4.8 max singular value)
 Estimated rank (grad): 203
 GRAD: rank 203 computed from 203 data channels with 0 projectors
Computing rank from covariance with rank=None
 Using tolerance 5.6e-15 (2.2e-16 eps * 102 dim * 0.25 max singular value)
 Estimated rank (mag): 99
 MAG: rank 99 computed from 102 data channels with 3 projectors
 Created an SSP operator (subspace dimension = 4)
Computing rank from covariance with rank={'eeg': 58, 'grad': 203, 'mag': 99, 'meg': 302}
 Setting small MEG eigenvalues to zero (without PCA)
 Setting small EEG eigenvalues to zero (without PCA)
 Created the whitener using a noise covariance matrix with rank 360 (4 small eigenvalues omitted)

Total running time of the script: (0 minutes 12.469 seconds)

Gallery generated by Sphinx-Gallery