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