Brainstorm
  • Comments
  • Menu
    • Attachments
    • Versions
    • Raw Text
    • Print View
  • Login

Software

  • Introduction

  • Gallery

  • Download

  • Installation

Users

  • Tutorials

  • Forum

  • Courses

  • Community

  • Publications

Development

  • What's new

  • What's next

  • About us

  • Contact us

  • Contribute

Revision 39 as of 2024-07-15 18:39:36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

EEG and epilepsy

Authors: Francois Tadel, Elizabeth Bock, John C. Mosher, Marcel Heers.

This tutorial introduces some concepts that are specific to the management of EEG recordings in the Brainstorm environment. It also describes a standard pipeline for analyzing epilepsy recordings. It is based on a clinical case from the Epilepsy Center at the University Hospital of Freiburg, Germany. The anonymized dataset can be downloaded directly from the Brainstorm download page.

Note that the operations used here are not detailed, the goal of this tutorial is not to introduce Brainstorm to new users. For in-depth explanations of the interface and theoretical foundations, please refer to the introduction tutorials. This page is the new version where shared channel files are not used anymore - if you really want to use shared channel files, see the ?old version.

NOT FOR CLINICAL USE:
The performance characteristics of the methods and software implentation presented in this tutorial have not been certified as medical devices and should be used for research purposes only.

Contents

  1. Dataset description
    1. License
    2. Clinical description
    3. Overview of the data processing
    4. References
  2. Download and installation
  3. Import the anatomy
  4. Access the recordings
    1. Link the recordings
    2. Prepare the channel file
    3. Register electrodes with MRI
  5. Review EEG recordings
    1. Display the recordings
    2. Frequency filters
    3. Time and amplitude resolution
    4. User setups
    5. Multiple montages
    6. Scalp current density
  6. Mark spikes
    1. Detect heartbeats
    2. Import the spike markers
    3. Manual marking
  7. Pre-process recordings
    1. Power spectrum
    2. Band-pass filter
    3. Average reference
    4. Average reference and bad channels
    5. Evaluate the modifications
  8. Artifact cleaning with ICA
  9. Import the recordings
    1. Epoching
    2. Averaging spikes
  10. Source analysis: Surface
    1. Head model
    2. Noise covariance matrix
    3. Inverse model
  11. (Advanced) Source analysis: MEM inverse solution
    1. Regions of interest
  12. Source analysis: Volume
    1. Head model
    2. Dipole scanning
    3. Dipole fitting
  13. Time-frequency
    1. Continuous recordings
    2. Spike average
  14. Additional documentation
  15. Scripting

Dataset description

License

This tutorial dataset (EEG and MRI data) remains proprietary of the Epilepsy Centre, University Hospital Freiburg, Germany. Its use and transfer outside the Brainstorm tutorial, e.g. for research purposes, is prohibited without written consent from the Epilepsy Centre in Freiburg. For questions please contact A. Schulze-Bonhage, MD, PhD: andreas.schulze-bonhage@uniklinik-freiburg.de

Clinical description

This tutorial dataset was acquired in a patient who suffered from focal epilepsy with focal sensory, dyscognitive and secondarily generalized seizures since the age of eight years. He does not have any typical risk factors for epilepsy. The high resolution 3T epilepsy MRI including postprocessing was found to be normal. FDG-PET of the brain did not show any pathological changes in the glucose metabolism. Non-invasive telemetry revealed left fronto-central sharp waves, polyspikes and bursts of beta band activity (max. amplitude FC1, Cz) especially during sleep. The tutorial dataset was acquired during one night of the non-invasive telemetry recording at the Epilepsy Center Freiburg, Germany.

Afterwards the patient underwent invasive EEG to identify the epileptogenic area and to map functionally important cortex. Details about invasive EEG and source localization from invasive EEG in this patient are reported in Dümpelmann, et al. (2011). Subsequently a left frontal tailored resection was performed. The histological analysis revealed a focal cortical dysplasia type IIB according to the classification of Palmini, et al. (2004). The postsurgical outcome is Engel 1A with a follow-up of 5 years.

The EEG data distributed here was recorded at 256Hz, using a Neurofile NT digital video-EEG system with 128 channels and a 16-bit A/D converter. The signal was filtered in the recording system with a high-pass filter with a time constant of 1 second (cutoff frequency ~ 0.16Hz) and a low-pass filter with a cutoff frequency of 344 Hz. The spikes were marked with Brainstorm by the epileptologists at the Epilepsy Center in Freiburg.

Overview of the data processing

The proper identification of epileptiform discharges ("spikes") is a complicated topic beyond the scope of this tutorial. Residents in Neurology train intensively on how to identify true interictal and ictal discharges, particularly as distinct from so-called "normal variants" that can be abundant. Sleep and drowsy states of the brain can generate "vertex waves," "K-complexes," "positive occipital sharp transients of sleep" (POSTS), and "wickets," to name a few variants, none of which are epileptic. A good overview of terminology and application can be found, for example, on the Medscape website, Epileptiform Discharges.

With this caveat, we nonetheless give an overview of the processing approach. Although automation has been proposed for decades, "spike hunting" is often done by manual inspection of the recorded EEG waveforms (whether scalp, subdural, or depths). The classic scalp sensor arrangement is the International 10-20 System (Wikipedia Site, Bioelectromagnetism Book, Chapter 13.3) arranged at 10 percent and 20 percent distances about the circumference of the head. Each of these 21 electrodes is acquired with respect to some reference (as all potentials must be). In reviewing the recordings, however, several "montages" are traditionally recommended that digitally "re-reference" the original recordings into new linear combinations of electrodes.

A classic montage is the "double banana" (Google Search) which emphasizes local changes in the scalp EEG by forming sequential bipolar pairs, such as "Fp1-F3", "F3-C3." Because F3 is found twice in this montage and of opposite sign, then an epileptic spike centered under F3 will appear as a reversed polarity in these two channels, a visual cue the trained epileptologist seeks when rapidly scanning through hours of recordings. This montage is more formally known as "LB-18.3" or "Longitudinal Bipolar 3" in the nomenclature of the American Clinical Neurophysiology Society (ACNS) Guidelines (see References Below).

ACNS guidelines suggest using both "longitudinal" and "transversal" bipolar montages to survey your data. For temporal epilepsy cases, you may also add a "temporal ring" montage. European neurologists often prefer to review the recordings using an average reference montage. Brainstorm provides several variations of all these montages, allows the users full flexibility in creating their own, and can run different montages simultaneously in multiple windows.

The user has to step along through the data, look for abnormal brain activity, then use Brainstorm's event markers to tag suspect intervals. With the suspected events marked and saved, the user can return later to perform source analyses on these intervals. With this brief overview, we detail below an exercise with the sample epilepsy data.

Note that the aim of this tutorial is not to train you on how to do spike recognition itself, but rather to illustrate how to manipulate the Brainstorm interface to build an environment adapted to this task. The formal data reviewing should be done by clinical neurophysiologists or other experienced personnel, with specialized training in separating true epileptic activity from other more normal variants of brain activity.

References

Dümpelmann M, Ball T, Schulze-Bonhage A (2011)
sLORETA allows reliable distributed source reconstruction based on subdural strip and grid recordings. Human Brain Mapping.

Palmini A, Najm I, Avanzini G, Babb T, Guerrini R, Foldvary-Schaefer N, Jackson G, Luders HO, Prayson R, Spreafico R, Vinters HV (2004) Terminology and classification of the cortical dysplasias.
Neurology, 62:S2-8.

Standard montages recommended by the American Clinical Neurophysiology Society:

  • American Clinical Neurophysiology Society Guidelines

  • Guidelines for Standard Electrode Position Nomenclature #5

  • A Proposal for Standard Montages to Be Used in Clinical EEG #6

Download and installation

  • Requirements: You have already followed all the introduction tutorials and you have a working copy of Brainstorm installed on your computer.

  • Go to the Download page of this website, and download the file: sample_epilepsy.zip

  • Unzip it in a folder that is not in any of the Brainstorm folders (program folder or database folder)

  • Start Brainstorm (Matlab scripts or stand-alone version)
  • Select the menu File > Create new protocol. Name it "TutorialEpilepsy" and select the options:

    • "No, use individual anatomy",

    • "No, use one channel file per acquisition run".

Import the anatomy

  • Switch to the "anatomy" view of the protocol.
  • Right-click on the TutorialEpilepsy folder > New subject > sepi01

    • Keep the default options you set for the protocol
  • Right-click on the subject node > Import anatomy folder (auto):

    • Set the file format: "FreeSurfer"

    • Select the folder: sample_epilepsy/anatomy

  • The "auto" import menu computed automatically a linear MNI normalization, default 3D positions for the anatomical fiducials NAS/LPA/RPA, and downsampled the cortex surface to 15000 vertices.

  • Click on [Save] to validate the modifications and continue with the importation of the anatomy. At the end, make sure the file "cortex_15000V" is selected (downsampled pial surface, that will be used for the source estimation). If it is not, double-click to select it as the default cortex surface.

    anatomy.gif

Without the individual MRI

If you do not have access to an individual MR scan of the subject (or if its quality is too low to be processed with FreeSurfer), but if you have digitized the head shape of the subject using a tracking system, you have an alternative: deform one of the Brainstorm templates (Colin27 or ICBM152) to match the shape of the subject's head. For more information, read the tutorials: Warping default anatomy, Using the anatomy templates

Access the recordings

Link the recordings

  • Switch to the "functional data" view (2nd button, on top of the database explorer).
  • Right-click on the subject folder > Review raw file:

    • Select the file format: "EEG: Deltamed Coherence-Neurofile(*.bin)"
    • Select the file: sample_epilepsy/data/tutorial_eeg.bin

  • The new files "Link to raw file" let you access directly the contents of the original EEG files. The menu "Review raw file" does not actually copy any data to the database. More information.

  • The channel file "Deltamed channels" contains the name of the channels, but not their positions. We need to import separately the positions of the electrodes (either a standard cap or accurate positions digitized with a Polhemus device or any other tracking system).

Prepare the channel file

  • Import the positions of the electrodes:
    • Right-click the channel file > Add EEG positions > Import from file:
      channel_positions.gif

    • Select the file format: "EEG: ANT ASA/Xensor (*.elc)"
    • Select the file: sample_epilepsy/data/tutorial_electrodes.elc

    • This file contains the default electrodes positions from the ASA software (ANT).
    • If you have digitized the position of the electrodes (eg. with a Polhemus device) you have to make sure it contains the position of the anatomical references NAS/LPA/RPA. This is the best way to make sure the electrode cap will be registered automatically with the MRI in Brainstorm.
    • The channels are matched by name: the position file you import must include the labels of the electrodes and they must be named exactly in the the same way as in your recordings.
    • In this example, you will get a question "Apply MRI transformation?". If you answer yes, it would apply the voxel=>world transformation initially available in the MRI volume. Whether you need to answer Yes or No depends on which coordinates system is closer to the one use in your position file. Try both and you'll see which one brings the electrodes closer to the head of the subject. Here, answering NO would give a better immediate result, but as we will run the automatic alignment electrodes/head surface later, the answer to this question doesn't matter much.

  • The recordings contain signals coming from different types of electrodes:
    • 29 EEG electrodes
    • EOG1, EOG2: Electrooculograms
    • EMG, ECG: Electromyogram and electrocardiogram
    • SP1, SP2: Sphenoidal electrodes
    • RS: Electrode on the right shoulder
    • PHO: Photo stimulation channel
    • DELR, DELL, QR, QL: Not used
  • Right-click on the channel file > Edit channel file:

    • Note that the EOG, EMG and ECG channels have their type correctly detected.
    • All the other non-EEG channels were set to "EEG_NO_LOC" when we imported the channel locations: SP1, SP2, RS, PHO, DELR, DELL, QR, QL
    • It happens commonly that the file format for the electrodes positions does not describe the type of the channels correctly, typically all the signals saved in the files are classified as EEG. You can edit the names and types of the channels with this in interface: select one channel, click on the type and select something in the drop-down list. To edit multiple channels at once: right-click in the window > Set channel type.

    • For this particular study, we can use the channel file as it is configured now, just close the figure. Discard any modification you may have done.

      channel_type.gif

Register electrodes with MRI

  • Right-click on the channel file > MRI registration > Edit.

  • Hover your mouse over the toolbar buttons for instructions. Click on the [Label] button in the toolbar to show the names of the electrodes. The default positions are already quite good, and the head shape is correct, only limited manual registration will be required in the next few steps.

  • Click on the button "Refine registration using head points" to find a better registration between the head shape defined by the electrodes and the head surface coming from the MRI. Note that this works only if have accurate head shapes and electrodes positions. If you don't, skip this step and edit the registration manually.

  • Click on the button "Project electrodes on scalp surface", to ensure all the electrodes touch the skin surface. Then click on "OK" and agree to save the modifications.

    channel_type.gif

  • To see again the electrodes, right-click on the channel file > Display sensors > EEG (head).

  • To see or edit the positions of the electrodes in the MRI Viewer: right-click on the channel file > Display sensors > EEG (MRI Viewer). Select the menu "MIP: Functional" to see all the electrodes. To edit the channel file: right-click > Electrodes > Set electrode position.

    channel_mri.gif

Review EEG recordings

Display the recordings

  • Open a time series figure with the "Average reference" montage

    • Right-click on the "Link to raw file" > EEG > Display time series.

    • In the Record tab, select the first button in the toolbar (Display mode for time series) to view the signals in columns.
    • Select "Average reference" in the drop-down list. This menu allows you to set a predefined montages to linearly re-arranging the waveforms. Note the keyboard shortcuts in the menus.
    • Change the default duration that is reviewed to 10s.
      review_avgref.gif review_duration.gif

    • In the figure, select the display option "Flip Y Axis" to have the negative values pointing up (convention used by many neurologists).

      review_flip.gif

  • Open a 2D Sensor cap map of the EEG sensor values:

    • Right-click on "Link to raw file" again > EEG > 2D Sensor cap

    • In the Record tab, set the Montage to this view to "Average reference"

  • Open the ECG and EOG traces, to avoid confusing spikes with cardiac or ocular artifacts:

    • Right-click on the Link to raw file > ECG > Display time series

    • Right-click on the Link to raw file > EOG > Display time series

    • The ECG is almost mandatory. The EOG is optional: it can be helpful for beginners but an experienced reviewer will easily recognize the eye movements directly in the EEG data.
  • Re-arrange the figures in a convenient way, for example as illustrated below. Then disable the automatic positioning of the figures (layout menu at the top-right of the Brainstorm figure > None), so that your figure arrangement doesn't get lost when you open a new figure.

  • Having a lot of windows open may slow down significantly the display because each time you change the current time, all the figures have to be updated. A lot of space is also wasted on the screen due to window frames. The number of windows to open has to be balanced between the amount of information to display and the ease of use.

    reviewall.gif

Frequency filters

Go to the Filter tab to enable some display frequency filters. General recommendations are:

  • High-pass filter: 0.5 Hz

  • Low-pass filter: 80 Hz

    filters.gif

  • Note that if you have filters selected in this panel, the display of the EEG signals will be slower. Each time you will go to the next page of recordings, the filters will be applied on the fly to the recordings. The computation time is not very long at each page, but can become annoying when reviewing a lot of data. For a faster display of filtered signals, you may consider apply the filters to the file (with the process Pre-process > Band-pass filter) and then review the recordings without visualization filters.

Time and amplitude resolution

The resolutions of the time and amplitude axes have a lot of importance for the visual detection of epileptic spikes. The shapes we are looking for are altered by the horizontal and vertical scaling. The distance unit on a screen is the pixel, we can set how much time is represented by one pixel horizontally and how much amplitude is represented by one pixel vertically.

In the Brainstorm interface, this resolution is usually set implicitly: you can set the size of the window, the duration or recordings reviewed at once (text box "duration" in tab Record) and the maximum amplitude to show in the figure (buttons [...] and [AS] on the right of the time series figure). From there, you can also zoom in time ([<], [>], mouse wheel) or amplitude ([^], [v], Shift+mouse wheel). These parameters are convenient to explore the recordings interactively but don't allow us to have reproducible displays with constant time and amplitude resolutions.

To set the figure resolution explicitly: right-click on the figure > Figure > Set axes resolution. Note that this interface does not store the input values, it just modifies the other parameters (figure size, time window, max amplitude) to fit the resolution objectives. If you modify these parameters (resize the figure, keep the button [AS] selected and scroll in time, etc) the resolution is lost, you have to set it again manually. In particular, make sure you disable the auto-scaling ([AS] button in the time series figure) if you want to preserve the aspect ratio while you scroll through the data.

This operation typically has to be repeated everytime you open a new file. For a faster access to this option, use the keyboard shortcut Ctrl+O. The option window offers by default the last values that you entered, just press Enter to apply them again.

Recommendations for this dataset are:

  • Time axis: 170 pixels/sec (~55 mm/sec)

  • Amplitude: 15 μV/pixels (~45 μV/mm)

    resolution.gif

User setups

This preparation of the reviewing environment requires a large number of operations, and would become quickly annoying if you have to repeat it every time you open a file. You can use the menu "User setups" to save a window configuration and reload it in one click later. In the menu "Window layout", at the top-right of the Brainstorm window, select User setup > New setup. Enter a name of your choice for this particular window arrangement.

This operation will also disable the automatic window arrangement (Window layout > None). To reload it later, open one figure on the dataset you want to review and then select your new entry in the User setup menu.

  • usersetup.gif

Multiple montages

It may be interesting for some cases to display different groups of sensors in multiple windows (eg. with an MEG system with 300 sensors), or some complicated epilepsy cases where you would like to review at the same time multiple montages (eg. longitudinal and transversal bipolar montages).

  • Open your full reviewing environment as described before, where the EEG signals are displayed with the "Average reference" montage.

  • Open another view on the same data with the "Longitudinal 3" montage ("double-banana" LB-18.3)

    • Right-click on the "Link to raw file" again > EEG > Display time series

    • Alternatively, you can right-click on the existing figure > Figure > Clone figure.

    • Then set the montage for this new figure to "Longitudinal 3".
    • Resize all the figures to make room for the new window.
    • Save this window configuration as a new "User setup".
  • If you don't see the "Longitudinal 3" menu, it is probably because you have been using Brainstorm before these predefined montages were made available in the distribution. To add them manually:
    • In the Record tab, select "Edit montages" in the drop-down menu
    • Click on the "Load montage" button.
    • Go to the folder "brainstorm3/toolbox/sensors/private/", and select the first file.
    • Note that a new entry (probably "Longitudinal 1") is added to the list of available montages.
    • Repeat the operation with all the files in the folder "brainstorm3/toolbox/sensors/private/".
    • Click on "Save" to close the montage editor and now select "Longitudinal 3".

    reviewall2.gif

  • More information available in the tutorial Montage editor.

Scalp current density

In the example below, see how the montage Scalp current density can enhance the visual detection of spikes. More information.

  • scd_off.gif

    scd_on.gif

Mark spikes

Detect heartbeats

When you have a clean ECG signal for your patient, you can automatically identify all the heartbeats in the recordings. Because heartbeats can cause sharp waves in some EEG traces, it helps the reviewing process to have all the cardiac events marked in the recordings.

  • Right-click on the "Link to raw file" > EEG > Display time series (or simply double-click on it).

  • In the tab Record, menu Artifacts > Detect heartbeats: Channel=ECG, All file.

    detect_ecg.gif

Import the spike markers

Some spikes were marked by the epileptologists at the Epilepsy Center in Freiburg and saved in an external text file. We are going to import this file manually.

  • In the tab Record, menu File > Add events from files...

    • Select format Array of times (text file containing the timing of the markers)

    • Select file sample_epilepsy/data/tutorial_spikes.txt

    • When prompted, enter the event name "SPIKE"

  • A new category SPIKE is visible in the events list, containing 58 markers. Click on a few of them and try to identify the shape of the spike (mostly visible on the channel FC1). Then close the viewer and save the modifications.

    events_import.gif

  • The two other types of events that were present initially in the file (REM/REM_Ende) indicated the beginning and the end of periods or REM sleep (the patient is sleeping during the entire session).

Manual marking

If you are marking the events by yourself, you could follow this procedure:

  • Close all the current figures ("Close all" button at the top-right corner of the Brainstorm window).
  • Double-click on the "Link to raw file" to open a continuous file viewer, and load your reviewing environment (menu User setups).
  • Start by creating a group of events (Events > Add group), and select it in the list of events.

  • Make sure that the time and amplitude resolutions are what you are used to
    (right-click on the figure > Figure > Set axes resolution)

  • Scroll through the recordings using the [<<<] and [>>>] buttons or shortcuts such as F3 or F4 (complete list and descriptions available when you hover your mouse over these buttons).

  • You can adjust the gain of the electrodes to observe better an event with the buttons [^] and [v], with the keyboard (+/-) or the mouse ([Shift+mouse wheel] or [Right-click+move up/down]).

  • When you identify a spike, click in a white area of the figure in order to place the time cursor at the peak of the spike. If you click on the signal itself, it selects the corresponding channel, but you can use the shortcut Shift+Click to prevent this behavior and force the time cursor to be moved instead.
  • Press Ctrl+E to add a marker where the time cursor is.
  • If you are marking multiple types of events, it is convenient to set up some additional keyboard shortcuts. Using the menu Events > Edit keyboard shortcuts, you can associate custom events to the keys 1 to 9 of the keyboard. Define the name of the event type to create for each key, and then simply press the corresponding key to add/delete a marker at the current time position.

  • To jump to the next/previous event in the current category: use the keyboard shortcuts [Shift+arrow right] and [Shift+arrow left]
  • More information on the data viewer, see tutorial: Review continuous recordings.

Pre-process recordings

Two of the typical pre-processing steps consist in removing the power lines artifacts (50 Hz or 60Hz) and the frequencies we are not interested in (a low-pass filter to remove the high-frequency noise and a high-pass filter to remove the very slow components of the signals). Let's start with a spectral evaluation of this file.

Power spectrum

  • In the Process1 box: Drag and drop the "Link to raw file".
  • Run process Frequency > Power spectrum density (Welch): All file, Length=10s, Overlap=50%.
    psd1.gif

  • Double-click on the new PSD file to display it.
    psd2.gif

  • This frequency spectrum does not show any particular peak at 50/60Hz, there is no notch filter to apply on these recordings. If we had to, we would run the process "Pre-processing > Notch filter" as explained in the tutorial Detect and remove artifacts.

Band-pass filter

The filters we selected for reviewing the recordings were for visualization only, they were not applied to the file. In order to apply these filters permanently to the recordings, we need to do the following:

  • Keep the "Link to raw file" selected in the Process1 list.
  • Run process Pre-process > Band-pass filter: [0.5,80]Hz, 60dB, no mirror, sensors=EEG

    bandpass.gif

  • Note that this new continuous file is saved in your Brainstorm database, while the original file is saved in a separate folder (sample_epilepsy). If you delete the link to the original file with the database explorer, it would not delete the actual file. If you delete the link to the filtered file, it would delete the file itself.

Average reference

The average reference montage we used to review the recordings was for visualization only, it did not modify the file. To apply this transformation permanently, we need to run the re-referencing process.

  • Double-click on the filtered file "Raw | band(0.5-80Hz)" to open it.
  • In the Record tab, select the menu Artifacts > Re-reference EEG: Enter AVERAGE.

    avgref_process.gif

  • The re-referencing is saved in the same way as the SSP and ICA projectors: a linear operator applied dynamically to the recordings. At the end of the process, the window "Select active projectors" is shown, so that you can control the list of projectors currently applied to the file. Close this figure and close the recordings.

    avgref_projector.gif

Average reference and bad channels

You should be careful with the average reference when adding or removing bad channels. Changing the number of channels modifies the way the average reference is computed.

Montage: When using the montage "Average reference" to change only the visulization, the average reference operator is computed dynamically, it always takes into account the bad channels at the moment you review the recordings. Therefore the average reference for display is always correct, you do not have to modify anything if you change the list of bad channels.

Permanent re-referencing: When using the process "Re-reference EEG" to alter permanently the recordings, the average reference operator is computed using the channels that are marked as bad at the moment of the computation, and saved in the file. If later you modify the list of bad channels, this operator will become incorrect, you will have to delete it and recompute it. To avoid any confusion, always compute the average reference after marking the bad channels.

Evaluate the modifications

  • In Process1, select the filtered file "Raw | band(0.5-80Hz)".
  • Run again the process Frequency > Power spectrum density (Welch), with same options.

  • Double-click on the new PSD file to display the spectrum of the filtered file. You can observe the effects of the filter (drops on the two sides of the spectrum, zoom in to observe it better) and the average reference (all the signals have now a similar level of power).

    psd3.gif

Artifact cleaning with ICA

The standard cleaning pipeline presented in the introduction tutorials recommends to use the SSP approach to remove the cardiac and blink artifacts. This is valid in most MEG experiments.

In EEG, there is usually not such a clear artifact caused by the heartbeats: cleaning for cardiac artifacts is not part of the standard processing pipeline. Eye movements typically cause huge artifacts on the frontal channels and need to be marked as bad or corrected. In the present case, the patient is sleeping, therefore there are no blinks, but we can observe a lot of fast eye movements during the periods of REM sleep, and other slower eye movements in the rest of the recordings.

The SSP technique is not adapted for cleaning events for which we cannot set markers, and in general it is not suitable for low-density EEG. The topographies are a lot smoother in EEG than in MEG, it is more difficult to identify a spatial filter that targets one specific artifact with a simple spatial PCA decomposition, especially with a low number of sensors.

The ICA approach (Independent Component Analysis) is much more popular in the EEG community. It relies on the the same logic as the SSP: identifying spatial topographies that are specific from an artifact and then removing them from the recordings. But instead of simply identifying the most powerful spatial components with a PCA decomposition, it tries to identify components that are independent in time. Using the information from the time dimension makes it possible to work with a lower number of sensors, and to identify some components of the signal that are completely uncorrelated with the others.

The ICA analysis can also be used to identify the signals from a few brain sources of interest: in this case, select a few components and remove all the others.

Various algorithms are available from the ICA process. You can explore the documentation of all these methods for reference documentation on ICA:

  • Picard: Recommended method

  • Infomax: EEGLAB reference implementation (runica.m)

  • FastICA

  • Jade

We will now illustrate how to compute some projectors to remove the contaminations from the eye movements with the Picard algorithm.

  • To make it run fast on most computers, we will not process the full recordings but only a short segment which contains a lot of eye movements: [500,700]s.

    ica_window.gif

  • Double-click on the filtered file "Raw | band(0.5-80Hz)" to open it.
  • In the Record tab, select the menu Artifacts > ICA components.

    ica_process.gif

    • Time window: Time segment where the artifact is present.
      Note that all the BAD segments are removed from the selected data before executing the ICA algorithm, causing some discontinuities in the signals.

    • Event name: Empty, we want to use all the recordings from the selected time window.

    • Event window: Not applicable (because the previous option is empty).

    • Sensor types: EEG

    • Band-pass filter: Ignored (0-0Hz), we want to perform the analysis on the broadband signal.

    • Resample: Disabled (0 Hz)

    • ICA algorithm: Picard

    • Number of ICA components: If this value N is higher than 0 and lower than the number of channels, it will first perform a spatial PCA decomposition, keep only the N principal components, and pass this subspace to the ICA algorithm. Enter 0 here.

    • Sort components based on correlation with: Sort ICA components based on their correlation with a selection of 'reference' channels (default: ECG & EOG). The sorting is based on the maximum correlation of a given ICA time-series with any of the reference channels. If empty, the components are sorted in decreasing order of the EEG variance accounted for by each component.

    • Save averaged artifact: Not applicable (because we are not using events).

  • You can follow the convergence of the selected algorithm in the Matlab command window. When it is done, the window "Select active projectors" is shown. Select all the components, display their spatial topography and time series (read the tooltips to see which button does what). The first two components (IC1, IC2) look very correlated with the EOG signals, and their topographies are typical of eye movements.

    ica_components.gif

  • If the algorithm doesn't converge: try to run the ICA decomposition before the EEG referencing, or limit the number of ICA components. In this example, the rank of the data (28) is lower than the number of signals (29), this is due to re-referencing EEG signals, and causes Infomax and FastICA to fail converging. If you set the parameter "number of ICA components" to 28, it would solve the problem.

  • Select the first two components to remove them: observe the effect on the EEG signals. It removes very well the artifacts due to the eye movements without affecting the rest of the recordings.

    ica_eeg.gif

  • Go to around a SPIKE event, make sure that removing these two components doesn't affect the shape of the spike. We do not want them to alter our events of interest.

    ica_spike.gif

  • Select the first two components, click on [Save] to keep this selection.
  • To save the ICA time series in a new file in the database, follow the instructions in the SSP tutorial: Extract the time series.

  • For practicing the visual identification of ICA components for various types of artifacts: https://labeling.ucsd.edu/tutorial/practice

  • Examples of results obtained with the four methods available in Brainstorm in this example. From left to right: method name and execution time, topography of the first two components, EOG signals and time series of the first two components.

    ica_compare.gif

Import the recordings

Epoching

Now we want to extract all the spikes from this filtered file and import them in the database.

  • Right-click on the filtered file (Raw|band) > Import in database.

    import_menu.gif import.gif

    • Select the option "Use events" and select the category SPIKE, with 58 events.

    • Epoch time: [-300, +500]ms around the spike events.

    • Remove DC offset: Disabled, the DC offset has already been removed with the high-pass filter.
    • Create a separate folder for each event type: Yes, it will import the epochs into a folder "SPIKE" instead of a folder named after the EEG original filename.
  • You should see a new folder "SPIKE" containing 58 epochs in your database. The channel file gets duplicated for each new folder.

    import_after.gif

  • We recommend you always review all the trials after importing them. To review the imported trials: double-click on the first trial, switch back to butterfly view (first button in Record tab), then navigate between trials with F3 / Shift+F3. Channels and trials can be marked as bad independently.

You can overlay one or more electrodes from multiple files with the tab "Cluster":

  • Display the time series for one trial (you must have at least one file loaded to create a cluster).
  • In the Brainstorm window: Click on the [+] to add the Cluster tab.

  • In the Cluster tab: Click on [New Ind] and enter "FC1" (cluster with one electrode only).
  • In the Cluster tab: Double-click to rename the cluster into something more meaningful ("FC1").
  • In the Cluster tab: Select the option "Overlay: Files"

  • In the database explorer: Right-click on the group of trials > Clusters time series.

    fc1_cluster.gif

Alternatively, you can display all the trials as an image, for one sensor at a time:

  • In the database explorer: Right-click on the on the group of trials > Display as image > EEG.

    fc1_erpimage.gif

Averaging spikes

  • Drag and drop all the SPIKE files or the SPIKE folder into the Process1 tab.
  • Run process Average > Average files, By folder (subject average), Arithmetic average.

    average1.gif

  • Double click on the new file "Avg: SPIKE" to review it. Add a "2D sensor cap" view (popup or Ctrl+T).

    average_view.gif

  • Go to the Filter tab to disable all the visualization filters: these filters are not working well on short signals, the high-pass filter at 0.5Hz can introduce errors in the display of the average.

  • To have all the figures automatically re-arrange themselves again, select "Weighted" or "Tiled" in the "Window layout" menu (top-right corner).
  • Explore this average in time with the left and right keyboard arrow. You can add more views to your reviewing environment (see the tutorial Visual exploration):

    average3.gif

  • Typically, the analysis could be limited to the ascending part of the peak (from -11ms to 0ms), as it gives a rather clear information on the primary epilepsy focus. For the rest of the tutorial, we will use a larger time window (-40ms to 100ms) in order to illustrate the visualization tools. Just keep in mind that it can be hazardous to interpret waves that are far in time or in space from the primary focus.

  • To get a synthetic view at the sensor level of the evolution of the 2D map in time:
    Right-click on the figure > Snapshot > Time contact sheet: Figure: [-40ms, 110ms], 16 images.

    average2.gif

Source analysis: Surface

Head model

  • We are going to use a realistic head model. This requires additional surfaces to model the skull properly. Go to the "Anatomy" view, right-click on the subject > MRI segmentation > Generate BEM surfaces, method = Brainstorm.

  • Use 1922 vertices for each layer (default). Three new surface files are created:

    bem1.gif bem2.gif

  • Go back to the "Functional data" view, right-click on the channel file in the SPIKE folder > Compute head model. Select "cortex surface" and "OpenMEEG BEM". Leave all the OpenMEEG options to their defaults. Depending on your computer, this may take between 10 and 60 minutes.

    headmodel1.gif

  • At the first execution, OpenMEEG will be downloaded and installed as a Brainstorm plugin.

  • Open your resource monitor to check the memory usage: if it goes over 98%, your system doesn't have enough RAM to compute this model. You should kill the process "om_gain", kill Matlab and try again with a different configuration.
  • If the automatic download doesn't work, download and install OpenMEEG manually (menu Help). If the OpenMEEG calculation crashes, please refer to the BEM tutorial.

  • If you don't have enough memory, try with the option Use adjoint formulation. Another easy way to make this work a lot faster and with a limited amount of memory is to use less vertices for each layer, for example 1082 vertices (scalp) and 642 vertices (outer skull and inner skull). However, with less refined models you may run into other issues (intersecting meshes or numerical instabilities).

  • If you can compute the model but the source maps you get don't make any sense, it could be because the BEM surfaces were poorly defined. When some cortex vertices are too close to the inner skull surface, the model can be unstable and you would typically see source maps containing zeros everywhere except for a few vertices. If this happens, delete the existing BEM surfaces and try computing new ones with a higher number of vertices for the inner and outer skull surfaces.
  • If you cannot get OpenMEEG to work, or if the results definitely do not make sense, try using a different forward model: "3-shell sphere". It's a spherical model, so it would perform better in the regions of the head that are close to the sphere. See the Head model tutorial.

Noise covariance matrix

  • For minimum norm inverse models, we need to estimate the level of noise at the level of the sensors. Defining what can be considered as "noise" in the middle of continuous brain recordings is a difficult question, discussed in the Noise covariance tutorial.

  • Here we choose what is described as option 1b in the section "Epilepsy" in that tutorial: we are going to calculate the noise covariance matrix using 50 seconds from the continuous file that are very "quiet", ie. that contain no apparent epileptic activity, no REM and no other special artifacts. We can use for this purpose the segment between 110s and 160s.

  • Right-click on the filtered file "Raw|band" > Noise covariance > Compute from recordings: Baseline = [110,160]ms, keep the other options to the default values.

    noisecov1.gif

  • The noise covariance gets saved in the same folder as the recordings, you need to copy it manually to the other folders. Right-click > Copy to other folders.

    noisecov_copy.gif

Inverse model

  • Right-click on the OpenMEEG head model > Compute sources [2018]: sLORETA, Unconstrained

    inverse1.gif

  • It creates a shared inversion kernel and a source link for each file in the folder. If you are not familiar with these concepts, please refer to the Source estimation tutorial.

  • Double-click on the source file for the average. Configure its display: surface smoothing, amplitude threshold, colormap. Make sure all the visualization filters are turned OFF.

    inverse2.gif

  • To display the same information re-interpolated in the volume, right-click on the source file > Cortical activation > Display on MRI. Right-click on the figure to set the smoothing level and other options.

    inverse4.gif

  • You can save movies or contact sheets of the source maps with the Snapshot popup menu

    snapshot_menu.gif spike_video.gif spike_contact.gif

(Advanced) Source analysis: MEM inverse solution

The maximum of entropy on the mean (MEM) framework solution gathers several source localization techniques dedicated to estimate accurately the spatial extent of the EEG/MEG generators, a very important property in the context of localizing the generators of epileptic discharges, for which it is known that a relatively extended brain region should be involved (several cm2) to detect these discharges from the scalp. You can read more information on MEM in the Brain entropy in space and time (BEst) in the BEst tutorial.

Here are the steps to perform MEM localization on epileptic spikes.

  • Baseline: MEM solution relies on a data-driven parcelization of the brain. To do so, it requires some baseline data that can be taken either from a segment of signal of interest or from another baseline section with no epileptic discharges extracted from the data (typically 2s).

  • Inverse model: Right-click on the average signal "Avg: SPIKE (58 files)" > Compute sources [2018].



    • mem_panel2021.GIF cmem_panel2021.GIF

  • The MEM option panel appears. You have the choice between 3 methods. cMEM is the standard MEM in the time domain. wMEM focuses in the oscillatory patterns by computing MEM in the wavelet domain. rMEM is dedicated in finding synchronous sources using continuous wavelets.

  • Select cMEM for this tutorial. Select a time window from -0.3s to 0.5s under the option Data definition.

  • To select the baseline, select within data and select a time window from -0.3s to -0.1s. This will select -0.3s to -0.1s from "Avg: SPIKE (58 files)". There are 2 more options available to select baseline: o Within Brainstorm- if you want to select an external baseline saved in your Brainstorm protocol, type the name of that file next to option Find and select Find. (e.g., if your baseline is named ‘xyz’, type ‘xyz’ and select find)
    o External: to import any file (even outside your Brainstorm database)

  • To learn how to use the option parameters of cMEM, we encourage you to read the MEM tutorial. Here, we will use the default values. Press ok to start the source estimation; MEM is an iterative localization approach, so computation time will depend on the time window selected.
    Double click on the source file that was created to display the results cMEM_results.jpg

Regions of interest

  • From the displays we generated previously, there is no clear propagation of the spike. The scouts can be an interesting tool to explore further this spatial propagation.
  • Start by placing a small scout at the focus, then place a few other scouts of a similar size at other places around the spike location, where you could suspect a possible propagation. Plot the overlaid time series for these scouts. If you need help with this: see the Scouts tutorial.

    scouts1.gif

Source analysis: Volume

If the results you obtain are not satisfying with the surface-based source estimation, you can run again the same analysis with a different source space, sampling the entire head volume instead. More information about this method in the Volume source estimation tutorial. We will use this new example to estimate the dipole scanning tools.

Head model

  • Right-click on the channel file > Compute head model, select MRI volume. To go faster this time, you can select a spherical head model: 3-shell sphere. Use the default sphere.

    headmodel_vol2.gif

  • Then you have to define what source grid you want to use. Keep the default options.

    headmodel_vol3.gif

Dipole scanning

  • Right-click on the new head model > Compute sources [2018]: Dipole modeling.

    inverse_vol2.gif

  • Note that this is not a global inverse solution like the minimum norm. It represents the performance of each individual dipole, ie. its capacity to explain all the recordings at one time sample on its own.

    dipoles1.gif

  • In Process1, select the Dipoles link associated with the average spike.
  • Run process Sources > Dipole scanning: [-40,100]ms

    dipoles2.gif

  • Double-click on the new dipoles file. In the Dipoles tab, set the threshold Goodness to 90% to show only the most meaningful dipoles. The color of the dipoles below represent the time at which each dipole was estimated. This representation seems to indicate there are two distinct brain regions: the activity at 40ms is deeper than at the peak of the spike (0ms).

    dipoles3.gif

  • More information about dipole scanning: Dipoles: Scanning and displaying.

Dipole fitting

The dipole scanning approach presented in the previous section estimates the activity of a fixed grid of dipoles and selects the most significant one at each time. Another option to represent the source activity as a sequence of moving dipoles is to use the FieldTrip function ft_dipolefitting.m to run a non-linear dipole fit at each time point. This process requires that you install FieldTrip on your computer first. Note that it works only with a spherical head model.

  • In Process1, select the EEG recordings for the average spike.
  • Run process Sources > FieldTrip: ft_dipolefitting: Time window=[-40,100]ms, Sensors=EEG.

    dipoles5.gif

  • Displaying the dipoles with a goodness of fit above 95% produces very similar figures. It is a good way to cross-validate the dipole results you obtain: if these two approaches lead to completely different interpretations, you should not trust either one.

    dipoles6.gif

  • More information about dipole fitting: FieldTrip dipole fitting

Time-frequency

We will illustrate two ways of computing time-frequency maps. Exploring the continuous recordings in time-frequency space can help with the detection of the epileptic activity, while computing the average of the time-frequency power of a few epochs can help understanding the dynamic of the event.

Continuous recordings

  • Right-click on the filtered continuous file (Raw|band) > Import in database. Select a block of 10s between 1890s and 1900s (this segment contains a lot of spikes). Do not use events.

    tf1.gif

  • In Process1, select the new imported file: "Raw (1890.00s,1900.00s)"
  • Run process Frequency > Time-Frequency (Morlet wavelets):
    Sensors=EEG, 1/f compensation, Frequency=Log 2:40:80

    tf2.gif

  • Display the new time-frequency file. In the Display tab, select channel FC1. You can notice that the vertical stripes in the time-frequency map match the spikes in this segment of file. The epileptic brain activity can be easier to detect in time-frequency space than in the original signals.

    tf3.gif

Spike average

  • In Process1, select all the imported spike epochs.
  • Run process Frequency > Time-Frequency (Morlet wavelets):
    Sensors=EEG, Spectral flattening=None, Frequency=Log 2:40:80, Save average.

    tf4.gif

  • In Process1, select the new time-frequency average.
  • Run process Standardize > Baseline normalization: Baseline=[-200,-100]ms, ESR/ERD.

    tf5.gif

  • Right-click on the average > All channels, then adjust the colormap.

    tf6.gif

Additional documentation

Related tutorials

  • sEEG epileptogenicity maps

  • EEG-Video synchronization

  • ECoG/sEEG tutorial

Forum posts

  • EEG reference: Reference of the gain matrix

  • EEG reference: Adding missing channel to the recordings

  • Registration: Match known EEG locations to the MRI image

  • Registration: Flipping EEG electrodes left-right

  • Pre-processing: Bad channel replacement

Minimum number of electrodes for EEG source modeling

  • Song J, Davey C, Poulsen C, Luu P, Turovets S, Anderson E, Li K, Tucker D
    EEG source localization: Sensor density and head surface coverage
    Journal of Neuroscience Methods, Dec 2015

  • Michel CM, Brunet D
    EEG source imaging: A practical review of the analysis steps
    Frontiers in Neurology, Apr 2019

Inverse models in epilepsy

  • Distributed source models vs. ECD (equivalent current dipole)
    Kobayashi K, Yoshinaga H, Ohtsuka Y, Gotman J (2005)
    Dipole modeling of epileptic spikes can be accurate or misleading
    Epilepsia, 2005 Mar;46(3):397-408.

  • Distributed source models vs. BOLD
    Heers M, Hedrich T, An D, Dubeau F, Gotman J, Grova C, Kobayashi E (2014)
    Spatial correlation of hemodynamic changes related to interictal epileptic discharges with electric and magnetic source imaging. Human Brain Mapping, published online 24 Feb 2014.

  • ECD vs. BOLD
    Benar CG, Grova C, Kobayashi E, Bagshaw AP, Aghakhani Y, Dubeau F, Gotman J (2006)
    EEG–fMRI of epileptic spikes: Concordance with EEG source localization and intracranial EEG
    NeuroImage, 30:1161-1170.

MEM in clinical epilepsy

Related methodological developments:

  • Amblard C, Lapalme E, Lina JM (2004)
    Biomagnetic source detection by maximum entropy and graphical models, IEEE Trans Biomed Eng.

  • Lapalme E, Lina JM, Mattout J (2006)
    Data-driven parceling and entropic inference in MEG, NeuroImage.

Ability of MEM to recover the spatial extent of epileptic spikes:

  • Grova C, Daunizeau J, Lina JM, Benar CG, Benali H, Gotman J (2006)
    Evaluation of EEG localization methods using realistic simulations of interictal spikes, NeuroImage.

  • Chowdhury RA, Lina JM, Kobayashi E, Grova C (2013)
    MEG Source Localization of spatially extended generators of epileptic activity: Comparing Entropic and Hierarchical Bayesian Approaches, PloS ONE.

Multimodal concordance on clinical cases:

  • Grova C, Daunizeau J, Kobayashi E, Bagshaw AP, Lina JM, Dubeau F, Gotman J (2008)
    Concordance between distributed EEG source localization and simultaneous EEG-fMRI studies of epileptic spikes, NeuroImage.

  • Heers M, Hedrich T, An D, Dubeau F, Gotman J, Grova C, Kobayashi E (2014)
    Spatial correlation of hemodynamic changes related to interictal epileptic discharges with electric and magnetic source imaging, Hum Brain Mapp.

Background readings: Epilepsy and EEG/MEG

  • Ebersole JS, Husain AM, Nordli DR
    Current Practice of Clinical Electroencephalography

  • Laoprasert P
    Atlas of Pediatric EEG

  • Anderson CT, Carlson CE, Li Z, Raghavan M
    Magnetoencephalography in the preoperative evaluation for epilepsy surgery
    Curr Neurol Neurosci, Rep. 2014 May;14(5):446.

  • Kharkar S, Knowlton R
    Magnetoencephalography in the presurgical evaluation of epilepsy
    Epilepsy Behav. 2015 May;46:19–26.

Scripting

The following script from the Brainstorm distribution reproduces the analysis presented in this tutorial page: brainstorm3/toolbox/script/tutorial_epilepsy.m

1 function tutorial_epilepsy(tutorial_dir, reports_dir) 2 % TUTORIAL_EPILEPSY: Script that reproduces the results of the online tutorial "EEG/Epilepsy". 3 % 4 % CORRESPONDING ONLINE TUTORIALS: 5 % https://neuroimage.usc.edu/brainstorm/Tutorials/Epilepsy 6 % 7 % INPUTS: 8 % - tutorial_dir: Directory where the sample_epilepsy.zip file has been unzipped 9 % - reports_dir : Directory where to save the execution report (instead of displaying it) 10 11 % @============================================================================= 12 % This function is part of the Brainstorm software: 13 % https://neuroimage.usc.edu/brainstorm 14 % 15 % Copyright (c) University of Southern California & McGill University 16 % This software is distributed under the terms of the GNU General Public License 17 % as published by the Free Software Foundation. Further details on the GPLv3 18 % license can be found at http://www.gnu.org/copyleft/gpl.html. 19 % 20 % FOR RESEARCH PURPOSES ONLY. THE SOFTWARE IS PROVIDED "AS IS," AND THE 21 % UNIVERSITY OF SOUTHERN CALIFORNIA AND ITS COLLABORATORS DO NOT MAKE ANY 22 % WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF 23 % MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, NOR DO THEY ASSUME ANY 24 % LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE. 25 % 26 % For more information type "brainstorm license" at command prompt. 27 % =============================================================================@ 28 % 29 % Author: Francois Tadel, 2014-2022 30 31 32 % ===== FILES TO IMPORT ===== 33 % Output folder for reports 34 if (nargin < 2) || isempty(reports_dir) || ~isdir(reports_dir) 35 reports_dir = []; 36 end 37 % You have to specify the folder in which the tutorial dataset is unzipped 38 if (nargin == 0) || isempty(tutorial_dir) || ~file_exist(tutorial_dir) 39 error('The first argument must be the full path to the tutorial dataset folder.'); 40 end 41 % Build the path of the files to import 42 AnatDir = fullfile(tutorial_dir, 'sample_epilepsy', 'anatomy'); 43 RawFile = fullfile(tutorial_dir, 'sample_epilepsy', 'data', 'tutorial_eeg.bin'); 44 ElcFile = fullfile(tutorial_dir, 'sample_epilepsy', 'data', 'tutorial_electrodes.elc'); 45 SpikeFile = fullfile(tutorial_dir, 'sample_epilepsy', 'data', 'tutorial_spikes.txt'); 46 % Check if the folder contains the required files 47 if ~file_exist(RawFile) 48 error(['The folder ' tutorial_dir ' does not contain the folder from the file sample_epilepsy.zip.']); 49 end 50 % Subject name 51 SubjectName = 'sepi01'; 52 53 54 % ===== CREATE PROTOCOL ===== 55 % The protocol name has to be a valid folder name (no spaces, no weird characters...) 56 ProtocolName = 'TutorialEpilepsy'; 57 % Start brainstorm without the GUI 58 if ~brainstorm('status') 59 brainstorm nogui 60 end 61 % Delete existing protocol 62 gui_brainstorm('DeleteProtocol', ProtocolName); 63 % Create new protocol 64 gui_brainstorm('CreateProtocol', ProtocolName, 0, 0); 65 % Start a new report 66 bst_report('Start'); 67 68 69 % ===== IMPORT ANATOMY ===== 70 % Process: Import anatomy folder 71 bst_process('CallProcess', 'process_import_anatomy', [], [], ... 72 'subjectname', SubjectName, ... 73 'mrifile', {AnatDir, 'FreeSurfer-fast'}, ... 74 'nvertices', 15000); 75 76 % ===== ACCESS THE RECORDINGS ===== 77 % Process: Create link to raw file 78 sFilesRaw = bst_process('CallProcess', 'process_import_data_raw', [], [], ... 79 'subjectname', SubjectName, ... 80 'datafile', {RawFile, 'EEG-DELTAMED'}, ... 81 'channelreplace', 1, ... 82 'channelalign', 0); 83 84 % Process: Add EEG positions 85 bst_process('CallProcess', 'process_channel_addloc', sFilesRaw, [], ... 86 'channelfile', {ElcFile, 'XENSOR'}, ... 87 'fixunits', 1, ... 88 'vox2ras', 0); 89 % Process: Refine registration 90 bst_process('CallProcess', 'process_headpoints_refine', sFilesRaw, []); 91 % Process: Project electrodes on scalp 92 bst_process('CallProcess', 'process_channel_project', sFilesRaw, []); 93 94 % Process: Snapshot: Sensors/MRI registration 95 bst_process('CallProcess', 'process_snapshot', sFilesRaw, [], ... 96 'target', 1, ... % Sensors/MRI registration 97 'modality', 4, ... % EEG 98 'orient', 1, ... % left 99 'Comment', 'MEG/MRI Registration'); 100 101 102 % ===== EVENTS: SPIKES AND HEARTBEATS ===== 103 % Process: Detect heartbeats 104 bst_process('CallProcess', 'process_evt_detect_ecg', sFilesRaw, [], ... 105 'channelname', 'ECG', ... 106 'timewindow', [], ... 107 'eventname', 'cardiac'); 108 % Process: Events: Import from file 109 bst_process('CallProcess', 'process_evt_import', sFilesRaw, [], ... 110 'evtfile', {SpikeFile, 'ARRAY-TIMES'}, ... 111 'evtname', 'SPIKE'); 112 113 114 % ===== PRE-PROCESSING ===== 115 % Process: Power spectrum density (Welch) 116 sFilesPsd = bst_process('CallProcess', 'process_psd', sFilesRaw, [], ... 117 'timewindow', [], ... 118 'win_length', 10, ... 119 'win_overlap', 50, ... 120 'sensortypes', 'EEG', ... 121 'edit', struct(... 122 'Comment', 'Power', ... 123 'TimeBands', [], ... 124 'Freqs', [], ... 125 'ClusterFuncTime', 'none', ... 126 'Measure', 'power', ... 127 'Output', 'all', ... 128 'SaveKernel', 0)); 129 % Process: Snapshot: Frequency spectrum 130 bst_process('CallProcess', 'process_snapshot', sFilesPsd, [], ... 131 'target', 10, ... % Frequency spectrum 132 'Comment', 'Power spectrum density'); 133 134 % Process: Band-pass:0.5-80Hz 135 sFilesRaw = bst_process('CallProcess', 'process_bandpass', sFilesRaw, [], ... 136 'sensortypes', 'EEG', ... 137 'highpass', 0.5, ... 138 'lowpass', 80, ... 139 'attenuation', 'strict', ... % 60dB 140 'mirror', 0); 141 142 % Process: Re-reference EEG 143 bst_process('CallProcess', 'process_eegref', sFilesRaw, [], ... 144 'eegref', 'AVERAGE', ... 145 'sensortypes', 'EEG'); 146 147 % Process: Power spectrum density (Welch) 148 sFilesPsdClean = bst_process('CallProcess', 'process_psd', sFilesRaw, [], ... 149 'timewindow', [], ... 150 'win_length', 10, ... 151 'win_overlap', 50, ... 152 'sensortypes', 'EEG', ... 153 'edit', struct(... 154 'Comment', 'Power', ... 155 'TimeBands', [], ... 156 'Freqs', [], ... 157 'ClusterFuncTime', 'none', ... 158 'Measure', 'power', ... 159 'Output', 'all', ... 160 'SaveKernel', 0)); 161 % Process: Snapshot: Frequency spectrum 162 bst_process('CallProcess', 'process_snapshot', sFilesPsdClean, [], ... 163 'target', 10, ... % Frequency spectrum 164 'Comment', 'Power spectrum density'); 165 166 167 % ===== ICA ===== 168 % Process: ICA components: Infomax 169 bst_process('CallProcess', 'process_ica', sFilesRaw, [], ... 170 'timewindow', [500, 700], ... 171 'eventname', '', ... 172 'eventtime', [], ... 173 'sensortypes', 'EEG', ... 174 'ignorebad', 1, ... 175 'bandpass', [0, 0], ... 176 'resample', 0, ... 177 'usessp', 1, ... 178 'method', 'picard', ... % Picard: Ablin, Cardoso & Gramfort (IEEE TSP 2018) 179 'nicacomp', 0, ... 180 'icasort', 'EOG, ECG', ... 181 'saveerp', 0, ... 182 'select', [1 2]); % Force the selection: components #1 and #2 183 184 185 % ===== IMPORT RECORDINGS ===== 186 % Process: Import MEG/EEG: Events 187 sFilesEpochs = bst_process('CallProcess', 'process_import_data_event', sFilesRaw, [], ... 188 'subjectname', SubjectName, ... 189 'condition', '', ... 190 'eventname', 'SPIKE', ... 191 'timewindow', [], ... 192 'epochtime', [-0.3, 0.5], ... 193 'createcond', 1, ... 194 'ignoreshort', 1, ... 195 'usectfcomp', 1, ... 196 'usessp', 1, ... 197 'freq', [], ... 198 'baseline', []); 199 200 % Process: Average: By condition (subject average) 201 sFilesAvg = bst_process('CallProcess', 'process_average', sFilesEpochs, [], ... 202 'avgtype', 3, ... 203 'avg_func', 1, ... % Arithmetic average: mean(x) 204 'weighted', 0, ... 205 'keepevents', 0); 206 207 % Configure the display so that the negative values points up 208 bst_set('FlipYAxis', 1); 209 % Process: Snapshot: Recordings time series 210 bst_process('CallProcess', 'process_snapshot', sFilesAvg, [], ... 211 'target', 5, ... % Recordings time series 212 'modality', 4, ... % EEG 213 'Comment', 'Average spike'); 214 % Process: Snapshot: Recordings topography (contact sheet) 215 bst_process('CallProcess', 'process_snapshot', sFilesAvg, [], ... 216 'target', 7, ... % Recordings topography (contact sheet) 217 'modality', 4, ... % EEG 218 'contact_time', [-0.040, 0.110], ... 219 'contact_nimage', 16, ... 220 'Comment', 'Average spike'); 221 222 223 % ===== SOURCE ANALYSIS: SURFACE ===== 224 % Process: Generate BEM surfaces 225 bst_process('CallProcess', 'process_generate_bem', [], [], ... 226 'subjectname', SubjectName, ... 227 'nscalp', 642, ... 228 'nouter', 482, ... 229 'ninner', 482, ... 230 'thickness', 4, ... 231 'method', 'brainstorm'); 232 % Process: Compute head model 233 bst_process('CallProcess', 'process_headmodel', sFilesAvg, [], ... 234 'sourcespace', 1, ... % Cortex surface 235 'eeg', 3, ... % OpenMEEG BEM 236 'openmeeg', struct(... 237 'BemSelect', [0, 0, 1], ... 238 'BemCond', [1, 0.0125, 1], ... 239 'BemNames', {{'Scalp', 'Skull', 'Brain'}}, ... 240 'BemFiles', {{}}, ... 241 'isAdjoint', 1, ... 242 'isAdaptative', 1, ... 243 'isSplit', 0, ... 244 'SplitLength', 4000)); 245 246 % Process: Compute noise covariance 247 bst_process('CallProcess', 'process_noisecov', sFilesRaw, [], ... 248 'baseline', [110, 160], ... 249 'sensortypes', 'EEG', ... 250 'target', 1, ... % Noise covariance (covariance over baseline time window) 251 'dcoffset', 1, ... % Block by block, to avoid effects of slow shifts in data 252 'identity', 0, ... 253 'copycond', 1, ... 254 'copysubj', 0, ... 255 'replacefile', 1); % Replace 256 257 % Process: Compute sources [2018] 258 sAvgSrc = bst_process('CallProcess', 'process_inverse_2018', sFilesAvg, [], ... 259 'output', 1, ... % Kernel only: shared 260 'inverse', struct(... 261 'Comment', 'sLORETA: EEG', ... 262 'InverseMethod', 'minnorm', ... 263 'InverseMeasure', 'sloreta', ... 264 'SourceOrient', {{'free'}}, ... 265 'Loose', 0.2, ... 266 'UseDepth', 0, ... 267 'WeightExp', 0.5, ... 268 'WeightLimit', 10, ... 269 'NoiseMethod', 'reg', ... 270 'NoiseReg', 0.1, ... 271 'SnrMethod', 'fixed', ... 272 'SnrRms', 1e-06, ... 273 'SnrFixed', 3, ... 274 'ComputeKernel', 1, ... 275 'DataTypes', {{'EEG'}})); 276 % Process: Snapshot: Sources (one time) 277 bst_process('CallProcess', 'process_snapshot', sAvgSrc, [], ... 278 'target', 8, ... % Sources (one time) 279 'modality', 1, ... % MEG (All) 280 'orient', 3, ... % top 281 'time', 0, ... 282 'threshold', 60, ... 283 'Comment', 'Average spike'); 284 285 286 % Install and Load Brain Entropy plugin 287 [isInstalled, errMsg] = bst_plugin('Install', 'brainentropy'); 288 if isInstalled 289 % Use default options of cMEM 290 mem_option = be_pipelineoptions(be_main, 'cMEM'); 291 mem_option.optional = struct_copy_fields(mem_option.optional, ... 292 struct(... 293 'TimeSegment', [-0.30078, 0.5], ... 294 'BaselineType', {{'within-data'}}, ... 295 'Baseline', [], ... 296 'BaselineHistory', {{'within'}}, ... 297 'BaselineSegment', [-0.30078, -0.10156], ... 298 'groupAnalysis', 0, ... 299 'display', 0)); 300 % Process: Compute sources: BEst 301 sAvgSrcMEM = bst_process('CallProcess', 'process_inverse_mem', sFilesAvg, [], ... 302 'comment', 'MEM', ... 303 'mem', struct('MEMpaneloptions', mem_option), ... 304 'sensortypes', 'EEG'); 305 % Process: Snapshot: Sources (one time) 306 bst_process('CallProcess', 'process_snapshot', sAvgSrcMEM, [], ... 307 'target', 8, ... % Sources (one time) 308 'modality', 1, ... % MEG (All) 309 'orient', 3, ... % top 310 'time', 0, ... 311 'threshold', 30, ... 312 'Comment', 'Average spike (cMEM)'); 313 else 314 bst_report('Error', [], [], errMsg); 315 end 316 317 318 % ===== SOURCE ANALYSIS: VOLUME ===== 319 % Process: Compute head model 320 bst_process('CallProcess', 'process_headmodel', sFilesAvg, [], ... 321 'sourcespace', 2, ... % MRI volume 322 'volumegrid', struct(... 323 'Method', 'adaptive', ... 324 'nLayers', 17, ... 325 'Reduction', 3, ... 326 'nVerticesInit', 4000, ... 327 'Resolution', 0.005, ... 328 'FileName', []), ... 329 'eeg', 2); % 3-shell sphere 330 331 % Process: Compute sources [2018] 332 sAvgSrcVol = bst_process('CallProcess', 'process_inverse_2018', sFilesAvg, [], ... 333 'output', 1, ... % Kernel only: shared 334 'inverse', struct(... 335 'Comment', 'Dipoles: EEG', ... 336 'InverseMethod', 'gls', ... 337 'InverseMeasure', 'performance', ... 338 'SourceOrient', {{'free'}}, ... 339 'Loose', 0.2, ... 340 'UseDepth', 1, ... 341 'WeightExp', 0.5, ... 342 'WeightLimit', 10, ... 343 'NoiseMethod', 'reg', ... 344 'NoiseReg', 0.1, ... 345 'SnrMethod', 'rms', ... 346 'SnrRms', 1e-06, ... 347 'SnrFixed', 3, ... 348 'ComputeKernel', 1, ... 349 'DataTypes', {{'EEG'}})); 350 % Process: Snapshot: Sources (one time) 351 bst_process('CallProcess', 'process_snapshot', sAvgSrcVol, [], ... 352 'target', 8, ... % Sources (one time) 353 'modality', 1, ... % MEG (All) 354 'orient', 3, ... % top 355 'time', 0, ... 356 'threshold', 0, ... 357 'Comment', 'Dipole modeling'); 358 359 % Process: Dipole scanning 360 sDipScan = bst_process('CallProcess', 'process_dipole_scanning', sAvgSrcVol, [], ... 361 'timewindow', [-0.040, 0.100], ... 362 'scouts', {}); 363 % Process: Snapshot: Dipoles 364 bst_process('CallProcess', 'process_snapshot', sDipScan, [], ... 365 'target', 13, ... % Dipoles 366 'orient', 3, ... % top 367 'threshold', 90, ... 368 'Comment', 'Dipole scanning'); 369 % Process: Snapshot: Dipoles 370 bst_process('CallProcess', 'process_snapshot', sDipScan, [], ... 371 'target', 13, ... % Dipoles 372 'orient', 1, ... % left 373 'threshold', 90, ... 374 'Comment', 'Dipole scanning'); 375 376 % Process: FieldTrip: ft_dipolefitting 377 sDipFit = bst_process('CallProcess', 'process_ft_dipolefitting', sFilesAvg, [], ... 378 'timewindow', [-0.040, 0.100], ... 379 'sensortypes', 'EEG', ... 380 'dipolemodel', 1, ... % Moving dipole 381 'numdipoles', 1, ... 382 'volumegrid', [], ... 383 'symmetry', 0, ... 384 'filetag', ''); 385 % Process: Snapshot: Dipoles 386 bst_process('CallProcess', 'process_snapshot', sDipFit, [], ... 387 'target', 13, ... % Dipoles 388 'orient', 3, ... % top 389 'threshold', 95, ... 390 'Comment', 'Dipole fitting'); 391 % Process: Snapshot: Dipoles 392 bst_process('CallProcess', 'process_snapshot', sDipFit, [], ... 393 'target', 13, ... % Dipoles 394 'orient', 1, ... % left 395 'threshold', 95, ... 396 'Comment', 'Dipole fitting'); 397 398 399 % ===== TIME-FREQUENCY ===== 400 % Process: Import MEG/EEG: Time 401 sRawImport = bst_process('CallProcess', 'process_import_data_time', sFilesRaw, [], ... 402 'subjectname', SubjectName, ... 403 'condition', '', ... 404 'timewindow', [1890, 1900], ... 405 'split', 0, ... 406 'ignoreshort', 1, ... 407 'usectfcomp', 1, ... 408 'usessp', 1); 409 % Process: Time-frequency (Morlet wavelets) 410 sRawTf = bst_process('CallProcess', 'process_timefreq', sRawImport, [], ... 411 'sensortypes', 'EEG', ... 412 'edit', struct(... 413 'Comment', 'Power,2-80Hz', ... 414 'TimeBands', [], ... 415 'Freqs', [2, 2.5, 3.1, 3.7, 4.3, 5, 5.7, 6.4, 7.2, 8.1, 9, 9.9, 10.9, 12, 13.1, 14.3, 15.6, 17, 18.4, 19.9, 21.6, 23.3, 25.1, 27, 29.1, 31.3, 33.6, 36, 38.6, 41.4, 44.3, 47.4, 50.7, 54.1, 57.8, 61.8, 65.9, 70.3, 75, 80], ... 416 'MorletFc', 1, ... 417 'MorletFwhmTc', 3, ... 418 'ClusterFuncTime', 'none', ... 419 'Measure', 'power', ... 420 'Output', 'all', ... 421 'SaveKernel', 0), ... 422 'normalize', 'multiply'); % 1/f compensation: Multiply output values by frequency 423 % Process: Snapshot: Time-frequency maps 424 bst_process('CallProcess', 'process_snapshot', sRawTf, [], ... 425 'target', 14, ... % Time-frequency maps 426 'rowname', 'FC1'); 427 428 % Process: Time-frequency (Morlet wavelets) 429 sAvgTf = bst_process('CallProcess', 'process_timefreq', sFilesEpochs, [], ... 430 'sensortypes', 'EEG', ... 431 'edit', struct(... 432 'Comment', 'Avg,Power,2-80Hz', ... 433 'TimeBands', [], ... 434 'Freqs', [2, 2.5, 3.1, 3.7, 4.3, 5, 5.7, 6.4, 7.2, 8.1, 9, 9.9, 10.9, 12, 13.1, 14.3, 15.6, 17, 18.4, 19.9, 21.6, 23.3, 25.1, 27, 29.1, 31.3, 33.6, 36, 38.6, 41.4, 44.3, 47.4, 50.7, 54.1, 57.8, 61.8, 65.9, 70.3, 75, 80], ... 435 'MorletFc', 1, ... 436 'MorletFwhmTc', 3, ... 437 'ClusterFuncTime', 'none', ... 438 'Measure', 'power', ... 439 'Output', 'average', ... 440 'RemoveEvoked', 0, ... 441 'SaveKernel', 0), ... 442 'normalize', 'none'); % None: Save non-standardized time-frequency maps 443 % Process: Event-related perturbation (ERS/ERD): [-199ms,-102ms] 444 sAvgTfNorm = bst_process('CallProcess', 'process_baseline_norm', sAvgTf, [], ... 445 'baseline', [-0.200, -0.100], ... 446 'method', 'ersd', ... % Event-related perturbation (ERS/ERD): x_std = (x - μ) / μ * 100 447 'overwrite', 0); 448 % Process: Snapshot: Time-frequency maps 449 bst_process('CallProcess', 'process_snapshot', sAvgTfNorm, [], ... 450 'target', 14, ... % Time-frequency maps 451 'rowname', 'FC1'); 452 453 454 % Save and display report 455 ReportFile = bst_report('Save', []); 456 if ~isempty(reports_dir) && ~isempty(ReportFile) 457 bst_report('Export', ReportFile, reports_dir); 458 else 459 bst_report('Open', ReportFile); 460 end 461 462 disp([10 'BST> tutorial_epilepsy: Done.' 10]); 463





Feedback: Comments, bug reports, suggestions, questions
Email address (if you expect an answer):


  • MoinMoin Powered
  • Python Powered
  • GPL licensed
  • Valid HTML 4.01