Skip to content

Bug in DCM-ERP tutorial: can't invert due to missing BEM data #11

Description

@pranaysy

Overview of problem

After specifying the model, as outlined in the first four steps of the DCM for evoked responses tutorial, inversion immediately fails with:

SPM26: spm_eeg_lgainmat                    14:06:10 - 28/04/2026
        ----------------------------------------------------------------
Error using ft_read_headmodel (line 46)
file 'C:\Users\at16431\OneDrive - University of Bristol\Ashley_AD_EEG\Anna_AI_taskcodes\Berk_new\New_spm\SPM\SPM\canonical\single_subj_T1_EEG_BEM.mat' does not exist

What's going on

The dataset linked in the docs for DCM for evoked response, points to dcm-erp-tyrer.zip with the following hash:

sha256sum: 56f364b9db49f3a9d1623754fce063424227095b6eaf236d5069615de27d659b

The contents of this archive are a single subject's processed data in SPM format:

mfaeffspmeeg_examplecontrolsubject.mat
mfaeffspmeeg_examplecontrolsubject.dat

Loading these data using SPM and inspecting their existing inversion fields reveals two things: there are five inversions in total with two unique gain matrices, and crucially these gain matrices are not supplied:

D = spm_eeg_load('mfaeffspmeeg_examplecontrolsubject');
numel(D.inv)
% ans =
%      5

% Loop over all inversions
cellfun(@(x)(fprintf('Gain matrix file: %s with comment: %s\n', x.gainmat, x.comment{:})), D.inv, 'UniformOutput', false)
  Gain matrix file: SPMgainmatrix_aeffspmeeg_8028_priming3_proc_1.mat with comment: 
  Gain matrix file: SPMgainmatrix_aeffspmeeg_8028_priming3_proc_1.mat with comment: ERP_CMM_NMDA_DCM_SENSOR_PRIMINGpmeeg_8028_priming3_proc.mat
  Gain matrix file: SPMgainmatrix_mfaeffspmeeg_8028_priming3_proc_3.mat with comment: DCM_ERP_CMM_NMDA_DCM_SENSOR_PRIMINGpmeeg_8028_priming3_proc.mat
  Gain matrix file: SPMgainmatrix_mfaeffspmeeg_8028_priming3_proc_3.mat with comment: DCM_30-Apr-2021
  Gain matrix file: SPMgainmatrix_mfaeffspmeeg_8028_priming3_proc_3.mat with comment: DCM_30-Apr-2021

Due to the missing leadfields, SPM tries to compute one from the forward model. However that fails because the paths to the BEM surfaces are hardcoded in each inversion:

unique(cellfun(@(x)(x.forward.vol), D.inv, 'UniformOutput', false)')
ans =
  2×1 cell array
    {'/users/at16431/Documents/MATLAB/SPM/spm12/spm12/canonical/single_subj_T1_EEG_BEM.mat'                                                           }
    {'C:\Users\at16431\OneDrive - University of Bristol\Ashley_AD_EEG\Anna_AI_taskcodes\Berk_new\New_spm\SPM\SPM\canonical\single_subj_T1_EEG_BEM.mat'}

The inversions appears to be using BEM surfaces derived from canonical meshes provided with SPM, however the paths to those files are local to the system used for respective inversions. And these paths don't automatically update over to a user's SPM installation unfortuntately.

Solution

Three possible paths forward:

  1. Supply the gain matrix along with processed data in the archive for maximum reproducibility
  2. Use same data and inversions, but provide a helper function to update paths for meshes etc on users' systems to their SPM installations
  3. Use same data, discard all existing inversions and create a forward model from scratch using SPM defaults

I vote for 1 > 3 > 2, as we've done the same in a reliable manner previously: https://github.com/pranaysy/MultimodalDCM

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions