Source code for src.runnables.study_runnable
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Study runnable
"""
import numpy as np
from PyQt5.QtCore import QRunnable, pyqtSignal, QObject
from mne.time_frequency import tfr_morlet, tfr_multitaper, tfr_stockwell
from utils.view.error_window import errorWindow
__author__ = "Lemahieu Antoine"
__copyright__ = "Copyright 2022"
__credits__ = ["Lemahieu Antoine"]
__license__ = "GNU General Public License v3.0"
__maintainer__ = "Lemahieu Antoine"
__email__ = "Antoine.Lemahieu@ulb.be"
__status__ = "Dev"
# Time Frequency
[docs]class studyTimeFrequencyWorkerSignals(QObject):
"""
Contain the signals used by the time-frequency runnable.
"""
finished = pyqtSignal()
error = pyqtSignal()
[docs]class studyTimeFrequencyRunnable(QRunnable):
def __init__(self, file_data, method_tfr, channel_selected, min_frequency, max_frequency, n_cycles):
"""
Runnable for the computation of the time-frequency analysis of the given data.
:param file_data: MNE data of the dataset.
:type file_data: MNE.Epochs/MNE.Raw
:param method_tfr: Method used for computing the time-frequency analysis.
:type method_tfr: str
:param channel_selected: Channel on which the time-frequency analysis will be computed.
:type channel_selected: str
:param min_frequency: Minimum frequency from which the time-frequency analysis will be computed.
:type min_frequency: float
:param max_frequency: Maximum frequency from which the time-frequency analysis will be computed.
:type max_frequency: float
:param n_cycles: Number of cycles used by the time-frequency analysis for his computation.
:type n_cycles: int
"""
super().__init__()
self.signals = studyTimeFrequencyWorkerSignals()
self.file_data = file_data
self.method_tfr = method_tfr
self.channel_selected = channel_selected
self.min_frequency = min_frequency
self.max_frequency = max_frequency
self.n_cycles = n_cycles
self.power = None
self.itc = None
[docs] def run(self):
"""
Launch the computation of the time-frequency analysis on the given data.
Notifies the main model that the computation is finished.
If to extreme parameters are given and the computation fails, an error message is displayed describing the error.
Notifies the main model when an error occurs.
"""
try:
freqs = np.arange(self.min_frequency, self.max_frequency)
if self.method_tfr == "Morlet":
self.power, self.itc = tfr_morlet(self.file_data, freqs=freqs, n_cycles=self.n_cycles,
picks=self.channel_selected)
elif self.method_tfr == "Multitaper":
self.power, self.itc = tfr_multitaper(self.file_data, freqs=freqs, n_cycles=self.n_cycles,
picks=self.channel_selected)
elif self.method_tfr == "Stockwell":
self.power, self.itc = tfr_stockwell(self.file_data, freqs=freqs, n_cycles=self.n_cycles,
picks=self.channel_selected)
self.signals.finished.emit()
except ValueError as error:
error_message = "An error as occurred during the computation of the time frequency analysis."
detailed_message = str(error)
error_window = errorWindow(error_message, detailed_message)
error_window.show()
self.signals.error.emit()
[docs] def get_channel_selected(self):
"""
Get the channel selected for the computation.
:return: The channel selected.
:rtype: str
"""
return self.channel_selected
[docs] def get_power(self):
"""
Get the "power" data of the time-frequency analysis computation.
:return: "power" data of the time-frequency analysis computation.
:rtype: MNE.AverageTFR
"""
return self.power
[docs] def get_itc(self):
"""
Get the "itc" data of the time-frequency analysis computation.
:return: "itc" data of the time-frequency analysis computation.
:rtype: MNE.AverageTFR
"""
return self.itc