[FieldTrip] Head model for EEG source localization - Possible bug in BEMCP?

Debora Desideri deb.desideri at gmail.com
Sat Mar 12 15:06:38 CET 2016


Dear all,
I am working on EEG source localization of a very simple fist clenching
task (right hand, 10 seconds of contraction alternated to 10 seconds of
relaxation to be used as contrast condition) using DICS beamformer
(frequency 10 Hz). I have the individial MRI and EEG electrode positions of
my participants, so I wrote a script to create the individual forward model
following the tutorials on the fieldtrip webpage and some useful
discussions on the mailing list. Below I report the full code used for the
forward model and the code used for the source analysis. Attached, you
find the  results of the source localization and
​some ​
figures of different steps in the computation of the forward model.

According to my task, I expect to identify a desynchronization on the left
motor cortex, but what I am getting are very weird results(see attachment
​s)​
.  I tryed to use the standard MRI in template\headmodel\standard_mri, and
I get similar results.

After a full day of self-debugging, I managed to get the result I expect
(attached) using the method "concentricspheres" instead of "bemcp" in the
computation of the head model, both with the MRI of my participants and
with the standard MRI.

I assume there must be something wrong with "bemcp", also becasue when I
use the standard bem headmodel (template\headmodel\standard_bem) created
with the method "dipoli", everything looks fine again.


Did anybody experienced a similar issue before? Is there anything wrong I
am doing in the pipeline?

Thanks a lot in advace for your support!
Best,
Debora


Fieldtrip version: 20150828
Matlab version: R2015a (64 bit)
OS: Windows 8 (64 bit)



%%%% --------------------- Code for  Forward Model ---------------- %%%


%% Read  MRI data (DICOM)
mri = ft_read_mri(experiment.mri); % experiment.mri contains the path to
individual MRIs

%% Convert anatomical MRI to MNI coordinate system (= RAS)

cfg = [];
cfg.method = 'interactive';
cfg.coordsys = 'spm'; % MNI coordinate system (=RAS)
cfg.viewmode = 'ortho';
mri_spm = ft_volumerealign(cfg,mri);

%% Re-slice the MRI volume so that all the 3 dimensions have the same
number of voxels

cfg = [];
cfg.resolution = 1; % 1 mm thick slices
cfg.dim = [256 256 256];

mri_spm = ft_volumereslice(cfg,mri_spm);

%% Visualize MRI data to check that everything is ok

cfg = [];
cfg.method = 'ortho';
ft_sourceplot(cfg,mri_spm)

%% Segment the anatomical data

cfg = [];
cfg.output = {'brain' 'skull' 'scalp'};
cfg.brainsmooth = 2;
cfg.brainthreshold = 0.25;
cfg.scalpthreshold = 0.025;
mri_seg    = ft_volumesegment(cfg, mri_spm);

%% Check segmentation brain
cfg = [];
cfg.method = 'ortho';
cfg.funparameter = 'brain';
ft_sourceplot(cfg,mri_seg)

%% Check segmentation skull
cfg = [];
cfg.method = 'ortho';
cfg.funparameter = 'skull';
ft_sourceplot(cfg,mri_seg)

%% Check segmentation scalp
cfg = [];
cfg.method = 'ortho';
cfg.funparameter = 'scalp';
ft_sourceplot(cfg,mri_seg)


%% Prepare mesh: creates surfaces at the boarders of the different
tissue-types
cfg = [];
cfg.method = 'projectmesh';
cfg.tissue = {'brain' 'skull' 'scalp'};
cfg.numvertices = [6000 4000 2000];
bnd = ft_prepare_mesh(cfg, mri_seg);

%% Visualize surfaces
figure
ft_plot_mesh(bnd(1),'facecolor','none') % brain
figure
ft_plot_mesh(bnd(2),'facecolor','none') % skull
figure
ft_plot_mesh(bnd(3),'facecolor','none') % scalp

%% Visualize full mesh
figure
ft_plot_mesh(bnd(3), 'facecolor',[0.2 0.2 0.2], 'facealpha', 0.3,
'edgecolor', [1 1 1], 'edgealpha', 0.05);
hold on;
ft_plot_mesh(bnd(2),'edgecolor','none','facealpha',0.4);
hold on;
ft_plot_mesh(bnd(1),'edgecolor','none','facecolor',[0.4 0.6 0.4]);


%% Prepare head model (volume conduction model)
cfg = [];
cfg.method = 'bemcp';
headmodel = ft_prepare_headmodel(cfg,bnd);


%% % --------------------- Align the EEG electrodes!!!-------------------%%%

%% (1) Read electrode position from Localizer file

elec = ft_read_sens(experiment.electrodes); % experiment.electrodes
contains the path to the individual electrode positions



%% (2) Check if alignment is necessary

figure
%plot scalp
ft_plot_mesh(headmodel.bnd(3),'edgecolor','none','facealpha',0.8,'facecolor',[0.6
0.6 0.8])
hold on
% plot electrodes
ft_plot_sens(elec,'style','sk')


%% (3) If the electrodes are not aligned to the head surface, interactively
align them

cfg = [];
cfg.method = 'interactive';
cfg.elec = elec;

cfg.headshape = headmodel.bnd(3); % scalp
elec_aligned = ft_electroderealign(cfg);


%%  Load hdr and order elec_aligned accordign to original order of signal
acquisition
%%% This is necessary because the eeg elctrod eposition shave been acquired
%%% in a different order with respect to theorder of the signal recording

load([experiment.path '\Data'],'hdr') % hdr contains some information about
the original order of the channels and so on...

 [~, original_order] = ismember(hdr.elec.label,elec_aligned.label);


elec_aligned.chanpos = elec_aligned.chanpos(original_order,:);
elec_aligned.elecpos = elec_aligned.elecpos(original_order,:);
elec_aligned.label = elec_aligned.label(original_order);

%% Check if the alignment is ok

figure
%plot scalp
ft_plot_mesh(headmodel.bnd(3),'edgecolor','none','facealpha',0.8,'facecolor',[0.6
0.6 0.8])
hold on
% plot electrodes
ft_plot_sens(elec_aligned,'style','sk')



%% -------------------------------- Source model -------------------------%%

%% Make the individual subject's grid


cfg = [];
cfg.grid.warpmni = 'yes';
cfg.resolution = 6; % resolution of the template grid in mm
cfg.grid.nonlinear = 'yes'; % use non linear normalization
cfg.mri = mri_spm; % use subject's mri in mni coordinates
cfg.grid.unit = 'mm';
sourcemodel = ft_prepare_sourcemodel(cfg);


%% Plot the single subject'e head model and grid positions

figure
hold on
ft_plot_vol(headmodel,'edgecolor','none','facealpha',0.3);
ft_plot_mesh(sourcemodel.pos(sourcemodel.inside,:));

%% Double check that source model is aligned to the segmented volume and to
the electrodes
figure
hold on
plot3(sourcemodel.pos(sourcemodel.inside,1),sourcemodel.pos(sourcemodel.inside,2),sourcemodel.pos(sourcemodel.inside,3),'.');
ft_plot_vol(headmodel,'facecolor','brain','edgecolor','none','facealpha',0.3);
ft_plot_sens(elec_aligned,'label','label','style','y*','Markersize',10);


%% ----------------------  FORWARD SOLUTION ------------------------ %%


%% Prepare leadfield

cfg = [];
cfg.elec = elec_aligned;
cfg.grid = sourcemodel;
cfg.headmodel = headmodel;
leadfield = ft_prepare_leadfield(cfg);


%% Test sourc elocalization



 load([experiment.path '\DATA'], 'preexperiment_freqsource')

 % preexperiment_freqsource contains the output of ft_freqanalysis

        cfg                    = [];
        cfg.elec               = elec_aligned;
        cfg.method             = 'dics';
        cfg.frequency          = 10;
        cfg.grid               = leadfield;
        cfg.headmodel          = headmodel;
        cfg.dics.keepfilter    = 'yes';
        cfg.dics.lambda       = '10%';
        src                    = ft_sourceanalysis(cfg,
preexperiment_freqsource);
        filter                 = src.avg.filter;


        markers = [224 192]; % markers are some number in the trialinfo,
224 is related to fist clenching, 192 to relaxation
        for mm = 1:length(markers)

           cfg = [];
           cfg.trials = find(preexperiment_freqsource.trialinfo ==
markers(mm));
           data = ft_selectdata(cfg,preexperiment_freqsource);

            %%% DICS
            cfg                    = [];
            cfg.elec               = elec_aligned;
            cfg.method             = 'dics';
            cfg.frequency          = 10;
            cfg.grid               = leadfield;
            cfg.headmodel          = headmodel;
            cfg.dics.projectnoise  = 'yes';
            cfg.dics.lambda       = '10%';
            cfg.grid.filter        = filter;
            Source{mm}            = ft_sourceanalysis(cfg, data);

        end


 %% Interpolate results to anatomy

    source = Source{1};
    source1 = Source{1}; %clenching
    source2 =  Source{2}; % release
    source.avg.cont = (source2.avg.pow./source1.avg.pow)-1;

    cfg = [];
    cfg.parameter         = 'cont';
    source               = ft_sourceinterpolate(cfg, source, mri_spm);



 %% Plot surface

    cfg = [];
    cfg.method            = 'surface';
    cfg.funparameter      = 'cont';
    cfg.funcolormap = 'jet';
    ft_sourceplot(cfg, source)


--------------------------------------------------------------------

Debora Desideri, PhD Student
BNP Lab - Neurology Department
University Hospital Tübingen
Eberhard Karls University Tübingen
Hoppe-Seyler Str. 3
D-72076 Tübingen
Tel: +49 7071/29 80478
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 5_CONCENTRICSPHERES_Results_Source.PNG
Type: image/png
Size: 126346 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0_IndividualMRI_spm.PNG
Type: image/png
Size: 80674 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0001.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 1_Segmentaiton_BrainSkullScalp.PNG
Type: image/png
Size: 41612 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 2a_Output ft_plot_mesh_BrainSkullScalp.PNG
Type: image/png
Size: 66519 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0003.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 2b_Output ft_plot_mesh_allSurfaces.PNG
Type: image/png
Size: 40960 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0004.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 3_BEMCP_SourceModel.PNG
Type: image/png
Size: 19959 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0005.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 3_CONCENTRICSPHERES_SourceModel.PNG
Type: image/png
Size: 19714 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0006.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 4_BEMCP_Alignment_HeadModel_SourceModel_Electrodes.PNG
Type: image/png
Size: 58428 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0007.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 4_CONCENTRICSPHERES_Alignment_HeadModel_SourceModel_Electrodes.PNG
Type: image/png
Size: 67775 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0008.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 5_BEMCP_Results_Source.PNG
Type: image/png
Size: 143105 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20160312/a9845405/attachment-0009.png>


More information about the fieldtrip mailing list