sccn / roiconnect

ROI connectivity analysis in EEG
39 stars 17 forks source link

Using only the leadfield for source reconstruction #79

Open nguyen-td opened 5 months ago

nguyen-td commented 5 months ago

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:

https://github.com/sccn/roiconnect/blob/e80177fda427af5fb9ba656787e5f3b304b8f804/roi_activity.m#L250

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 commented 5 months ago

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

nguyen-td commented 5 months ago

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

https://github.com/sccn/roiconnect/blob/81336ddc84d0c21e1bb6c28a74e9817efcc95285/pop_roi_activity.m#L250

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.