[FieldTrip] issues with ft_connectivityanalysis, interpolation, and parcellation in EEG

Christian Mista cmista at ingenieria.uner.edu.ar
Wed May 22 16:34:22 CEST 2019


Hi Jan-Mathijs,

Thank you for your replay. I tried to describe the problem as clear as
possible, but it seems I ended omitting information in the process. Here is
all my code so far. I still can't find what i'm doing wrong.

My data is a preprocessed continuous eeg recording.

% prepare layout
    cfg = [];
%I have to rotate the axis layout
    aux_elec         = chanloc.elec;
    aux_elec.pnt(:,1) = -chanloc.elec.pnt(:,2);
    aux_elec.pnt(:,2) = chanloc.elec.pnt(:,1);
%update direction
    chanloc.elec.pnt = aux_elec.pnt;
%layout for plotting
    cfg.elec          = chanloc.elec;
    layout            = ft_prepare_layout(cfg);

% subdivide into trials of 1 seconds 10% overlap
     cfg              = [];
% single number (in unit of time, typically seconds) of the required
snippets
     cfg.length      = 1;
% single number (between 0 and 1 (exclusive)) specifying the fraction of
overlap between snippets (0 = no overlap)
     cfg.overlap     = 0.1;
%cut
     data            = ft_redefinetrial(cfg, data);

%%  calculate cross-spectrum
    cfg               = [];
    cfg.method      = 'mtmfft';
    cfg.taper         = 'hanning';
%For connectivity analysis we need power and phase -> 'fourier'
    cfg.output        = 'fourier';
    cfg.keeptrials    = 'yes';
%frequency of interest foilim at 10 Hz +/- 1 Hz
    cfg.foi            = 10;
    cfg.tapsmofrq    = 1;
%frequency analysis
    freq1             = ft_freqanalysis(cfg, data);

%% Calculate source model
    [headmodel sourcemodel] = read_custom_head_source_model(freq1);  *%function
at the end of the email*

%% do the source reconstruction
    cfg                    = [];
    cfg.frequency         = freq1.freq;
    cfg.method            = 'pcc';                   % Dynamic Imaging of
Coherent Sources
    cfg.headmodel        = headmodel;
    cfg.grid                = sourcemodel;          % Our grid and the
leadfield
    cfg.pcc.projectnoise   = 'yes';                   % estimate noise
    cfg.pcc.lambda        = '10%';                  % how to regularise
    cfg.pcc.keepfilter      = 'yes';                  % keep the spatial
filter in the output
    cfg.pcc.realfilter       = 'yes';                  % retain the real
values
    cfg.keeptrials          = 'yes';
    cfg.senstype           = 'eeg';

    SourceData = ft_sourceanalysis(cfg, freq1);
   [SourceData] = ft_sourcedescriptives([], SourceData);

*   %% connectivity (this is the code I posted before)*
    cfg         = [];
    cfg.method  = 'coh';
    cfg.complex = 'absimag';
    source_conn = ft_connectivityanalysis(cfg, SourceData);

    %The conectome
    figure;imagesc(source_conn.cohspctrm);

    %Parcellation
    atlas =
ft_read_atlas('/fieldtrip-master/template/atlas/aal/ROI_MNI_V4.nii');

    cfg = [];
    cfg.interpmethod='nearest';
    cfg.parameter='tissue';
    [int_atlas] = ft_sourceinterpolate(cfg, atlas, source_conn);
    int_atlas.pos = source_conn.pos; % otherwise the parcellation won't work

    % and call ft_sourceparcellate:
    cfg = [];
    cfg.parcellation = 'tissue';
    cfg.parameter    = 'cohspctrm';
    parc_conn = ft_sourceparcellate(cfg, source_conn, int_atlas);

    figure;imagesc(parc_conn.cohspctrm);

+++ continue code


function [hdm lf] = read_custom_head_source_model(data)
%% read labels and search positions in template
    elec = ft_read_sens('standard_1020.elc');
    % Change unit for visivility
    data.elec.unit = 'mm';

    for labelindex = 1:length(data.label)
       %position of my electrodes in the template standard_1020
       Index = find(strcmpi(elec.label, data.label{labelindex}));

       %writing the real position of the electrodes in my data
       data.elec.chanpos(labelindex,:) = elec.chanpos(Index,:);
       data.elec.elecpos(labelindex,:) = elec.elecpos(Index,:);
    end

% Load template head model
    load('/fieldtrip-master/template/headmodel/symetric_headmodel.mat')
    headmodel = ft_convert_units(headmodel, data.elec.unit);

%% compute the leadfield
    cfg                = [];
    cfg.elec           = data.elec;
    cfg.elec.unit     = 'mm';
    cfg.headmodel    = headmodel;
    cfg.grid.resolution = 20;           % use a 3-D grid with a 20 mm
resolution
    [lf] = ft_prepare_leadfield(cfg);
end

I attached a figure how the source nai index looks in a sourceplot. Thanks
for your help.

All the best,
Christian

El mar., 21 may. 2019 a las 15:44, Schoffelen, J.M. (Jan Mathijs) (<
jan.schoffelen at donders.ru.nl>) escribió:

> Hi Christian,
>
> I guess you need to figure out why the dimension of the coherence matrix
> does not match the expectations.
> Based on the information you provide (i.e. the lack thereof: it’s not
> clear how you compute SourceData, and how you spectrally transformed your
> sensor data that goes into the source reconstruction step) there is lottle
> to go on.
>
> Best wishes,
> Jan-Mathijs
>
>
>
>
> On 21 May 2019, at 19:27, Christian Mista <cmista at ingenieria.uner.edu.ar>
> wrote:
>
> Hi FieldTrip community,
>
> I've been trying to perform a connectivity analysis using a 66 eeg
> recording database. So far, I've being able to solve the sourceanalysis
> (following the tutorial
> http://www.fieldtriptoolbox.org/tutorial/networkanalysis/) and plot the
> source activity. However, the problem starts when I'm trying the
> connectivity analysis. Any grid dimension lower than 20 mm in the
> sourcemodel calculation results in a matlab error (Out of memory) in the
> connectivity analysis. I guess that a grid dimension lower than 20 mm
> conveys to huge matrix sizes, not manageable by my OS (linux + Matlab).
>
> %% This is how I compute the sourcemodel (run ok)
>     cfg                 = [];
>     cfg.elec            = data.elec;
>     cfg.elec.unit = 'mm';                   % unit in cm
>     cfg.headmodel       = headmodel;
>     cfg.grid.resolution = 20;     % use a 3-D grid with a 20 mm resolution
>     [lf] = ft_prepare_leadfield(cfg);
>
>
> After computing the sourcemodel using the 20 mm grid, I have issues to
> parcellate my data. My main concern is about the mismatch size between the
> connectivity matrix and the atlas.
>
> source_conn =
>           dim: [7 9 8]
>        inside: [504×1 logical]
>           pos: [504×3 double]
>     cohspctrm: [5544×5544 double]
>        dimord: 'pos_pos_freq'
>          freq: 10
>           cfg: [1×1 struct]
>
>
> atlas =
>             dim: [91 109 91]
>             hdr: [1×1 struct]
>       transform: [4×4 double]
>            unit: 'mm'
>          tissue: [91×109×91 double]
>     tissuelabel: {1×116 cell}
>        coordsys: 'mni'
>
> I'd tried to interpolate and parcellate the matrix, but I must be missing
> or confusing something... Below is the code to calculate the connectivity
> and the parcellation.
>
> %% connectivity
>     cfg         = [];
>     cfg.method  = 'coh';
>     cfg.complex = 'absimag';
>     source_conn = ft_connectivityanalysis(cfg, SourceData);
>
>     %The conectome
>     figure;imagesc(source_conn.cohspctrm); %5544x5544 double
>
>     %Parcellation
>     atlas =
> ft_read_atlas('/fieldtrip-master/template/atlas/aal/ROI_MNI_V4.nii');
>
>     cfg = [];
>     cfg.interpmethod='nearest';
>     cfg.parameter='tissue';
>     [int_atlas] = ft_sourceinterpolate(cfg, atlas, source_conn);
>     int_atlas.pos = source_conn.pos; % otherwise the parcellation won't
> work
>
>     % and call ft_sourceparcellate:
>     cfg = [];
>     cfg.parcellation = 'tissue';
>     cfg.parameter    = 'cohspctrm';
>     parc_conn = ft_sourceparcellate(cfg, source_conn, int_atlas);
>
>     figure;imagesc(parc_conn.cohspctrm);
>
> ++Error in command windows matlab
>
> there are in total 504 positions, 230 positions are inside the brain, 181
> positions have a label
> 168 of the positions inside the brain have a label
> 168 of the labeled positions are inside the brain
> 62 of the positions inside the brain do not have a label
> Error using ft_notification (line 340)
> unsupported dimord unknown_unknown_freq
>
> Error in ft_error (line 39)
>   ft_notification(varargin{:});
>
> Error in ft_sourceparcellate (line 309)
>     ft_error('unsupported dimord %s', dimord{i})
>
> Two questions
> -Is 20 mm the min grid size to calculate connectivity?
> -What I'm missing in the parcellation process?
>
> I would really appreciate any advice, I've been scratching my head for a
> while on this one.
>
> Best,
> Christian
> _______________________________________________
> fieldtrip mailing list
> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
> https://doi.org/10.1371/journal.pcbi.1002202
>
>
> _______________________________________________
> fieldtrip mailing list
> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
> https://doi.org/10.1371/journal.pcbi.1002202
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20190522/7598c99b/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sourceNAI.jpg
Type: image/jpeg
Size: 18998 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20190522/7598c99b/attachment-0002.jpg>
-------------- next part --------------
_______________________________________________
fieldtrip mailing list
https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
https://doi.org/10.1371/journal.pcbi.1002202


More information about the fieldtrip mailing list