raphaelvallat / yasa

YASA (Yet Another Spindle Algorithm): a Python package to analyze polysomnographic sleep recordings.
https://raphaelvallat.com/yasa/
BSD 3-Clause "New" or "Revised" License
417 stars 113 forks source link

Feed MNE epochs #35

Closed balandongiv closed 3 years ago

balandongiv commented 3 years ago

Great work from the author.

I understand spindles_detect welcome mne raw data. In this case, I assume the raw is a continuous signal.

However, I wonder whether the YASA have the built-capability to process mne epochs data?

raphaelvallat commented 3 years ago

Hi @balandongiv,

Currently, YASA does not have the capability to work with MNE Epochs. This would require quite a complete refactoring of the function, and I suspect it would also greatly increase computation time. Essentially, we would have to add another nested for loop here in order to loop across all the epochs.

https://github.com/raphaelvallat/yasa/blob/30d2501638457cfa45113d8121a9a345ff75ac01/yasa/detection.py#L616

I'm also not sure how we could align the epochs with the hypnogram (which is defined on continuous data). My recommendation would therefore be to keep using the continuous data and create your custom "epoch" mask directly with the hypno and include parameters. For example, hypno could be a vector of integer where each integer refers to an epoch, e.g. hypno=[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, ... 17, 17, 17] and then you could use yasa.spindles_detect(raw, hypno, include=[1, 2, 3, ... 17]).

Thanks, Raphael

balandongiv commented 3 years ago

Hi @raphaelvallat,

Sorry for not being that clear about my question. The case I have in mind is for continuous non-sleep EEG signal that has been epochs.

One way around that I can think of is by implement something like demonstrated in tutorial .

epochs = mne.read_epochs('some-epo.fif', preload=True, verbose=False)
sp=[yasa.spindles_detect ( epoch.get_data () [0, :, :], epochs.info['sfreq'], ch_names=epochs.ch_names, multi_only=False ) for epoch in epochs]
raphaelvallat commented 3 years ago

I see! In that case, I think that your solution is probably the best option. Otherwise, adding support for MNE epochs directly in the function would require extensive refactoring, most probably for no or little speed gain compared to your solution.