Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using only the leadfield for source reconstruction #79

Open
nguyen-td opened this issue Apr 3, 2024 · 2 comments
Open

Using only the leadfield for source reconstruction #79

nguyen-td opened this issue Apr 3, 2024 · 2 comments

Comments

@nguyen-td
Copy link
Collaborator

nguyen-td commented Apr 3, 2024

Right now, we need a pointer to the head model and source model to run source reconstruction using pop_roi_activity. But technically, we only need a lead field, right?

Can we modify the the pop_roi_activity and roi_activity functions in a way that makes them accept the raw lead field matrix/array instead of requiring pointers? Say we have a pre-computed lead field with the dimension (30 x 5003 x 3), where 30 is the number of channels, 5003 the number of voxels and 3 the orientation and pass this array directly to the function, then we could skip almost all steps and jump right to this line:

leadfield = reshape(H*leadfield(:, :), nbchan, nvox, 3);

For example, you could download a standard lead field here (New York head) and just pass the lead field. So instead of having to run everything here (e.g. pipeline_connectivity)

EEG = pop_dipfit_settings( EEG, 'hdmfile',fullfile(eeglabp, 'plugins','dipfit','standard_BEM','standard_vol.mat'), ...
    'coordformat','MNI','mrifile',fullfile(eeglabp, 'plugins','dipfit','standard_BEM','standard_mri.mat'),...
    'chanfile',fullfile(eeglabp, 'plugins','dipfit','standard_BEM','elec', 'standard_1005.elc'),...
    'coord_transform',[0.83215 -15.6287 2.4114 0.081214 0.00093739 -1.5732 1.1742 1.0601 1.1485] );

EEG = pop_leadfield(EEG, 'sourcemodel',fullfile(eeglabp,'functions','supportfiles','head_modelColin27_5003_Standard-10-5-Cap339.mat'), ...
    'sourcemodel2mni',[0 -24 -45 0 0 -1.5708 1000 1000 1000] ,'downsample',1);

EEG = pop_roi_activity(EEG, 'leadfield',EEG.dipfit.sourcemodel,'model','LCMV','modelparams',{0.05},'atlas','LORETA-Talairach-BAs','nPCA',3, 'chansel', EEG.dipfit.chansel);

we could simply run something like this (of course, you would need to match the EEG channels):

load sa_nyhead

% use lower-resolution cortex
L_3D = sa.cortex75K.V_fem(:, sa.cortex5K.in_from_cortex75K, :);

EEG = pop_roi_activity(EEG, 'leadfield', L_3D,'model','LCMV','modelparams',{0.05},'atlas','LORETA-Talairach-BAs','nPCA',3);

I think this would make the code more flexible. What do you think @arnodelorme?

@arnodelorme
Copy link
Collaborator

Yes, these functions already accept a leadfield matrix plus an atlas (Brainstorm). Did you try the call you proposed.

@nguyen-td
Copy link
Collaborator Author

nguyen-td commented Apr 4, 2024

Yes but there are some error messages, for example due to this line

'leadfield' { 'string' 'struct' } { { } {} } '';

that prevents arrays from passing through. There are some other error messages after fixing that (adding 'float' to the list) too. But I can work on it then.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants