# -*- coding: utf-8 -*-
import numpy as np
from ..misc.report import get_kwargs
from .rsp_clean import rsp_clean
from .rsp_peaks import rsp_peaks
from .rsp_rvt import rsp_rvt
[docs]
def rsp_methods(
sampling_rate=1000,
method="khodadad",
method_cleaning="default",
method_peaks="default",
method_rvt="power",
**kwargs,
):
"""**RSP Preprocessing Methods**
This function analyzes and specifies the methods used in the preprocessing, and create a
textual description of the methods used. It is used by :func:`rsp_process()` to dispatch the
correct methods to each subroutine of the pipeline and :func:`rsp_report()` to create a
preprocessing report.
Parameters
----------
sampling_rate : int
The sampling frequency of the raw RSP signal (in Hz, i.e., samples/second).
method : str
The method used for cleaning and peak finding if ``"method_cleaning"``
and ``"method_peaks"`` are set to ``"default"``. Can be one of ``"Khodadad"``, ``"BioSPPy"``.
Defaults to ``"Khodadad"``.
method_cleaning: str
The method used to clean the raw RSP signal. If ``"default"``,
will be set to the value of ``"method"``. Defaults to ``"default"``.
For more information, see the ``"method"`` argument
of :func:`.rsp_clean`.
method_peaks: str
The method used to find peaks. If ``"default"``,
will be set to the value of ``"method"``. Defaults to ``"default"``.
For more information, see the ``"method"`` argument
of :func:`.rsp_peaks`.
method_rvt: str
The method used to compute respiratory volume per time. Defaults to ``"harrison"``.
For more information, see the ``"method"`` argument
of :func:`.rsp_rvt`.
**kwargs
Other arguments to be passed to :func:`.rsp_clean`,
:func:`.rsp_peaks`, and :func:`.rsp_rvt`.
Returns
-------
report_info : dict
A dictionary containing the keyword arguments passed to the cleaning
and peak finding functions, text describing the methods, and the corresponding
references.
See Also
--------
rsp_process, rsp_clean, rsp_findpeaks
Examples
--------
.. ipython:: python
import neurokit2 as nk
methods = nk.rsp_methods(sampling_rate=100, method="Khodadad", method_cleaning="hampel")
print(methods["text_cleaning"])
print(methods["references"][0])
"""
# Sanitize inputs
method_cleaning = (
str(method).lower() if method_cleaning == "default" else str(method_cleaning).lower()
)
method_peaks = str(method).lower() if method_peaks == "default" else str(method_peaks).lower()
method_rvt = str(method_rvt).lower()
# Create dictionary with all inputs
report_info = {
"sampling_rate": sampling_rate,
"method": method,
"method_cleaning": method_cleaning,
"method_peaks": method_peaks,
"method_rvt": method_rvt,
**kwargs,
}
# Get arguments to be passed to cleaning and peak finding functions
kwargs_cleaning, report_info = get_kwargs(report_info, rsp_clean)
kwargs_peaks, report_info = get_kwargs(report_info, rsp_peaks)
kwargs_rvt, report_info = get_kwargs(report_info, rsp_rvt)
# Save keyword arguments in dictionary
report_info["kwargs_cleaning"] = kwargs_cleaning
report_info["kwargs_peaks"] = kwargs_peaks
report_info["kwargs_rvt"] = kwargs_rvt
# Initialize refs list with NeuroKit2 reference
refs = ["""Makowski, D., Pham, T., Lau, Z. J., Brammer, J. C., Lespinasse, F., Pham, H.,
Schölzel, C., & Chen, S. A. (2021). NeuroKit2: A Python toolbox for neurophysiological signal processing.
Behavior Research Methods, 53(4), 1689–1696. https://doi.org/10.3758/s13428-020-01516-y
"""]
# 1. Cleaning
# ------------
report_info["text_cleaning"] = f"The raw signal, sampled at {sampling_rate} Hz,"
if method_cleaning in ["khodadad", "khodadad2018"]:
report_info["text_cleaning"] += (
" was preprocessed using a second order 0.05-3 Hz bandpass Butterworth filter."
)
elif method_cleaning in ["hampel", "power", "power2020"]:
report_info["text_cleaning"] += (
" was preprocessed using a median-based Hampel filter by replacing values which"
+ f' are {report_info.get("threshold", 3)} median absolute deviation away from the rolling median;'
+ "following Power et al. 2020."
)
refs.append(
"""Power, J., Lynch, C., Dubin, M., Silver, B., Martin, A., Jones, R.,(2020)
Characteristics of respiratory measures in young adults scanned at rest,
including systematic changes and “missed” deep breaths.
NeuroImage, Volume 204, 116234"""
)
elif method_cleaning in ["biosppy"]:
report_info["text_cleaning"] += (
" was preprocessed using a second order 0.1-0.35 Hz bandpass "
+ "Butterworth filter followed by a constant detrending."
)
elif method_cleaning in ["none"]:
report_info[
"text_cleaning"
] += " was directly used for peak detection without preprocessing."
else:
# just in case more methods are added
report_info["text_cleaning"] += f" was cleaned following the {method} method."
# 2. Peaks
# ----------
if method_peaks in ["khodadad", "khodadad2018"]:
report_info[
"text_peaks"
] = "The peak detection was carried out using the method described in Khoadadad et al. (2018)."
refs.append(
"""Khodadad, D., Nordebo, S., Müller, B., Waldmann, A., Yerworth, R., Becher, T., ... & Bayford, R. (2018).
Optimized breath detection algorithm in electrical impedance tomography.
Physiological measurement, 39(9), 094001."""
)
elif method_peaks in ["biosppy"]:
report_info[
"text_peaks"
] = "The peak detection was carried out using the method provided by the Python library BioSPpy (/signals/resp.py)."
elif method_peaks in ["scipy"]:
report_info[
"text_peaks"
] = "The peak detection was carried out using the method provided by the Python library SciPy (signal.find_peaks)."
elif method_peaks in ["none"]:
report_info["text_peaks"] = "There was no peak detection carried out."
else:
report_info[
"text_peaks"
] = f"The peak detection was carried out using the method {method_peaks}."
# 3. RVT
# ----------
if method_rvt in ["harrison", "harrison2021"]:
report_info[
"text_rvt"
] = "The respiratory volume per time computation was carried out using the method described in Harrison et al. (2021)."
refs.append(
"""Harrison, S. J., Bianchi, S., Heinzle, J., Stephan, K. E., Iglesias, S., & Kasper, L. (2021).
A Hilbert-based method for processing respiratory timeseries.
Neuroimage, 230, 117787."""
)
elif method_rvt in ["birn", "birn2006"]:
report_info[
"text_rvt"
] = "The respiratory volume per time computation was carried out using the method described in Birn et al. (2006)."
refs.append(
"""Birn, R. M., Diamond, J. B., Smith, M. A., & Bandettini, P. A. (2006).
Separating respiratory-variation-related fluctuations from neuronal-activity-related fluctuations in
fMRI. Neuroimage, 31(4), 1536-1548."""
)
elif method_rvt in ["power", "power2020"]:
report_info[
"text_rvt"
] = "The respiratory volume per time computation was carried out using the method described in Power at al. (2020)."
refs.append(
"""Power, J. D., Lynch, C. J., Dubin, M. J., Silver, B. M., Martin, A., & Jones, R. M. (2020).
Characteristics of respiratory measures in young adults scanned at rest, including systematic
changes and "missed" deep breaths. Neuroimage, 204, 116234."""
)
elif method_rvt in ["none"]:
report_info["text_rvt"] = "Respiratory volume per time was not computed."
else:
report_info[
"text_rvt"
] = f"The respiratory volume per time computation was carried out using the method described in {method_rvt}."
report_info["references"] = list(np.unique(refs))
return report_info