GRUNECO / eeg_harmonization

2 stars 4 forks source link

harmonize no funciona si se define spatial_filters:None en THE_DATASET #5

Open alberto-jj opened 2 years ago

alberto-jj commented 2 years ago

Al correr el siguiente código en el dataset de resting-state EEG de Parkinson de GRUNECO

THE_DATASET={
    'name':'antioquia',
    'input_path':'D:/Semillero/bids_multicenter/Automagic/raw/antioquia',
    'layout':{'extension':'.set','suffix':'eeg', 'return_type':'filename'},
       'args':{'line_freqs':[60]},
        'group_regex':None,
        'events_to_keep':None,
        'run-label':'restEC',
        'channels':['FP1', 'FPZ', 'FP2', 'AF3', 'AF4', 'F7', 'F5', 'F3', 'F1', 'FZ', 'F2', 'F4', 'F6', 'F8', 'FC5', 'FC3', 'FC1', 'FCZ', 'FC2', 'FC4', 'FC6', 'T7', 'C5', 'C3', 'C1', 'CZ', 'C2', 'C4', 'C6', 'T8', 'TP7', 'CP5', 'CP3', 'CP1', 'CPZ', 'CP2', 'CP4', 'CP6', 'TP8', 'P7', 'P5', 'P3', 'P1', 'PZ', 'P2', 'P4', 'P6', 'P8', 'PO7', 'PO5', 'PO3', 'POZ', 'PO4', 'PO6', 'PO8', 'O1', 'OZ', 'O2'],
        'spatial_filter':None
}

sovaharmony.processing.harmonize(THE_DATASET, fast_mode=False)

La última línea genera el siguiente error:


TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_15936/3447123753.py in ----> 1 sovaharmony.processing.harmonize(THE_DATASET, fast_mode=False)

c:\users\acer\eeg_harmonization\sovaharmony\processing.py in harmonize(THE_DATASET, fast_mode) 86 def_spatial_filter='58x25' 87 # Inputs not dataset dependent ---> 88 spatial_filter = get_spatial_filter(THE_DATASET.get('spatial_filter',def_spatial_filter)) 89 90 # Static Params

c:\Users\acer\anaconda3\lib\site-packages\sovaflow\utils.py in get_spatial_filter(name) 940 """ 941 # How sure are we that the order of the channels of matlab is the same as of python? --> 942 mat_contents = loadmat(os.path.join(os.path.dirname(os.path.abspath(file)),'spatial_filter__'+name+'.mat')) 943 W = mat_contents['W'] 944 A = mat_contents['A']

TypeError: can only concatenate str (not "NoneType") to str

Se puede solucionar cambiando la línea 88 de código en sovaharmony/processing.py (ver abajo) spatial_filter = get_spatial_filter(THE_DATASET.get('spatial_filter',def_spatial_filter)) por la siguiente expresión:

if THE_DATASET.get('spatial_filter',def_spatial_filter):
    spatial_filter = get_spatial_filter(THE_DATASET.get('spatial_filter',def_spatial_filter))

Gracias por la ayuda con el bug!

alberto-jj commented 2 years ago

Con la última actualización de la normalización de Huber (versión más fidedigna a la implementación de Bigdely-Shamlo, N. et al, Neuroimage 2020), si se define spatial_filters = None desde el directorio THE_DATASET, hay un pequeño bug al calcular la matrix de covarianza de los canales, ya que se usan los "ch_names = channels" del objeto spatial_filters por default de Medellín (58 canales).

Para solucionarlo, a mí me funcionó solamente reemplazando la línea 188 de processing.py

signal_ch = createRaw(da_eeg_cont,signal_lp.info['sfreq'],ch_names=channels)

por esta otra signal_ch = createRaw(da_eeg_cont,signal_lp.info['sfreq'],ch_names=signal_lp.info['ch_names'])

Creo que no debería cambiar como tal la estimación de la media de Huber ya que solo se toman los ch_names y el sfreq del objeto epochs, en lugar del spatial_filters.

Gracias!!!