Spaces:
Sleeping
Sleeping
Upload 633 files
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +94 -0
- Dockerfile +18 -0
- NeuroKit/mcp_output/README_MCP.md +52 -0
- NeuroKit/mcp_output/analysis.json +1327 -0
- NeuroKit/mcp_output/diff_report.md +63 -0
- NeuroKit/mcp_output/mcp_plugin/__init__.py +0 -0
- NeuroKit/mcp_output/mcp_plugin/adapter.py +355 -0
- NeuroKit/mcp_output/mcp_plugin/main.py +13 -0
- NeuroKit/mcp_output/mcp_plugin/mcp_service.py +76 -0
- NeuroKit/mcp_output/requirements.txt +10 -0
- NeuroKit/mcp_output/start_mcp.py +30 -0
- NeuroKit/mcp_output/workflow_summary.json +215 -0
- NeuroKit/source/.DS_Store +0 -0
- NeuroKit/source/.binder/requirements.txt +6 -0
- NeuroKit/source/.coveragerc +7 -0
- NeuroKit/source/.editorconfig +21 -0
- NeuroKit/source/AUTHORS.rst +65 -0
- NeuroKit/source/CITATION.cff +46 -0
- NeuroKit/source/LICENSE +22 -0
- NeuroKit/source/MANIFEST.in +12 -0
- NeuroKit/source/NEWS.rst +235 -0
- NeuroKit/source/Pipfile +30 -0
- NeuroKit/source/README.rst +636 -0
- NeuroKit/source/__init__.py +4 -0
- NeuroKit/source/codecov.yml +11 -0
- NeuroKit/source/data/README.rst +5 -0
- NeuroKit/source/data/acqnowledge.acq +3 -0
- NeuroKit/source/data/bio_eventrelated_100hz.csv +0 -0
- NeuroKit/source/data/bio_resting_5min_100hz.csv +0 -0
- NeuroKit/source/data/bio_resting_8min_100hz.csv +0 -0
- NeuroKit/source/data/bio_resting_8min_200hz.json +3 -0
- NeuroKit/source/data/ecg_1000hz.csv +0 -0
- NeuroKit/source/data/ecg_3000hz.csv +0 -0
- NeuroKit/source/data/eeg.txt +4097 -0
- NeuroKit/source/data/eeg_1min_200hz.pickle +3 -0
- NeuroKit/source/data/eeg_1min_200hz.py +20 -0
- NeuroKit/source/data/eeg_resting_8min.py +45 -0
- NeuroKit/source/data/eeg_resting_8min_300hz.fif +3 -0
- NeuroKit/source/data/eog_100hz.csv +0 -0
- NeuroKit/source/data/eog_200hz.csv +0 -0
- NeuroKit/source/data/eogdb/README.md +1 -0
- NeuroKit/source/data/fantasia/download_fantasia.py +67 -0
- NeuroKit/source/data/gudb/download_gudb.py +61 -0
- NeuroKit/source/data/labstreaminglayer.xdf +3 -0
- NeuroKit/source/data/lemon/download_lemon.py +89 -0
- NeuroKit/source/data/ludb/download_ludb.py +53 -0
- NeuroKit/source/data/mit_arrhythmia/download_mit_arrhythmia.py +86 -0
- NeuroKit/source/data/mit_long-term/Rpeaks.csv +0 -0
- NeuroKit/source/data/mit_long-term/download_mit_long-term.py +65 -0
- NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14046.atr +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,97 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
NeuroKit/source/data/acqnowledge.acq filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
NeuroKit/source/data/bio_resting_8min_200hz.json filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
NeuroKit/source/data/eeg_resting_8min_300hz.fif filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
NeuroKit/source/data/labstreaminglayer.xdf filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14046.atr filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14046.dat filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14134.dat filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14149.atr filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14149.dat filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14157.atr filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14157.dat filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14172.atr filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14172.dat filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14184.atr filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14184.dat filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/15814.atr filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/15814.dat filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
NeuroKit/source/data/rsp_1000hz.txt filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
NeuroKit/source/docs/examples/ecg_generate_12leads/3D.png filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
NeuroKit/source/docs/img/banner.psd filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
NeuroKit/source/docs/img/bell2019.jpg filter=lfs diff=lfs merge=lfs -text
|
| 57 |
+
NeuroKit/source/docs/img/cole2019.png filter=lfs diff=lfs merge=lfs -text
|
| 58 |
+
NeuroKit/source/docs/img/complexity.png filter=lfs diff=lfs merge=lfs -text
|
| 59 |
+
NeuroKit/source/docs/img/cuestafrau2019.png filter=lfs diff=lfs merge=lfs -text
|
| 60 |
+
NeuroKit/source/docs/img/dimensions.png filter=lfs diff=lfs merge=lfs -text
|
| 61 |
+
NeuroKit/source/docs/img/douglas2022a.png filter=lfs diff=lfs merge=lfs -text
|
| 62 |
+
NeuroKit/source/docs/img/douglas2022c.png filter=lfs diff=lfs merge=lfs -text
|
| 63 |
+
NeuroKit/source/docs/img/fix_typo.gif filter=lfs diff=lfs merge=lfs -text
|
| 64 |
+
NeuroKit/source/docs/img/github_preview.psd filter=lfs diff=lfs merge=lfs -text
|
| 65 |
+
NeuroKit/source/docs/img/hjorth1970.png filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
NeuroKit/source/docs/img/icon.ai filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
NeuroKit/source/docs/img/logo.ai filter=lfs diff=lfs merge=lfs -text
|
| 68 |
+
NeuroKit/source/docs/img/logo.png filter=lfs diff=lfs merge=lfs -text
|
| 69 |
+
NeuroKit/source/docs/img/neurokit.png filter=lfs diff=lfs merge=lfs -text
|
| 70 |
+
NeuroKit/source/docs/img/pr.png filter=lfs diff=lfs merge=lfs -text
|
| 71 |
+
NeuroKit/source/docs/img/rohila2019.png filter=lfs diff=lfs merge=lfs -text
|
| 72 |
+
NeuroKit/source/docs/img/text.ai filter=lfs diff=lfs merge=lfs -text
|
| 73 |
+
NeuroKit/source/docs/img/timedelay.gif filter=lfs diff=lfs merge=lfs -text
|
| 74 |
+
NeuroKit/source/docs/img/wu2013b.png filter=lfs diff=lfs merge=lfs -text
|
| 75 |
+
NeuroKit/source/docs/readme/features.png filter=lfs diff=lfs merge=lfs -text
|
| 76 |
+
NeuroKit/source/docs/readme/README_complexity_optimize.png filter=lfs diff=lfs merge=lfs -text
|
| 77 |
+
NeuroKit/source/docs/readme/README_decomposition.png filter=lfs diff=lfs merge=lfs -text
|
| 78 |
+
NeuroKit/source/docs/readme/README_delineate.png filter=lfs diff=lfs merge=lfs -text
|
| 79 |
+
NeuroKit/source/docs/readme/README_ecg.png filter=lfs diff=lfs merge=lfs -text
|
| 80 |
+
NeuroKit/source/docs/readme/README_eda.png filter=lfs diff=lfs merge=lfs -text
|
| 81 |
+
NeuroKit/source/docs/readme/README_embedding.png filter=lfs diff=lfs merge=lfs -text
|
| 82 |
+
NeuroKit/source/docs/readme/README_emg.png filter=lfs diff=lfs merge=lfs -text
|
| 83 |
+
NeuroKit/source/docs/readme/README_eog.png filter=lfs diff=lfs merge=lfs -text
|
| 84 |
+
NeuroKit/source/docs/readme/README_hrv.png filter=lfs diff=lfs merge=lfs -text
|
| 85 |
+
NeuroKit/source/docs/readme/README_popularity.png filter=lfs diff=lfs merge=lfs -text
|
| 86 |
+
NeuroKit/source/docs/readme/README_ppg.png filter=lfs diff=lfs merge=lfs -text
|
| 87 |
+
NeuroKit/source/docs/readme/README_psd.png filter=lfs diff=lfs merge=lfs -text
|
| 88 |
+
NeuroKit/source/docs/readme/README_rsp.png filter=lfs diff=lfs merge=lfs -text
|
| 89 |
+
NeuroKit/source/docs/readme/README_signalprocessing.png filter=lfs diff=lfs merge=lfs -text
|
| 90 |
+
NeuroKit/source/docs/readme/README_simulation.png filter=lfs diff=lfs merge=lfs -text
|
| 91 |
+
NeuroKit/source/paper/makowski2021neurokit.pdf filter=lfs diff=lfs merge=lfs -text
|
| 92 |
+
NeuroKit/source/paper/OHBM2022/OHBM2022_Makowski.pptx filter=lfs diff=lfs merge=lfs -text
|
| 93 |
+
NeuroKit/source/studies/complexity_eeg/data_attractor2Danim.csv filter=lfs diff=lfs merge=lfs -text
|
| 94 |
+
NeuroKit/source/studies/complexity_eeg/figures/attractor.gif filter=lfs diff=lfs merge=lfs -text
|
| 95 |
+
NeuroKit/source/studies/complexity_eeg/figures/attractors2D.png filter=lfs diff=lfs merge=lfs -text
|
| 96 |
+
NeuroKit/source/studies/complexity_eeg/figures/delay_perchannel-1.png filter=lfs diff=lfs merge=lfs -text
|
| 97 |
+
NeuroKit/source/studies/complexity_eeg/figures/delay_persubject-1.png filter=lfs diff=lfs merge=lfs -text
|
| 98 |
+
NeuroKit/source/studies/complexity_eeg/figures/dim_perchannel-1.png filter=lfs diff=lfs merge=lfs -text
|
| 99 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-11-1.png filter=lfs diff=lfs merge=lfs -text
|
| 100 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-12-1.png filter=lfs diff=lfs merge=lfs -text
|
| 101 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-12-2.png filter=lfs diff=lfs merge=lfs -text
|
| 102 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-12-3.png filter=lfs diff=lfs merge=lfs -text
|
| 103 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-12-4.png filter=lfs diff=lfs merge=lfs -text
|
| 104 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-12-5.png filter=lfs diff=lfs merge=lfs -text
|
| 105 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-7-1.png filter=lfs diff=lfs merge=lfs -text
|
| 106 |
+
NeuroKit/source/studies/complexity_eeg/figures/unnamed-chunk-8-1.png filter=lfs diff=lfs merge=lfs -text
|
| 107 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-10-1.png filter=lfs diff=lfs merge=lfs -text
|
| 108 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-11-1.png filter=lfs diff=lfs merge=lfs -text
|
| 109 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-15-1.png filter=lfs diff=lfs merge=lfs -text
|
| 110 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-6-1.png filter=lfs diff=lfs merge=lfs -text
|
| 111 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-7-1.png filter=lfs diff=lfs merge=lfs -text
|
| 112 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-8-1.png filter=lfs diff=lfs merge=lfs -text
|
| 113 |
+
NeuroKit/source/studies/ecg_benchmark/figures/unnamed-chunk-9-1.png filter=lfs diff=lfs merge=lfs -text
|
| 114 |
+
NeuroKit/source/studies/eog_blinktemplate/figures/fig2.png filter=lfs diff=lfs merge=lfs -text
|
| 115 |
+
NeuroKit/source/studies/eog_blinktemplate/figures/fig4.png filter=lfs diff=lfs merge=lfs -text
|
| 116 |
+
NeuroKit/source/studies/eog_blinktemplate/figures/fig5.png filter=lfs diff=lfs merge=lfs -text
|
| 117 |
+
NeuroKit/source/studies/erp_gam/figures/fig1.png filter=lfs diff=lfs merge=lfs -text
|
| 118 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-10-1.png filter=lfs diff=lfs merge=lfs -text
|
| 119 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-11-1.png filter=lfs diff=lfs merge=lfs -text
|
| 120 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-12-1.png filter=lfs diff=lfs merge=lfs -text
|
| 121 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-13-1.png filter=lfs diff=lfs merge=lfs -text
|
| 122 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-14-1.png filter=lfs diff=lfs merge=lfs -text
|
| 123 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-15-1.png filter=lfs diff=lfs merge=lfs -text
|
| 124 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-16-1.png filter=lfs diff=lfs merge=lfs -text
|
| 125 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-5-1.png filter=lfs diff=lfs merge=lfs -text
|
| 126 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-6-1.png filter=lfs diff=lfs merge=lfs -text
|
| 127 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-7-1.png filter=lfs diff=lfs merge=lfs -text
|
| 128 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-8-1.png filter=lfs diff=lfs merge=lfs -text
|
| 129 |
+
NeuroKit/source/studies/erp_gam/figures/unnamed-chunk-9-1.png filter=lfs diff=lfs merge=lfs -text
|
Dockerfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.10
|
| 2 |
+
|
| 3 |
+
RUN useradd -m -u 1000 user && python -m pip install --upgrade pip
|
| 4 |
+
USER user
|
| 5 |
+
ENV PATH="/home/user/.local/bin:$PATH"
|
| 6 |
+
|
| 7 |
+
WORKDIR /app
|
| 8 |
+
|
| 9 |
+
COPY --chown=user ./requirements.txt requirements.txt
|
| 10 |
+
RUN pip install --no-cache-dir --upgrade -r requirements.txt
|
| 11 |
+
|
| 12 |
+
COPY --chown=user . /app
|
| 13 |
+
ENV MCP_TRANSPORT=http
|
| 14 |
+
ENV MCP_PORT=7860
|
| 15 |
+
|
| 16 |
+
EXPOSE 7860
|
| 17 |
+
|
| 18 |
+
CMD ["python", "NeuroKit/mcp_output/start_mcp.py"]
|
NeuroKit/mcp_output/README_MCP.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NeuroKit2: A Comprehensive Toolbox for Neurophysiological Signal Processing
|
| 2 |
+
|
| 3 |
+
## Project Introduction
|
| 4 |
+
|
| 5 |
+
NeuroKit2 is a Python toolbox designed to facilitate the processing and analysis of neurophysiological signals. It provides researchers and clinicians with user-friendly access to advanced biosignal processing routines, enabling the analysis of physiological data with minimal coding requirements. The toolbox supports a wide range of signals including ECG, PPG, RSP, EDA, EMG, EOG, and EEG, offering functionalities for signal cleaning, peak detection, feature extraction, and more.
|
| 6 |
+
|
| 7 |
+
## Installation Method
|
| 8 |
+
|
| 9 |
+
To install NeuroKit2, ensure you have Python installed and use the following pip command:
|
| 10 |
+
|
| 11 |
+
pip install neurokit2
|
| 12 |
+
|
| 13 |
+
NeuroKit2 requires the following dependencies:
|
| 14 |
+
- Required: numpy, scipy, pandas, matplotlib, mne, biosppy
|
| 15 |
+
- Optional: seaborn, plotly
|
| 16 |
+
|
| 17 |
+
## Quick Start
|
| 18 |
+
|
| 19 |
+
Here's a basic example to get you started with NeuroKit2:
|
| 20 |
+
|
| 21 |
+
import neurokit2 as nk
|
| 22 |
+
|
| 23 |
+
# Download example data
|
| 24 |
+
data = nk.data("bio_eventrelated_100hz")
|
| 25 |
+
|
| 26 |
+
# Preprocess the data (filter, find peaks, etc.)
|
| 27 |
+
processed_data, info = nk.bio_process(ecg=data["ECG"], rsp=data["RSP"], eda=data["EDA"], sampling_rate=100)
|
| 28 |
+
|
| 29 |
+
# Compute relevant features
|
| 30 |
+
results = nk.bio_analyze(processed_data, sampling_rate=100)
|
| 31 |
+
|
| 32 |
+
## Available Tools and Endpoints List
|
| 33 |
+
|
| 34 |
+
NeuroKit2 offers a variety of tools and endpoints for signal processing and analysis:
|
| 35 |
+
|
| 36 |
+
- **ECG Analysis**: Functions for analyzing ECG signals, including `ecg_analyze`.
|
| 37 |
+
- **EDA Analysis**: Functions for analyzing EDA signals, including `eda_analyze`.
|
| 38 |
+
- **EEG Power Analysis**: Functions for EEG power analysis, including `eeg_power`.
|
| 39 |
+
- **PPG Analysis**: Functions for analyzing PPG signals, including `ppg_analyze`.
|
| 40 |
+
- **RSP Analysis**: Functions for analyzing respiratory signals, including `rsp_analyze`.
|
| 41 |
+
- **Complexity Analysis**: Functions for calculating signal complexity, including `complexity`.
|
| 42 |
+
- **Benchmarking**: Functions related to benchmarking ECG data, including `benchmark_ecg`.
|
| 43 |
+
|
| 44 |
+
## Common Issues and Notes
|
| 45 |
+
|
| 46 |
+
- Ensure all required dependencies are installed to avoid import errors.
|
| 47 |
+
- For optimal performance, consider using a virtual environment to manage dependencies.
|
| 48 |
+
- If you encounter issues with specific functions, refer to the official documentation for troubleshooting tips.
|
| 49 |
+
|
| 50 |
+
## Reference Links or Documentation
|
| 51 |
+
|
| 52 |
+
For more detailed information, visit the [NeuroKit2 GitHub repository](https://github.com/neuropsychology/NeuroKit) and refer to the official documentation available there. You can also find additional resources and examples to help you make the most of NeuroKit2's capabilities.
|
NeuroKit/mcp_output/analysis.json
ADDED
|
@@ -0,0 +1,1327 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"summary": {
|
| 3 |
+
"repository_url": "https://github.com/neuropsychology/NeuroKit",
|
| 4 |
+
"summary": "Imported via zip fallback, file count: 387",
|
| 5 |
+
"file_tree": {
|
| 6 |
+
".binder/requirements.txt": {
|
| 7 |
+
"size": 53
|
| 8 |
+
},
|
| 9 |
+
".github/CODE_OF_CONDUCT.md": {
|
| 10 |
+
"size": 3196
|
| 11 |
+
},
|
| 12 |
+
".github/FUNDING.yml": {
|
| 13 |
+
"size": 653
|
| 14 |
+
},
|
| 15 |
+
".github/ISSUE_TEMPLATE/bug_report.md": {
|
| 16 |
+
"size": 1085
|
| 17 |
+
},
|
| 18 |
+
".github/ISSUE_TEMPLATE/feature-idea.md": {
|
| 19 |
+
"size": 247
|
| 20 |
+
},
|
| 21 |
+
".github/ISSUE_TEMPLATE/question.md": {
|
| 22 |
+
"size": 90
|
| 23 |
+
},
|
| 24 |
+
".github/PULL_REQUEST_TEMPLATE.md": {
|
| 25 |
+
"size": 994
|
| 26 |
+
},
|
| 27 |
+
".github/config.yml": {
|
| 28 |
+
"size": 1553
|
| 29 |
+
},
|
| 30 |
+
".github/release-drafter-config.yml": {
|
| 31 |
+
"size": 413
|
| 32 |
+
},
|
| 33 |
+
".github/stale.yml": {
|
| 34 |
+
"size": 809
|
| 35 |
+
},
|
| 36 |
+
".github/workflows/checks.yml": {
|
| 37 |
+
"size": 932
|
| 38 |
+
},
|
| 39 |
+
".github/workflows/codeql-analysis.yml": {
|
| 40 |
+
"size": 2623
|
| 41 |
+
},
|
| 42 |
+
".github/workflows/docs-build.yml": {
|
| 43 |
+
"size": 1913
|
| 44 |
+
},
|
| 45 |
+
".github/workflows/docs-check.yml": {
|
| 46 |
+
"size": 1614
|
| 47 |
+
},
|
| 48 |
+
".github/workflows/release-drafter.yml": {
|
| 49 |
+
"size": 566
|
| 50 |
+
},
|
| 51 |
+
".github/workflows/releasePR.yml": {
|
| 52 |
+
"size": 2537
|
| 53 |
+
},
|
| 54 |
+
".github/workflows/style.yml": {
|
| 55 |
+
"size": 2984
|
| 56 |
+
},
|
| 57 |
+
".github/workflows/tests.yml": {
|
| 58 |
+
"size": 1275
|
| 59 |
+
},
|
| 60 |
+
"codecov.yml": {
|
| 61 |
+
"size": 229
|
| 62 |
+
},
|
| 63 |
+
"data/bio_resting_8min_200hz.json": {
|
| 64 |
+
"size": 524313
|
| 65 |
+
},
|
| 66 |
+
"data/eeg.txt": {
|
| 67 |
+
"size": 16116
|
| 68 |
+
},
|
| 69 |
+
"data/eeg_1min_200hz.py": {
|
| 70 |
+
"size": 445
|
| 71 |
+
},
|
| 72 |
+
"data/eeg_resting_8min.py": {
|
| 73 |
+
"size": 1318
|
| 74 |
+
},
|
| 75 |
+
"data/eogdb/README.md": {
|
| 76 |
+
"size": 74
|
| 77 |
+
},
|
| 78 |
+
"data/fantasia/download_fantasia.py": {
|
| 79 |
+
"size": 2485
|
| 80 |
+
},
|
| 81 |
+
"data/gudb/download_gudb.py": {
|
| 82 |
+
"size": 2107
|
| 83 |
+
},
|
| 84 |
+
"data/lemon/download_lemon.py": {
|
| 85 |
+
"size": 2705
|
| 86 |
+
},
|
| 87 |
+
"data/ludb/download_ludb.py": {
|
| 88 |
+
"size": 1843
|
| 89 |
+
},
|
| 90 |
+
"data/mit_arrhythmia/download_mit_arrhythmia.py": {
|
| 91 |
+
"size": 3016
|
| 92 |
+
},
|
| 93 |
+
"data/mit_long-term/download_mit_long-term.py": {
|
| 94 |
+
"size": 1993
|
| 95 |
+
},
|
| 96 |
+
"data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/SHA256SUMS.txt": {
|
| 97 |
+
"size": 2781
|
| 98 |
+
},
|
| 99 |
+
"data/mit_normal/download_mit_normal.py": {
|
| 100 |
+
"size": 2009
|
| 101 |
+
},
|
| 102 |
+
"data/mit_nst/download_mit_nst.py": {
|
| 103 |
+
"size": 2000
|
| 104 |
+
},
|
| 105 |
+
"data/ptb_xl/download_ptbxl.py": {
|
| 106 |
+
"size": 118
|
| 107 |
+
},
|
| 108 |
+
"data/rs_eeg_texas/README.md": {
|
| 109 |
+
"size": 1157
|
| 110 |
+
},
|
| 111 |
+
"data/rsp_1000hz.txt": {
|
| 112 |
+
"size": 524313
|
| 113 |
+
},
|
| 114 |
+
"data/srm_restingstate_eeg/download_script.py": {
|
| 115 |
+
"size": 1101
|
| 116 |
+
},
|
| 117 |
+
"data/testretest_restingstate_eeg/download_script.py": {
|
| 118 |
+
"size": 2061
|
| 119 |
+
},
|
| 120 |
+
"docs/conf.py": {
|
| 121 |
+
"size": 5016
|
| 122 |
+
},
|
| 123 |
+
"docs/directives/csv_codebook_directive.py": {
|
| 124 |
+
"size": 3164
|
| 125 |
+
},
|
| 126 |
+
"docs/readme/README_examples.py": {
|
| 127 |
+
"size": 11820
|
| 128 |
+
},
|
| 129 |
+
"neurokit2/__init__.py": {
|
| 130 |
+
"size": 3108
|
| 131 |
+
},
|
| 132 |
+
"neurokit2/benchmark/__init__.py": {
|
| 133 |
+
"size": 137
|
| 134 |
+
},
|
| 135 |
+
"neurokit2/benchmark/benchmark_ecg.py": {
|
| 136 |
+
"size": 5347
|
| 137 |
+
},
|
| 138 |
+
"neurokit2/benchmark/benchmark_utils.py": {
|
| 139 |
+
"size": 2161
|
| 140 |
+
},
|
| 141 |
+
"neurokit2/bio/__init__.py": {
|
| 142 |
+
"size": 148
|
| 143 |
+
},
|
| 144 |
+
"neurokit2/bio/bio_analyze.py": {
|
| 145 |
+
"size": 11712
|
| 146 |
+
},
|
| 147 |
+
"neurokit2/bio/bio_process.py": {
|
| 148 |
+
"size": 7900
|
| 149 |
+
},
|
| 150 |
+
"neurokit2/complexity/TODO_entropy_wiener.py": {
|
| 151 |
+
"size": 3002
|
| 152 |
+
},
|
| 153 |
+
"neurokit2/complexity/TODO_fractal_capacity.py": {
|
| 154 |
+
"size": 3403
|
| 155 |
+
},
|
| 156 |
+
"neurokit2/complexity/__init__.py": {
|
| 157 |
+
"size": 7528
|
| 158 |
+
},
|
| 159 |
+
"neurokit2/complexity/complexity.py": {
|
| 160 |
+
"size": 8255
|
| 161 |
+
},
|
| 162 |
+
"neurokit2/complexity/complexity_decorrelation.py": {
|
| 163 |
+
"size": 3030
|
| 164 |
+
},
|
| 165 |
+
"neurokit2/complexity/complexity_hjorth.py": {
|
| 166 |
+
"size": 3457
|
| 167 |
+
},
|
| 168 |
+
"neurokit2/complexity/complexity_lempelziv.py": {
|
| 169 |
+
"size": 8843
|
| 170 |
+
},
|
| 171 |
+
"neurokit2/complexity/complexity_lyapunov.py": {
|
| 172 |
+
"size": 17196
|
| 173 |
+
},
|
| 174 |
+
"neurokit2/complexity/complexity_relativeroughness.py": {
|
| 175 |
+
"size": 1865
|
| 176 |
+
},
|
| 177 |
+
"neurokit2/complexity/complexity_rqa.py": {
|
| 178 |
+
"size": 12320
|
| 179 |
+
},
|
| 180 |
+
"neurokit2/complexity/entropy_angular.py": {
|
| 181 |
+
"size": 5376
|
| 182 |
+
},
|
| 183 |
+
"neurokit2/complexity/entropy_approximate.py": {
|
| 184 |
+
"size": 5131
|
| 185 |
+
},
|
| 186 |
+
"neurokit2/complexity/entropy_attention.py": {
|
| 187 |
+
"size": 5187
|
| 188 |
+
},
|
| 189 |
+
"neurokit2/complexity/entropy_bubble.py": {
|
| 190 |
+
"size": 2990
|
| 191 |
+
},
|
| 192 |
+
"neurokit2/complexity/entropy_coalition.py": {
|
| 193 |
+
"size": 6380
|
| 194 |
+
},
|
| 195 |
+
"neurokit2/complexity/entropy_cosinesimilarity.py": {
|
| 196 |
+
"size": 4292
|
| 197 |
+
},
|
| 198 |
+
"neurokit2/complexity/entropy_cumulativeresidual.py": {
|
| 199 |
+
"size": 3365
|
| 200 |
+
},
|
| 201 |
+
"neurokit2/complexity/entropy_differential.py": {
|
| 202 |
+
"size": 2600
|
| 203 |
+
},
|
| 204 |
+
"neurokit2/complexity/entropy_dispersion.py": {
|
| 205 |
+
"size": 4292
|
| 206 |
+
},
|
| 207 |
+
"neurokit2/complexity/entropy_distribution.py": {
|
| 208 |
+
"size": 3817
|
| 209 |
+
},
|
| 210 |
+
"neurokit2/complexity/entropy_fuzzy.py": {
|
| 211 |
+
"size": 3166
|
| 212 |
+
},
|
| 213 |
+
"neurokit2/complexity/entropy_grid.py": {
|
| 214 |
+
"size": 4579
|
| 215 |
+
},
|
| 216 |
+
"neurokit2/complexity/entropy_hierarchical.py": {
|
| 217 |
+
"size": 7284
|
| 218 |
+
},
|
| 219 |
+
"neurokit2/complexity/entropy_increment.py": {
|
| 220 |
+
"size": 5168
|
| 221 |
+
},
|
| 222 |
+
"neurokit2/complexity/entropy_kl.py": {
|
| 223 |
+
"size": 4914
|
| 224 |
+
},
|
| 225 |
+
"neurokit2/complexity/entropy_kolmogorov.py": {
|
| 226 |
+
"size": 3190
|
| 227 |
+
},
|
| 228 |
+
"neurokit2/complexity/entropy_maximum.py": {
|
| 229 |
+
"size": 1037
|
| 230 |
+
},
|
| 231 |
+
"neurokit2/complexity/entropy_multiscale.py": {
|
| 232 |
+
"size": 17111
|
| 233 |
+
},
|
| 234 |
+
"neurokit2/complexity/entropy_ofentropy.py": {
|
| 235 |
+
"size": 3216
|
| 236 |
+
},
|
| 237 |
+
"neurokit2/complexity/entropy_permutation.py": {
|
| 238 |
+
"size": 7190
|
| 239 |
+
},
|
| 240 |
+
"neurokit2/complexity/entropy_phase.py": {
|
| 241 |
+
"size": 5032
|
| 242 |
+
},
|
| 243 |
+
"neurokit2/complexity/entropy_power.py": {
|
| 244 |
+
"size": 3166
|
| 245 |
+
},
|
| 246 |
+
"neurokit2/complexity/entropy_quadratic.py": {
|
| 247 |
+
"size": 2507
|
| 248 |
+
},
|
| 249 |
+
"neurokit2/complexity/entropy_range.py": {
|
| 250 |
+
"size": 4172
|
| 251 |
+
},
|
| 252 |
+
"neurokit2/complexity/entropy_rate.py": {
|
| 253 |
+
"size": 6145
|
| 254 |
+
},
|
| 255 |
+
"neurokit2/complexity/entropy_renyi.py": {
|
| 256 |
+
"size": 2898
|
| 257 |
+
},
|
| 258 |
+
"neurokit2/complexity/entropy_sample.py": {
|
| 259 |
+
"size": 3230
|
| 260 |
+
},
|
| 261 |
+
"neurokit2/complexity/entropy_shannon.py": {
|
| 262 |
+
"size": 4867
|
| 263 |
+
},
|
| 264 |
+
"neurokit2/complexity/entropy_shannon_joint.py": {
|
| 265 |
+
"size": 1440
|
| 266 |
+
},
|
| 267 |
+
"neurokit2/complexity/entropy_slope.py": {
|
| 268 |
+
"size": 3938
|
| 269 |
+
},
|
| 270 |
+
"neurokit2/complexity/entropy_spectral.py": {
|
| 271 |
+
"size": 3496
|
| 272 |
+
},
|
| 273 |
+
"neurokit2/complexity/entropy_svd.py": {
|
| 274 |
+
"size": 2732
|
| 275 |
+
},
|
| 276 |
+
"neurokit2/complexity/entropy_symbolicdynamic.py": {
|
| 277 |
+
"size": 5300
|
| 278 |
+
},
|
| 279 |
+
"neurokit2/complexity/entropy_tsallis.py": {
|
| 280 |
+
"size": 2443
|
| 281 |
+
},
|
| 282 |
+
"neurokit2/complexity/fractal_correlation.py": {
|
| 283 |
+
"size": 6393
|
| 284 |
+
},
|
| 285 |
+
"neurokit2/complexity/fractal_density.py": {
|
| 286 |
+
"size": 5842
|
| 287 |
+
},
|
| 288 |
+
"neurokit2/complexity/fractal_dfa.py": {
|
| 289 |
+
"size": 25243
|
| 290 |
+
},
|
| 291 |
+
"neurokit2/complexity/fractal_higuchi.py": {
|
| 292 |
+
"size": 5361
|
| 293 |
+
},
|
| 294 |
+
"neurokit2/complexity/fractal_hurst.py": {
|
| 295 |
+
"size": 8916
|
| 296 |
+
},
|
| 297 |
+
"neurokit2/complexity/fractal_katz.py": {
|
| 298 |
+
"size": 2915
|
| 299 |
+
},
|
| 300 |
+
"neurokit2/complexity/fractal_linelength.py": {
|
| 301 |
+
"size": 2149
|
| 302 |
+
},
|
| 303 |
+
"neurokit2/complexity/fractal_nld.py": {
|
| 304 |
+
"size": 4552
|
| 305 |
+
},
|
| 306 |
+
"neurokit2/complexity/fractal_petrosian.py": {
|
| 307 |
+
"size": 3975
|
| 308 |
+
},
|
| 309 |
+
"neurokit2/complexity/fractal_psdslope.py": {
|
| 310 |
+
"size": 5904
|
| 311 |
+
},
|
| 312 |
+
"neurokit2/complexity/fractal_sda.py": {
|
| 313 |
+
"size": 5048
|
| 314 |
+
},
|
| 315 |
+
"neurokit2/complexity/fractal_sevcik.py": {
|
| 316 |
+
"size": 2854
|
| 317 |
+
},
|
| 318 |
+
"neurokit2/complexity/fractal_tmf.py": {
|
| 319 |
+
"size": 4893
|
| 320 |
+
},
|
| 321 |
+
"neurokit2/complexity/information_fisher.py": {
|
| 322 |
+
"size": 2660
|
| 323 |
+
},
|
| 324 |
+
"neurokit2/complexity/information_fishershannon.py": {
|
| 325 |
+
"size": 2282
|
| 326 |
+
},
|
| 327 |
+
"neurokit2/complexity/information_gain.py": {
|
| 328 |
+
"size": 4307
|
| 329 |
+
},
|
| 330 |
+
"neurokit2/complexity/information_mutual.py": {
|
| 331 |
+
"size": 8843
|
| 332 |
+
},
|
| 333 |
+
"neurokit2/complexity/optim_complexity_delay.py": {
|
| 334 |
+
"size": 30901
|
| 335 |
+
},
|
| 336 |
+
"neurokit2/complexity/optim_complexity_dimension.py": {
|
| 337 |
+
"size": 18101
|
| 338 |
+
},
|
| 339 |
+
"neurokit2/complexity/optim_complexity_k.py": {
|
| 340 |
+
"size": 6280
|
| 341 |
+
},
|
| 342 |
+
"neurokit2/complexity/optim_complexity_optimize.py": {
|
| 343 |
+
"size": 9977
|
| 344 |
+
},
|
| 345 |
+
"neurokit2/complexity/optim_complexity_tolerance.py": {
|
| 346 |
+
"size": 19280
|
| 347 |
+
},
|
| 348 |
+
"neurokit2/complexity/utils_complexity_attractor.py": {
|
| 349 |
+
"size": 10479
|
| 350 |
+
},
|
| 351 |
+
"neurokit2/complexity/utils_complexity_coarsegraining.py": {
|
| 352 |
+
"size": 9547
|
| 353 |
+
},
|
| 354 |
+
"neurokit2/complexity/utils_complexity_embedding.py": {
|
| 355 |
+
"size": 6158
|
| 356 |
+
},
|
| 357 |
+
"neurokit2/complexity/utils_complexity_ordinalpatterns.py": {
|
| 358 |
+
"size": 3626
|
| 359 |
+
},
|
| 360 |
+
"neurokit2/complexity/utils_complexity_simulate.py": {
|
| 361 |
+
"size": 9912
|
| 362 |
+
},
|
| 363 |
+
"neurokit2/complexity/utils_complexity_symbolize.py": {
|
| 364 |
+
"size": 11763
|
| 365 |
+
},
|
| 366 |
+
"neurokit2/complexity/utils_entropy.py": {
|
| 367 |
+
"size": 5775
|
| 368 |
+
},
|
| 369 |
+
"neurokit2/complexity/utils_fractal_mandelbrot.py": {
|
| 370 |
+
"size": 8324
|
| 371 |
+
},
|
| 372 |
+
"neurokit2/complexity/utils_recurrence_matrix.py": {
|
| 373 |
+
"size": 4884
|
| 374 |
+
},
|
| 375 |
+
"neurokit2/data/__init__.py": {
|
| 376 |
+
"size": 467
|
| 377 |
+
},
|
| 378 |
+
"neurokit2/data/data.py": {
|
| 379 |
+
"size": 7412
|
| 380 |
+
},
|
| 381 |
+
"neurokit2/data/database.py": {
|
| 382 |
+
"size": 3978
|
| 383 |
+
},
|
| 384 |
+
"neurokit2/data/read_acqknowledge.py": {
|
| 385 |
+
"size": 4600
|
| 386 |
+
},
|
| 387 |
+
"neurokit2/data/read_bitalino.py": {
|
| 388 |
+
"size": 4605
|
| 389 |
+
},
|
| 390 |
+
"neurokit2/data/read_video.py": {
|
| 391 |
+
"size": 1541
|
| 392 |
+
},
|
| 393 |
+
"neurokit2/data/read_xdf.py": {
|
| 394 |
+
"size": 6911
|
| 395 |
+
},
|
| 396 |
+
"neurokit2/data/write_csv.py": {
|
| 397 |
+
"size": 1287
|
| 398 |
+
},
|
| 399 |
+
"neurokit2/ecg/__init__.py": {
|
| 400 |
+
"size": 969
|
| 401 |
+
},
|
| 402 |
+
"neurokit2/ecg/ecg_analyze.py": {
|
| 403 |
+
"size": 4548
|
| 404 |
+
},
|
| 405 |
+
"neurokit2/ecg/ecg_clean.py": {
|
| 406 |
+
"size": 14572
|
| 407 |
+
},
|
| 408 |
+
"neurokit2/ecg/ecg_delineate.py": {
|
| 409 |
+
"size": 53079
|
| 410 |
+
},
|
| 411 |
+
"neurokit2/ecg/ecg_eventrelated.py": {
|
| 412 |
+
"size": 5994
|
| 413 |
+
},
|
| 414 |
+
"neurokit2/ecg/ecg_findpeaks.py": {
|
| 415 |
+
"size": 64883
|
| 416 |
+
},
|
| 417 |
+
"neurokit2/ecg/ecg_intervalrelated.py": {
|
| 418 |
+
"size": 4282
|
| 419 |
+
},
|
| 420 |
+
"neurokit2/ecg/ecg_invert.py": {
|
| 421 |
+
"size": 3388
|
| 422 |
+
},
|
| 423 |
+
"neurokit2/ecg/ecg_peaks.py": {
|
| 424 |
+
"size": 17992
|
| 425 |
+
},
|
| 426 |
+
"neurokit2/ecg/ecg_phase.py": {
|
| 427 |
+
"size": 5377
|
| 428 |
+
},
|
| 429 |
+
"neurokit2/ecg/ecg_plot.py": {
|
| 430 |
+
"size": 3360
|
| 431 |
+
},
|
| 432 |
+
"neurokit2/ecg/ecg_process.py": {
|
| 433 |
+
"size": 5507
|
| 434 |
+
},
|
| 435 |
+
"neurokit2/ecg/ecg_quality.py": {
|
| 436 |
+
"size": 15393
|
| 437 |
+
},
|
| 438 |
+
"neurokit2/ecg/ecg_rsp.py": {
|
| 439 |
+
"size": 4614
|
| 440 |
+
},
|
| 441 |
+
"neurokit2/ecg/ecg_segment.py": {
|
| 442 |
+
"size": 5420
|
| 443 |
+
},
|
| 444 |
+
"neurokit2/ecg/ecg_simulate.py": {
|
| 445 |
+
"size": 15548
|
| 446 |
+
},
|
| 447 |
+
"neurokit2/eda/__init__.py": {
|
| 448 |
+
"size": 885
|
| 449 |
+
},
|
| 450 |
+
"neurokit2/eda/eda_analyze.py": {
|
| 451 |
+
"size": 4397
|
| 452 |
+
},
|
| 453 |
+
"neurokit2/eda/eda_autocor.py": {
|
| 454 |
+
"size": 2357
|
| 455 |
+
},
|
| 456 |
+
"neurokit2/eda/eda_changepoints.py": {
|
| 457 |
+
"size": 2404
|
| 458 |
+
},
|
| 459 |
+
"neurokit2/eda/eda_clean.py": {
|
| 460 |
+
"size": 4638
|
| 461 |
+
},
|
| 462 |
+
"neurokit2/eda/eda_eventrelated.py": {
|
| 463 |
+
"size": 6437
|
| 464 |
+
},
|
| 465 |
+
"neurokit2/eda/eda_findpeaks.py": {
|
| 466 |
+
"size": 12988
|
| 467 |
+
},
|
| 468 |
+
"neurokit2/eda/eda_fixpeaks.py": {
|
| 469 |
+
"size": 3002
|
| 470 |
+
},
|
| 471 |
+
"neurokit2/eda/eda_intervalrelated.py": {
|
| 472 |
+
"size": 5499
|
| 473 |
+
},
|
| 474 |
+
"neurokit2/eda/eda_methods.py": {
|
| 475 |
+
"size": 6621
|
| 476 |
+
},
|
| 477 |
+
"neurokit2/eda/eda_peaks.py": {
|
| 478 |
+
"size": 7635
|
| 479 |
+
},
|
| 480 |
+
"neurokit2/eda/eda_phasic.py": {
|
| 481 |
+
"size": 25713
|
| 482 |
+
},
|
| 483 |
+
"neurokit2/eda/eda_plot.py": {
|
| 484 |
+
"size": 10781
|
| 485 |
+
},
|
| 486 |
+
"neurokit2/eda/eda_process.py": {
|
| 487 |
+
"size": 4639
|
| 488 |
+
},
|
| 489 |
+
"neurokit2/eda/eda_simulate.py": {
|
| 490 |
+
"size": 6198
|
| 491 |
+
},
|
| 492 |
+
"neurokit2/eda/eda_sympathetic.py": {
|
| 493 |
+
"size": 7606
|
| 494 |
+
},
|
| 495 |
+
"neurokit2/eeg/__init__.py": {
|
| 496 |
+
"size": 904
|
| 497 |
+
},
|
| 498 |
+
"neurokit2/eeg/eeg_1f.py": {
|
| 499 |
+
"size": 996
|
| 500 |
+
},
|
| 501 |
+
"neurokit2/eeg/eeg_badchannels.py": {
|
| 502 |
+
"size": 4410
|
| 503 |
+
},
|
| 504 |
+
"neurokit2/eeg/eeg_diss.py": {
|
| 505 |
+
"size": 2026
|
| 506 |
+
},
|
| 507 |
+
"neurokit2/eeg/eeg_gfp.py": {
|
| 508 |
+
"size": 4869
|
| 509 |
+
},
|
| 510 |
+
"neurokit2/eeg/eeg_power.py": {
|
| 511 |
+
"size": 3963
|
| 512 |
+
},
|
| 513 |
+
"neurokit2/eeg/eeg_rereference.py": {
|
| 514 |
+
"size": 5622
|
| 515 |
+
},
|
| 516 |
+
"neurokit2/eeg/eeg_simulate.py": {
|
| 517 |
+
"size": 3600
|
| 518 |
+
},
|
| 519 |
+
"neurokit2/eeg/eeg_source.py": {
|
| 520 |
+
"size": 2658
|
| 521 |
+
},
|
| 522 |
+
"neurokit2/eeg/eeg_source_extract.py": {
|
| 523 |
+
"size": 2135
|
| 524 |
+
},
|
| 525 |
+
"neurokit2/eeg/mne_channel_add.py": {
|
| 526 |
+
"size": 3693
|
| 527 |
+
},
|
| 528 |
+
"neurokit2/eeg/mne_channel_extract.py": {
|
| 529 |
+
"size": 3844
|
| 530 |
+
},
|
| 531 |
+
"neurokit2/eeg/mne_crop.py": {
|
| 532 |
+
"size": 4041
|
| 533 |
+
},
|
| 534 |
+
"neurokit2/eeg/mne_data.py": {
|
| 535 |
+
"size": 2308
|
| 536 |
+
},
|
| 537 |
+
"neurokit2/eeg/mne_templateMRI.py": {
|
| 538 |
+
"size": 1277
|
| 539 |
+
},
|
| 540 |
+
"neurokit2/eeg/mne_to_df.py": {
|
| 541 |
+
"size": 4424
|
| 542 |
+
},
|
| 543 |
+
"neurokit2/eeg/utils.py": {
|
| 544 |
+
"size": 874
|
| 545 |
+
},
|
| 546 |
+
"neurokit2/emg/__init__.py": {
|
| 547 |
+
"size": 593
|
| 548 |
+
},
|
| 549 |
+
"neurokit2/emg/emg_activation.py": {
|
| 550 |
+
"size": 15464
|
| 551 |
+
},
|
| 552 |
+
"neurokit2/emg/emg_amplitude.py": {
|
| 553 |
+
"size": 4219
|
| 554 |
+
},
|
| 555 |
+
"neurokit2/emg/emg_analyze.py": {
|
| 556 |
+
"size": 3915
|
| 557 |
+
},
|
| 558 |
+
"neurokit2/emg/emg_clean.py": {
|
| 559 |
+
"size": 3220
|
| 560 |
+
},
|
| 561 |
+
"neurokit2/emg/emg_eventrelated.py": {
|
| 562 |
+
"size": 4711
|
| 563 |
+
},
|
| 564 |
+
"neurokit2/emg/emg_intervalrelated.py": {
|
| 565 |
+
"size": 4382
|
| 566 |
+
},
|
| 567 |
+
"neurokit2/emg/emg_methods.py": {
|
| 568 |
+
"size": 5092
|
| 569 |
+
},
|
| 570 |
+
"neurokit2/emg/emg_plot.py": {
|
| 571 |
+
"size": 7862
|
| 572 |
+
},
|
| 573 |
+
"neurokit2/emg/emg_process.py": {
|
| 574 |
+
"size": 3681
|
| 575 |
+
},
|
| 576 |
+
"neurokit2/emg/emg_simulate.py": {
|
| 577 |
+
"size": 3570
|
| 578 |
+
},
|
| 579 |
+
"neurokit2/eog/__init__.py": {
|
| 580 |
+
"size": 638
|
| 581 |
+
},
|
| 582 |
+
"neurokit2/eog/eog_analyze.py": {
|
| 583 |
+
"size": 3868
|
| 584 |
+
},
|
| 585 |
+
"neurokit2/eog/eog_clean.py": {
|
| 586 |
+
"size": 8170
|
| 587 |
+
},
|
| 588 |
+
"neurokit2/eog/eog_eventrelated.py": {
|
| 589 |
+
"size": 3840
|
| 590 |
+
},
|
| 591 |
+
"neurokit2/eog/eog_features.py": {
|
| 592 |
+
"size": 8542
|
| 593 |
+
},
|
| 594 |
+
"neurokit2/eog/eog_findpeaks.py": {
|
| 595 |
+
"size": 10384
|
| 596 |
+
},
|
| 597 |
+
"neurokit2/eog/eog_intervalrelated.py": {
|
| 598 |
+
"size": 3258
|
| 599 |
+
},
|
| 600 |
+
"neurokit2/eog/eog_peaks.py": {
|
| 601 |
+
"size": 3523
|
| 602 |
+
},
|
| 603 |
+
"neurokit2/eog/eog_plot.py": {
|
| 604 |
+
"size": 4420
|
| 605 |
+
},
|
| 606 |
+
"neurokit2/eog/eog_process.py": {
|
| 607 |
+
"size": 2936
|
| 608 |
+
},
|
| 609 |
+
"neurokit2/eog/eog_simulate.py": {
|
| 610 |
+
"size": 1892
|
| 611 |
+
},
|
| 612 |
+
"neurokit2/epochs/__init__.py": {
|
| 613 |
+
"size": 333
|
| 614 |
+
},
|
| 615 |
+
"neurokit2/epochs/epochs_average.py": {
|
| 616 |
+
"size": 2383
|
| 617 |
+
},
|
| 618 |
+
"neurokit2/epochs/epochs_create.py": {
|
| 619 |
+
"size": 7905
|
| 620 |
+
},
|
| 621 |
+
"neurokit2/epochs/epochs_plot.py": {
|
| 622 |
+
"size": 4862
|
| 623 |
+
},
|
| 624 |
+
"neurokit2/epochs/epochs_to_array.py": {
|
| 625 |
+
"size": 1626
|
| 626 |
+
},
|
| 627 |
+
"neurokit2/epochs/epochs_to_df.py": {
|
| 628 |
+
"size": 1721
|
| 629 |
+
},
|
| 630 |
+
"neurokit2/epochs/eventrelated_utils.py": {
|
| 631 |
+
"size": 4187
|
| 632 |
+
},
|
| 633 |
+
"neurokit2/events/__init__.py": {
|
| 634 |
+
"size": 263
|
| 635 |
+
},
|
| 636 |
+
"neurokit2/events/events_create.py": {
|
| 637 |
+
"size": 1821
|
| 638 |
+
},
|
| 639 |
+
"neurokit2/events/events_find.py": {
|
| 640 |
+
"size": 11091
|
| 641 |
+
},
|
| 642 |
+
"neurokit2/events/events_plot.py": {
|
| 643 |
+
"size": 4002
|
| 644 |
+
},
|
| 645 |
+
"neurokit2/events/events_to_mne.py": {
|
| 646 |
+
"size": 2061
|
| 647 |
+
},
|
| 648 |
+
"neurokit2/hrv/__init__.py": {
|
| 649 |
+
"size": 481
|
| 650 |
+
},
|
| 651 |
+
"neurokit2/hrv/hrv.py": {
|
| 652 |
+
"size": 6318
|
| 653 |
+
},
|
| 654 |
+
"neurokit2/hrv/hrv_frequency.py": {
|
| 655 |
+
"size": 11534
|
| 656 |
+
},
|
| 657 |
+
"neurokit2/hrv/hrv_nonlinear.py": {
|
| 658 |
+
"size": 30173
|
| 659 |
+
},
|
| 660 |
+
"neurokit2/hrv/hrv_rqa.py": {
|
| 661 |
+
"size": 3397
|
| 662 |
+
},
|
| 663 |
+
"neurokit2/hrv/hrv_rsa.py": {
|
| 664 |
+
"size": 23501
|
| 665 |
+
},
|
| 666 |
+
"neurokit2/hrv/hrv_time.py": {
|
| 667 |
+
"size": 14095
|
| 668 |
+
},
|
| 669 |
+
"neurokit2/hrv/hrv_utils.py": {
|
| 670 |
+
"size": 4933
|
| 671 |
+
},
|
| 672 |
+
"neurokit2/hrv/intervals_process.py": {
|
| 673 |
+
"size": 5182
|
| 674 |
+
},
|
| 675 |
+
"neurokit2/hrv/intervals_to_peaks.py": {
|
| 676 |
+
"size": 2911
|
| 677 |
+
},
|
| 678 |
+
"neurokit2/hrv/intervals_utils.py": {
|
| 679 |
+
"size": 7239
|
| 680 |
+
},
|
| 681 |
+
"neurokit2/markov/__init__.py": {
|
| 682 |
+
"size": 600
|
| 683 |
+
},
|
| 684 |
+
"neurokit2/markov/markov_mixingtime.py": {
|
| 685 |
+
"size": 1380
|
| 686 |
+
},
|
| 687 |
+
"neurokit2/markov/markov_simulate.py": {
|
| 688 |
+
"size": 1606
|
| 689 |
+
},
|
| 690 |
+
"neurokit2/markov/markov_test_homogeneity.py": {
|
| 691 |
+
"size": 2506
|
| 692 |
+
},
|
| 693 |
+
"neurokit2/markov/markov_test_markovity.py": {
|
| 694 |
+
"size": 3341
|
| 695 |
+
},
|
| 696 |
+
"neurokit2/markov/markov_test_random.py": {
|
| 697 |
+
"size": 1865
|
| 698 |
+
},
|
| 699 |
+
"neurokit2/markov/markov_test_symmetry.py": {
|
| 700 |
+
"size": 1737
|
| 701 |
+
},
|
| 702 |
+
"neurokit2/markov/transition_matrix.py": {
|
| 703 |
+
"size": 6349
|
| 704 |
+
},
|
| 705 |
+
"neurokit2/microstates/__init__.py": {
|
| 706 |
+
"size": 813
|
| 707 |
+
},
|
| 708 |
+
"neurokit2/microstates/microstates_classify.py": {
|
| 709 |
+
"size": 2460
|
| 710 |
+
},
|
| 711 |
+
"neurokit2/microstates/microstates_clean.py": {
|
| 712 |
+
"size": 3329
|
| 713 |
+
},
|
| 714 |
+
"neurokit2/microstates/microstates_complexity.py": {
|
| 715 |
+
"size": 1692
|
| 716 |
+
},
|
| 717 |
+
"neurokit2/microstates/microstates_dynamic.py": {
|
| 718 |
+
"size": 2081
|
| 719 |
+
},
|
| 720 |
+
"neurokit2/microstates/microstates_findnumber.py": {
|
| 721 |
+
"size": 4713
|
| 722 |
+
},
|
| 723 |
+
"neurokit2/microstates/microstates_peaks.py": {
|
| 724 |
+
"size": 3783
|
| 725 |
+
},
|
| 726 |
+
"neurokit2/microstates/microstates_plot.py": {
|
| 727 |
+
"size": 4161
|
| 728 |
+
},
|
| 729 |
+
"neurokit2/microstates/microstates_segment.py": {
|
| 730 |
+
"size": 11449
|
| 731 |
+
},
|
| 732 |
+
"neurokit2/microstates/microstates_static.py": {
|
| 733 |
+
"size": 6410
|
| 734 |
+
},
|
| 735 |
+
"neurokit2/misc/__init__.py": {
|
| 736 |
+
"size": 1249
|
| 737 |
+
},
|
| 738 |
+
"neurokit2/misc/_warnings.py": {
|
| 739 |
+
"size": 271
|
| 740 |
+
},
|
| 741 |
+
"neurokit2/misc/check_random_state.py": {
|
| 742 |
+
"size": 5552
|
| 743 |
+
},
|
| 744 |
+
"neurokit2/misc/check_type.py": {
|
| 745 |
+
"size": 1198
|
| 746 |
+
},
|
| 747 |
+
"neurokit2/misc/copyfunction.py": {
|
| 748 |
+
"size": 227
|
| 749 |
+
},
|
| 750 |
+
"neurokit2/misc/expspace.py": {
|
| 751 |
+
"size": 1270
|
| 752 |
+
},
|
| 753 |
+
"neurokit2/misc/fig2img.py": {
|
| 754 |
+
"size": 945
|
| 755 |
+
},
|
| 756 |
+
"neurokit2/misc/find_closest.py": {
|
| 757 |
+
"size": 3426
|
| 758 |
+
},
|
| 759 |
+
"neurokit2/misc/find_consecutive.py": {
|
| 760 |
+
"size": 568
|
| 761 |
+
},
|
| 762 |
+
"neurokit2/misc/find_groups.py": {
|
| 763 |
+
"size": 537
|
| 764 |
+
},
|
| 765 |
+
"neurokit2/misc/find_knee.py": {
|
| 766 |
+
"size": 2830
|
| 767 |
+
},
|
| 768 |
+
"neurokit2/misc/find_outliers.py": {
|
| 769 |
+
"size": 4051
|
| 770 |
+
},
|
| 771 |
+
"neurokit2/misc/find_plateau.py": {
|
| 772 |
+
"size": 3005
|
| 773 |
+
},
|
| 774 |
+
"neurokit2/misc/listify.py": {
|
| 775 |
+
"size": 854
|
| 776 |
+
},
|
| 777 |
+
"neurokit2/misc/parallel_run.py": {
|
| 778 |
+
"size": 1501
|
| 779 |
+
},
|
| 780 |
+
"neurokit2/misc/progress_bar.py": {
|
| 781 |
+
"size": 1107
|
| 782 |
+
},
|
| 783 |
+
"neurokit2/misc/replace.py": {
|
| 784 |
+
"size": 932
|
| 785 |
+
},
|
| 786 |
+
"neurokit2/misc/report.py": {
|
| 787 |
+
"size": 7466
|
| 788 |
+
},
|
| 789 |
+
"neurokit2/misc/type_converters.py": {
|
| 790 |
+
"size": 1159
|
| 791 |
+
},
|
| 792 |
+
"neurokit2/ppg/__init__.py": {
|
| 793 |
+
"size": 816
|
| 794 |
+
},
|
| 795 |
+
"neurokit2/ppg/ppg_analyze.py": {
|
| 796 |
+
"size": 4193
|
| 797 |
+
},
|
| 798 |
+
"neurokit2/ppg/ppg_clean.py": {
|
| 799 |
+
"size": 4625
|
| 800 |
+
},
|
| 801 |
+
"neurokit2/ppg/ppg_eventrelated.py": {
|
| 802 |
+
"size": 2862
|
| 803 |
+
},
|
| 804 |
+
"neurokit2/ppg/ppg_findpeaks.py": {
|
| 805 |
+
"size": 18575
|
| 806 |
+
},
|
| 807 |
+
"neurokit2/ppg/ppg_intervalrelated.py": {
|
| 808 |
+
"size": 4151
|
| 809 |
+
},
|
| 810 |
+
"neurokit2/ppg/ppg_methods.py": {
|
| 811 |
+
"size": 8429
|
| 812 |
+
},
|
| 813 |
+
"neurokit2/ppg/ppg_peaks.py": {
|
| 814 |
+
"size": 7654
|
| 815 |
+
},
|
| 816 |
+
"neurokit2/ppg/ppg_plot.py": {
|
| 817 |
+
"size": 5875
|
| 818 |
+
},
|
| 819 |
+
"neurokit2/ppg/ppg_process.py": {
|
| 820 |
+
"size": 4026
|
| 821 |
+
},
|
| 822 |
+
"neurokit2/ppg/ppg_quality.py": {
|
| 823 |
+
"size": 4047
|
| 824 |
+
},
|
| 825 |
+
"neurokit2/ppg/ppg_segment.py": {
|
| 826 |
+
"size": 2598
|
| 827 |
+
},
|
| 828 |
+
"neurokit2/ppg/ppg_simulate.py": {
|
| 829 |
+
"size": 11257
|
| 830 |
+
},
|
| 831 |
+
"neurokit2/rsp/__init__.py": {
|
| 832 |
+
"size": 1099
|
| 833 |
+
},
|
| 834 |
+
"neurokit2/rsp/rsp_amplitude.py": {
|
| 835 |
+
"size": 4573
|
| 836 |
+
},
|
| 837 |
+
"neurokit2/rsp/rsp_analyze.py": {
|
| 838 |
+
"size": 4175
|
| 839 |
+
},
|
| 840 |
+
"neurokit2/rsp/rsp_clean.py": {
|
| 841 |
+
"size": 7445
|
| 842 |
+
},
|
| 843 |
+
"neurokit2/rsp/rsp_eventrelated.py": {
|
| 844 |
+
"size": 7174
|
| 845 |
+
},
|
| 846 |
+
"neurokit2/rsp/rsp_findpeaks.py": {
|
| 847 |
+
"size": 8895
|
| 848 |
+
},
|
| 849 |
+
"neurokit2/rsp/rsp_fixpeaks.py": {
|
| 850 |
+
"size": 2410
|
| 851 |
+
},
|
| 852 |
+
"neurokit2/rsp/rsp_intervalrelated.py": {
|
| 853 |
+
"size": 5865
|
| 854 |
+
},
|
| 855 |
+
"neurokit2/rsp/rsp_methods.py": {
|
| 856 |
+
"size": 8478
|
| 857 |
+
},
|
| 858 |
+
"neurokit2/rsp/rsp_peaks.py": {
|
| 859 |
+
"size": 3310
|
| 860 |
+
},
|
| 861 |
+
"neurokit2/rsp/rsp_phase.py": {
|
| 862 |
+
"size": 2733
|
| 863 |
+
},
|
| 864 |
+
"neurokit2/rsp/rsp_plot.py": {
|
| 865 |
+
"size": 12063
|
| 866 |
+
},
|
| 867 |
+
"neurokit2/rsp/rsp_process.py": {
|
| 868 |
+
"size": 5399
|
| 869 |
+
},
|
| 870 |
+
"neurokit2/rsp/rsp_rate.py": {
|
| 871 |
+
"size": 5683
|
| 872 |
+
},
|
| 873 |
+
"neurokit2/rsp/rsp_rav.py": {
|
| 874 |
+
"size": 2833
|
| 875 |
+
},
|
| 876 |
+
"neurokit2/rsp/rsp_rrv.py": {
|
| 877 |
+
"size": 12074
|
| 878 |
+
},
|
| 879 |
+
"neurokit2/rsp/rsp_rvt.py": {
|
| 880 |
+
"size": 13112
|
| 881 |
+
},
|
| 882 |
+
"neurokit2/rsp/rsp_simulate.py": {
|
| 883 |
+
"size": 14964
|
| 884 |
+
},
|
| 885 |
+
"neurokit2/rsp/rsp_symmetry.py": {
|
| 886 |
+
"size": 6702
|
| 887 |
+
},
|
| 888 |
+
"neurokit2/signal/__init__.py": {
|
| 889 |
+
"size": 2302
|
| 890 |
+
},
|
| 891 |
+
"neurokit2/signal/signal_autocor.py": {
|
| 892 |
+
"size": 4067
|
| 893 |
+
},
|
| 894 |
+
"neurokit2/signal/signal_binarize.py": {
|
| 895 |
+
"size": 3745
|
| 896 |
+
},
|
| 897 |
+
"neurokit2/signal/signal_changepoints.py": {
|
| 898 |
+
"size": 4929
|
| 899 |
+
},
|
| 900 |
+
"neurokit2/signal/signal_cyclesegment.py": {
|
| 901 |
+
"size": 3224
|
| 902 |
+
},
|
| 903 |
+
"neurokit2/signal/signal_decompose.py": {
|
| 904 |
+
"size": 6075
|
| 905 |
+
},
|
| 906 |
+
"neurokit2/signal/signal_detrend.py": {
|
| 907 |
+
"size": 10124
|
| 908 |
+
},
|
| 909 |
+
"neurokit2/signal/signal_distort.py": {
|
| 910 |
+
"size": 10658
|
| 911 |
+
},
|
| 912 |
+
"neurokit2/signal/signal_fillmissing.py": {
|
| 913 |
+
"size": 1075
|
| 914 |
+
},
|
| 915 |
+
"neurokit2/signal/signal_filter.py": {
|
| 916 |
+
"size": 15399
|
| 917 |
+
},
|
| 918 |
+
"neurokit2/signal/signal_findpeaks.py": {
|
| 919 |
+
"size": 7447
|
| 920 |
+
},
|
| 921 |
+
"neurokit2/signal/signal_fixpeaks.py": {
|
| 922 |
+
"size": 24711
|
| 923 |
+
},
|
| 924 |
+
"neurokit2/signal/signal_flatline.py": {
|
| 925 |
+
"size": 978
|
| 926 |
+
},
|
| 927 |
+
"neurokit2/signal/signal_formatpeaks.py": {
|
| 928 |
+
"size": 4331
|
| 929 |
+
},
|
| 930 |
+
"neurokit2/signal/signal_interpolate.py": {
|
| 931 |
+
"size": 8438
|
| 932 |
+
},
|
| 933 |
+
"neurokit2/signal/signal_merge.py": {
|
| 934 |
+
"size": 2770
|
| 935 |
+
},
|
| 936 |
+
"neurokit2/signal/signal_noise.py": {
|
| 937 |
+
"size": 4052
|
| 938 |
+
},
|
| 939 |
+
"neurokit2/signal/signal_period.py": {
|
| 940 |
+
"size": 4293
|
| 941 |
+
},
|
| 942 |
+
"neurokit2/signal/signal_phase.py": {
|
| 943 |
+
"size": 3303
|
| 944 |
+
},
|
| 945 |
+
"neurokit2/signal/signal_plot.py": {
|
| 946 |
+
"size": 6532
|
| 947 |
+
},
|
| 948 |
+
"neurokit2/signal/signal_power.py": {
|
| 949 |
+
"size": 7917
|
| 950 |
+
},
|
| 951 |
+
"neurokit2/signal/signal_psd.py": {
|
| 952 |
+
"size": 19806
|
| 953 |
+
},
|
| 954 |
+
"neurokit2/signal/signal_quality.py": {
|
| 955 |
+
"size": 7847
|
| 956 |
+
},
|
| 957 |
+
"neurokit2/signal/signal_rate.py": {
|
| 958 |
+
"size": 5345
|
| 959 |
+
},
|
| 960 |
+
"neurokit2/signal/signal_recompose.py": {
|
| 961 |
+
"size": 6336
|
| 962 |
+
},
|
| 963 |
+
"neurokit2/signal/signal_resample.py": {
|
| 964 |
+
"size": 6388
|
| 965 |
+
},
|
| 966 |
+
"neurokit2/signal/signal_sanitize.py": {
|
| 967 |
+
"size": 942
|
| 968 |
+
},
|
| 969 |
+
"neurokit2/signal/signal_simulate.py": {
|
| 970 |
+
"size": 3880
|
| 971 |
+
},
|
| 972 |
+
"neurokit2/signal/signal_smooth.py": {
|
| 973 |
+
"size": 5358
|
| 974 |
+
},
|
| 975 |
+
"neurokit2/signal/signal_surrogate.py": {
|
| 976 |
+
"size": 5520
|
| 977 |
+
},
|
| 978 |
+
"neurokit2/signal/signal_synchrony.py": {
|
| 979 |
+
"size": 4293
|
| 980 |
+
},
|
| 981 |
+
"neurokit2/signal/signal_tidypeaksonsets.py": {
|
| 982 |
+
"size": 9075
|
| 983 |
+
},
|
| 984 |
+
"neurokit2/signal/signal_timefrequency.py": {
|
| 985 |
+
"size": 22160
|
| 986 |
+
},
|
| 987 |
+
"neurokit2/signal/signal_zerocrossings.py": {
|
| 988 |
+
"size": 1564
|
| 989 |
+
},
|
| 990 |
+
"neurokit2/stats/__init__.py": {
|
| 991 |
+
"size": 1009
|
| 992 |
+
},
|
| 993 |
+
"neurokit2/stats/cluster.py": {
|
| 994 |
+
"size": 28345
|
| 995 |
+
},
|
| 996 |
+
"neurokit2/stats/cluster_findnumber.py": {
|
| 997 |
+
"size": 2697
|
| 998 |
+
},
|
| 999 |
+
"neurokit2/stats/cluster_quality.py": {
|
| 1000 |
+
"size": 12509
|
| 1001 |
+
},
|
| 1002 |
+
"neurokit2/stats/correlation.py": {
|
| 1003 |
+
"size": 1874
|
| 1004 |
+
},
|
| 1005 |
+
"neurokit2/stats/density.py": {
|
| 1006 |
+
"size": 2045
|
| 1007 |
+
},
|
| 1008 |
+
"neurokit2/stats/density_bandwidth.py": {
|
| 1009 |
+
"size": 4943
|
| 1010 |
+
},
|
| 1011 |
+
"neurokit2/stats/distance.py": {
|
| 1012 |
+
"size": 2251
|
| 1013 |
+
},
|
| 1014 |
+
"neurokit2/stats/fit_error.py": {
|
| 1015 |
+
"size": 3199
|
| 1016 |
+
},
|
| 1017 |
+
"neurokit2/stats/fit_loess.py": {
|
| 1018 |
+
"size": 2919
|
| 1019 |
+
},
|
| 1020 |
+
"neurokit2/stats/fit_mixture.py": {
|
| 1021 |
+
"size": 1465
|
| 1022 |
+
},
|
| 1023 |
+
"neurokit2/stats/fit_polynomial.py": {
|
| 1024 |
+
"size": 4961
|
| 1025 |
+
},
|
| 1026 |
+
"neurokit2/stats/hdi.py": {
|
| 1027 |
+
"size": 2905
|
| 1028 |
+
},
|
| 1029 |
+
"neurokit2/stats/mad.py": {
|
| 1030 |
+
"size": 815
|
| 1031 |
+
},
|
| 1032 |
+
"neurokit2/stats/rescale.py": {
|
| 1033 |
+
"size": 1945
|
| 1034 |
+
},
|
| 1035 |
+
"neurokit2/stats/standardize.py": {
|
| 1036 |
+
"size": 4697
|
| 1037 |
+
},
|
| 1038 |
+
"neurokit2/stats/summary.py": {
|
| 1039 |
+
"size": 1845
|
| 1040 |
+
},
|
| 1041 |
+
"neurokit2/video/__init__.py": {
|
| 1042 |
+
"size": 236
|
| 1043 |
+
},
|
| 1044 |
+
"neurokit2/video/video_blinks.py": {
|
| 1045 |
+
"size": 2574
|
| 1046 |
+
},
|
| 1047 |
+
"neurokit2/video/video_face.py": {
|
| 1048 |
+
"size": 2665
|
| 1049 |
+
},
|
| 1050 |
+
"neurokit2/video/video_plot.py": {
|
| 1051 |
+
"size": 3435
|
| 1052 |
+
},
|
| 1053 |
+
"neurokit2/video/video_ppg.py": {
|
| 1054 |
+
"size": 3488
|
| 1055 |
+
},
|
| 1056 |
+
"neurokit2/video/video_skin.py": {
|
| 1057 |
+
"size": 4237
|
| 1058 |
+
},
|
| 1059 |
+
"pyproject.toml": {
|
| 1060 |
+
"size": 950
|
| 1061 |
+
},
|
| 1062 |
+
"pytest.ini": {
|
| 1063 |
+
"size": 241
|
| 1064 |
+
},
|
| 1065 |
+
"readthedocs.yml": {
|
| 1066 |
+
"size": 304
|
| 1067 |
+
},
|
| 1068 |
+
"setup.cfg": {
|
| 1069 |
+
"size": 452
|
| 1070 |
+
},
|
| 1071 |
+
"setup.py": {
|
| 1072 |
+
"size": 2461
|
| 1073 |
+
},
|
| 1074 |
+
"studies/complexity_eeg/README.md": {
|
| 1075 |
+
"size": 17920
|
| 1076 |
+
},
|
| 1077 |
+
"studies/complexity_eeg/make_data.py": {
|
| 1078 |
+
"size": 12454
|
| 1079 |
+
},
|
| 1080 |
+
"studies/ecg_benchmark/README.md": {
|
| 1081 |
+
"size": 21191
|
| 1082 |
+
},
|
| 1083 |
+
"studies/ecg_benchmark/make_data.py": {
|
| 1084 |
+
"size": 5866
|
| 1085 |
+
},
|
| 1086 |
+
"studies/eog_blinktemplate/README.md": {
|
| 1087 |
+
"size": 16107
|
| 1088 |
+
},
|
| 1089 |
+
"studies/erp_gam/README.md": {
|
| 1090 |
+
"size": 12997
|
| 1091 |
+
},
|
| 1092 |
+
"studies/erp_gam/script.py": {
|
| 1093 |
+
"size": 3394
|
| 1094 |
+
},
|
| 1095 |
+
"studies/hrv_frequency/make_data.py": {
|
| 1096 |
+
"size": 1516
|
| 1097 |
+
},
|
| 1098 |
+
"studies/microstates_howmany/script.py": {
|
| 1099 |
+
"size": 1816
|
| 1100 |
+
},
|
| 1101 |
+
"tests/__init__.py": {
|
| 1102 |
+
"size": 0
|
| 1103 |
+
},
|
| 1104 |
+
"tests/tests.py": {
|
| 1105 |
+
"size": 99
|
| 1106 |
+
},
|
| 1107 |
+
"tests/tests_bio.py": {
|
| 1108 |
+
"size": 2148
|
| 1109 |
+
},
|
| 1110 |
+
"tests/tests_complexity.py": {
|
| 1111 |
+
"size": 23101
|
| 1112 |
+
},
|
| 1113 |
+
"tests/tests_data.py": {
|
| 1114 |
+
"size": 1187
|
| 1115 |
+
},
|
| 1116 |
+
"tests/tests_ecg.py": {
|
| 1117 |
+
"size": 12076
|
| 1118 |
+
},
|
| 1119 |
+
"tests/tests_ecg_delineate.py": {
|
| 1120 |
+
"size": 2795
|
| 1121 |
+
},
|
| 1122 |
+
"tests/tests_ecg_findpeaks.py": {
|
| 1123 |
+
"size": 3330
|
| 1124 |
+
},
|
| 1125 |
+
"tests/tests_eda.py": {
|
| 1126 |
+
"size": 8438
|
| 1127 |
+
},
|
| 1128 |
+
"tests/tests_eeg.py": {
|
| 1129 |
+
"size": 3675
|
| 1130 |
+
},
|
| 1131 |
+
"tests/tests_emg.py": {
|
| 1132 |
+
"size": 6259
|
| 1133 |
+
},
|
| 1134 |
+
"tests/tests_eog.py": {
|
| 1135 |
+
"size": 5408
|
| 1136 |
+
},
|
| 1137 |
+
"tests/tests_epochs.py": {
|
| 1138 |
+
"size": 1507
|
| 1139 |
+
},
|
| 1140 |
+
"tests/tests_events.py": {
|
| 1141 |
+
"size": 3137
|
| 1142 |
+
},
|
| 1143 |
+
"tests/tests_hrv.py": {
|
| 1144 |
+
"size": 7651
|
| 1145 |
+
},
|
| 1146 |
+
"tests/tests_microstates.py": {
|
| 1147 |
+
"size": 951
|
| 1148 |
+
},
|
| 1149 |
+
"tests/tests_ppg.py": {
|
| 1150 |
+
"size": 7646
|
| 1151 |
+
},
|
| 1152 |
+
"tests/tests_rsp.py": {
|
| 1153 |
+
"size": 16166
|
| 1154 |
+
},
|
| 1155 |
+
"tests/tests_signal.py": {
|
| 1156 |
+
"size": 15973
|
| 1157 |
+
},
|
| 1158 |
+
"tests/tests_signal_fixpeaks.py": {
|
| 1159 |
+
"size": 9512
|
| 1160 |
+
},
|
| 1161 |
+
"tests/tests_stats.py": {
|
| 1162 |
+
"size": 3969
|
| 1163 |
+
},
|
| 1164 |
+
"tox.ini": {
|
| 1165 |
+
"size": 505
|
| 1166 |
+
}
|
| 1167 |
+
},
|
| 1168 |
+
"processed_by": "zip_fallback",
|
| 1169 |
+
"success": true
|
| 1170 |
+
},
|
| 1171 |
+
"structure": {
|
| 1172 |
+
"packages": [
|
| 1173 |
+
"source.neurokit2",
|
| 1174 |
+
"source.neurokit2.benchmark",
|
| 1175 |
+
"source.neurokit2.bio",
|
| 1176 |
+
"source.neurokit2.complexity",
|
| 1177 |
+
"source.neurokit2.data",
|
| 1178 |
+
"source.neurokit2.ecg",
|
| 1179 |
+
"source.neurokit2.eda",
|
| 1180 |
+
"source.neurokit2.eeg",
|
| 1181 |
+
"source.neurokit2.emg",
|
| 1182 |
+
"source.neurokit2.eog",
|
| 1183 |
+
"source.neurokit2.epochs",
|
| 1184 |
+
"source.neurokit2.events",
|
| 1185 |
+
"source.neurokit2.hrv",
|
| 1186 |
+
"source.neurokit2.markov",
|
| 1187 |
+
"source.neurokit2.microstates",
|
| 1188 |
+
"source.neurokit2.misc",
|
| 1189 |
+
"source.neurokit2.ppg",
|
| 1190 |
+
"source.neurokit2.rsp",
|
| 1191 |
+
"source.neurokit2.signal",
|
| 1192 |
+
"source.neurokit2.stats",
|
| 1193 |
+
"source.neurokit2.video",
|
| 1194 |
+
"source.tests"
|
| 1195 |
+
]
|
| 1196 |
+
},
|
| 1197 |
+
"dependencies": {
|
| 1198 |
+
"has_environment_yml": false,
|
| 1199 |
+
"has_requirements_txt": false,
|
| 1200 |
+
"pyproject": true,
|
| 1201 |
+
"setup_cfg": true,
|
| 1202 |
+
"setup_py": true
|
| 1203 |
+
},
|
| 1204 |
+
"entry_points": {
|
| 1205 |
+
"imports": [],
|
| 1206 |
+
"cli": [],
|
| 1207 |
+
"modules": []
|
| 1208 |
+
},
|
| 1209 |
+
"llm_analysis": {
|
| 1210 |
+
"core_modules": [
|
| 1211 |
+
{
|
| 1212 |
+
"package": "source.neurokit2.benchmark",
|
| 1213 |
+
"module": "benchmark_ecg",
|
| 1214 |
+
"functions": [
|
| 1215 |
+
"benchmark_ecg"
|
| 1216 |
+
],
|
| 1217 |
+
"classes": [],
|
| 1218 |
+
"description": "Functions related to benchmarking ECG data."
|
| 1219 |
+
},
|
| 1220 |
+
{
|
| 1221 |
+
"package": "source.neurokit2.bio",
|
| 1222 |
+
"module": "bio_analyze",
|
| 1223 |
+
"functions": [
|
| 1224 |
+
"bio_analyze"
|
| 1225 |
+
],
|
| 1226 |
+
"classes": [],
|
| 1227 |
+
"description": "Functions for analyzing biological signals."
|
| 1228 |
+
},
|
| 1229 |
+
{
|
| 1230 |
+
"package": "source.neurokit2.complexity",
|
| 1231 |
+
"module": "complexity",
|
| 1232 |
+
"functions": [
|
| 1233 |
+
"complexity"
|
| 1234 |
+
],
|
| 1235 |
+
"classes": [],
|
| 1236 |
+
"description": "Functions for calculating signal complexity."
|
| 1237 |
+
},
|
| 1238 |
+
{
|
| 1239 |
+
"package": "source.neurokit2.ecg",
|
| 1240 |
+
"module": "ecg_analyze",
|
| 1241 |
+
"functions": [
|
| 1242 |
+
"ecg_analyze"
|
| 1243 |
+
],
|
| 1244 |
+
"classes": [],
|
| 1245 |
+
"description": "Functions for analyzing ECG signals."
|
| 1246 |
+
},
|
| 1247 |
+
{
|
| 1248 |
+
"package": "source.neurokit2.eda",
|
| 1249 |
+
"module": "eda_analyze",
|
| 1250 |
+
"functions": [
|
| 1251 |
+
"eda_analyze"
|
| 1252 |
+
],
|
| 1253 |
+
"classes": [],
|
| 1254 |
+
"description": "Functions for analyzing EDA signals."
|
| 1255 |
+
},
|
| 1256 |
+
{
|
| 1257 |
+
"package": "source.neurokit2.eeg",
|
| 1258 |
+
"module": "eeg_power",
|
| 1259 |
+
"functions": [
|
| 1260 |
+
"eeg_power"
|
| 1261 |
+
],
|
| 1262 |
+
"classes": [],
|
| 1263 |
+
"description": "Functions for EEG power analysis."
|
| 1264 |
+
},
|
| 1265 |
+
{
|
| 1266 |
+
"package": "source.neurokit2.ppg",
|
| 1267 |
+
"module": "ppg_analyze",
|
| 1268 |
+
"functions": [
|
| 1269 |
+
"ppg_analyze"
|
| 1270 |
+
],
|
| 1271 |
+
"classes": [],
|
| 1272 |
+
"description": "Functions for analyzing PPG signals."
|
| 1273 |
+
},
|
| 1274 |
+
{
|
| 1275 |
+
"package": "source.neurokit2.rsp",
|
| 1276 |
+
"module": "rsp_analyze",
|
| 1277 |
+
"functions": [
|
| 1278 |
+
"rsp_analyze"
|
| 1279 |
+
],
|
| 1280 |
+
"classes": [],
|
| 1281 |
+
"description": "Functions for analyzing respiratory signals."
|
| 1282 |
+
}
|
| 1283 |
+
],
|
| 1284 |
+
"cli_commands": [],
|
| 1285 |
+
"import_strategy": {
|
| 1286 |
+
"primary": "import",
|
| 1287 |
+
"fallback": "blackbox",
|
| 1288 |
+
"confidence": 0.9
|
| 1289 |
+
},
|
| 1290 |
+
"dependencies": {
|
| 1291 |
+
"required": [
|
| 1292 |
+
"numpy",
|
| 1293 |
+
"scipy",
|
| 1294 |
+
"pandas",
|
| 1295 |
+
"matplotlib",
|
| 1296 |
+
"mne",
|
| 1297 |
+
"biosppy"
|
| 1298 |
+
],
|
| 1299 |
+
"optional": [
|
| 1300 |
+
"seaborn",
|
| 1301 |
+
"plotly"
|
| 1302 |
+
]
|
| 1303 |
+
},
|
| 1304 |
+
"risk_assessment": {
|
| 1305 |
+
"import_feasibility": 0.9,
|
| 1306 |
+
"intrusiveness_risk": "low",
|
| 1307 |
+
"complexity": "medium"
|
| 1308 |
+
}
|
| 1309 |
+
},
|
| 1310 |
+
"deepwiki_analysis": {
|
| 1311 |
+
"repo_url": "https://github.com/neuropsychology/NeuroKit",
|
| 1312 |
+
"repo_name": "NeuroKit",
|
| 1313 |
+
"content": "neuropsychology/NeuroKit\nBiosignal Processing\nECG Processing\nRespiration Processing\nEDA Processing\nOther Biosignals\nSignal Processing Core\nPeak Detection and Correction\nSpectral Analysis\nSignal Simulation\nAdvanced Analysis\nHeart Rate Variability\nComplexity Analysis\nEvent-Related Analysis\nMicrostates Analysis\nClustering and Statistical Analysis\nDeveloper Guide\nContributing\nDocumentation System\nTesting Framework\n.editorconfig\nCITATION.cff\nneurokit2/__init__.py\nneurokit2/ecg/__init__.py\nneurokit2/signal/__init__.py\nPurpose and Scope\nNeuroKit2 is a comprehensive Python toolbox designed for neurophysiological signal processing and analysis. It provides researchers and clinicians with user-friendly access to advanced biosignal processing routines, enabling the analysis of physiological data with minimal coding requirements. This page provides a high-level overview of the system architecture, components, and capabilities of NeuroKit2.\nFor specific information about biosignal processing modules, seeBiosignal Processing. For details on core signal processing functionality, seeSignal Processing Core. For advanced analysis methods, refer toAdvanced Analysis.\nSources:README.rst22-26neurokit2/__init__.py1-34\nArchitecture Overview\nNeuroKit2 follows a modular design pattern with several key components that work together to process and analyze neurophysiological signals.\nAnalysis MethodsBiosignal ProcessingCore FoundationSignal Processing ToolkitSignal SimulationECG ModuleRespiration ModuleEDA ModuleEMG ModuleEOG ModuleEEG ModulePPG ModuleHeart Rate VariabilityComplexity AnalysisEvent-related AnalysisMicrostates AnalysisStatistical Tools\nAnalysis Methods\nBiosignal Processing\nCore Foundation\nSignal Processing Toolkit\nSignal Simulation\nRespiration Module\nHeart Rate Variability\nComplexity Analysis\nEvent-related Analysis\nMicrostates Analysis\nStatistical Tools\nSources:README.rst204-594neurokit2/__init__.py14-32\nSignal Processing Core\nThe signal processing toolkit forms the foundation of NeuroKit2. It provides a comprehensive set of functions for manipulating, analyzing, and visualizing time series data.\nSources:neurokit2/signal/__init__.py1-64\nKey Signal Processing Capabilities\nsignal_filter\nsignal_detrend\nsignal_findpeaks\nsignal_fixpeaks\nsignal_timefrequency\nsignal_decompose\nsignal_recompose\nsignal_simulate\nsignal_interpolate\nsignal_plot\nSources:neurokit2/signal/__init__.py33-64README.rst476-482\nBiosignal Processing\nNeuroKit2 supports the processing and analysis of various physiological signals. Each signal type has dedicated modules with specialized functions.\nSupported BiosignalsBiosignal Processing PipelineRaw Signal*_clean()*_findpeaks()*_peaks()*_process()*_analyze()ECG (electrocardiogram)PPG (photoplethysmogram)RSP (respiration)EDA (electrodermal activity)EMG (electromyography)EOG (electrooculography)EEG (electroencephalography)*_eventrelated()*_intervalrelated()\nSupported Biosignals\nBiosignal Processing Pipeline\n*_findpeaks()\n*_process()\n*_analyze()\nECG (electrocardiogram)\nPPG (photoplethysmogram)\nRSP (respiration)\nEDA (electrodermal activity)\nEMG (electromyography)\nEOG (electrooculography)\nEEG (electroencephalography)\n*_eventrelated()\n*_intervalrelated()\nSources:neurokit2/ecg/__init__.py1-38README.rst204-347\nKey Biosignal Modules\necg_process\necg_delineate\nrsp_process\neda_process\nemg_process\neog_process\nppg_process\neeg_process\nSources:README.rst256-347\nAnalysis Methods\nNeuroKit2 provides advanced analysis methods that build upon the processed biosignals.\nHeart Rate Variability (HRV)\nHeart Rate Variability analysis is a key feature of NeuroKit2, offering comprehensive metrics across multiple domains:\nhrv_frequency\nhrv_nonlinear\nSources:README.rst400-445\nEvent-Related and Interval-Related Analysis\nNeuroKit2 provides two primary approaches to analyzing physiological data:\nEvent-Related Analysis: Examines physiological changes in response to specific time-locked events\nInterval-Related Analysis: Analyzes physiological characteristics over longer periods\nFunctionsAnalysis TypesEvent-related AnalysisInterval-related Analysisbio_process()bio_analyze()\nAnalysis Types\nEvent-related Analysis\nInterval-related Analysis\nbio_process()\nbio_analyze()\nSources:README.rst356-397\nGetting Started\nNeuroKit2 is designed to be user-friendly, allowing researchers to analyze physiological data with minimal code.\nBasic usage example:\nimportneurokit2asnk# Download example datadata = nk.data(\"bio_eventrelated_100hz\")# Preprocess the data (filter, find peaks, etc.)processed_data, info = nk.bio_process(ecg=data[\"ECG\"], rsp=data[\"RSP\"], eda=data[\"EDA\"], sampling_rate=100)# Compute relevant featuresresults = nk.bio_analyze(processed_data, sampling_rate=100)\nimportneurokit2asnk# Download example datadata = nk.data(\"bio_eventrelated_100hz\")# Preprocess the data (filter, find peaks, etc.)processed_data, info = nk.bio_process(ecg=data[\"ECG\"], rsp=data[\"RSP\"], eda=data[\"EDA\"], sampling_rate=100)# Compute relevant featuresresults = nk.bio_analyze(processed_data, sampling_rate=100)\nimportneurokit2asnk# Download example datadata = nk.data(\"bio_eventrelated_100hz\")# Preprocess the data (filter, find peaks, etc.)processed_data, info = nk.bio_process(ecg=data[\"ECG\"], rsp=data[\"RSP\"], eda=data[\"EDA\"], sampling_rate=100)# Compute relevant featuresresults = nk.bio_analyze(processed_data, sampling_rate=100)\nSources:README.rst29-46\nInstallation\nNeuroKit2 can be installed via pip or conda:\npip install neurokit2\npip install neurokit2\nconda install -c conda-forge neurokit2\nconda install -c conda-forge neurokit2\nSources:README.rst48-63\nLicense and Citation\nNeuroKit2 is licensed under the MIT License and can be cited as follows:\nMakowski, D., Pham, T., Lau, Z. J., Brammer, J. C., Lespinasse, F., Pham, H., \nSchölzel, C., & Chen, S. A. (2021). NeuroKit2: A Python toolbox for neurophysiological signal processing. \nBehavior Research Methods, 53(4), 1689-1696. https://doi.org/10.3758/s13428-020-01516-y\nMakowski, D., Pham, T., Lau, Z. J., Brammer, J. C., Lespinasse, F., Pham, H., \nSchölzel, C., & Chen, S. A. (2021). NeuroKit2: A Python toolbox for neurophysiological signal processing. \nBehavior Research Methods, 53(4), 1689-1696. https://doi.org/10.3758/s13428-020-01516-y\nSources:LICENSE1-22CITATION.cff1-46neurokit2/__init__.py45-73\nRefresh this wiki\nOn this page\nPurpose and Scope\nArchitecture Overview\nSignal Processing Core\nKey Signal Processing Capabilities\nBiosignal Processing\nKey Biosignal Modules\nAnalysis Methods\nHeart Rate Variability (HRV)\nEvent-Related and Interval-Related Analysis\nGetting Started\nInstallation\nLicense and Citation",
|
| 1314 |
+
"model": "gpt-4o-2024-08-06",
|
| 1315 |
+
"source": "selenium",
|
| 1316 |
+
"success": true
|
| 1317 |
+
},
|
| 1318 |
+
"deepwiki_options": {
|
| 1319 |
+
"enabled": true,
|
| 1320 |
+
"model": "gpt-4o-2024-08-06"
|
| 1321 |
+
},
|
| 1322 |
+
"risk": {
|
| 1323 |
+
"import_feasibility": 0.9,
|
| 1324 |
+
"intrusiveness_risk": "low",
|
| 1325 |
+
"complexity": "medium"
|
| 1326 |
+
}
|
| 1327 |
+
}
|
NeuroKit/mcp_output/diff_report.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NeuroKit Project Difference Report
|
| 2 |
+
|
| 3 |
+
**Date:** January 30, 2026
|
| 4 |
+
**Time:** 14:06:15
|
| 5 |
+
**Repository:** NeuroKit
|
| 6 |
+
**Project Type:** Python Library
|
| 7 |
+
**Intrusiveness:** None
|
| 8 |
+
**Workflow Status:** Success
|
| 9 |
+
**Test Status:** Failed
|
| 10 |
+
|
| 11 |
+
## Project Overview
|
| 12 |
+
|
| 13 |
+
NeuroKit is a Python library designed to provide basic functionality for processing and analyzing physiological signals. It is widely used in research and educational settings for its ease of use and comprehensive feature set. The library aims to facilitate the analysis of biosignals such as ECG, EDA, EMG, and others.
|
| 14 |
+
|
| 15 |
+
## Difference Analysis
|
| 16 |
+
|
| 17 |
+
### New Files Added
|
| 18 |
+
|
| 19 |
+
In this update, 8 new files have been introduced to the NeuroKit repository. These files are likely to contain new features or enhancements to existing functionalities. However, no existing files were modified, indicating that the new additions are supplementary rather than replacements or updates to current code.
|
| 20 |
+
|
| 21 |
+
### Modified Files
|
| 22 |
+
|
| 23 |
+
There were no modifications to existing files in this update. This suggests that the core functionality of the library remains unchanged, and the focus was on expanding the library's capabilities through new additions.
|
| 24 |
+
|
| 25 |
+
## Technical Analysis
|
| 26 |
+
|
| 27 |
+
### Workflow Status
|
| 28 |
+
|
| 29 |
+
The workflow status is marked as "success," indicating that the integration and deployment processes were completed without any technical issues. This suggests that the new files were successfully integrated into the existing codebase.
|
| 30 |
+
|
| 31 |
+
### Test Status
|
| 32 |
+
|
| 33 |
+
The test status is marked as "failed," which is a critical issue that needs immediate attention. This failure indicates that the new additions may have introduced bugs or that the new features are not functioning as intended. It is essential to conduct a thorough review of the new files to identify and resolve the issues causing the test failures.
|
| 34 |
+
|
| 35 |
+
## Recommendations and Improvements
|
| 36 |
+
|
| 37 |
+
1. **Conduct a Detailed Code Review:** Perform a comprehensive review of the new files to identify any potential bugs or issues that could be causing the test failures.
|
| 38 |
+
|
| 39 |
+
2. **Enhance Test Coverage:** Ensure that the new features are adequately covered by unit tests. This will help in identifying specific areas where the code is failing.
|
| 40 |
+
|
| 41 |
+
3. **Debugging and Issue Resolution:** Focus on debugging the new additions to resolve any issues. Utilize logging and debugging tools to trace the source of the test failures.
|
| 42 |
+
|
| 43 |
+
4. **Documentation Update:** Update the project documentation to include information about the new features and how they integrate with the existing functionalities.
|
| 44 |
+
|
| 45 |
+
5. **Community Feedback:** Engage with the user community to gather feedback on the new features and identify any additional issues that may not have been captured during testing.
|
| 46 |
+
|
| 47 |
+
## Deployment Information
|
| 48 |
+
|
| 49 |
+
The successful workflow status indicates that the deployment process was completed without any technical issues. However, given the test failures, it is advisable to hold off on any further deployment until the issues are resolved.
|
| 50 |
+
|
| 51 |
+
## Future Planning
|
| 52 |
+
|
| 53 |
+
1. **Stabilization Phase:** Focus on stabilizing the current release by addressing the test failures and ensuring that all new features are functioning as intended.
|
| 54 |
+
|
| 55 |
+
2. **Feature Expansion:** Once the current issues are resolved, consider expanding the library's capabilities by introducing more advanced features and functionalities.
|
| 56 |
+
|
| 57 |
+
3. **Community Engagement:** Continue to engage with the user community to gather insights and feedback that can guide future development efforts.
|
| 58 |
+
|
| 59 |
+
4. **Regular Updates:** Plan for regular updates and maintenance releases to ensure the library remains up-to-date with the latest advancements in physiological signal processing.
|
| 60 |
+
|
| 61 |
+
## Conclusion
|
| 62 |
+
|
| 63 |
+
The recent update to the NeuroKit project has introduced new features through the addition of 8 new files. However, the test failures indicate that there are issues that need to be addressed before further deployment. By focusing on debugging, enhancing test coverage, and engaging with the community, the project can continue to evolve and provide valuable tools for physiological signal analysis.
|
NeuroKit/mcp_output/mcp_plugin/__init__.py
ADDED
|
File without changes
|
NeuroKit/mcp_output/mcp_plugin/adapter.py
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
|
| 4 |
+
# Path settings
|
| 5 |
+
source_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "source")
|
| 6 |
+
sys.path.insert(0, source_path)
|
| 7 |
+
|
| 8 |
+
# Import statements
|
| 9 |
+
try:
|
| 10 |
+
from neurokit2 import bio_process, bio_analyze
|
| 11 |
+
from neurokit2.ecg import ecg_process, ecg_analyze
|
| 12 |
+
from neurokit2.rsp import rsp_process, rsp_analyze
|
| 13 |
+
from neurokit2.eda import eda_process, eda_analyze
|
| 14 |
+
from neurokit2.ppg import ppg_process, ppg_analyze
|
| 15 |
+
from neurokit2.eeg import eeg_process, eeg_analyze
|
| 16 |
+
from neurokit2.emg import emg_process, emg_analyze
|
| 17 |
+
from neurokit2.eog import eog_process, eog_analyze
|
| 18 |
+
from neurokit2.hrv import hrv_frequency, hrv_nonlinear
|
| 19 |
+
except ImportError as e:
|
| 20 |
+
print(f"Import failed: {e}. Ensure the source directory is correct and all dependencies are installed.")
|
| 21 |
+
|
| 22 |
+
class Adapter:
|
| 23 |
+
"""
|
| 24 |
+
Adapter class for the MCP plugin, providing a unified interface to access
|
| 25 |
+
various neurophysiological signal processing functions from NeuroKit2.
|
| 26 |
+
"""
|
| 27 |
+
|
| 28 |
+
def __init__(self):
|
| 29 |
+
self.mode = "import"
|
| 30 |
+
|
| 31 |
+
# -------------------- Biosignal Processing Methods --------------------
|
| 32 |
+
|
| 33 |
+
def process_biosignal(self, ecg=None, rsp=None, eda=None, sampling_rate=100):
|
| 34 |
+
"""
|
| 35 |
+
Process biosignals using NeuroKit2's bio_process function.
|
| 36 |
+
|
| 37 |
+
Parameters:
|
| 38 |
+
- ecg: ECG data
|
| 39 |
+
- rsp: RSP data
|
| 40 |
+
- eda: EDA data
|
| 41 |
+
- sampling_rate: Sampling rate of the data
|
| 42 |
+
|
| 43 |
+
Returns:
|
| 44 |
+
- dict: Processed data and status
|
| 45 |
+
"""
|
| 46 |
+
try:
|
| 47 |
+
processed_data, info = bio_process(ecg=ecg, rsp=rsp, eda=eda, sampling_rate=sampling_rate)
|
| 48 |
+
return {"status": "success", "data": processed_data, "info": info}
|
| 49 |
+
except Exception as e:
|
| 50 |
+
return {"status": "error", "message": str(e)}
|
| 51 |
+
|
| 52 |
+
def analyze_biosignal(self, processed_data, sampling_rate=100):
|
| 53 |
+
"""
|
| 54 |
+
Analyze processed biosignals using NeuroKit2's bio_analyze function.
|
| 55 |
+
|
| 56 |
+
Parameters:
|
| 57 |
+
- processed_data: Data processed by bio_process
|
| 58 |
+
- sampling_rate: Sampling rate of the data
|
| 59 |
+
|
| 60 |
+
Returns:
|
| 61 |
+
- dict: Analysis results and status
|
| 62 |
+
"""
|
| 63 |
+
try:
|
| 64 |
+
results = bio_analyze(processed_data, sampling_rate=sampling_rate)
|
| 65 |
+
return {"status": "success", "results": results}
|
| 66 |
+
except Exception as e:
|
| 67 |
+
return {"status": "error", "message": str(e)}
|
| 68 |
+
|
| 69 |
+
# -------------------- ECG Processing Methods --------------------
|
| 70 |
+
|
| 71 |
+
def process_ecg(self, ecg, sampling_rate=100):
|
| 72 |
+
"""
|
| 73 |
+
Process ECG data using NeuroKit2's ecg_process function.
|
| 74 |
+
|
| 75 |
+
Parameters:
|
| 76 |
+
- ecg: ECG data
|
| 77 |
+
- sampling_rate: Sampling rate of the data
|
| 78 |
+
|
| 79 |
+
Returns:
|
| 80 |
+
- dict: Processed ECG data and status
|
| 81 |
+
"""
|
| 82 |
+
try:
|
| 83 |
+
processed_ecg, info = ecg_process(ecg, sampling_rate=sampling_rate)
|
| 84 |
+
return {"status": "success", "data": processed_ecg, "info": info}
|
| 85 |
+
except Exception as e:
|
| 86 |
+
return {"status": "error", "message": str(e)}
|
| 87 |
+
|
| 88 |
+
def analyze_ecg(self, processed_ecg, sampling_rate=100):
|
| 89 |
+
"""
|
| 90 |
+
Analyze processed ECG data using NeuroKit2's ecg_analyze function.
|
| 91 |
+
|
| 92 |
+
Parameters:
|
| 93 |
+
- processed_ecg: Data processed by ecg_process
|
| 94 |
+
- sampling_rate: Sampling rate of the data
|
| 95 |
+
|
| 96 |
+
Returns:
|
| 97 |
+
- dict: Analysis results and status
|
| 98 |
+
"""
|
| 99 |
+
try:
|
| 100 |
+
results = ecg_analyze(processed_ecg, sampling_rate=sampling_rate)
|
| 101 |
+
return {"status": "success", "results": results}
|
| 102 |
+
except Exception as e:
|
| 103 |
+
return {"status": "error", "message": str(e)}
|
| 104 |
+
|
| 105 |
+
# -------------------- RSP Processing Methods --------------------
|
| 106 |
+
|
| 107 |
+
def process_rsp(self, rsp, sampling_rate=100):
|
| 108 |
+
"""
|
| 109 |
+
Process RSP data using NeuroKit2's rsp_process function.
|
| 110 |
+
|
| 111 |
+
Parameters:
|
| 112 |
+
- rsp: RSP data
|
| 113 |
+
- sampling_rate: Sampling rate of the data
|
| 114 |
+
|
| 115 |
+
Returns:
|
| 116 |
+
- dict: Processed RSP data and status
|
| 117 |
+
"""
|
| 118 |
+
try:
|
| 119 |
+
processed_rsp, info = rsp_process(rsp, sampling_rate=sampling_rate)
|
| 120 |
+
return {"status": "success", "data": processed_rsp, "info": info}
|
| 121 |
+
except Exception as e:
|
| 122 |
+
return {"status": "error", "message": str(e)}
|
| 123 |
+
|
| 124 |
+
def analyze_rsp(self, processed_rsp, sampling_rate=100):
|
| 125 |
+
"""
|
| 126 |
+
Analyze processed RSP data using NeuroKit2's rsp_analyze function.
|
| 127 |
+
|
| 128 |
+
Parameters:
|
| 129 |
+
- processed_rsp: Data processed by rsp_process
|
| 130 |
+
- sampling_rate: Sampling rate of the data
|
| 131 |
+
|
| 132 |
+
Returns:
|
| 133 |
+
- dict: Analysis results and status
|
| 134 |
+
"""
|
| 135 |
+
try:
|
| 136 |
+
results = rsp_analyze(processed_rsp, sampling_rate=sampling_rate)
|
| 137 |
+
return {"status": "success", "results": results}
|
| 138 |
+
except Exception as e:
|
| 139 |
+
return {"status": "error", "message": str(e)}
|
| 140 |
+
|
| 141 |
+
# -------------------- EDA Processing Methods --------------------
|
| 142 |
+
|
| 143 |
+
def process_eda(self, eda, sampling_rate=100):
|
| 144 |
+
"""
|
| 145 |
+
Process EDA data using NeuroKit2's eda_process function.
|
| 146 |
+
|
| 147 |
+
Parameters:
|
| 148 |
+
- eda: EDA data
|
| 149 |
+
- sampling_rate: Sampling rate of the data
|
| 150 |
+
|
| 151 |
+
Returns:
|
| 152 |
+
- dict: Processed EDA data and status
|
| 153 |
+
"""
|
| 154 |
+
try:
|
| 155 |
+
processed_eda, info = eda_process(eda, sampling_rate=sampling_rate)
|
| 156 |
+
return {"status": "success", "data": processed_eda, "info": info}
|
| 157 |
+
except Exception as e:
|
| 158 |
+
return {"status": "error", "message": str(e)}
|
| 159 |
+
|
| 160 |
+
def analyze_eda(self, processed_eda, sampling_rate=100):
|
| 161 |
+
"""
|
| 162 |
+
Analyze processed EDA data using NeuroKit2's eda_analyze function.
|
| 163 |
+
|
| 164 |
+
Parameters:
|
| 165 |
+
- processed_eda: Data processed by eda_process
|
| 166 |
+
- sampling_rate: Sampling rate of the data
|
| 167 |
+
|
| 168 |
+
Returns:
|
| 169 |
+
- dict: Analysis results and status
|
| 170 |
+
"""
|
| 171 |
+
try:
|
| 172 |
+
results = eda_analyze(processed_eda, sampling_rate=sampling_rate)
|
| 173 |
+
return {"status": "success", "results": results}
|
| 174 |
+
except Exception as e:
|
| 175 |
+
return {"status": "error", "message": str(e)}
|
| 176 |
+
|
| 177 |
+
# -------------------- PPG Processing Methods --------------------
|
| 178 |
+
|
| 179 |
+
def process_ppg(self, ppg, sampling_rate=100):
|
| 180 |
+
"""
|
| 181 |
+
Process PPG data using NeuroKit2's ppg_process function.
|
| 182 |
+
|
| 183 |
+
Parameters:
|
| 184 |
+
- ppg: PPG data
|
| 185 |
+
- sampling_rate: Sampling rate of the data
|
| 186 |
+
|
| 187 |
+
Returns:
|
| 188 |
+
- dict: Processed PPG data and status
|
| 189 |
+
"""
|
| 190 |
+
try:
|
| 191 |
+
processed_ppg, info = ppg_process(ppg, sampling_rate=sampling_rate)
|
| 192 |
+
return {"status": "success", "data": processed_ppg, "info": info}
|
| 193 |
+
except Exception as e:
|
| 194 |
+
return {"status": "error", "message": str(e)}
|
| 195 |
+
|
| 196 |
+
def analyze_ppg(self, processed_ppg, sampling_rate=100):
|
| 197 |
+
"""
|
| 198 |
+
Analyze processed PPG data using NeuroKit2's ppg_analyze function.
|
| 199 |
+
|
| 200 |
+
Parameters:
|
| 201 |
+
- processed_ppg: Data processed by ppg_process
|
| 202 |
+
- sampling_rate: Sampling rate of the data
|
| 203 |
+
|
| 204 |
+
Returns:
|
| 205 |
+
- dict: Analysis results and status
|
| 206 |
+
"""
|
| 207 |
+
try:
|
| 208 |
+
results = ppg_analyze(processed_ppg, sampling_rate=sampling_rate)
|
| 209 |
+
return {"status": "success", "results": results}
|
| 210 |
+
except Exception as e:
|
| 211 |
+
return {"status": "error", "message": str(e)}
|
| 212 |
+
|
| 213 |
+
# -------------------- EEG Processing Methods --------------------
|
| 214 |
+
|
| 215 |
+
def process_eeg(self, eeg, sampling_rate=100):
|
| 216 |
+
"""
|
| 217 |
+
Process EEG data using NeuroKit2's eeg_process function.
|
| 218 |
+
|
| 219 |
+
Parameters:
|
| 220 |
+
- eeg: EEG data
|
| 221 |
+
- sampling_rate: Sampling rate of the data
|
| 222 |
+
|
| 223 |
+
Returns:
|
| 224 |
+
- dict: Processed EEG data and status
|
| 225 |
+
"""
|
| 226 |
+
try:
|
| 227 |
+
processed_eeg, info = eeg_process(eeg, sampling_rate=sampling_rate)
|
| 228 |
+
return {"status": "success", "data": processed_eeg, "info": info}
|
| 229 |
+
except Exception as e:
|
| 230 |
+
return {"status": "error", "message": str(e)}
|
| 231 |
+
|
| 232 |
+
def analyze_eeg(self, processed_eeg, sampling_rate=100):
|
| 233 |
+
"""
|
| 234 |
+
Analyze processed EEG data using NeuroKit2's eeg_analyze function.
|
| 235 |
+
|
| 236 |
+
Parameters:
|
| 237 |
+
- processed_eeg: Data processed by eeg_process
|
| 238 |
+
- sampling_rate: Sampling rate of the data
|
| 239 |
+
|
| 240 |
+
Returns:
|
| 241 |
+
- dict: Analysis results and status
|
| 242 |
+
"""
|
| 243 |
+
try:
|
| 244 |
+
results = eeg_analyze(processed_eeg, sampling_rate=sampling_rate)
|
| 245 |
+
return {"status": "success", "results": results}
|
| 246 |
+
except Exception as e:
|
| 247 |
+
return {"status": "error", "message": str(e)}
|
| 248 |
+
|
| 249 |
+
# -------------------- EMG Processing Methods --------------------
|
| 250 |
+
|
| 251 |
+
def process_emg(self, emg, sampling_rate=100):
|
| 252 |
+
"""
|
| 253 |
+
Process EMG data using NeuroKit2's emg_process function.
|
| 254 |
+
|
| 255 |
+
Parameters:
|
| 256 |
+
- emg: EMG data
|
| 257 |
+
- sampling_rate: Sampling rate of the data
|
| 258 |
+
|
| 259 |
+
Returns:
|
| 260 |
+
- dict: Processed EMG data and status
|
| 261 |
+
"""
|
| 262 |
+
try:
|
| 263 |
+
processed_emg, info = emg_process(emg, sampling_rate=sampling_rate)
|
| 264 |
+
return {"status": "success", "data": processed_emg, "info": info}
|
| 265 |
+
except Exception as e:
|
| 266 |
+
return {"status": "error", "message": str(e)}
|
| 267 |
+
|
| 268 |
+
def analyze_emg(self, processed_emg, sampling_rate=100):
|
| 269 |
+
"""
|
| 270 |
+
Analyze processed EMG data using NeuroKit2's emg_analyze function.
|
| 271 |
+
|
| 272 |
+
Parameters:
|
| 273 |
+
- processed_emg: Data processed by emg_process
|
| 274 |
+
- sampling_rate: Sampling rate of the data
|
| 275 |
+
|
| 276 |
+
Returns:
|
| 277 |
+
- dict: Analysis results and status
|
| 278 |
+
"""
|
| 279 |
+
try:
|
| 280 |
+
results = emg_analyze(processed_emg, sampling_rate=sampling_rate)
|
| 281 |
+
return {"status": "success", "results": results}
|
| 282 |
+
except Exception as e:
|
| 283 |
+
return {"status": "error", "message": str(e)}
|
| 284 |
+
|
| 285 |
+
# -------------------- EOG Processing Methods --------------------
|
| 286 |
+
|
| 287 |
+
def process_eog(self, eog, sampling_rate=100):
|
| 288 |
+
"""
|
| 289 |
+
Process EOG data using NeuroKit2's eog_process function.
|
| 290 |
+
|
| 291 |
+
Parameters:
|
| 292 |
+
- eog: EOG data
|
| 293 |
+
- sampling_rate: Sampling rate of the data
|
| 294 |
+
|
| 295 |
+
Returns:
|
| 296 |
+
- dict: Processed EOG data and status
|
| 297 |
+
"""
|
| 298 |
+
try:
|
| 299 |
+
processed_eog, info = eog_process(eog, sampling_rate=sampling_rate)
|
| 300 |
+
return {"status": "success", "data": processed_eog, "info": info}
|
| 301 |
+
except Exception as e:
|
| 302 |
+
return {"status": "error", "message": str(e)}
|
| 303 |
+
|
| 304 |
+
def analyze_eog(self, processed_eog, sampling_rate=100):
|
| 305 |
+
"""
|
| 306 |
+
Analyze processed EOG data using NeuroKit2's eog_analyze function.
|
| 307 |
+
|
| 308 |
+
Parameters:
|
| 309 |
+
- processed_eog: Data processed by eog_process
|
| 310 |
+
- sampling_rate: Sampling rate of the data
|
| 311 |
+
|
| 312 |
+
Returns:
|
| 313 |
+
- dict: Analysis results and status
|
| 314 |
+
"""
|
| 315 |
+
try:
|
| 316 |
+
results = eog_analyze(processed_eog, sampling_rate=sampling_rate)
|
| 317 |
+
return {"status": "success", "results": results}
|
| 318 |
+
except Exception as e:
|
| 319 |
+
return {"status": "error", "message": str(e)}
|
| 320 |
+
|
| 321 |
+
# -------------------- HRV Analysis Methods --------------------
|
| 322 |
+
|
| 323 |
+
def analyze_hrv_frequency(self, ecg, sampling_rate=100):
|
| 324 |
+
"""
|
| 325 |
+
Analyze HRV frequency using NeuroKit2's hrv_frequency function.
|
| 326 |
+
|
| 327 |
+
Parameters:
|
| 328 |
+
- ecg: ECG data
|
| 329 |
+
- sampling_rate: Sampling rate of the data
|
| 330 |
+
|
| 331 |
+
Returns:
|
| 332 |
+
- dict: HRV frequency analysis results and status
|
| 333 |
+
"""
|
| 334 |
+
try:
|
| 335 |
+
results = hrv_frequency(ecg, sampling_rate=sampling_rate)
|
| 336 |
+
return {"status": "success", "results": results}
|
| 337 |
+
except Exception as e:
|
| 338 |
+
return {"status": "error", "message": str(e)}
|
| 339 |
+
|
| 340 |
+
def analyze_hrv_nonlinear(self, ecg, sampling_rate=100):
|
| 341 |
+
"""
|
| 342 |
+
Analyze HRV nonlinear using NeuroKit2's hrv_nonlinear function.
|
| 343 |
+
|
| 344 |
+
Parameters:
|
| 345 |
+
- ecg: ECG data
|
| 346 |
+
- sampling_rate: Sampling rate of the data
|
| 347 |
+
|
| 348 |
+
Returns:
|
| 349 |
+
- dict: HRV nonlinear analysis results and status
|
| 350 |
+
"""
|
| 351 |
+
try:
|
| 352 |
+
results = hrv_nonlinear(ecg, sampling_rate=sampling_rate)
|
| 353 |
+
return {"status": "success", "results": results}
|
| 354 |
+
except Exception as e:
|
| 355 |
+
return {"status": "error", "message": str(e)}
|
NeuroKit/mcp_output/mcp_plugin/main.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
MCP Service Auto-Wrapper - Auto-generated
|
| 3 |
+
"""
|
| 4 |
+
from mcp_service import create_app
|
| 5 |
+
|
| 6 |
+
def main():
|
| 7 |
+
"""Main entry point"""
|
| 8 |
+
app = create_app()
|
| 9 |
+
return app
|
| 10 |
+
|
| 11 |
+
if __name__ == "__main__":
|
| 12 |
+
app = main()
|
| 13 |
+
app.run()
|
NeuroKit/mcp_output/mcp_plugin/mcp_service.py
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
|
| 4 |
+
# Path settings to include the local source directory
|
| 5 |
+
source_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "source")
|
| 6 |
+
if source_path not in sys.path:
|
| 7 |
+
sys.path.insert(0, source_path)
|
| 8 |
+
|
| 9 |
+
from fastmcp import FastMCP
|
| 10 |
+
import neurokit2 as nk
|
| 11 |
+
|
| 12 |
+
# Create the FastMCP service application
|
| 13 |
+
mcp = FastMCP("neurokit_service")
|
| 14 |
+
|
| 15 |
+
@mcp.tool(name="ecg_process", description="Process ECG data")
|
| 16 |
+
def ecg_process(ecg_data: list, sampling_rate: int) -> dict:
|
| 17 |
+
"""
|
| 18 |
+
Process ECG data using NeuroKit2's ecg_process function.
|
| 19 |
+
|
| 20 |
+
Parameters:
|
| 21 |
+
- ecg_data: list of ECG signal values
|
| 22 |
+
- sampling_rate: int, the sampling rate of the ECG data
|
| 23 |
+
|
| 24 |
+
Returns:
|
| 25 |
+
- dict: Contains success, result, and error fields
|
| 26 |
+
"""
|
| 27 |
+
try:
|
| 28 |
+
processed_data, info = nk.ecg_process(ecg=ecg_data, sampling_rate=sampling_rate)
|
| 29 |
+
return {"success": True, "result": {"processed_data": processed_data, "info": info}, "error": None}
|
| 30 |
+
except Exception as e:
|
| 31 |
+
return {"success": False, "result": None, "error": str(e)}
|
| 32 |
+
|
| 33 |
+
@mcp.tool(name="rsp_process", description="Process respiration data")
|
| 34 |
+
def rsp_process(rsp_data: list, sampling_rate: int) -> dict:
|
| 35 |
+
"""
|
| 36 |
+
Process respiration data using NeuroKit2's rsp_process function.
|
| 37 |
+
|
| 38 |
+
Parameters:
|
| 39 |
+
- rsp_data: list of respiration signal values
|
| 40 |
+
- sampling_rate: int, the sampling rate of the respiration data
|
| 41 |
+
|
| 42 |
+
Returns:
|
| 43 |
+
- dict: Contains success, result, and error fields
|
| 44 |
+
"""
|
| 45 |
+
try:
|
| 46 |
+
processed_data, info = nk.rsp_process(rsp=rsp_data, sampling_rate=sampling_rate)
|
| 47 |
+
return {"success": True, "result": {"processed_data": processed_data, "info": info}, "error": None}
|
| 48 |
+
except Exception as e:
|
| 49 |
+
return {"success": False, "result": None, "error": str(e)}
|
| 50 |
+
|
| 51 |
+
@mcp.tool(name="eda_process", description="Process EDA data")
|
| 52 |
+
def eda_process(eda_data: list, sampling_rate: int) -> dict:
|
| 53 |
+
"""
|
| 54 |
+
Process EDA data using NeuroKit2's eda_process function.
|
| 55 |
+
|
| 56 |
+
Parameters:
|
| 57 |
+
- eda_data: list of EDA signal values
|
| 58 |
+
- sampling_rate: int, the sampling rate of the EDA data
|
| 59 |
+
|
| 60 |
+
Returns:
|
| 61 |
+
- dict: Contains success, result, and error fields
|
| 62 |
+
"""
|
| 63 |
+
try:
|
| 64 |
+
processed_data, info = nk.eda_process(eda=eda_data, sampling_rate=sampling_rate)
|
| 65 |
+
return {"success": True, "result": {"processed_data": processed_data, "info": info}, "error": None}
|
| 66 |
+
except Exception as e:
|
| 67 |
+
return {"success": False, "result": None, "error": str(e)}
|
| 68 |
+
|
| 69 |
+
def create_app() -> FastMCP:
|
| 70 |
+
"""
|
| 71 |
+
Create and return the FastMCP application instance.
|
| 72 |
+
|
| 73 |
+
Returns:
|
| 74 |
+
- FastMCP: The configured FastMCP instance
|
| 75 |
+
"""
|
| 76 |
+
return mcp
|
NeuroKit/mcp_output/requirements.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
fastapi
|
| 3 |
+
uvicorn[standard]
|
| 4 |
+
pydantic>=2.0.0
|
| 5 |
+
numpy
|
| 6 |
+
scipy
|
| 7 |
+
pandas
|
| 8 |
+
matplotlib
|
| 9 |
+
mne
|
| 10 |
+
biosppy
|
NeuroKit/mcp_output/start_mcp.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
"""
|
| 3 |
+
MCP Service Startup Entry
|
| 4 |
+
"""
|
| 5 |
+
import sys
|
| 6 |
+
import os
|
| 7 |
+
|
| 8 |
+
project_root = os.path.dirname(os.path.abspath(__file__))
|
| 9 |
+
mcp_plugin_dir = os.path.join(project_root, "mcp_plugin")
|
| 10 |
+
if mcp_plugin_dir not in sys.path:
|
| 11 |
+
sys.path.insert(0, mcp_plugin_dir)
|
| 12 |
+
|
| 13 |
+
from mcp_service import create_app
|
| 14 |
+
|
| 15 |
+
def main():
|
| 16 |
+
"""Start FastMCP service"""
|
| 17 |
+
app = create_app()
|
| 18 |
+
# Use environment variable to configure port, default 8000
|
| 19 |
+
port = int(os.environ.get("MCP_PORT", "8000"))
|
| 20 |
+
|
| 21 |
+
# Choose transport mode based on environment variable
|
| 22 |
+
transport = os.environ.get("MCP_TRANSPORT", "stdio")
|
| 23 |
+
if transport == "http":
|
| 24 |
+
app.run(transport="http", host="0.0.0.0", port=port)
|
| 25 |
+
else:
|
| 26 |
+
# Default to STDIO mode
|
| 27 |
+
app.run()
|
| 28 |
+
|
| 29 |
+
if __name__ == "__main__":
|
| 30 |
+
main()
|
NeuroKit/mcp_output/workflow_summary.json
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository": {
|
| 3 |
+
"name": "NeuroKit",
|
| 4 |
+
"url": "https://github.com/neuropsychology/NeuroKit",
|
| 5 |
+
"local_path": "/export/zxcpu1/shiweijie/code/ghh/Code2MCP/workspace/NeuroKit",
|
| 6 |
+
"description": "Python library",
|
| 7 |
+
"features": "Basic functionality",
|
| 8 |
+
"tech_stack": "Python",
|
| 9 |
+
"stars": 0,
|
| 10 |
+
"forks": 0,
|
| 11 |
+
"language": "Python",
|
| 12 |
+
"last_updated": "",
|
| 13 |
+
"complexity": "medium",
|
| 14 |
+
"intrusiveness_risk": "low"
|
| 15 |
+
},
|
| 16 |
+
"execution": {
|
| 17 |
+
"start_time": 1769752559.096556,
|
| 18 |
+
"end_time": 1769753098.6671715,
|
| 19 |
+
"duration": 539.5706160068512,
|
| 20 |
+
"status": "success",
|
| 21 |
+
"workflow_status": "success",
|
| 22 |
+
"nodes_executed": [
|
| 23 |
+
"download",
|
| 24 |
+
"analysis",
|
| 25 |
+
"env",
|
| 26 |
+
"generate",
|
| 27 |
+
"run",
|
| 28 |
+
"review",
|
| 29 |
+
"finalize"
|
| 30 |
+
],
|
| 31 |
+
"total_files_processed": 22,
|
| 32 |
+
"environment_type": "unknown",
|
| 33 |
+
"llm_calls": 0,
|
| 34 |
+
"deepwiki_calls": 0
|
| 35 |
+
},
|
| 36 |
+
"tests": {
|
| 37 |
+
"original_project": {
|
| 38 |
+
"passed": false,
|
| 39 |
+
"details": {},
|
| 40 |
+
"test_coverage": "100%",
|
| 41 |
+
"execution_time": 0,
|
| 42 |
+
"test_files": []
|
| 43 |
+
},
|
| 44 |
+
"mcp_plugin": {
|
| 45 |
+
"passed": true,
|
| 46 |
+
"details": {},
|
| 47 |
+
"service_health": "healthy",
|
| 48 |
+
"startup_time": 0,
|
| 49 |
+
"transport_mode": "stdio",
|
| 50 |
+
"fastmcp_version": "unknown",
|
| 51 |
+
"mcp_version": "unknown"
|
| 52 |
+
}
|
| 53 |
+
},
|
| 54 |
+
"analysis": {
|
| 55 |
+
"structure": {
|
| 56 |
+
"packages": [
|
| 57 |
+
"source.neurokit2",
|
| 58 |
+
"source.neurokit2.benchmark",
|
| 59 |
+
"source.neurokit2.bio",
|
| 60 |
+
"source.neurokit2.complexity",
|
| 61 |
+
"source.neurokit2.data",
|
| 62 |
+
"source.neurokit2.ecg",
|
| 63 |
+
"source.neurokit2.eda",
|
| 64 |
+
"source.neurokit2.eeg",
|
| 65 |
+
"source.neurokit2.emg",
|
| 66 |
+
"source.neurokit2.eog",
|
| 67 |
+
"source.neurokit2.epochs",
|
| 68 |
+
"source.neurokit2.events",
|
| 69 |
+
"source.neurokit2.hrv",
|
| 70 |
+
"source.neurokit2.markov",
|
| 71 |
+
"source.neurokit2.microstates",
|
| 72 |
+
"source.neurokit2.misc",
|
| 73 |
+
"source.neurokit2.ppg",
|
| 74 |
+
"source.neurokit2.rsp",
|
| 75 |
+
"source.neurokit2.signal",
|
| 76 |
+
"source.neurokit2.stats",
|
| 77 |
+
"source.neurokit2.video",
|
| 78 |
+
"source.tests"
|
| 79 |
+
]
|
| 80 |
+
},
|
| 81 |
+
"dependencies": {
|
| 82 |
+
"has_environment_yml": false,
|
| 83 |
+
"has_requirements_txt": false,
|
| 84 |
+
"pyproject": true,
|
| 85 |
+
"setup_cfg": true,
|
| 86 |
+
"setup_py": true
|
| 87 |
+
},
|
| 88 |
+
"entry_points": {
|
| 89 |
+
"imports": [],
|
| 90 |
+
"cli": [],
|
| 91 |
+
"modules": []
|
| 92 |
+
},
|
| 93 |
+
"risk_assessment": {
|
| 94 |
+
"import_feasibility": 0.9,
|
| 95 |
+
"intrusiveness_risk": "low",
|
| 96 |
+
"complexity": "medium"
|
| 97 |
+
},
|
| 98 |
+
"deepwiki_analysis": {
|
| 99 |
+
"repo_url": "https://github.com/neuropsychology/NeuroKit",
|
| 100 |
+
"repo_name": "NeuroKit",
|
| 101 |
+
"content": "neuropsychology/NeuroKit\nBiosignal Processing\nECG Processing\nRespiration Processing\nEDA Processing\nOther Biosignals\nSignal Processing Core\nPeak Detection and Correction\nSpectral Analysis\nSignal Simulation\nAdvanced Analysis\nHeart Rate Variability\nComplexity Analysis\nEvent-Related Analysis\nMicrostates Analysis\nClustering and Statistical Analysis\nDeveloper Guide\nContributing\nDocumentation System\nTesting Framework\n.editorconfig\nCITATION.cff\nneurokit2/__init__.py\nneurokit2/ecg/__init__.py\nneurokit2/signal/__init__.py\nPurpose and Scope\nNeuroKit2 is a comprehensive Python toolbox designed for neurophysiological signal processing and analysis. It provides researchers and clinicians with user-friendly access to advanced biosignal processing routines, enabling the analysis of physiological data with minimal coding requirements. This page provides a high-level overview of the system architecture, components, and capabilities of NeuroKit2.\nFor specific information about biosignal processing modules, seeBiosignal Processing. For details on core signal processing functionality, seeSignal Processing Core. For advanced analysis methods, refer toAdvanced Analysis.\nSources:README.rst22-26neurokit2/__init__.py1-34\nArchitecture Overview\nNeuroKit2 follows a modular design pattern with several key components that work together to process and analyze neurophysiological signals.\nAnalysis MethodsBiosignal ProcessingCore FoundationSignal Processing ToolkitSignal SimulationECG ModuleRespiration ModuleEDA ModuleEMG ModuleEOG ModuleEEG ModulePPG ModuleHeart Rate VariabilityComplexity AnalysisEvent-related AnalysisMicrostates AnalysisStatistical Tools\nAnalysis Methods\nBiosignal Processing\nCore Foundation\nSignal Processing Toolkit\nSignal Simulation\nRespiration Module\nHeart Rate Variability\nComplexity Analysis\nEvent-related Analysis\nMicrostates Analysis\nStatistical Tools\nSources:README.rst204-594neurokit2/__init__.py14-32\nSignal Processing Core\nThe signal processing toolkit forms the foundation of NeuroKit2. It provides a comprehensive set of functions for manipulating, analyzing, and visualizing time series data.\nSources:neurokit2/signal/__init__.py1-64\nKey Signal Processing Capabilities\nsignal_filter\nsignal_detrend\nsignal_findpeaks\nsignal_fixpeaks\nsignal_timefrequency\nsignal_decompose\nsignal_recompose\nsignal_simulate\nsignal_interpolate\nsignal_plot\nSources:neurokit2/signal/__init__.py33-64README.rst476-482\nBiosignal Processing\nNeuroKit2 supports the processing and analysis of various physiological signals. Each signal type has dedicated modules with specialized functions.\nSupported BiosignalsBiosignal Processing PipelineRaw Signal*_clean()*_findpeaks()*_peaks()*_process()*_analyze()ECG (electrocardiogram)PPG (photoplethysmogram)RSP (respiration)EDA (electrodermal activity)EMG (electromyography)EOG (electrooculography)EEG (electroencephalography)*_eventrelated()*_intervalrelated()\nSupported Biosignals\nBiosignal Processing Pipeline\n*_findpeaks()\n*_process()\n*_analyze()\nECG (electrocardiogram)\nPPG (photoplethysmogram)\nRSP (respiration)\nEDA (electrodermal activity)\nEMG (electromyography)\nEOG (electrooculography)\nEEG (electroencephalography)\n*_eventrelated()\n*_intervalrelated()\nSources:neurokit2/ecg/__init__.py1-38README.rst204-347\nKey Biosignal Modules\necg_process\necg_delineate\nrsp_process\neda_process\nemg_process\neog_process\nppg_process\neeg_process\nSources:README.rst256-347\nAnalysis Methods\nNeuroKit2 provides advanced analysis methods that build upon the processed biosignals.\nHeart Rate Variability (HRV)\nHeart Rate Variability analysis is a key feature of NeuroKit2, offering comprehensive metrics across multiple domains:\nhrv_frequency\nhrv_nonlinear\nSources:README.rst400-445\nEvent-Related and Interval-Related Analysis\nNeuroKit2 provides two primary approaches to analyzing physiological data:\nEvent-Related Analysis: Examines physiological changes in response to specific time-locked events\nInterval-Related Analysis: Analyzes physiological characteristics over longer periods\nFunctionsAnalysis TypesEvent-related AnalysisInterval-related Analysisbio_process()bio_analyze()\nAnalysis Types\nEvent-related Analysis\nInterval-related Analysis\nbio_process()\nbio_analyze()\nSources:README.rst356-397\nGetting Started\nNeuroKit2 is designed to be user-friendly, allowing researchers to analyze physiological data with minimal code.\nBasic usage example:\nimportneurokit2asnk# Download example datadata = nk.data(\"bio_eventrelated_100hz\")# Preprocess the data (filter, find peaks, etc.)processed_data, info = nk.bio_process(ecg=data[\"ECG\"], rsp=data[\"RSP\"], eda=data[\"EDA\"], sampling_rate=100)# Compute relevant featuresresults = nk.bio_analyze(processed_data, sampling_rate=100)\nimportneurokit2asnk# Download example datadata = nk.data(\"bio_eventrelated_100hz\")# Preprocess the data (filter, find peaks, etc.)processed_data, info = nk.bio_process(ecg=data[\"ECG\"], rsp=data[\"RSP\"], eda=data[\"EDA\"], sampling_rate=100)# Compute relevant featuresresults = nk.bio_analyze(processed_data, sampling_rate=100)\nimportneurokit2asnk# Download example datadata = nk.data(\"bio_eventrelated_100hz\")# Preprocess the data (filter, find peaks, etc.)processed_data, info = nk.bio_process(ecg=data[\"ECG\"], rsp=data[\"RSP\"], eda=data[\"EDA\"], sampling_rate=100)# Compute relevant featuresresults = nk.bio_analyze(processed_data, sampling_rate=100)\nSources:README.rst29-46\nInstallation\nNeuroKit2 can be installed via pip or conda:\npip install neurokit2\npip install neurokit2\nconda install -c conda-forge neurokit2\nconda install -c conda-forge neurokit2\nSources:README.rst48-63\nLicense and Citation\nNeuroKit2 is licensed under the MIT License and can be cited as follows:\nMakowski, D., Pham, T., Lau, Z. J., Brammer, J. C., Lespinasse, F., Pham, H., \nSchölzel, C., & Chen, S. A. (2021). NeuroKit2: A Python toolbox for neurophysiological signal processing. \nBehavior Research Methods, 53(4), 1689-1696. https://doi.org/10.3758/s13428-020-01516-y\nMakowski, D., Pham, T., Lau, Z. J., Brammer, J. C., Lespinasse, F., Pham, H., \nSchölzel, C., & Chen, S. A. (2021). NeuroKit2: A Python toolbox for neurophysiological signal processing. \nBehavior Research Methods, 53(4), 1689-1696. https://doi.org/10.3758/s13428-020-01516-y\nSources:LICENSE1-22CITATION.cff1-46neurokit2/__init__.py45-73\nRefresh this wiki\nOn this page\nPurpose and Scope\nArchitecture Overview\nSignal Processing Core\nKey Signal Processing Capabilities\nBiosignal Processing\nKey Biosignal Modules\nAnalysis Methods\nHeart Rate Variability (HRV)\nEvent-Related and Interval-Related Analysis\nGetting Started\nInstallation\nLicense and Citation",
|
| 102 |
+
"model": "gpt-4o-2024-08-06",
|
| 103 |
+
"source": "selenium",
|
| 104 |
+
"success": true
|
| 105 |
+
},
|
| 106 |
+
"code_complexity": {
|
| 107 |
+
"cyclomatic_complexity": "medium",
|
| 108 |
+
"cognitive_complexity": "medium",
|
| 109 |
+
"maintainability_index": 75
|
| 110 |
+
},
|
| 111 |
+
"security_analysis": {
|
| 112 |
+
"vulnerabilities_found": 0,
|
| 113 |
+
"security_score": 85,
|
| 114 |
+
"recommendations": []
|
| 115 |
+
}
|
| 116 |
+
},
|
| 117 |
+
"plugin_generation": {
|
| 118 |
+
"files_created": [
|
| 119 |
+
"mcp_output/start_mcp.py",
|
| 120 |
+
"mcp_output/mcp_plugin/__init__.py",
|
| 121 |
+
"mcp_output/mcp_plugin/mcp_service.py",
|
| 122 |
+
"mcp_output/mcp_plugin/adapter.py",
|
| 123 |
+
"mcp_output/mcp_plugin/main.py",
|
| 124 |
+
"mcp_output/requirements.txt",
|
| 125 |
+
"mcp_output/README_MCP.md"
|
| 126 |
+
],
|
| 127 |
+
"main_entry": "start_mcp.py",
|
| 128 |
+
"requirements": [
|
| 129 |
+
"fastmcp>=0.1.0",
|
| 130 |
+
"pydantic>=2.0.0"
|
| 131 |
+
],
|
| 132 |
+
"readme_path": "/export/zxcpu1/shiweijie/code/ghh/Code2MCP/workspace/NeuroKit/mcp_output/README_MCP.md",
|
| 133 |
+
"adapter_mode": "import",
|
| 134 |
+
"total_lines_of_code": 0,
|
| 135 |
+
"generated_files_size": 0,
|
| 136 |
+
"tool_endpoints": 0,
|
| 137 |
+
"supported_features": [
|
| 138 |
+
"Basic functionality"
|
| 139 |
+
],
|
| 140 |
+
"generated_tools": [
|
| 141 |
+
"Basic tools",
|
| 142 |
+
"Health check tools",
|
| 143 |
+
"Version info tools"
|
| 144 |
+
]
|
| 145 |
+
},
|
| 146 |
+
"code_review": {},
|
| 147 |
+
"errors": [],
|
| 148 |
+
"warnings": [],
|
| 149 |
+
"recommendations": [
|
| 150 |
+
"Improve test coverage by adding more unit tests",
|
| 151 |
+
"Ensure all dependencies are clearly documented and up-to-date",
|
| 152 |
+
"Implement continuous integration to automate testing",
|
| 153 |
+
"Optimize large files for better performance",
|
| 154 |
+
"Enhance documentation for better user understanding",
|
| 155 |
+
"Review and refactor complex code for maintainability",
|
| 156 |
+
"Ensure consistent coding style across the project",
|
| 157 |
+
"Add examples and tutorials to demonstrate usage",
|
| 158 |
+
"Regularly update the README with the latest project information",
|
| 159 |
+
"Conduct a security audit to identify potential vulnerabilities."
|
| 160 |
+
],
|
| 161 |
+
"performance_metrics": {
|
| 162 |
+
"memory_usage_mb": 0,
|
| 163 |
+
"cpu_usage_percent": 0,
|
| 164 |
+
"response_time_ms": 0,
|
| 165 |
+
"throughput_requests_per_second": 0
|
| 166 |
+
},
|
| 167 |
+
"deployment_info": {
|
| 168 |
+
"supported_platforms": [
|
| 169 |
+
"Linux",
|
| 170 |
+
"Windows",
|
| 171 |
+
"macOS"
|
| 172 |
+
],
|
| 173 |
+
"python_versions": [
|
| 174 |
+
"3.8",
|
| 175 |
+
"3.9",
|
| 176 |
+
"3.10",
|
| 177 |
+
"3.11",
|
| 178 |
+
"3.12"
|
| 179 |
+
],
|
| 180 |
+
"deployment_methods": [
|
| 181 |
+
"Docker",
|
| 182 |
+
"pip",
|
| 183 |
+
"conda"
|
| 184 |
+
],
|
| 185 |
+
"monitoring_support": true,
|
| 186 |
+
"logging_configuration": "structured"
|
| 187 |
+
},
|
| 188 |
+
"execution_analysis": {
|
| 189 |
+
"success_factors": [
|
| 190 |
+
"Comprehensive modular design of the NeuroKit repository",
|
| 191 |
+
"Successful execution of all workflow nodes without errors"
|
| 192 |
+
],
|
| 193 |
+
"failure_reasons": [],
|
| 194 |
+
"overall_assessment": "excellent",
|
| 195 |
+
"node_performance": {
|
| 196 |
+
"download_time": "Efficient download and setup of the repository",
|
| 197 |
+
"analysis_time": "Thorough analysis completed within expected duration",
|
| 198 |
+
"generation_time": "Code generation was swift and error-free",
|
| 199 |
+
"test_time": "Testing was completed successfully, though original project tests did not pass"
|
| 200 |
+
},
|
| 201 |
+
"resource_usage": {
|
| 202 |
+
"memory_efficiency": "Memory usage was not explicitly measured, but no issues reported",
|
| 203 |
+
"cpu_efficiency": "CPU usage was not explicitly measured, but no issues reported",
|
| 204 |
+
"disk_usage": "Disk usage was efficient given the medium complexity of the project"
|
| 205 |
+
}
|
| 206 |
+
},
|
| 207 |
+
"technical_quality": {
|
| 208 |
+
"code_quality_score": 85,
|
| 209 |
+
"architecture_score": 90,
|
| 210 |
+
"performance_score": 80,
|
| 211 |
+
"maintainability_score": 75,
|
| 212 |
+
"security_score": 85,
|
| 213 |
+
"scalability_score": 80
|
| 214 |
+
}
|
| 215 |
+
}
|
NeuroKit/source/.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
NeuroKit/source/.binder/requirements.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
neurokit2
|
| 2 |
+
pandas
|
| 3 |
+
matplotlib
|
| 4 |
+
seaborn
|
| 5 |
+
numpy
|
| 6 |
+
pywavelets
|
NeuroKit/source/.coveragerc
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[report]
|
| 2 |
+
fail_under = 50
|
| 3 |
+
show_missing = True
|
| 4 |
+
|
| 5 |
+
[run]
|
| 6 |
+
parallel=true
|
| 7 |
+
omit = *tests*
|
NeuroKit/source/.editorconfig
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# http://editorconfig.org
|
| 2 |
+
|
| 3 |
+
root = true
|
| 4 |
+
|
| 5 |
+
[*]
|
| 6 |
+
indent_style = space
|
| 7 |
+
indent_size = 4
|
| 8 |
+
trim_trailing_whitespace = true
|
| 9 |
+
insert_final_newline = true
|
| 10 |
+
charset = utf-8
|
| 11 |
+
end_of_line = lf
|
| 12 |
+
|
| 13 |
+
[*.bat]
|
| 14 |
+
indent_style = tab
|
| 15 |
+
end_of_line = crlf
|
| 16 |
+
|
| 17 |
+
[LICENSE]
|
| 18 |
+
insert_final_newline = false
|
| 19 |
+
|
| 20 |
+
[Makefile]
|
| 21 |
+
indent_style = tab
|
NeuroKit/source/AUTHORS.rst
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Authors
|
| 2 |
+
=======
|
| 3 |
+
|
| 4 |
+
.. hint::
|
| 5 |
+
Want to be a part of the project? Read how to `contribute and join us <https://neuropsychology.github.io/NeuroKit/resources/contributing.html>`_!
|
| 6 |
+
|
| 7 |
+
The full log of contributors is available on `GitHub <https://github.com/neuropsychology/NeuroKit/graphs/contributors>`_.
|
| 8 |
+
|
| 9 |
+
Current maintainers
|
| 10 |
+
-------------------
|
| 11 |
+
|
| 12 |
+
* `Dominique Makowski <https://github.com/DominiqueMakowski>`_ *(Nanyang Technological University, Singapore)*
|
| 13 |
+
* `Danielle Benesch <https://github.com/danibene>`_ *(École de technologie supérieure, Canada)*
|
| 14 |
+
* `An Shu Te <https://github.com/anshu-97>`_ *(Nanyang Technological University, Singapore)*
|
| 15 |
+
* `Max Ngoi Zi Liang <https://github.com/Max-ZiLiang>`_ *(Nanyang Technological University, Singapore)*
|
| 16 |
+
* `Johannes Herforth <https://github.com/DerAndereJohannes>`_ *(University of Luxembourg, Luxembourg)*
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
Core contributors
|
| 20 |
+
------------------
|
| 21 |
+
|
| 22 |
+
* `Tam Pham <https://github.com/Tam-Pham>`_ *(Nanyang Technological University, Singapore)*
|
| 23 |
+
* `Zen Juen Lau <https://github.com/zen-juen>`_ *(Nanyang Technological University, Singapore)*
|
| 24 |
+
* `Jan C. Brammer <https://github.com/JanCBrammer>`_ *(Radboud University, Netherlands)*
|
| 25 |
+
* `François Lespinasse <https://github.com/sangfrois>`_ *(Université de Montréal, Canada)*
|
| 26 |
+
|
| 27 |
+
.. note::
|
| 28 |
+
We might sometimes update the categories, order of display, etc., and we won't necessarily notify each contributor every time. However, if you are for any reasons unsatisfied with the list, or your position in it, please do let us know!
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
Contributors
|
| 32 |
+
-------------
|
| 33 |
+
|
| 34 |
+
* `Gansheng Tan <https://github.com/GanshengT>`_ *(Washington University, USA)*
|
| 35 |
+
* `Hung Pham <https://github.com/hungpham2511>`_ *(Eureka Robotics, Singapore)*
|
| 36 |
+
* `Christopher Schölzel <https://github.com/CSchoel>`_ *(THM University of Applied Sciences, Germany)*
|
| 37 |
+
* `Duy Le <https://github.com/duylp>`_ *(Hubble, Singapore)*
|
| 38 |
+
* `Leonardo Rydin Gorjão <https://github.com/lrydin>`_ *(OsloMet, Norway)*
|
| 39 |
+
* `Alexander Wong <https://github.com/awwong1>`_ *(University of Alberta, Canada)*
|
| 40 |
+
* `Pierre Elias <https://twitter.com/pierreeliasmd>`_ *(Columbia University, USA)*
|
| 41 |
+
* `Jukka Zitting <https://github.com/jukka>`_
|
| 42 |
+
* `Stavros Avramidis <https://github.com/purpl3F0x>`_
|
| 43 |
+
* `Tiago Rodrigues <https://github.com/TiagoTostas>`_ *(IST, Lisbon)*
|
| 44 |
+
* `Mitchell Bishop <https://github.com/Mitchellb16>`_ *(NINDS, USA)*
|
| 45 |
+
* `Robert Richer <https://github.com/richrobe>`_ *(FAU Erlangen-Nürnberg, Germany)*
|
| 46 |
+
* `Russell Anderson <https://github.com/rpanderson>`_ *(La Trobe Institute for Molecular Science, Australia)*
|
| 47 |
+
* `Elaine Teo <https://github.com/elaineteo2000>`_ *(University College London)*
|
| 48 |
+
* `Raimon Padrós <https://github.com/raimonpv>`_ *(Universitat politècnica de Catalunya, Spain - Massachusetts General Hospital, USA)*
|
| 49 |
+
* `Minsoo Yeo <https://github.com/minsooyeo>`_ *(Taewoong Medical Co., Ltd., ROK)*
|
| 50 |
+
* `Celal Savur <https://github.com/csavur>`_ *(Rochester Institute of Technology, USA)*
|
| 51 |
+
* `Jacob Epifano <https://github.com/jrepifano>`_ *(Rowan University - Children's Hospital of Philadelphia, USA)*
|
| 52 |
+
* `Patryk Wielopolski <https://github.com/pfilo8>`_ *(Wrocław University of Science and Technology, Poland)*
|
| 53 |
+
* `Jannik Gut <https://github.com/rostro36>`_
|
| 54 |
+
* `Nattapong Thammasan <https://github.com/Nattapong-OnePlanet>`_ *(OnePlanet, Netherlands)*
|
| 55 |
+
* `Marek Sokol <https://github.com/sokolmarek>`_ *(Faculty of Biomedical Engineering of the CTU in Prague, Czech Republic)*
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
Thanks also to `Chuan-Peng Hu <https://github.com/hcp4715>`_, `@ucohen <https://github.com/ucohen>`_, `Anthony Gatti <https://github.com/gattia>`_, `Julien Lamour <https://github.com/lamourj>`_, `@renatosc <https://github.com/renatosc>`_, `Nicolas Beaudoin-Gagnon <https://github.com/Fegalf>`_ and `@rubinovitz <https://github.com/rubinovitz>`_ for their contribution in `NeuroKit 1 <https://github.com/neuropsychology/NeuroKit.py>`_.
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
.. seealso::
|
| 63 |
+
|
| 64 |
+
Information about **how to cite** the software in publications can be found `here <https://neuropsychology.github.io/NeuroKit/cite_us.html>`_.
|
| 65 |
+
|
NeuroKit/source/CITATION.cff
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
cff-version: 1.2.0
|
| 2 |
+
message: "If you use this software, please cite it as below."
|
| 3 |
+
authors:
|
| 4 |
+
- family-names: "Makowski"
|
| 5 |
+
given-names: "Dominique"
|
| 6 |
+
orcid: "https://orcid.org/0000-0001-5375-9967"
|
| 7 |
+
- family-names: "Pham"
|
| 8 |
+
given-names: "Tam"
|
| 9 |
+
- family-names: "Lau"
|
| 10 |
+
given-names: "Zen J."
|
| 11 |
+
- family-names: "Brammer"
|
| 12 |
+
given-names: "Jan C."
|
| 13 |
+
title: "NeuroKit2: The Python Toolbox for Neurophysiological Signal Processing"
|
| 14 |
+
version: 0.1.6
|
| 15 |
+
doi: 10.3758/s13428-020-01516-y
|
| 16 |
+
date-released: 2021-02-02
|
| 17 |
+
url: "https://github.com/neuropsychology/NeuroKit"
|
| 18 |
+
preferred-citation:
|
| 19 |
+
type: article
|
| 20 |
+
authors:
|
| 21 |
+
- family-names: "Makowski"
|
| 22 |
+
given-names: "Dominique"
|
| 23 |
+
orcid: "https://orcid.org/0000-0001-5375-9967"
|
| 24 |
+
- family-names: "Pham"
|
| 25 |
+
given-names: "Tam"
|
| 26 |
+
- family-names: "Lau"
|
| 27 |
+
given-names: "Zen J."
|
| 28 |
+
- family-names: "Brammer"
|
| 29 |
+
given-names: "Jan C."
|
| 30 |
+
- family-names: "Lespinasse"
|
| 31 |
+
given-names: "François"
|
| 32 |
+
- family-names: "Pham"
|
| 33 |
+
given-names: "Hung"
|
| 34 |
+
- family-names: "Schölzel"
|
| 35 |
+
given-names: "Christopher"
|
| 36 |
+
- family-names: "Chen"
|
| 37 |
+
given-names: "S. H. Annabel"
|
| 38 |
+
doi: "10.3758/s13428-020-01516-y"
|
| 39 |
+
journal: "Behavior Research Methods"
|
| 40 |
+
month: 2
|
| 41 |
+
start: 1689 # First page number
|
| 42 |
+
end: 1696 # Last page number
|
| 43 |
+
title: "NeuroKit2: A Python toolbox for neurophysiological signal processing"
|
| 44 |
+
issue: 4
|
| 45 |
+
volume: 53
|
| 46 |
+
year: 2021
|
NeuroKit/source/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2020, Dominique Makowski
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
| 22 |
+
|
NeuroKit/source/MANIFEST.in
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
include AUTHORS.rst
|
| 2 |
+
include CONTRIBUTING.rst
|
| 3 |
+
include NEWS.rst
|
| 4 |
+
include LICENSE
|
| 5 |
+
include README.rst
|
| 6 |
+
|
| 7 |
+
recursive-exclude tests *
|
| 8 |
+
recursive-exclude * __pycache__
|
| 9 |
+
recursive-exclude * *.py[co]
|
| 10 |
+
|
| 11 |
+
recursive-include docs *.rst conf.py *.jpg *.png *.gif
|
| 12 |
+
|
NeuroKit/source/NEWS.rst
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
News
|
| 2 |
+
=====
|
| 3 |
+
|
| 4 |
+
0.2.8
|
| 5 |
+
-------------------
|
| 6 |
+
New Features
|
| 7 |
+
+++++++++++++
|
| 8 |
+
|
| 9 |
+
* New feature `events_find()`: is now able to combine multiple digital input channels,
|
| 10 |
+
retrieve events from the combined events channel and differentiate between the inputs that
|
| 11 |
+
occur simultaneously.
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
0.2.4
|
| 16 |
+
-------------------
|
| 17 |
+
Fixes
|
| 18 |
+
+++++++++++++
|
| 19 |
+
|
| 20 |
+
* `eda_sympathetic()` has been reviewed: low-pass filter and resampling have been added to be in
|
| 21 |
+
line with the original paper
|
| 22 |
+
* `eda_findpeaks()` using methods proposed in nabian2018 is reviewed and improved. Differentiation
|
| 23 |
+
has been added before smoothing. Skin conductance response criteria have been revised based on
|
| 24 |
+
the original paper.
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
0.2.1
|
| 29 |
+
-------------------
|
| 30 |
+
New Features
|
| 31 |
+
+++++++++++++
|
| 32 |
+
|
| 33 |
+
* Allow for input with NaNs and extrapolation in `signal_interpolate()`
|
| 34 |
+
* Add argument `method` in `find_outliers()`
|
| 35 |
+
* A lot (see https://github.com/neuropsychology/NeuroKit/pull/645)
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
0.2.0
|
| 41 |
+
-------------------
|
| 42 |
+
New Features
|
| 43 |
+
+++++++++++++
|
| 44 |
+
|
| 45 |
+
* Add new time-domain measures in `hrv_time()`: `Prc20NN`, `Prc80NN`, `MinNN`, and `MaxNN`
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
0.1.6
|
| 52 |
+
-------------------
|
| 53 |
+
|
| 54 |
+
Breaking Changes
|
| 55 |
+
+++++++++++++++++
|
| 56 |
+
|
| 57 |
+
* Argument `type` changed to `out` in `expspace()`
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
New Features
|
| 61 |
+
+++++++++++++
|
| 62 |
+
|
| 63 |
+
* Add new time-domain measures in `hrv_time()`: `Prc20NN`, `Prc80NN`, `MinNN`, and `MaxNN`
|
| 64 |
+
* Allow `fix_peaks()` to account for larger intervals
|
| 65 |
+
|
| 66 |
+
Fixes
|
| 67 |
+
+++++++++++++
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
0.1.5
|
| 74 |
+
-------------------
|
| 75 |
+
|
| 76 |
+
Breaking Changes
|
| 77 |
+
+++++++++++++++++
|
| 78 |
+
|
| 79 |
+
* Argument `r` changed to `radius` in `fractal_correlation()`
|
| 80 |
+
* Argument `r` changed to `tolerance` in entropy and complexity utility functions
|
| 81 |
+
* Argument `r_method` changed to `tolerance_method` in `complexity_optimize()`
|
| 82 |
+
* `complexity_lempelziv()`, `fractal_higuchi()`, `fractal_katz()`, `fractal_correlation()`, `fractal_dfa()`, `entropy_multiscale()`, `entropy_shannon()`, `entropy_approximate()`, `entropy_fuzzy()`, `entropy_sample()` now return a tuple consisting of the complexity index, and a dictionary comprising of the different parameters specific to the measure. For `fractal_katz()` and `entropy_shannon()`, the parameters dictionary is empty.
|
| 83 |
+
* Restructure `complexity` submodules with optimization files starting with `optim_*`, such as `optim_complexity_delay()`, `optim_complexity_dimension()`, `optim_complexity_k()`, `optim_complexity_optimize()`, and `optim_complexity_tolerance()`.
|
| 84 |
+
* `mutual_information()` moved from `stats` module to `complexity` module.
|
| 85 |
+
|
| 86 |
+
New Features
|
| 87 |
+
+++++++++++++
|
| 88 |
+
|
| 89 |
+
* Added various complexity indices: `complexity_hjorth()`, `complexity_hurst()`, `complexity_lyapunov()`, `complexity_rqa()`, `complexity_rr()`, `entropy_coalition()`, `entropy_permutation()`, `entropy_range()`, `entropy_spectral()`, `fractal_nld()`, `fractal_psdslope()`, `fractal_sda()`, `fractal_sevcik()`
|
| 90 |
+
* Added `mne_templateMRI()` as a helper to get MNE's template MRI.
|
| 91 |
+
* Added `eeg_source()` as a helper to perform source reconstruction.
|
| 92 |
+
* Added `eeg_source_extract()` to extract the activity from a brain region.
|
| 93 |
+
* Added `parallel_run()` in `misc` as a parallel processing utility function.
|
| 94 |
+
* Added `find_plateau()` in `misc` to find the point of plateau in an array of values.
|
| 95 |
+
* Added `write_csv()` in `data` to facilitate saving dataframes into multiple parts.
|
| 96 |
+
* Added more complexity-related functions, `entropy_cumulative_residual()`, `entropy_differential()`, `entropy_svd()`, `fractal_petrosian()`, and `information_fisher()`.
|
| 97 |
+
* Updates logic to find `kmax` in `fractal_higuchi()`
|
| 98 |
+
* Add RSP_Amplitude_Baseline in event-related analysis
|
| 99 |
+
* Add argument `add_firstsamples` in `mne_channel_extract()` to account for first sample attribute in mne raw objects
|
| 100 |
+
* Allow plotting of `mne.Epochs` in `epochs_plot()`
|
| 101 |
+
* Add `mne_crop()` to crop `mne` Raw objects with additional flexibility to specify first and last elements
|
| 102 |
+
* Plotting function in `eeg_badchannels()` to visualize overlay of individual EEG channels and highlighting of bad ones
|
| 103 |
+
* Add `eog_peaks()` as wrapper for `eog_findpeaks()`
|
| 104 |
+
* Allow `ecg_delineate()` to account for different heart rate
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
Fixes
|
| 108 |
+
+++++++++++++
|
| 109 |
+
|
| 110 |
+
* Ensure detected offset in `emg_activation()` is not beyond signal length
|
| 111 |
+
* Raise ValueError in `_hrv_sanitize_input()` if RRIs are detected instead of peaks
|
| 112 |
+
* Ensure that multifractal DFA indices returned by `fractal_mdfa()` is not Nan when array of slopes contains Nan (due to zero fluctuations)
|
| 113 |
+
* Documentation of respiration from peak/trough terminology to inhale/exhale onsets
|
| 114 |
+
* Change labelling in `rsp_plot()` from "inhalation peaks" and "exhalation troughs" to "peaks (exhalation onsets)" and "troughs (inhalation onsets)" respectively.
|
| 115 |
+
* Change RSP_Amplitude_Mean/Min/Max parameters to be corrected based on value closest to t=0 in event-related analysis, rather than using all pre-zero values.
|
| 116 |
+
* Have `rsp_rrv()` compute breath-to-breath intervals based on trough indices (inhalation onsets) rather than peak indices
|
| 117 |
+
* Compute `rsp_rate()` based on trough indices (rather than peak indices) in 'periods' method
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
0.1.4.1
|
| 121 |
+
-------------------
|
| 122 |
+
|
| 123 |
+
Fixes
|
| 124 |
+
+++++++++++++
|
| 125 |
+
* Adjust `kmax` parameter in `fractal_higuchi()` according to signal length as having `kmax` more than half of signal length leads to division by zero error
|
| 126 |
+
* Ensure that sanitization of input in `_hrv_dfa()` is done before windows for `DFA_alpha2` is computed
|
| 127 |
+
* `np.seterr` is added to `fractal_dfa()` to avoid returning division by zero warning which is an expected behaviour
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
0.1.4
|
| 131 |
+
-------------------
|
| 132 |
+
|
| 133 |
+
Breaking Changes
|
| 134 |
+
+++++++++++++++++
|
| 135 |
+
|
| 136 |
+
* `fractal_df()` now returns a dictionary of windows, fluctuations and the slope value (see documentation for more information. If `multifractal` is True, the dictionary additionally contains the parameters of the singularity spectrum (see `singularity_spectrum()` for more information)
|
| 137 |
+
|
| 138 |
+
New Features
|
| 139 |
+
+++++++++++++
|
| 140 |
+
|
| 141 |
+
* Add convenience function `intervals_to_peaks()` useful for RRI or BBI conversion to peak indices
|
| 142 |
+
* `hrv_nonlinear()` and `rrv_rsp()` now return the parameters of singularity spectrum for multifractal DFA analysis
|
| 143 |
+
* Add new complexity measures in `fractal_higuchi()`, `fractal_katz()` and `fractal_lempelziv()`
|
| 144 |
+
* Add new time-domain measures in `hrv_time()`: `SDANN` and `SDNNI`
|
| 145 |
+
* Add new non-linear measures in `hrv_nonlinear()`: `ShanEn`, `FuzzyEn`, `HFD`, `KFD` and `LZC`
|
| 146 |
+
|
| 147 |
+
Fixes
|
| 148 |
+
+++++++++++++
|
| 149 |
+
|
| 150 |
+
* Add path argument in `mne_data()` and throw warning to download mne datasets if data folder is not present
|
| 151 |
+
* The implementation of `TTIN` in `hrv_time()` is amended to its correct formulation.
|
| 152 |
+
* The default binsize used for RRI histogram in the computation of geometric HRV indices is set to 1 / 128 seconds
|
| 153 |
+
|
| 154 |
+
|
| 155 |
+
0.1.3
|
| 156 |
+
-------------------
|
| 157 |
+
|
| 158 |
+
Breaking Changes
|
| 159 |
+
+++++++++++++++++
|
| 160 |
+
|
| 161 |
+
* None
|
| 162 |
+
|
| 163 |
+
New Features
|
| 164 |
+
+++++++++++++
|
| 165 |
+
|
| 166 |
+
* Add internal function for detecting missing data points and forward filling missing values in `nk.*_clean()` functions
|
| 167 |
+
* Add computation of standard deviation in `eventrelated()` functions for *ECG_Rate_SD*, *EMG_Amplitude_SD*, *EOG_Rate_SD*, *PPG_Rate_SD*, *RSP_Rate_SD*, *RSP_Amplitude_SD*
|
| 168 |
+
* Add labelling for interval related features if a dictionary of dataframes is passed
|
| 169 |
+
* Retrun Q peaks and S Peaks information for wavelet-based methods in `nk.ecg_delineate()`
|
| 170 |
+
|
| 171 |
+
Fixes
|
| 172 |
+
+++++++++++++
|
| 173 |
+
|
| 174 |
+
* Fix epochs columns with `dtype: object` generated by `nk.epochs_create()`
|
| 175 |
+
* Bug fix ecg_findpeaks_rodrigues for array out of bounds bug
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
0.1.2
|
| 179 |
+
-------------------
|
| 180 |
+
|
| 181 |
+
New Features
|
| 182 |
+
+++++++++++++
|
| 183 |
+
|
| 184 |
+
* Additional features for `nk.rsp_intervalrelated()`: average inspiratory and expiratory durations, inspiratory-to-expiratory (I/E) time ratio
|
| 185 |
+
* Add multiscale entropy measures (MSE, CMSE, RCMSE) and fractal methods (Detrended Fluctuation Analysis, Correlation Dimension) into `nk.hrv_nonlinear()`
|
| 186 |
+
* Allow for data resampling in `nk.read_bitalino()`
|
| 187 |
+
* Add `bio_resting_8min_200hz` into database for reading with `nk.data()`
|
| 188 |
+
* Reading of url links in `nk.data()`
|
| 189 |
+
* Allow for `nk.hrv()` to compute RSA indices if respiratory data is present
|
| 190 |
+
* All `hrv` functions to automatically detect correct sampling rate if tuple or dict is passed as input
|
| 191 |
+
* Add support for PPG analysis: `nk.ppg_eventrelated()`, `nk.ppg_intervalrelated()`, `nk.ppg_analyze()`
|
| 192 |
+
* Add Zhao et al. (2018) method for `nk.ecg_quality()`
|
| 193 |
+
* Add tests for `epochs` module
|
| 194 |
+
* Add sub-epoch option for ECG and RSP event-related analysis:
|
| 195 |
+
* users can create a smaller sub-epoch within the event-related epoch
|
| 196 |
+
* the rate-related features of ECG and RSP signals are calculated over the sub-epoch
|
| 197 |
+
* the remaining features are calculated over the original epoch, not the sub-epoch
|
| 198 |
+
|
| 199 |
+
Fixes
|
| 200 |
+
+++++++++++++
|
| 201 |
+
|
| 202 |
+
* Fix propagation of values in `nk.signal_formatpeaks()` for formatting SCR column outputs generated by `eda_peaks()`
|
| 203 |
+
* Fix docstrings of `nk.rsp_phase()`, from "RSP_Inspiration" to "RSP_Phase"
|
| 204 |
+
* Update `signal_filter()` method for `rsp_clean()`: to use `sos` form, instead of `ba` form of butterworth (similar to `eda_clean()`)
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
|
| 208 |
+
|
| 209 |
+
|
| 210 |
+
0.1.1
|
| 211 |
+
-------------------
|
| 212 |
+
|
| 213 |
+
New Features
|
| 214 |
+
+++++++++++++
|
| 215 |
+
|
| 216 |
+
* Use duration from `nk.events_find()` as `epochs_end` in `nk.epochs_create()`
|
| 217 |
+
* Allow customized subsets of epoch lengths in `nk.bio_analyze()` with `window_lengths` argument
|
| 218 |
+
* Add `nk.find_outliers()` to identify outliers (abnormal values)
|
| 219 |
+
* Add utility function - `nk.check_type()` to return appropriate boolean values of input (integer, list, ndarray, pandas dataframe or pandas series)
|
| 220 |
+
* (experimental) Add error bars in the summary plot method to illustrate standard error of each bin
|
| 221 |
+
|
| 222 |
+
|
| 223 |
+
Fixes
|
| 224 |
+
+++++++++++++
|
| 225 |
+
|
| 226 |
+
* Fix type of value in `nk.signal_formatpeaks()` to ensure slice assignment is done on the same type
|
| 227 |
+
|
| 228 |
+
|
| 229 |
+
0.0.1 (2019-10-29)
|
| 230 |
+
-------------------
|
| 231 |
+
|
| 232 |
+
* First release on PyPI.
|
| 233 |
+
|
| 234 |
+
|
| 235 |
+
|
NeuroKit/source/Pipfile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[[source]]
|
| 2 |
+
url = "https://pypi.org/simple"
|
| 3 |
+
verify_ssl = true
|
| 4 |
+
name = "pypi"
|
| 5 |
+
|
| 6 |
+
[dev-packages]
|
| 7 |
+
invoke = "*"
|
| 8 |
+
bumpversion = "*"
|
| 9 |
+
coverage = "*"
|
| 10 |
+
wheel = "*"
|
| 11 |
+
sphinx = "*"
|
| 12 |
+
twine = "*"
|
| 13 |
+
tox = "*"
|
| 14 |
+
"flake8" = "*"
|
| 15 |
+
pylint = "*"
|
| 16 |
+
pytest = "*"
|
| 17 |
+
isort = "*"
|
| 18 |
+
yapf = "*"
|
| 19 |
+
bioread = "*"
|
| 20 |
+
mne = "*"
|
| 21 |
+
scipy = "*"
|
| 22 |
+
scikit-learn = "*"
|
| 23 |
+
matplotlib = "*"
|
| 24 |
+
pyentrp = "*"
|
| 25 |
+
cvxopt = "*"
|
| 26 |
+
PyWavelets = "*"
|
| 27 |
+
PyEMD = "*"
|
| 28 |
+
|
| 29 |
+
[packages]
|
| 30 |
+
neurokit2 = {path = ".", editable = true}
|
NeuroKit/source/README.rst
ADDED
|
@@ -0,0 +1,636 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/img/banner.png
|
| 2 |
+
:target: https://neuropsychology.github.io/NeuroKit/
|
| 3 |
+
|
| 4 |
+
.. image:: https://img.shields.io/pypi/pyversions/neurokit2.svg?logo=python&logoColor=FFE873
|
| 5 |
+
:target: https://pypi.python.org/pypi/neurokit2
|
| 6 |
+
|
| 7 |
+
.. image:: https://img.shields.io/pypi/dm/neurokit2
|
| 8 |
+
:target: https://pypi.python.org/pypi/neurokit2
|
| 9 |
+
|
| 10 |
+
.. image:: https://img.shields.io/pypi/v/neurokit2.svg?logo=pypi&logoColor=FFE873
|
| 11 |
+
:target: https://pypi.python.org/pypi/neurokit2
|
| 12 |
+
|
| 13 |
+
.. image:: https://github.com/neuropsychology/NeuroKit/actions/workflows/tests.yml/badge.svg
|
| 14 |
+
:target: https://github.com/neuropsychology/NeuroKit/actions/workflows/tests.yml
|
| 15 |
+
|
| 16 |
+
.. image:: https://codecov.io/gh/neuropsychology/NeuroKit/branch/master/graph/badge.svg
|
| 17 |
+
:target: https://codecov.io/gh/neuropsychology/NeuroKit
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
**The Python Toolbox for Neurophysiological Signal Processing**
|
| 23 |
+
|
| 24 |
+
**NeuroKit2** is a user-friendly package providing easy access to advanced biosignal processing routines.
|
| 25 |
+
Researchers and clinicians without extensive knowledge of programming or biomedical signal processing
|
| 26 |
+
can **analyze physiological data with only two lines of code**.
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
Quick Example
|
| 30 |
+
------------------
|
| 31 |
+
|
| 32 |
+
.. code-block:: python
|
| 33 |
+
|
| 34 |
+
import neurokit2 as nk
|
| 35 |
+
|
| 36 |
+
# Download example data
|
| 37 |
+
data = nk.data("bio_eventrelated_100hz")
|
| 38 |
+
|
| 39 |
+
# Preprocess the data (filter, find peaks, etc.)
|
| 40 |
+
processed_data, info = nk.bio_process(ecg=data["ECG"], rsp=data["RSP"], eda=data["EDA"], sampling_rate=100)
|
| 41 |
+
|
| 42 |
+
# Compute relevant features
|
| 43 |
+
results = nk.bio_analyze(processed_data, sampling_rate=100)
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
And **boom** 💥 your analysis is done 😎
|
| 47 |
+
|
| 48 |
+
Download
|
| 49 |
+
--------
|
| 50 |
+
|
| 51 |
+
You can download NeuroKit2 from `PyPI <https://pypi.org/project/neurokit2/>`_
|
| 52 |
+
|
| 53 |
+
.. code-block::
|
| 54 |
+
|
| 55 |
+
pip install neurokit2
|
| 56 |
+
|
| 57 |
+
or `conda-forge <https://anaconda.org/conda-forge/neurokit2>`_
|
| 58 |
+
|
| 59 |
+
.. code-block::
|
| 60 |
+
|
| 61 |
+
conda install -c conda-forge neurokit2
|
| 62 |
+
|
| 63 |
+
If you're not sure what to do, read our `installation guide <https://neuropsychology.github.io/NeuroKit/installation.html>`_.
|
| 64 |
+
|
| 65 |
+
Contributing
|
| 66 |
+
-------------
|
| 67 |
+
|
| 68 |
+
.. image:: https://img.shields.io/badge/License-MIT-blue.svg
|
| 69 |
+
:target: https://github.com/neuropsychology/NeuroKit/blob/master/LICENSE
|
| 70 |
+
:alt: License
|
| 71 |
+
|
| 72 |
+
.. image:: https://github.com/neuropsychology/neurokit/workflows/%E2%9C%A8%20Style/badge.svg?branch=master
|
| 73 |
+
:target: https://github.com/neuropsychology/NeuroKit/actions
|
| 74 |
+
:alt: GitHub CI
|
| 75 |
+
|
| 76 |
+
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
|
| 77 |
+
:target: https://github.com/psf/black
|
| 78 |
+
:alt: Black code
|
| 79 |
+
|
| 80 |
+
NeuroKit2 is the most `welcoming <https://github.com/neuropsychology/NeuroKit#popularity>`_ project with a large community of contributors with all levels of programming expertise. **But the package is still far from being perfect!** Thus, if you have some ideas for **improvement**, **new features**, or just want to **learn Python** and do something useful at the same time, do not hesitate and check out the following guide:
|
| 81 |
+
|
| 82 |
+
- `Contributing to NeuroKit <https://neuropsychology.github.io/NeuroKit/resources/contributing.html>`_
|
| 83 |
+
|
| 84 |
+
Also, if you have developed new signal processing methods or algorithms and you want to **increase their usage, popularity, and citations**, get in touch with us to eventually add them to NeuroKit. A great opportunity for the users as well as the original developers!
|
| 85 |
+
|
| 86 |
+
You have spotted a **mistake**? An **error** in a formula or code? OR there is just a step that seems strange and you don't understand? **Please let us know!** We are human beings, and we'll appreciate any inquiry.
|
| 87 |
+
|
| 88 |
+
Documentation
|
| 89 |
+
----------------
|
| 90 |
+
|
| 91 |
+
.. image:: https://img.shields.io/badge/documentation-online-brightgreen.svg
|
| 92 |
+
:target: https://neuropsychology.github.io/NeuroKit/
|
| 93 |
+
:alt: Documentation Status
|
| 94 |
+
|
| 95 |
+
.. image:: https://img.shields.io/badge/functions-API-orange.svg?colorB=2196F3
|
| 96 |
+
:target: https://neuropsychology.github.io/NeuroKit/functions/index.html
|
| 97 |
+
:alt: API
|
| 98 |
+
|
| 99 |
+
.. image:: https://img.shields.io/badge/tutorials-examples-orange.svg?colorB=E91E63
|
| 100 |
+
:target: https://neuropsychology.github.io/NeuroKit/examples/index.html
|
| 101 |
+
:alt: Tutorials
|
| 102 |
+
|
| 103 |
+
.. .. image:: https://img.shields.io/badge/documentation-pdf-purple.svg?colorB=FF9800
|
| 104 |
+
.. :target: https://neurokit2.readthedocs.io/_/downloads/en/latest/pdf/
|
| 105 |
+
.. :alt: PDF
|
| 106 |
+
|
| 107 |
+
.. .. image:: https://mybinder.org/badge_logo.svg
|
| 108 |
+
.. :target: https://mybinder.org/v2/gh/neuropsychology/NeuroKit/dev?urlpath=lab%2Ftree%2Fdocs%2Fexamples
|
| 109 |
+
.. :alt: Binder
|
| 110 |
+
|
| 111 |
+
.. .. image:: https://img.shields.io/gitter/room/neuropsychology/NeuroKit.js.svg
|
| 112 |
+
.. :target: https://gitter.im/NeuroKit/community
|
| 113 |
+
.. :alt: Chat on Gitter
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
Click on the links above and check out our tutorials:
|
| 117 |
+
|
| 118 |
+
General
|
| 119 |
+
^^^^^^^^^^
|
| 120 |
+
|
| 121 |
+
- `Get familiar with Python in 10 minutes <https://neuropsychology.github.io/NeuroKit/resources/learn_python.html>`_
|
| 122 |
+
- `Recording good quality signals <https://neuropsychology.github.io/NeuroKit/resources/recording.html>`_
|
| 123 |
+
- `Install Python and NeuroKit <https://neuropsychology.github.io/NeuroKit/installation.html>`_
|
| 124 |
+
- `Included datasets <https://neuropsychology.github.io/NeuroKit/functions/data.html#datasets>`_
|
| 125 |
+
- `Additional Resources <https://neuropsychology.github.io/NeuroKit/resources/resources.html>`_
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
Examples
|
| 129 |
+
^^^^^^^^^^
|
| 130 |
+
|
| 131 |
+
- `Simulate Artificial Physiological Signals <https://neuropsychology.github.io/NeuroKit/examples/signal_simulation/signal_simulation.html>`_
|
| 132 |
+
- `Customize your Processing Pipeline <https://neuropsychology.github.io/NeuroKit/examples/bio_custom/bio_custom.html>`_
|
| 133 |
+
- `Event-related Analysis <https://neuropsychology.github.io/NeuroKit/examples/bio_eventrelated/bio_eventrelated.html>`_
|
| 134 |
+
- `Interval-related Analysis <https://neuropsychology.github.io/NeuroKit/examples/bio_intervalrelated/bio_intervalrelated.html>`_
|
| 135 |
+
- `Analyze Electrodermal Activity (EDA) <https://neuropsychology.github.io/NeuroKit/examples/eda_peaks/eda_peaks.html>`_
|
| 136 |
+
- `Analyze Respiratory Rate Variability (RRV) <https://neuropsychology.github.io/NeuroKit/examples/rsp_rrv/rsp_rrv.html>`_
|
| 137 |
+
- `Extract and Visualize Individual Heartbeats <https://neuropsychology.github.io/NeuroKit/examples/ecg_heartbeats/ecg_heartbeats.html>`_
|
| 138 |
+
- `Locate P, Q, S, and T waves in ECG <https://neuropsychology.github.io/NeuroKit/examples/ecg_delineate/ecg_delineate.html>`_
|
| 139 |
+
- `Analyze Electrooculography EOG data <https://neuropsychology.github.io/NeuroKit/examples/eog_analyze/eog_analyze.html>`_
|
| 140 |
+
|
| 141 |
+
.. *You can try out these examples directly* `in your browser <https://github.com/neuropsychology/NeuroKit/tree/master/docs/examples#cloud-based-interactive-examples>`_.
|
| 142 |
+
|
| 143 |
+
**Don't know which tutorial is suited for your case?** Follow this flowchart:
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/workflow.png
|
| 147 |
+
:target: https://neuropsychology.github.io/NeuroKit/
|
| 148 |
+
|
| 149 |
+
Citation
|
| 150 |
+
---------
|
| 151 |
+
|
| 152 |
+
.. image:: https://zenodo.org/badge/218212111.svg
|
| 153 |
+
:target: https://zenodo.org/badge/latestdoi/218212111
|
| 154 |
+
|
| 155 |
+
.. image:: https://img.shields.io/badge/details-authors-purple.svg?colorB=9C27B0
|
| 156 |
+
:target: https://neuropsychology.github.io/NeuroKit/authors.html
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
The **NeuroKit2** paper can be found `here <https://doi.org/10.3758/s13428-020-01516-y>`_ 🎉 Additionally, you can get the reference directly from Python by running:
|
| 160 |
+
|
| 161 |
+
.. code-block:: python
|
| 162 |
+
|
| 163 |
+
nk.cite()
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
.. code-block:: tex
|
| 167 |
+
|
| 168 |
+
You can cite NeuroKit2 as follows:
|
| 169 |
+
|
| 170 |
+
- Makowski, D., Pham, T., Lau, Z. J., Brammer, J. C., Lespinasse, F., Pham, H.,
|
| 171 |
+
Schölzel, C., & Chen, S. A. (2021). NeuroKit2: A Python toolbox for neurophysiological signal processing.
|
| 172 |
+
Behavior Research Methods, 53(4), 1689–1696. https://doi.org/10.3758/s13428-020-01516-y
|
| 173 |
+
|
| 174 |
+
Full bibtex reference:
|
| 175 |
+
|
| 176 |
+
@article{Makowski2021neurokit,
|
| 177 |
+
author = {Dominique Makowski and Tam Pham and Zen J. Lau and Jan C. Brammer and Fran{\c{c}}ois Lespinasse and Hung Pham and Christopher Schölzel and S. H. Annabel Chen},
|
| 178 |
+
title = {{NeuroKit}2: A Python toolbox for neurophysiological signal processing},
|
| 179 |
+
journal = {Behavior Research Methods},
|
| 180 |
+
volume = {53},
|
| 181 |
+
number = {4},
|
| 182 |
+
pages = {1689--1696},
|
| 183 |
+
publisher = {Springer Science and Business Media {LLC}},
|
| 184 |
+
doi = {10.3758/s13428-020-01516-y},
|
| 185 |
+
url = {https://doi.org/10.3758%2Fs13428-020-01516-y},
|
| 186 |
+
year = 2021,
|
| 187 |
+
month = {feb}
|
| 188 |
+
}
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
**Let us know if you used NeuroKit2 in a publication!** Open a new `discussion <https://github.com/neuropsychology/NeuroKit/discussions>`_ (select the *NK in publications* category) and link the paper. The community would be happy to know about how you used it and learn about your research. We could also feature it once we have a section on the website for papers that used the software.
|
| 192 |
+
|
| 193 |
+
..
|
| 194 |
+
Design
|
| 195 |
+
--------
|
| 196 |
+
|
| 197 |
+
*NeuroKit2* is designed to provide a **consistent**, **accessible** yet **powerful** and **flexible** API.
|
| 198 |
+
|
| 199 |
+
- **Consistency**: For each type of signals (ECG, RSP, EDA, EMG...), the same function names are called (in the form :code:`signaltype_functiongoal()`) to achieve equivalent goals, such as :code:`*_clean()`, :code:`*_findpeaks()`, :code:`*_process()`, :code:`*_plot()` (replace the star with the signal type, e.g., :code:`ecg_clean()`).
|
| 200 |
+
- **Accessibility**: Using NeuroKit2 is made very easy for beginners through the existence of powerful high-level "master" functions, such as :code:`*_process()`, that performs cleaning, preprocessing and processing with sensible defaults.
|
| 201 |
+
- **Flexibility**: However, advanced users can very easily build their own custom analysis pipeline by using the mid-level functions (such as :code:`*_clean()`, :code:`*_rate()`), offering more control and flexibility over their parameters.
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
Physiological Data Preprocessing
|
| 205 |
+
---------------------------------
|
| 206 |
+
|
| 207 |
+
Simulate physiological signals
|
| 208 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 209 |
+
|
| 210 |
+
You can easily simulate artificial ECG (also `12-Lead multichannel ECGs <https://neuropsychology.github.io/NeuroKit/examples/ecg_generate_12leads/ecg_generate_12leads.html>`_), PPG, RSP, EDA, and EMG signals to test your scripts and algorithms.
|
| 211 |
+
|
| 212 |
+
.. code-block:: python
|
| 213 |
+
|
| 214 |
+
import numpy as np
|
| 215 |
+
import pandas as pd
|
| 216 |
+
import neurokit2 as nk
|
| 217 |
+
|
| 218 |
+
# Generate synthetic signals
|
| 219 |
+
ecg = nk.ecg_simulate(duration=10, heart_rate=70)
|
| 220 |
+
ppg = nk.ppg_simulate(duration=10, heart_rate=70)
|
| 221 |
+
rsp = nk.rsp_simulate(duration=10, respiratory_rate=15)
|
| 222 |
+
eda = nk.eda_simulate(duration=10, scr_number=3)
|
| 223 |
+
emg = nk.emg_simulate(duration=10, burst_number=2)
|
| 224 |
+
|
| 225 |
+
# Visualise biosignals
|
| 226 |
+
data = pd.DataFrame({"ECG": ecg,
|
| 227 |
+
"PPG": ppg,
|
| 228 |
+
"RSP": rsp,
|
| 229 |
+
"EDA": eda,
|
| 230 |
+
"EMG": emg})
|
| 231 |
+
nk.signal_plot(data, subplots=True)
|
| 232 |
+
|
| 233 |
+
|
| 234 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_simulation.png
|
| 235 |
+
:target: https://neuropsychology.github.io/NeuroKit/examples/signal_simulation/signal_simulation.html
|
| 236 |
+
|
| 237 |
+
|
| 238 |
+
Electrodermal Activity (EDA/GSR)
|
| 239 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 240 |
+
|
| 241 |
+
.. code-block:: python
|
| 242 |
+
|
| 243 |
+
# Generate 10 seconds of EDA signal (recorded at 250 samples / second) with 2 SCR peaks
|
| 244 |
+
eda = nk.eda_simulate(duration=10, sampling_rate=250, scr_number=2, drift=0.01)
|
| 245 |
+
|
| 246 |
+
# Process it
|
| 247 |
+
signals, info = nk.eda_process(eda, sampling_rate=250)
|
| 248 |
+
|
| 249 |
+
# Visualise the processing
|
| 250 |
+
nk.eda_plot(signals, info)
|
| 251 |
+
|
| 252 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_eda.png
|
| 253 |
+
:target: https://neuropsychology.github.io/NeuroKit/examples/eda_peaks/eda_peaks.html
|
| 254 |
+
|
| 255 |
+
|
| 256 |
+
Cardiac activity (ECG)
|
| 257 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 258 |
+
|
| 259 |
+
.. code-block:: python
|
| 260 |
+
|
| 261 |
+
# Generate 15 seconds of ECG signal (recorded at 250 samples/second)
|
| 262 |
+
ecg = nk.ecg_simulate(duration=15, sampling_rate=250, heart_rate=70)
|
| 263 |
+
|
| 264 |
+
# Process it
|
| 265 |
+
signals, info = nk.ecg_process(ecg, sampling_rate=250)
|
| 266 |
+
|
| 267 |
+
# Visualise the processing
|
| 268 |
+
nk.ecg_plot(signals, info)
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_ecg.png
|
| 272 |
+
:target: https://neuropsychology.github.io/NeuroKit/examples/ecg_heartbeats/ecg_heartbeats.html
|
| 273 |
+
|
| 274 |
+
|
| 275 |
+
Respiration (RSP)
|
| 276 |
+
^^^^^^^^^^^^^^^^^^^
|
| 277 |
+
|
| 278 |
+
.. code-block:: python
|
| 279 |
+
|
| 280 |
+
# Generate one minute of respiratory (RSP) signal (recorded at 250 samples / second)
|
| 281 |
+
rsp = nk.rsp_simulate(duration=60, sampling_rate=250, respiratory_rate=15)
|
| 282 |
+
|
| 283 |
+
# Process it
|
| 284 |
+
signals, info = nk.rsp_process(rsp, sampling_rate=250)
|
| 285 |
+
|
| 286 |
+
# Visualise the processing
|
| 287 |
+
nk.rsp_plot(signals, info)
|
| 288 |
+
|
| 289 |
+
|
| 290 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_rsp.png
|
| 291 |
+
:target: https://neuropsychology.github.io/NeuroKit/examples/rsp_rrv/rsp_rrv.html
|
| 292 |
+
|
| 293 |
+
|
| 294 |
+
Photoplethysmography (PPG/BVP)
|
| 295 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 296 |
+
|
| 297 |
+
.. code-block:: python
|
| 298 |
+
|
| 299 |
+
# Generate 15 seconds of PPG signal (recorded at 250 samples/second)
|
| 300 |
+
ppg = nk.ppg_simulate(duration=15, sampling_rate=250, heart_rate=70)
|
| 301 |
+
|
| 302 |
+
# Process it
|
| 303 |
+
signals, info = nk.ppg_process(ppg, sampling_rate=250)
|
| 304 |
+
|
| 305 |
+
# Visualize the processing
|
| 306 |
+
nk.ppg_plot(signals, info)
|
| 307 |
+
|
| 308 |
+
|
| 309 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_ppg.png
|
| 310 |
+
|
| 311 |
+
|
| 312 |
+
Electromyography (EMG)
|
| 313 |
+
^^^^^^^^^^^^^^^^^^^^^^^
|
| 314 |
+
|
| 315 |
+
.. code-block:: python
|
| 316 |
+
|
| 317 |
+
# Generate 10 seconds of EMG signal (recorded at 250 samples/second)
|
| 318 |
+
emg = nk.emg_simulate(duration=10, sampling_rate=250, burst_number=3)
|
| 319 |
+
|
| 320 |
+
# Process it
|
| 321 |
+
signals, info = nk.emg_process(emg, sampling_rate=250)
|
| 322 |
+
|
| 323 |
+
# Visualise the processing
|
| 324 |
+
nk.emg_plot(signals, info)
|
| 325 |
+
|
| 326 |
+
|
| 327 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_emg.png
|
| 328 |
+
|
| 329 |
+
|
| 330 |
+
|
| 331 |
+
Electrooculography (EOG)
|
| 332 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 333 |
+
|
| 334 |
+
.. code-block:: python
|
| 335 |
+
|
| 336 |
+
# Import EOG data
|
| 337 |
+
eog_signal = nk.data("eog_100hz")
|
| 338 |
+
|
| 339 |
+
# Process it
|
| 340 |
+
signals, info = nk.eog_process(eog_signal, sampling_rate=100)
|
| 341 |
+
|
| 342 |
+
# Plot
|
| 343 |
+
nk.eog_plot(signals, info)
|
| 344 |
+
|
| 345 |
+
|
| 346 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_eog.png
|
| 347 |
+
|
| 348 |
+
|
| 349 |
+
|
| 350 |
+
Electrogastrography (EGG)
|
| 351 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 352 |
+
|
| 353 |
+
Consider `helping us develop it <https://neuropsychology.github.io/NeuroKit/resources/contributing.html>`_!
|
| 354 |
+
|
| 355 |
+
|
| 356 |
+
Physiological Data Analysis
|
| 357 |
+
----------------------------
|
| 358 |
+
|
| 359 |
+
The analysis of physiological data usually comes in two types, **event-related** or **interval-related**.
|
| 360 |
+
|
| 361 |
+
|
| 362 |
+
|
| 363 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/features.png
|
| 364 |
+
|
| 365 |
+
|
| 366 |
+
Event-related
|
| 367 |
+
^^^^^^^^^^^^^^
|
| 368 |
+
|
| 369 |
+
This type of analysis refers to physiological changes immediately occurring in response to an event.
|
| 370 |
+
For instance, physiological changes following the presentation of a stimulus (e.g., an emotional stimulus) are indicated by
|
| 371 |
+
the dotted lines in the figure above. In this situation, the analysis is epoch-based.
|
| 372 |
+
An epoch is a short chunk of the physiological signal (usually < 10 seconds), that is locked to a specific stimulus and hence
|
| 373 |
+
the physiological signals of interest are time-segmented accordingly. This is represented by the orange boxes in the figure above.
|
| 374 |
+
In this case, using `bio_analyze()` will compute features like rate changes, peak characteristics, and phase characteristics.
|
| 375 |
+
|
| 376 |
+
- `Event-related example <https://neuropsychology.github.io/NeuroKit/examples/bio_eventrelated/bio_eventrelated.html>`_
|
| 377 |
+
|
| 378 |
+
Interval-related
|
| 379 |
+
^^^^^^^^^^^^^^^^^
|
| 380 |
+
|
| 381 |
+
This type of analysis refers to the physiological characteristics and features that occur over
|
| 382 |
+
longer periods of time (from a few seconds to days of activity). Typical use cases are either
|
| 383 |
+
periods of resting state, in which the activity is recorded for several minutes while the participant
|
| 384 |
+
is at rest, or during different conditions in which there is no specific time-locked event
|
| 385 |
+
(e.g., watching movies, listening to music, engaging in physical activity, etc.). For instance,
|
| 386 |
+
this type of analysis is used when people want to compare the physiological activity under different
|
| 387 |
+
intensities of physical exercise, different types of movies, or different intensities of
|
| 388 |
+
stress. To compare event-related and interval-related analysis, we can refer to the example figure above.
|
| 389 |
+
For example, a participant might be watching a 20s-long short film where particular stimuli of
|
| 390 |
+
interest in the movie appear at certain time points (marked by the dotted lines). While
|
| 391 |
+
event-related analysis pertains to the segments of signals within the orange boxes (to understand the physiological
|
| 392 |
+
changes pertaining to the appearance of stimuli), interval-related analysis can be
|
| 393 |
+
applied on the entire 20s duration to investigate how physiology fluctuates in general.
|
| 394 |
+
In this case, using `bio_analyze()` will compute features such as rate characteristics (in particular,
|
| 395 |
+
variability metrics) and peak characteristics.
|
| 396 |
+
|
| 397 |
+
- `Interval-related example <https://neuropsychology.github.io/NeuroKit/examples/bio_intervalrelated/bio_intervalrelated.html>`_
|
| 398 |
+
|
| 399 |
+
|
| 400 |
+
Heart Rate Variability (HRV)
|
| 401 |
+
----------------------------
|
| 402 |
+
.. image:: https://img.shields.io/badge/Tutorial-HRV-green
|
| 403 |
+
:target: https://www.mdpi.com/1424-8220/21/12/3998
|
| 404 |
+
|
| 405 |
+
Check-out our **Heart Rate Variability in Psychology: A Review of HRV Indices and an Analysis Tutorial** `paper <https://doi.org/10.3390/s21123998>`_ for:
|
| 406 |
+
|
| 407 |
+
- a comprehensive review of the most up-to-date HRV indices
|
| 408 |
+
- a discussion of their significance in psychological research and practices
|
| 409 |
+
- a step-by-step guide for HRV analysis using **NeuroKit2**
|
| 410 |
+
|
| 411 |
+
|
| 412 |
+
.. code-block:: tex
|
| 413 |
+
|
| 414 |
+
You can cite the paper as follows:
|
| 415 |
+
|
| 416 |
+
- Pham, T., Lau, Z. J., Chen, S. H. A., & Makowski, D. (2021).
|
| 417 |
+
Heart Rate Variability in Psychology: A Review of HRV Indices and an Analysis Tutorial.
|
| 418 |
+
Sensors, 21(12), 3998. https://doi:10.3390/s21123998
|
| 419 |
+
|
| 420 |
+
|
| 421 |
+
- **Compute HRV indices using Python**
|
| 422 |
+
|
| 423 |
+
- **Time domain**: RMSSD, MeanNN, SDNN, SDSD, CVNN, etc.
|
| 424 |
+
- **Frequency domain**: Spectral power density in various frequency bands (Ultra low/ULF, Very low/VLF, Low/LF, High/HF, Very high/VHF), Ratio of LF to HF power, Normalized LF (LFn) and HF (HFn), Log transformed HF (LnHF).
|
| 425 |
+
- **Nonlinear domain**: Spread of RR intervals (SD1, SD2, ratio between SD2 to SD1), Cardiac Sympathetic Index (CSI), Cardial Vagal Index (CVI), Modified CSI, Sample Entropy (SampEn).
|
| 426 |
+
|
| 427 |
+
|
| 428 |
+
.. code-block:: python
|
| 429 |
+
|
| 430 |
+
# Download data
|
| 431 |
+
data = nk.data("bio_resting_8min_100hz")
|
| 432 |
+
|
| 433 |
+
# Find peaks
|
| 434 |
+
peaks, info = nk.ecg_peaks(data["ECG"], sampling_rate=100)
|
| 435 |
+
|
| 436 |
+
# Compute HRV indices
|
| 437 |
+
nk.hrv(peaks, sampling_rate=100, show=True)
|
| 438 |
+
>>> HRV_RMSSD HRV_MeanNN HRV_SDNN ... HRV_CVI HRV_CSI_Modified HRV_SampEn
|
| 439 |
+
>>> 0 69.697983 696.395349 62.135891 ... 4.829101 592.095372 1.259931
|
| 440 |
+
|
| 441 |
+
|
| 442 |
+
|
| 443 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_hrv.png
|
| 444 |
+
|
| 445 |
+
Miscellaneous
|
| 446 |
+
----------------------------
|
| 447 |
+
|
| 448 |
+
ECG Delineation
|
| 449 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 450 |
+
|
| 451 |
+
- Delineate the QRS complex of an electrocardiac signal (ECG) including P-peaks, T-peaks, as well as their onsets and offsets.
|
| 452 |
+
|
| 453 |
+
|
| 454 |
+
.. code-block:: python
|
| 455 |
+
|
| 456 |
+
|
| 457 |
+
# Download data
|
| 458 |
+
ecg_signal = nk.data(dataset="ecg_3000hz")
|
| 459 |
+
|
| 460 |
+
# Extract R-peaks locations
|
| 461 |
+
_, rpeaks = nk.ecg_peaks(ecg_signal, sampling_rate=3000)
|
| 462 |
+
|
| 463 |
+
# Delineate
|
| 464 |
+
signal, waves = nk.ecg_delineate(ecg_signal, rpeaks, sampling_rate=3000, method="dwt", show=True, show_type='all')
|
| 465 |
+
|
| 466 |
+
|
| 467 |
+
|
| 468 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_delineate.png
|
| 469 |
+
:target: https://neuropsychology.github.io/NeuroKit/examples/ecg_delineate/ecg_delineate.html
|
| 470 |
+
|
| 471 |
+
|
| 472 |
+
|
| 473 |
+
Signal Processing
|
| 474 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 475 |
+
|
| 476 |
+
- **Signal processing functionalities**
|
| 477 |
+
|
| 478 |
+
- **Filtering**: Using different methods.
|
| 479 |
+
- **Detrending**: Remove the baseline drift or trend.
|
| 480 |
+
- **Distorting**: Add noise and artifacts.
|
| 481 |
+
|
| 482 |
+
.. code-block:: python
|
| 483 |
+
|
| 484 |
+
# Generate original signal
|
| 485 |
+
original = nk.signal_simulate(duration=6, frequency=1)
|
| 486 |
+
|
| 487 |
+
# Distort the signal (add noise, linear trend, artifacts, etc.)
|
| 488 |
+
distorted = nk.signal_distort(original,
|
| 489 |
+
noise_amplitude=0.1,
|
| 490 |
+
noise_frequency=[5, 10, 20],
|
| 491 |
+
powerline_amplitude=0.05,
|
| 492 |
+
artifacts_amplitude=0.3,
|
| 493 |
+
artifacts_number=3,
|
| 494 |
+
linear_drift=0.5)
|
| 495 |
+
|
| 496 |
+
# Clean (filter and detrend)
|
| 497 |
+
cleaned = nk.signal_detrend(distorted)
|
| 498 |
+
cleaned = nk.signal_filter(cleaned, lowcut=0.5, highcut=1.5)
|
| 499 |
+
|
| 500 |
+
# Compare the 3 signals
|
| 501 |
+
plot = nk.signal_plot([original, distorted, cleaned])
|
| 502 |
+
|
| 503 |
+
|
| 504 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_signalprocessing.png
|
| 505 |
+
|
| 506 |
+
|
| 507 |
+
Complexity (Entropy, Fractal Dimensions, ...)
|
| 508 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 509 |
+
|
| 510 |
+
- **Optimize complexity parameters** (delay *tau*, dimension *m*, tolerance *r*)
|
| 511 |
+
|
| 512 |
+
.. code-block:: python
|
| 513 |
+
|
| 514 |
+
# Generate signal
|
| 515 |
+
signal = nk.signal_simulate(frequency=[1, 3], noise=0.01, sampling_rate=200)
|
| 516 |
+
|
| 517 |
+
# Find optimal time delay, embedding dimension, and r
|
| 518 |
+
parameters = nk.complexity_optimize(signal, show=True)
|
| 519 |
+
|
| 520 |
+
|
| 521 |
+
|
| 522 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_complexity_optimize.png
|
| 523 |
+
:target: https://neuropsychology.github.io/NeuroKit/functions/complexity.html
|
| 524 |
+
|
| 525 |
+
|
| 526 |
+
|
| 527 |
+
- **Compute complexity features**
|
| 528 |
+
|
| 529 |
+
- **Entropy**: Sample Entropy (SampEn), Approximate Entropy (ApEn), Fuzzy Entropy (FuzzEn), Multiscale Entropy (MSE), Shannon Entropy (ShEn)
|
| 530 |
+
- **Fractal dimensions**: Correlation Dimension D2, ...
|
| 531 |
+
- **Detrended Fluctuation Analysis**
|
| 532 |
+
|
| 533 |
+
.. code-block:: python
|
| 534 |
+
|
| 535 |
+
nk.entropy_sample(signal)
|
| 536 |
+
nk.entropy_approximate(signal)
|
| 537 |
+
|
| 538 |
+
|
| 539 |
+
Signal Decomposition
|
| 540 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 541 |
+
|
| 542 |
+
.. code-block:: python
|
| 543 |
+
|
| 544 |
+
# Create complex signal
|
| 545 |
+
signal = nk.signal_simulate(duration=10, frequency=1) # High freq
|
| 546 |
+
signal += 3 * nk.signal_simulate(duration=10, frequency=3) # Higher freq
|
| 547 |
+
signal += 3 * np.linspace(0, 2, len(signal)) # Add baseline and linear trend
|
| 548 |
+
signal += 2 * nk.signal_simulate(duration=10, frequency=0.1, noise=0) # Non-linear trend
|
| 549 |
+
signal += np.random.normal(0, 0.02, len(signal)) # Add noise
|
| 550 |
+
|
| 551 |
+
# Decompose signal using Empirical Mode Decomposition (EMD)
|
| 552 |
+
components = nk.signal_decompose(signal, method='emd')
|
| 553 |
+
nk.signal_plot(components) # Visualize components
|
| 554 |
+
|
| 555 |
+
# Recompose merging correlated components
|
| 556 |
+
recomposed = nk.signal_recompose(components, threshold=0.99)
|
| 557 |
+
nk.signal_plot(recomposed) # Visualize components
|
| 558 |
+
|
| 559 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_decomposition.png
|
| 560 |
+
:target: https://neuropsychology.github.io/NeuroKit/functions/signal.html#signal-decompose
|
| 561 |
+
|
| 562 |
+
Signal Power Spectrum Density (PSD)
|
| 563 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 564 |
+
.. code-block:: python
|
| 565 |
+
|
| 566 |
+
# Generate complex signal
|
| 567 |
+
signal = nk.signal_simulate(duration=20, frequency=[0.5, 5, 10, 15], amplitude=[2, 1.5, 0.5, 0.3], noise=0.025)
|
| 568 |
+
|
| 569 |
+
# Get the PSD using different methods
|
| 570 |
+
welch = nk.signal_psd(signal, method="welch", min_frequency=1, max_frequency=20, show=True)
|
| 571 |
+
multitaper = nk.signal_psd(signal, method="multitapers", max_frequency=20, show=True)
|
| 572 |
+
lomb = nk.signal_psd(signal, method="lomb", min_frequency=1, max_frequency=20, show=True)
|
| 573 |
+
burg = nk.signal_psd(signal, method="burg", min_frequency=1, max_frequency=20, order=10, show=True)
|
| 574 |
+
|
| 575 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_psd.png
|
| 576 |
+
:target: https://neuropsychology.github.io/NeuroKit/functions/signal.html#signal-psd
|
| 577 |
+
|
| 578 |
+
Statistics
|
| 579 |
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| 580 |
+
|
| 581 |
+
- **Highest Density Interval (HDI)**
|
| 582 |
+
|
| 583 |
+
.. code-block:: python
|
| 584 |
+
|
| 585 |
+
x = np.random.normal(loc=0, scale=1, size=100000)
|
| 586 |
+
|
| 587 |
+
ci_min, ci_max = nk.hdi(x, ci=0.95, show=True)
|
| 588 |
+
|
| 589 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/master/docs/readme/README_hdi.png
|
| 590 |
+
:target: https://neuropsychology.github.io/NeuroKit/functions/stats.html#hdi
|
| 591 |
+
|
| 592 |
+
.. used_at_section
|
| 593 |
+
|
| 594 |
+
Popularity
|
| 595 |
+
---------------------
|
| 596 |
+
|
| 597 |
+
.. image:: https://img.shields.io/pypi/dd/neurokit2
|
| 598 |
+
:target: https://pypi.python.org/pypi/neurokit2
|
| 599 |
+
|
| 600 |
+
.. image:: https://img.shields.io/github/stars/neuropsychology/NeuroKit
|
| 601 |
+
:target: https://github.com/neuropsychology/NeuroKit/stargazers
|
| 602 |
+
|
| 603 |
+
.. image:: https://img.shields.io/github/forks/neuropsychology/NeuroKit
|
| 604 |
+
:target: https://github.com/neuropsychology/NeuroKit/network
|
| 605 |
+
|
| 606 |
+
|
| 607 |
+
NeuroKit2 is one of the most welcoming packages for new contributors and users, as well as the fastest-growing package. So stop hesitating and hop on board 🤗
|
| 608 |
+
|
| 609 |
+
.. image:: https://raw.github.com/neuropsychology/NeuroKit/dev/docs/readme/README_popularity.png
|
| 610 |
+
:target: https://pypi.python.org/pypi/neurokit2
|
| 611 |
+
|
| 612 |
+
|
| 613 |
+
Used at
|
| 614 |
+
-------
|
| 615 |
+
|
| 616 |
+
|ntu| |univ_paris| |univ_duke| |uni_auckland| |uni_pittsburh| |uni_washington|
|
| 617 |
+
|
| 618 |
+
.. |ntu| image:: https://upload.wikimedia.org/wikipedia/en/thumb/c/c6/Nanyang_Technological_University.svg/1024px-Nanyang_Technological_University.svg.png
|
| 619 |
+
:height: 70
|
| 620 |
+
.. |univ_duke| image:: https://www.tutelaprep.com/blog/wp-content/uploads/2019/12/duke.png
|
| 621 |
+
:height: 70
|
| 622 |
+
.. |univ_paris| image:: https://study-eu.s3.amazonaws.com/uploads/university/universit--de-paris-logo.svg
|
| 623 |
+
:height: 70
|
| 624 |
+
.. |uni_auckland| image:: https://upload.wikimedia.org/wikipedia/en/thumb/a/ae/University_of_Auckland.svg/1024px-University_of_Auckland.svg.png
|
| 625 |
+
:height: 70
|
| 626 |
+
.. |uni_pittsburh| image:: https://upload.wikimedia.org/wikipedia/en/thumb/f/fb/University_of_Pittsburgh_seal.svg/1200px-University_of_Pittsburgh_seal.svg.png
|
| 627 |
+
:height: 70
|
| 628 |
+
.. |uni_washington| image:: https://upload.wikimedia.org/wikipedia/en/thumb/5/58/University_of_Washington_seal.svg/768px-University_of_Washington_seal.svg.png
|
| 629 |
+
:height: 70
|
| 630 |
+
|
| 631 |
+
|
| 632 |
+
Disclaimer
|
| 633 |
+
----------
|
| 634 |
+
*The authors do not provide any warranty. If this software causes your keyboard to blow up, your brain to liquefy, your toilet to clog or a zombie plague to break loose, the authors CANNOT IN ANY WAY be held responsible.*
|
| 635 |
+
|
| 636 |
+
|
NeuroKit/source/__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""
|
| 3 |
+
NeuroKit Project Package Initialization File
|
| 4 |
+
"""
|
NeuroKit/source/codecov.yml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
coverage:
|
| 2 |
+
status:
|
| 3 |
+
project:
|
| 4 |
+
default:
|
| 5 |
+
enabled: yes
|
| 6 |
+
threshold: 0.2 # allow a drop of 0.2% in coverage
|
| 7 |
+
if_not_found: success
|
| 8 |
+
patch:
|
| 9 |
+
default:
|
| 10 |
+
enabled: no
|
| 11 |
+
if_not_found: success
|
NeuroKit/source/data/README.rst
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Datasets
|
| 2 |
+
========
|
| 3 |
+
|
| 4 |
+
NeuroKit includes datasets that can be used for testing. These datasets are not downloaded automatically with the package (to avoid increasing its weight), but can be downloaded via the `nk.data()` function.
|
| 5 |
+
|
NeuroKit/source/data/acqnowledge.acq
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e7320ec12f4754b74c799748a88686d24ef8b074de5e45dc486bc5da1256d081
|
| 3 |
+
size 70432586
|
NeuroKit/source/data/bio_eventrelated_100hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/bio_resting_5min_100hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/bio_resting_8min_100hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/bio_resting_8min_200hz.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:897fd571887d3a9c8f26ea37b4a81ae084ced4df1846109c6daa35155d30d0fd
|
| 3 |
+
size 36448850
|
NeuroKit/source/data/ecg_1000hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/ecg_3000hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/eeg.txt
ADDED
|
@@ -0,0 +1,4097 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-56
|
| 2 |
+
-50
|
| 3 |
+
-64
|
| 4 |
+
-91
|
| 5 |
+
-135
|
| 6 |
+
-140
|
| 7 |
+
-134
|
| 8 |
+
-114
|
| 9 |
+
-115
|
| 10 |
+
-126
|
| 11 |
+
-138
|
| 12 |
+
-143
|
| 13 |
+
-126
|
| 14 |
+
-91
|
| 15 |
+
-57
|
| 16 |
+
-62
|
| 17 |
+
-91
|
| 18 |
+
-125
|
| 19 |
+
-153
|
| 20 |
+
-154
|
| 21 |
+
-147
|
| 22 |
+
-136
|
| 23 |
+
-143
|
| 24 |
+
-147
|
| 25 |
+
-153
|
| 26 |
+
-171
|
| 27 |
+
-187
|
| 28 |
+
-175
|
| 29 |
+
-141
|
| 30 |
+
-96
|
| 31 |
+
-47
|
| 32 |
+
-40
|
| 33 |
+
-55
|
| 34 |
+
-74
|
| 35 |
+
-79
|
| 36 |
+
-89
|
| 37 |
+
-94
|
| 38 |
+
-107
|
| 39 |
+
-124
|
| 40 |
+
-134
|
| 41 |
+
-133
|
| 42 |
+
-108
|
| 43 |
+
-74
|
| 44 |
+
-59
|
| 45 |
+
-52
|
| 46 |
+
-78
|
| 47 |
+
-90
|
| 48 |
+
-99
|
| 49 |
+
-106
|
| 50 |
+
-119
|
| 51 |
+
-139
|
| 52 |
+
-150
|
| 53 |
+
-152
|
| 54 |
+
-130
|
| 55 |
+
-97
|
| 56 |
+
-51
|
| 57 |
+
-32
|
| 58 |
+
-25
|
| 59 |
+
-6
|
| 60 |
+
9
|
| 61 |
+
21
|
| 62 |
+
16
|
| 63 |
+
16
|
| 64 |
+
1
|
| 65 |
+
-24
|
| 66 |
+
-52
|
| 67 |
+
-85
|
| 68 |
+
-100
|
| 69 |
+
-102
|
| 70 |
+
-78
|
| 71 |
+
-44
|
| 72 |
+
-24
|
| 73 |
+
-9
|
| 74 |
+
4
|
| 75 |
+
5
|
| 76 |
+
-10
|
| 77 |
+
-17
|
| 78 |
+
-15
|
| 79 |
+
-9
|
| 80 |
+
-11
|
| 81 |
+
-15
|
| 82 |
+
-37
|
| 83 |
+
-56
|
| 84 |
+
-57
|
| 85 |
+
-55
|
| 86 |
+
-51
|
| 87 |
+
-56
|
| 88 |
+
-65
|
| 89 |
+
-78
|
| 90 |
+
-77
|
| 91 |
+
-60
|
| 92 |
+
-47
|
| 93 |
+
-43
|
| 94 |
+
-33
|
| 95 |
+
-20
|
| 96 |
+
8
|
| 97 |
+
8
|
| 98 |
+
17
|
| 99 |
+
15
|
| 100 |
+
2
|
| 101 |
+
-12
|
| 102 |
+
-20
|
| 103 |
+
-24
|
| 104 |
+
-22
|
| 105 |
+
-24
|
| 106 |
+
-40
|
| 107 |
+
-64
|
| 108 |
+
-63
|
| 109 |
+
-54
|
| 110 |
+
-41
|
| 111 |
+
-44
|
| 112 |
+
-30
|
| 113 |
+
-9
|
| 114 |
+
-3
|
| 115 |
+
0
|
| 116 |
+
-6
|
| 117 |
+
-21
|
| 118 |
+
-34
|
| 119 |
+
-50
|
| 120 |
+
-63
|
| 121 |
+
-89
|
| 122 |
+
-101
|
| 123 |
+
-107
|
| 124 |
+
-93
|
| 125 |
+
-51
|
| 126 |
+
11
|
| 127 |
+
50
|
| 128 |
+
65
|
| 129 |
+
42
|
| 130 |
+
12
|
| 131 |
+
-27
|
| 132 |
+
-59
|
| 133 |
+
-62
|
| 134 |
+
-62
|
| 135 |
+
-64
|
| 136 |
+
-67
|
| 137 |
+
-66
|
| 138 |
+
-65
|
| 139 |
+
-60
|
| 140 |
+
-58
|
| 141 |
+
-57
|
| 142 |
+
-77
|
| 143 |
+
-105
|
| 144 |
+
-125
|
| 145 |
+
-145
|
| 146 |
+
-134
|
| 147 |
+
-126
|
| 148 |
+
-100
|
| 149 |
+
-100
|
| 150 |
+
-100
|
| 151 |
+
-94
|
| 152 |
+
-76
|
| 153 |
+
-59
|
| 154 |
+
-29
|
| 155 |
+
-22
|
| 156 |
+
-21
|
| 157 |
+
-11
|
| 158 |
+
-18
|
| 159 |
+
-22
|
| 160 |
+
-36
|
| 161 |
+
-20
|
| 162 |
+
-7
|
| 163 |
+
17
|
| 164 |
+
33
|
| 165 |
+
3
|
| 166 |
+
-35
|
| 167 |
+
-83
|
| 168 |
+
-94
|
| 169 |
+
-78
|
| 170 |
+
-72
|
| 171 |
+
-68
|
| 172 |
+
-85
|
| 173 |
+
-99
|
| 174 |
+
-111
|
| 175 |
+
-88
|
| 176 |
+
-84
|
| 177 |
+
-91
|
| 178 |
+
-96
|
| 179 |
+
-91
|
| 180 |
+
-78
|
| 181 |
+
-75
|
| 182 |
+
-70
|
| 183 |
+
-77
|
| 184 |
+
-69
|
| 185 |
+
-66
|
| 186 |
+
-52
|
| 187 |
+
-69
|
| 188 |
+
-59
|
| 189 |
+
-57
|
| 190 |
+
-48
|
| 191 |
+
-43
|
| 192 |
+
-40
|
| 193 |
+
-51
|
| 194 |
+
-67
|
| 195 |
+
-82
|
| 196 |
+
-79
|
| 197 |
+
-91
|
| 198 |
+
-99
|
| 199 |
+
-111
|
| 200 |
+
-97
|
| 201 |
+
-70
|
| 202 |
+
-38
|
| 203 |
+
-38
|
| 204 |
+
-72
|
| 205 |
+
-120
|
| 206 |
+
-154
|
| 207 |
+
-173
|
| 208 |
+
-129
|
| 209 |
+
-91
|
| 210 |
+
-71
|
| 211 |
+
-60
|
| 212 |
+
-44
|
| 213 |
+
-22
|
| 214 |
+
2
|
| 215 |
+
-3
|
| 216 |
+
-13
|
| 217 |
+
-14
|
| 218 |
+
-24
|
| 219 |
+
-47
|
| 220 |
+
-58
|
| 221 |
+
-70
|
| 222 |
+
-68
|
| 223 |
+
-63
|
| 224 |
+
-60
|
| 225 |
+
-64
|
| 226 |
+
-71
|
| 227 |
+
-77
|
| 228 |
+
-85
|
| 229 |
+
-89
|
| 230 |
+
-88
|
| 231 |
+
-94
|
| 232 |
+
-96
|
| 233 |
+
-106
|
| 234 |
+
-98
|
| 235 |
+
-89
|
| 236 |
+
-84
|
| 237 |
+
-84
|
| 238 |
+
-96
|
| 239 |
+
-117
|
| 240 |
+
-119
|
| 241 |
+
-114
|
| 242 |
+
-104
|
| 243 |
+
-87
|
| 244 |
+
-62
|
| 245 |
+
-61
|
| 246 |
+
-64
|
| 247 |
+
-74
|
| 248 |
+
-96
|
| 249 |
+
-97
|
| 250 |
+
-87
|
| 251 |
+
-37
|
| 252 |
+
-7
|
| 253 |
+
-8
|
| 254 |
+
-35
|
| 255 |
+
-58
|
| 256 |
+
-81
|
| 257 |
+
-74
|
| 258 |
+
-58
|
| 259 |
+
-43
|
| 260 |
+
-43
|
| 261 |
+
-47
|
| 262 |
+
-39
|
| 263 |
+
-38
|
| 264 |
+
-53
|
| 265 |
+
-63
|
| 266 |
+
-79
|
| 267 |
+
-92
|
| 268 |
+
-90
|
| 269 |
+
-97
|
| 270 |
+
-117
|
| 271 |
+
-143
|
| 272 |
+
-163
|
| 273 |
+
-170
|
| 274 |
+
-164
|
| 275 |
+
-147
|
| 276 |
+
-127
|
| 277 |
+
-109
|
| 278 |
+
-99
|
| 279 |
+
-90
|
| 280 |
+
-70
|
| 281 |
+
-67
|
| 282 |
+
-53
|
| 283 |
+
-59
|
| 284 |
+
-70
|
| 285 |
+
-82
|
| 286 |
+
-85
|
| 287 |
+
-87
|
| 288 |
+
-93
|
| 289 |
+
-89
|
| 290 |
+
-86
|
| 291 |
+
-76
|
| 292 |
+
-73
|
| 293 |
+
-80
|
| 294 |
+
-105
|
| 295 |
+
-126
|
| 296 |
+
-123
|
| 297 |
+
-109
|
| 298 |
+
-74
|
| 299 |
+
-59
|
| 300 |
+
-51
|
| 301 |
+
-65
|
| 302 |
+
-84
|
| 303 |
+
-91
|
| 304 |
+
-88
|
| 305 |
+
-69
|
| 306 |
+
-41
|
| 307 |
+
0
|
| 308 |
+
11
|
| 309 |
+
51
|
| 310 |
+
86
|
| 311 |
+
98
|
| 312 |
+
69
|
| 313 |
+
17
|
| 314 |
+
-22
|
| 315 |
+
-43
|
| 316 |
+
-59
|
| 317 |
+
-50
|
| 318 |
+
-46
|
| 319 |
+
-29
|
| 320 |
+
-37
|
| 321 |
+
-40
|
| 322 |
+
-60
|
| 323 |
+
-49
|
| 324 |
+
-42
|
| 325 |
+
-30
|
| 326 |
+
-28
|
| 327 |
+
-33
|
| 328 |
+
-25
|
| 329 |
+
-31
|
| 330 |
+
-24
|
| 331 |
+
-22
|
| 332 |
+
-36
|
| 333 |
+
-58
|
| 334 |
+
-63
|
| 335 |
+
-73
|
| 336 |
+
-67
|
| 337 |
+
-54
|
| 338 |
+
-26
|
| 339 |
+
10
|
| 340 |
+
30
|
| 341 |
+
28
|
| 342 |
+
16
|
| 343 |
+
2
|
| 344 |
+
-11
|
| 345 |
+
-17
|
| 346 |
+
-24
|
| 347 |
+
-31
|
| 348 |
+
-24
|
| 349 |
+
-23
|
| 350 |
+
-25
|
| 351 |
+
-14
|
| 352 |
+
-11
|
| 353 |
+
-7
|
| 354 |
+
-17
|
| 355 |
+
-27
|
| 356 |
+
-42
|
| 357 |
+
-61
|
| 358 |
+
-59
|
| 359 |
+
-46
|
| 360 |
+
-31
|
| 361 |
+
-29
|
| 362 |
+
-36
|
| 363 |
+
-58
|
| 364 |
+
-80
|
| 365 |
+
-104
|
| 366 |
+
-125
|
| 367 |
+
-134
|
| 368 |
+
-128
|
| 369 |
+
-105
|
| 370 |
+
-94
|
| 371 |
+
-93
|
| 372 |
+
-106
|
| 373 |
+
-100
|
| 374 |
+
-92
|
| 375 |
+
-75
|
| 376 |
+
-57
|
| 377 |
+
-50
|
| 378 |
+
-66
|
| 379 |
+
-74
|
| 380 |
+
-75
|
| 381 |
+
-74
|
| 382 |
+
-60
|
| 383 |
+
-41
|
| 384 |
+
-40
|
| 385 |
+
-66
|
| 386 |
+
-95
|
| 387 |
+
-114
|
| 388 |
+
-126
|
| 389 |
+
-117
|
| 390 |
+
-102
|
| 391 |
+
-86
|
| 392 |
+
-52
|
| 393 |
+
-26
|
| 394 |
+
-9
|
| 395 |
+
-28
|
| 396 |
+
-55
|
| 397 |
+
-84
|
| 398 |
+
-80
|
| 399 |
+
-59
|
| 400 |
+
-37
|
| 401 |
+
-15
|
| 402 |
+
-10
|
| 403 |
+
-7
|
| 404 |
+
-15
|
| 405 |
+
-29
|
| 406 |
+
-51
|
| 407 |
+
-56
|
| 408 |
+
-61
|
| 409 |
+
-83
|
| 410 |
+
-92
|
| 411 |
+
-99
|
| 412 |
+
-98
|
| 413 |
+
-100
|
| 414 |
+
-92
|
| 415 |
+
-81
|
| 416 |
+
-71
|
| 417 |
+
-51
|
| 418 |
+
-43
|
| 419 |
+
-46
|
| 420 |
+
-64
|
| 421 |
+
-79
|
| 422 |
+
-80
|
| 423 |
+
-69
|
| 424 |
+
-45
|
| 425 |
+
-22
|
| 426 |
+
-10
|
| 427 |
+
-18
|
| 428 |
+
-6
|
| 429 |
+
4
|
| 430 |
+
26
|
| 431 |
+
40
|
| 432 |
+
33
|
| 433 |
+
7
|
| 434 |
+
-34
|
| 435 |
+
-59
|
| 436 |
+
-90
|
| 437 |
+
-94
|
| 438 |
+
-85
|
| 439 |
+
-56
|
| 440 |
+
-36
|
| 441 |
+
-15
|
| 442 |
+
-11
|
| 443 |
+
-11
|
| 444 |
+
3
|
| 445 |
+
33
|
| 446 |
+
89
|
| 447 |
+
106
|
| 448 |
+
92
|
| 449 |
+
28
|
| 450 |
+
-45
|
| 451 |
+
-109
|
| 452 |
+
-135
|
| 453 |
+
-125
|
| 454 |
+
-105
|
| 455 |
+
-59
|
| 456 |
+
-15
|
| 457 |
+
18
|
| 458 |
+
30
|
| 459 |
+
23
|
| 460 |
+
7
|
| 461 |
+
-14
|
| 462 |
+
-22
|
| 463 |
+
-17
|
| 464 |
+
-12
|
| 465 |
+
-7
|
| 466 |
+
-8
|
| 467 |
+
-19
|
| 468 |
+
-47
|
| 469 |
+
-61
|
| 470 |
+
-57
|
| 471 |
+
-46
|
| 472 |
+
-47
|
| 473 |
+
-35
|
| 474 |
+
-17
|
| 475 |
+
1
|
| 476 |
+
16
|
| 477 |
+
12
|
| 478 |
+
-3
|
| 479 |
+
-39
|
| 480 |
+
-33
|
| 481 |
+
-36
|
| 482 |
+
-49
|
| 483 |
+
-89
|
| 484 |
+
-119
|
| 485 |
+
-109
|
| 486 |
+
-67
|
| 487 |
+
-19
|
| 488 |
+
4
|
| 489 |
+
4
|
| 490 |
+
3
|
| 491 |
+
13
|
| 492 |
+
20
|
| 493 |
+
23
|
| 494 |
+
15
|
| 495 |
+
-9
|
| 496 |
+
-47
|
| 497 |
+
-76
|
| 498 |
+
-101
|
| 499 |
+
-105
|
| 500 |
+
-104
|
| 501 |
+
-100
|
| 502 |
+
-88
|
| 503 |
+
-60
|
| 504 |
+
-12
|
| 505 |
+
32
|
| 506 |
+
30
|
| 507 |
+
7
|
| 508 |
+
-44
|
| 509 |
+
-84
|
| 510 |
+
-119
|
| 511 |
+
-136
|
| 512 |
+
-115
|
| 513 |
+
-90
|
| 514 |
+
-59
|
| 515 |
+
-32
|
| 516 |
+
-21
|
| 517 |
+
-16
|
| 518 |
+
-10
|
| 519 |
+
-14
|
| 520 |
+
-40
|
| 521 |
+
-67
|
| 522 |
+
-80
|
| 523 |
+
-85
|
| 524 |
+
-83
|
| 525 |
+
-78
|
| 526 |
+
-64
|
| 527 |
+
-66
|
| 528 |
+
-74
|
| 529 |
+
-93
|
| 530 |
+
-110
|
| 531 |
+
-122
|
| 532 |
+
-120
|
| 533 |
+
-111
|
| 534 |
+
-118
|
| 535 |
+
-125
|
| 536 |
+
-123
|
| 537 |
+
-106
|
| 538 |
+
-82
|
| 539 |
+
-38
|
| 540 |
+
-14
|
| 541 |
+
6
|
| 542 |
+
4
|
| 543 |
+
6
|
| 544 |
+
-14
|
| 545 |
+
-44
|
| 546 |
+
-69
|
| 547 |
+
-109
|
| 548 |
+
-138
|
| 549 |
+
-143
|
| 550 |
+
-120
|
| 551 |
+
-94
|
| 552 |
+
-76
|
| 553 |
+
-69
|
| 554 |
+
-70
|
| 555 |
+
-57
|
| 556 |
+
-48
|
| 557 |
+
-31
|
| 558 |
+
-52
|
| 559 |
+
-78
|
| 560 |
+
-108
|
| 561 |
+
-124
|
| 562 |
+
-125
|
| 563 |
+
-111
|
| 564 |
+
-96
|
| 565 |
+
-90
|
| 566 |
+
-90
|
| 567 |
+
-90
|
| 568 |
+
-92
|
| 569 |
+
-80
|
| 570 |
+
-59
|
| 571 |
+
-35
|
| 572 |
+
-35
|
| 573 |
+
-27
|
| 574 |
+
-47
|
| 575 |
+
-67
|
| 576 |
+
-97
|
| 577 |
+
-91
|
| 578 |
+
-76
|
| 579 |
+
-68
|
| 580 |
+
-76
|
| 581 |
+
-86
|
| 582 |
+
-92
|
| 583 |
+
-89
|
| 584 |
+
-68
|
| 585 |
+
-43
|
| 586 |
+
-23
|
| 587 |
+
-24
|
| 588 |
+
-39
|
| 589 |
+
-63
|
| 590 |
+
-63
|
| 591 |
+
-69
|
| 592 |
+
-74
|
| 593 |
+
-77
|
| 594 |
+
-84
|
| 595 |
+
-62
|
| 596 |
+
-38
|
| 597 |
+
-31
|
| 598 |
+
-32
|
| 599 |
+
-66
|
| 600 |
+
-89
|
| 601 |
+
-93
|
| 602 |
+
-63
|
| 603 |
+
-26
|
| 604 |
+
-9
|
| 605 |
+
2
|
| 606 |
+
-5
|
| 607 |
+
-25
|
| 608 |
+
-56
|
| 609 |
+
-84
|
| 610 |
+
-111
|
| 611 |
+
-128
|
| 612 |
+
-120
|
| 613 |
+
-89
|
| 614 |
+
-45
|
| 615 |
+
-2
|
| 616 |
+
22
|
| 617 |
+
23
|
| 618 |
+
-8
|
| 619 |
+
-47
|
| 620 |
+
-84
|
| 621 |
+
-123
|
| 622 |
+
-145
|
| 623 |
+
-150
|
| 624 |
+
-136
|
| 625 |
+
-111
|
| 626 |
+
-59
|
| 627 |
+
-17
|
| 628 |
+
10
|
| 629 |
+
21
|
| 630 |
+
26
|
| 631 |
+
20
|
| 632 |
+
17
|
| 633 |
+
13
|
| 634 |
+
-6
|
| 635 |
+
-27
|
| 636 |
+
-45
|
| 637 |
+
-48
|
| 638 |
+
-55
|
| 639 |
+
-52
|
| 640 |
+
-55
|
| 641 |
+
-51
|
| 642 |
+
-45
|
| 643 |
+
-32
|
| 644 |
+
-22
|
| 645 |
+
-29
|
| 646 |
+
-47
|
| 647 |
+
-53
|
| 648 |
+
-45
|
| 649 |
+
-34
|
| 650 |
+
-38
|
| 651 |
+
-38
|
| 652 |
+
-77
|
| 653 |
+
-94
|
| 654 |
+
-103
|
| 655 |
+
-100
|
| 656 |
+
-86
|
| 657 |
+
-83
|
| 658 |
+
-85
|
| 659 |
+
-101
|
| 660 |
+
-98
|
| 661 |
+
-87
|
| 662 |
+
-62
|
| 663 |
+
-44
|
| 664 |
+
-24
|
| 665 |
+
-10
|
| 666 |
+
8
|
| 667 |
+
21
|
| 668 |
+
25
|
| 669 |
+
26
|
| 670 |
+
7
|
| 671 |
+
-10
|
| 672 |
+
-35
|
| 673 |
+
-70
|
| 674 |
+
-79
|
| 675 |
+
-87
|
| 676 |
+
-93
|
| 677 |
+
-102
|
| 678 |
+
-97
|
| 679 |
+
-84
|
| 680 |
+
-48
|
| 681 |
+
-13
|
| 682 |
+
28
|
| 683 |
+
36
|
| 684 |
+
20
|
| 685 |
+
-1
|
| 686 |
+
-28
|
| 687 |
+
-45
|
| 688 |
+
-45
|
| 689 |
+
-36
|
| 690 |
+
-37
|
| 691 |
+
-26
|
| 692 |
+
-18
|
| 693 |
+
-13
|
| 694 |
+
-9
|
| 695 |
+
2
|
| 696 |
+
9
|
| 697 |
+
3
|
| 698 |
+
9
|
| 699 |
+
11
|
| 700 |
+
18
|
| 701 |
+
20
|
| 702 |
+
12
|
| 703 |
+
2
|
| 704 |
+
-32
|
| 705 |
+
-60
|
| 706 |
+
-91
|
| 707 |
+
-129
|
| 708 |
+
-162
|
| 709 |
+
-173
|
| 710 |
+
-155
|
| 711 |
+
-125
|
| 712 |
+
-93
|
| 713 |
+
-60
|
| 714 |
+
-42
|
| 715 |
+
-25
|
| 716 |
+
-12
|
| 717 |
+
10
|
| 718 |
+
16
|
| 719 |
+
12
|
| 720 |
+
-3
|
| 721 |
+
-23
|
| 722 |
+
-29
|
| 723 |
+
-17
|
| 724 |
+
-4
|
| 725 |
+
-7
|
| 726 |
+
-29
|
| 727 |
+
-49
|
| 728 |
+
-64
|
| 729 |
+
-64
|
| 730 |
+
-37
|
| 731 |
+
-26
|
| 732 |
+
-18
|
| 733 |
+
-21
|
| 734 |
+
-3
|
| 735 |
+
20
|
| 736 |
+
35
|
| 737 |
+
26
|
| 738 |
+
-7
|
| 739 |
+
-21
|
| 740 |
+
-28
|
| 741 |
+
0
|
| 742 |
+
17
|
| 743 |
+
22
|
| 744 |
+
22
|
| 745 |
+
7
|
| 746 |
+
-21
|
| 747 |
+
-45
|
| 748 |
+
-61
|
| 749 |
+
-85
|
| 750 |
+
-105
|
| 751 |
+
-126
|
| 752 |
+
-128
|
| 753 |
+
-120
|
| 754 |
+
-111
|
| 755 |
+
-100
|
| 756 |
+
-115
|
| 757 |
+
-112
|
| 758 |
+
-101
|
| 759 |
+
-89
|
| 760 |
+
-81
|
| 761 |
+
-67
|
| 762 |
+
-46
|
| 763 |
+
-36
|
| 764 |
+
-48
|
| 765 |
+
-75
|
| 766 |
+
-113
|
| 767 |
+
-155
|
| 768 |
+
-187
|
| 769 |
+
-195
|
| 770 |
+
-188
|
| 771 |
+
-162
|
| 772 |
+
-140
|
| 773 |
+
-141
|
| 774 |
+
-162
|
| 775 |
+
-188
|
| 776 |
+
-195
|
| 777 |
+
-166
|
| 778 |
+
-117
|
| 779 |
+
-83
|
| 780 |
+
-80
|
| 781 |
+
-106
|
| 782 |
+
-121
|
| 783 |
+
-121
|
| 784 |
+
-127
|
| 785 |
+
-134
|
| 786 |
+
-141
|
| 787 |
+
-141
|
| 788 |
+
-130
|
| 789 |
+
-108
|
| 790 |
+
-98
|
| 791 |
+
-98
|
| 792 |
+
-80
|
| 793 |
+
-49
|
| 794 |
+
-22
|
| 795 |
+
-19
|
| 796 |
+
-42
|
| 797 |
+
-86
|
| 798 |
+
-120
|
| 799 |
+
-131
|
| 800 |
+
-113
|
| 801 |
+
-92
|
| 802 |
+
-57
|
| 803 |
+
-32
|
| 804 |
+
-6
|
| 805 |
+
-2
|
| 806 |
+
-10
|
| 807 |
+
-14
|
| 808 |
+
-9
|
| 809 |
+
-7
|
| 810 |
+
0
|
| 811 |
+
7
|
| 812 |
+
13
|
| 813 |
+
13
|
| 814 |
+
15
|
| 815 |
+
-10
|
| 816 |
+
-24
|
| 817 |
+
-25
|
| 818 |
+
-24
|
| 819 |
+
-16
|
| 820 |
+
-17
|
| 821 |
+
-14
|
| 822 |
+
-5
|
| 823 |
+
14
|
| 824 |
+
26
|
| 825 |
+
15
|
| 826 |
+
-8
|
| 827 |
+
-41
|
| 828 |
+
-42
|
| 829 |
+
-48
|
| 830 |
+
-39
|
| 831 |
+
-32
|
| 832 |
+
-43
|
| 833 |
+
-44
|
| 834 |
+
-48
|
| 835 |
+
-46
|
| 836 |
+
-51
|
| 837 |
+
-60
|
| 838 |
+
-79
|
| 839 |
+
-89
|
| 840 |
+
-97
|
| 841 |
+
-89
|
| 842 |
+
-79
|
| 843 |
+
-69
|
| 844 |
+
-69
|
| 845 |
+
-70
|
| 846 |
+
-83
|
| 847 |
+
-84
|
| 848 |
+
-69
|
| 849 |
+
-60
|
| 850 |
+
-65
|
| 851 |
+
-77
|
| 852 |
+
-74
|
| 853 |
+
-71
|
| 854 |
+
-66
|
| 855 |
+
-68
|
| 856 |
+
-67
|
| 857 |
+
-61
|
| 858 |
+
-43
|
| 859 |
+
-26
|
| 860 |
+
-22
|
| 861 |
+
-21
|
| 862 |
+
-16
|
| 863 |
+
-18
|
| 864 |
+
-21
|
| 865 |
+
-36
|
| 866 |
+
-51
|
| 867 |
+
-68
|
| 868 |
+
-78
|
| 869 |
+
-80
|
| 870 |
+
-88
|
| 871 |
+
-86
|
| 872 |
+
-84
|
| 873 |
+
-79
|
| 874 |
+
-81
|
| 875 |
+
-68
|
| 876 |
+
-42
|
| 877 |
+
-15
|
| 878 |
+
-17
|
| 879 |
+
-24
|
| 880 |
+
-29
|
| 881 |
+
-19
|
| 882 |
+
-13
|
| 883 |
+
-29
|
| 884 |
+
-53
|
| 885 |
+
-73
|
| 886 |
+
-70
|
| 887 |
+
-48
|
| 888 |
+
-32
|
| 889 |
+
-20
|
| 890 |
+
-4
|
| 891 |
+
-12
|
| 892 |
+
-39
|
| 893 |
+
-72
|
| 894 |
+
-86
|
| 895 |
+
-105
|
| 896 |
+
-108
|
| 897 |
+
-119
|
| 898 |
+
-109
|
| 899 |
+
-89
|
| 900 |
+
-41
|
| 901 |
+
-21
|
| 902 |
+
-30
|
| 903 |
+
-59
|
| 904 |
+
-74
|
| 905 |
+
-71
|
| 906 |
+
-64
|
| 907 |
+
-55
|
| 908 |
+
-41
|
| 909 |
+
-50
|
| 910 |
+
-32
|
| 911 |
+
-25
|
| 912 |
+
-23
|
| 913 |
+
-25
|
| 914 |
+
-19
|
| 915 |
+
-7
|
| 916 |
+
3
|
| 917 |
+
10
|
| 918 |
+
1
|
| 919 |
+
-23
|
| 920 |
+
-59
|
| 921 |
+
-72
|
| 922 |
+
-66
|
| 923 |
+
-44
|
| 924 |
+
-38
|
| 925 |
+
-40
|
| 926 |
+
-48
|
| 927 |
+
-58
|
| 928 |
+
-53
|
| 929 |
+
-48
|
| 930 |
+
-63
|
| 931 |
+
-76
|
| 932 |
+
-85
|
| 933 |
+
-96
|
| 934 |
+
-91
|
| 935 |
+
-94
|
| 936 |
+
-97
|
| 937 |
+
-107
|
| 938 |
+
-108
|
| 939 |
+
-96
|
| 940 |
+
-93
|
| 941 |
+
-71
|
| 942 |
+
-62
|
| 943 |
+
-36
|
| 944 |
+
-25
|
| 945 |
+
-26
|
| 946 |
+
-42
|
| 947 |
+
-67
|
| 948 |
+
-78
|
| 949 |
+
-69
|
| 950 |
+
-59
|
| 951 |
+
-58
|
| 952 |
+
-49
|
| 953 |
+
-26
|
| 954 |
+
-9
|
| 955 |
+
0
|
| 956 |
+
-6
|
| 957 |
+
-21
|
| 958 |
+
-23
|
| 959 |
+
-26
|
| 960 |
+
-34
|
| 961 |
+
-46
|
| 962 |
+
-55
|
| 963 |
+
-39
|
| 964 |
+
-30
|
| 965 |
+
-34
|
| 966 |
+
-34
|
| 967 |
+
-37
|
| 968 |
+
-46
|
| 969 |
+
-57
|
| 970 |
+
-76
|
| 971 |
+
-98
|
| 972 |
+
-112
|
| 973 |
+
-91
|
| 974 |
+
-64
|
| 975 |
+
-39
|
| 976 |
+
-26
|
| 977 |
+
-18
|
| 978 |
+
-17
|
| 979 |
+
-21
|
| 980 |
+
0
|
| 981 |
+
15
|
| 982 |
+
18
|
| 983 |
+
6
|
| 984 |
+
-16
|
| 985 |
+
-20
|
| 986 |
+
-23
|
| 987 |
+
-20
|
| 988 |
+
-36
|
| 989 |
+
-47
|
| 990 |
+
-49
|
| 991 |
+
-33
|
| 992 |
+
-35
|
| 993 |
+
-48
|
| 994 |
+
-63
|
| 995 |
+
-69
|
| 996 |
+
-63
|
| 997 |
+
-37
|
| 998 |
+
-20
|
| 999 |
+
-28
|
| 1000 |
+
-59
|
| 1001 |
+
-109
|
| 1002 |
+
-149
|
| 1003 |
+
-158
|
| 1004 |
+
-136
|
| 1005 |
+
-92
|
| 1006 |
+
-60
|
| 1007 |
+
-35
|
| 1008 |
+
-29
|
| 1009 |
+
-31
|
| 1010 |
+
-45
|
| 1011 |
+
-30
|
| 1012 |
+
-7
|
| 1013 |
+
0
|
| 1014 |
+
3
|
| 1015 |
+
-15
|
| 1016 |
+
-34
|
| 1017 |
+
-77
|
| 1018 |
+
-100
|
| 1019 |
+
-119
|
| 1020 |
+
-114
|
| 1021 |
+
-86
|
| 1022 |
+
-44
|
| 1023 |
+
-10
|
| 1024 |
+
-3
|
| 1025 |
+
-7
|
| 1026 |
+
-6
|
| 1027 |
+
5
|
| 1028 |
+
13
|
| 1029 |
+
2
|
| 1030 |
+
-40
|
| 1031 |
+
-73
|
| 1032 |
+
-83
|
| 1033 |
+
-87
|
| 1034 |
+
-94
|
| 1035 |
+
-108
|
| 1036 |
+
-118
|
| 1037 |
+
-118
|
| 1038 |
+
-115
|
| 1039 |
+
-104
|
| 1040 |
+
-106
|
| 1041 |
+
-103
|
| 1042 |
+
-78
|
| 1043 |
+
-39
|
| 1044 |
+
8
|
| 1045 |
+
19
|
| 1046 |
+
19
|
| 1047 |
+
-4
|
| 1048 |
+
-34
|
| 1049 |
+
-47
|
| 1050 |
+
-55
|
| 1051 |
+
-72
|
| 1052 |
+
-109
|
| 1053 |
+
-147
|
| 1054 |
+
-175
|
| 1055 |
+
-161
|
| 1056 |
+
-120
|
| 1057 |
+
-91
|
| 1058 |
+
-88
|
| 1059 |
+
-100
|
| 1060 |
+
-101
|
| 1061 |
+
-90
|
| 1062 |
+
-80
|
| 1063 |
+
-80
|
| 1064 |
+
-83
|
| 1065 |
+
-91
|
| 1066 |
+
-95
|
| 1067 |
+
-86
|
| 1068 |
+
-100
|
| 1069 |
+
-113
|
| 1070 |
+
-129
|
| 1071 |
+
-115
|
| 1072 |
+
-99
|
| 1073 |
+
-79
|
| 1074 |
+
-72
|
| 1075 |
+
-92
|
| 1076 |
+
-112
|
| 1077 |
+
-112
|
| 1078 |
+
-91
|
| 1079 |
+
-53
|
| 1080 |
+
-21
|
| 1081 |
+
-21
|
| 1082 |
+
-42
|
| 1083 |
+
-69
|
| 1084 |
+
-75
|
| 1085 |
+
-61
|
| 1086 |
+
-68
|
| 1087 |
+
-85
|
| 1088 |
+
-107
|
| 1089 |
+
-117
|
| 1090 |
+
-106
|
| 1091 |
+
-78
|
| 1092 |
+
-71
|
| 1093 |
+
-61
|
| 1094 |
+
-67
|
| 1095 |
+
-45
|
| 1096 |
+
-32
|
| 1097 |
+
-40
|
| 1098 |
+
-49
|
| 1099 |
+
-84
|
| 1100 |
+
-98
|
| 1101 |
+
-96
|
| 1102 |
+
-75
|
| 1103 |
+
-52
|
| 1104 |
+
-42
|
| 1105 |
+
-24
|
| 1106 |
+
-10
|
| 1107 |
+
-15
|
| 1108 |
+
-11
|
| 1109 |
+
-17
|
| 1110 |
+
-14
|
| 1111 |
+
-12
|
| 1112 |
+
17
|
| 1113 |
+
50
|
| 1114 |
+
76
|
| 1115 |
+
69
|
| 1116 |
+
34
|
| 1117 |
+
-8
|
| 1118 |
+
-56
|
| 1119 |
+
-75
|
| 1120 |
+
-76
|
| 1121 |
+
-61
|
| 1122 |
+
-38
|
| 1123 |
+
-13
|
| 1124 |
+
-7
|
| 1125 |
+
2
|
| 1126 |
+
-6
|
| 1127 |
+
-14
|
| 1128 |
+
-44
|
| 1129 |
+
-72
|
| 1130 |
+
-100
|
| 1131 |
+
-122
|
| 1132 |
+
-117
|
| 1133 |
+
-94
|
| 1134 |
+
-74
|
| 1135 |
+
-67
|
| 1136 |
+
-60
|
| 1137 |
+
-52
|
| 1138 |
+
-63
|
| 1139 |
+
-71
|
| 1140 |
+
-75
|
| 1141 |
+
-68
|
| 1142 |
+
-44
|
| 1143 |
+
-27
|
| 1144 |
+
-1
|
| 1145 |
+
9
|
| 1146 |
+
10
|
| 1147 |
+
8
|
| 1148 |
+
-5
|
| 1149 |
+
-28
|
| 1150 |
+
-38
|
| 1151 |
+
-28
|
| 1152 |
+
-20
|
| 1153 |
+
-13
|
| 1154 |
+
-26
|
| 1155 |
+
-61
|
| 1156 |
+
-80
|
| 1157 |
+
-79
|
| 1158 |
+
-57
|
| 1159 |
+
-24
|
| 1160 |
+
8
|
| 1161 |
+
26
|
| 1162 |
+
26
|
| 1163 |
+
-3
|
| 1164 |
+
-37
|
| 1165 |
+
-85
|
| 1166 |
+
-116
|
| 1167 |
+
-130
|
| 1168 |
+
-112
|
| 1169 |
+
-92
|
| 1170 |
+
-66
|
| 1171 |
+
-44
|
| 1172 |
+
-27
|
| 1173 |
+
-25
|
| 1174 |
+
-23
|
| 1175 |
+
-15
|
| 1176 |
+
-1
|
| 1177 |
+
18
|
| 1178 |
+
47
|
| 1179 |
+
54
|
| 1180 |
+
49
|
| 1181 |
+
35
|
| 1182 |
+
27
|
| 1183 |
+
5
|
| 1184 |
+
-18
|
| 1185 |
+
-44
|
| 1186 |
+
-67
|
| 1187 |
+
-91
|
| 1188 |
+
-99
|
| 1189 |
+
-104
|
| 1190 |
+
-105
|
| 1191 |
+
-110
|
| 1192 |
+
-113
|
| 1193 |
+
-105
|
| 1194 |
+
-94
|
| 1195 |
+
-64
|
| 1196 |
+
-42
|
| 1197 |
+
-55
|
| 1198 |
+
-78
|
| 1199 |
+
-99
|
| 1200 |
+
-97
|
| 1201 |
+
-83
|
| 1202 |
+
-61
|
| 1203 |
+
-58
|
| 1204 |
+
-56
|
| 1205 |
+
-54
|
| 1206 |
+
-52
|
| 1207 |
+
-40
|
| 1208 |
+
-27
|
| 1209 |
+
-15
|
| 1210 |
+
-16
|
| 1211 |
+
-33
|
| 1212 |
+
-44
|
| 1213 |
+
-56
|
| 1214 |
+
-54
|
| 1215 |
+
-71
|
| 1216 |
+
-60
|
| 1217 |
+
-39
|
| 1218 |
+
-5
|
| 1219 |
+
19
|
| 1220 |
+
5
|
| 1221 |
+
-18
|
| 1222 |
+
-42
|
| 1223 |
+
-33
|
| 1224 |
+
-18
|
| 1225 |
+
-15
|
| 1226 |
+
-22
|
| 1227 |
+
-29
|
| 1228 |
+
-35
|
| 1229 |
+
-40
|
| 1230 |
+
-45
|
| 1231 |
+
-70
|
| 1232 |
+
-95
|
| 1233 |
+
-96
|
| 1234 |
+
-87
|
| 1235 |
+
-77
|
| 1236 |
+
-82
|
| 1237 |
+
-70
|
| 1238 |
+
-74
|
| 1239 |
+
-59
|
| 1240 |
+
-43
|
| 1241 |
+
-29
|
| 1242 |
+
-31
|
| 1243 |
+
-29
|
| 1244 |
+
-19
|
| 1245 |
+
-12
|
| 1246 |
+
-17
|
| 1247 |
+
-32
|
| 1248 |
+
-39
|
| 1249 |
+
-47
|
| 1250 |
+
-37
|
| 1251 |
+
-32
|
| 1252 |
+
-36
|
| 1253 |
+
-57
|
| 1254 |
+
-73
|
| 1255 |
+
-85
|
| 1256 |
+
-94
|
| 1257 |
+
-99
|
| 1258 |
+
-94
|
| 1259 |
+
-96
|
| 1260 |
+
-104
|
| 1261 |
+
-103
|
| 1262 |
+
-92
|
| 1263 |
+
-75
|
| 1264 |
+
-69
|
| 1265 |
+
-69
|
| 1266 |
+
-53
|
| 1267 |
+
-37
|
| 1268 |
+
-14
|
| 1269 |
+
-10
|
| 1270 |
+
-39
|
| 1271 |
+
-78
|
| 1272 |
+
-102
|
| 1273 |
+
-98
|
| 1274 |
+
-80
|
| 1275 |
+
-54
|
| 1276 |
+
-40
|
| 1277 |
+
-35
|
| 1278 |
+
-39
|
| 1279 |
+
-32
|
| 1280 |
+
-13
|
| 1281 |
+
7
|
| 1282 |
+
34
|
| 1283 |
+
41
|
| 1284 |
+
33
|
| 1285 |
+
6
|
| 1286 |
+
-15
|
| 1287 |
+
-30
|
| 1288 |
+
-47
|
| 1289 |
+
-53
|
| 1290 |
+
-65
|
| 1291 |
+
-64
|
| 1292 |
+
-68
|
| 1293 |
+
-85
|
| 1294 |
+
-98
|
| 1295 |
+
-109
|
| 1296 |
+
-82
|
| 1297 |
+
-57
|
| 1298 |
+
-38
|
| 1299 |
+
-40
|
| 1300 |
+
-36
|
| 1301 |
+
-31
|
| 1302 |
+
-13
|
| 1303 |
+
11
|
| 1304 |
+
19
|
| 1305 |
+
9
|
| 1306 |
+
-20
|
| 1307 |
+
-48
|
| 1308 |
+
-71
|
| 1309 |
+
-71
|
| 1310 |
+
-57
|
| 1311 |
+
-32
|
| 1312 |
+
-13
|
| 1313 |
+
6
|
| 1314 |
+
29
|
| 1315 |
+
27
|
| 1316 |
+
25
|
| 1317 |
+
10
|
| 1318 |
+
-7
|
| 1319 |
+
-36
|
| 1320 |
+
-47
|
| 1321 |
+
-37
|
| 1322 |
+
-36
|
| 1323 |
+
-22
|
| 1324 |
+
-32
|
| 1325 |
+
-38
|
| 1326 |
+
-55
|
| 1327 |
+
-61
|
| 1328 |
+
-64
|
| 1329 |
+
-72
|
| 1330 |
+
-67
|
| 1331 |
+
-53
|
| 1332 |
+
-25
|
| 1333 |
+
-10
|
| 1334 |
+
-4
|
| 1335 |
+
-23
|
| 1336 |
+
-55
|
| 1337 |
+
-93
|
| 1338 |
+
-102
|
| 1339 |
+
-106
|
| 1340 |
+
-101
|
| 1341 |
+
-69
|
| 1342 |
+
-45
|
| 1343 |
+
-42
|
| 1344 |
+
-57
|
| 1345 |
+
-64
|
| 1346 |
+
-77
|
| 1347 |
+
-80
|
| 1348 |
+
-77
|
| 1349 |
+
-78
|
| 1350 |
+
-56
|
| 1351 |
+
-34
|
| 1352 |
+
-5
|
| 1353 |
+
10
|
| 1354 |
+
5
|
| 1355 |
+
-5
|
| 1356 |
+
-44
|
| 1357 |
+
-75
|
| 1358 |
+
-99
|
| 1359 |
+
-110
|
| 1360 |
+
-104
|
| 1361 |
+
-103
|
| 1362 |
+
-94
|
| 1363 |
+
-105
|
| 1364 |
+
-108
|
| 1365 |
+
-110
|
| 1366 |
+
-99
|
| 1367 |
+
-89
|
| 1368 |
+
-82
|
| 1369 |
+
-76
|
| 1370 |
+
-80
|
| 1371 |
+
-90
|
| 1372 |
+
-106
|
| 1373 |
+
-106
|
| 1374 |
+
-108
|
| 1375 |
+
-87
|
| 1376 |
+
-60
|
| 1377 |
+
-37
|
| 1378 |
+
-26
|
| 1379 |
+
-15
|
| 1380 |
+
-6
|
| 1381 |
+
-14
|
| 1382 |
+
-23
|
| 1383 |
+
-34
|
| 1384 |
+
-41
|
| 1385 |
+
-54
|
| 1386 |
+
-82
|
| 1387 |
+
-107
|
| 1388 |
+
-126
|
| 1389 |
+
-124
|
| 1390 |
+
-108
|
| 1391 |
+
-84
|
| 1392 |
+
-68
|
| 1393 |
+
-61
|
| 1394 |
+
-56
|
| 1395 |
+
-63
|
| 1396 |
+
-62
|
| 1397 |
+
-33
|
| 1398 |
+
1
|
| 1399 |
+
28
|
| 1400 |
+
45
|
| 1401 |
+
37
|
| 1402 |
+
48
|
| 1403 |
+
62
|
| 1404 |
+
80
|
| 1405 |
+
66
|
| 1406 |
+
23
|
| 1407 |
+
-11
|
| 1408 |
+
-39
|
| 1409 |
+
-44
|
| 1410 |
+
-42
|
| 1411 |
+
-45
|
| 1412 |
+
-48
|
| 1413 |
+
-42
|
| 1414 |
+
-6
|
| 1415 |
+
29
|
| 1416 |
+
57
|
| 1417 |
+
64
|
| 1418 |
+
48
|
| 1419 |
+
19
|
| 1420 |
+
-12
|
| 1421 |
+
-30
|
| 1422 |
+
-35
|
| 1423 |
+
-35
|
| 1424 |
+
-36
|
| 1425 |
+
-39
|
| 1426 |
+
-51
|
| 1427 |
+
-57
|
| 1428 |
+
-60
|
| 1429 |
+
-69
|
| 1430 |
+
-80
|
| 1431 |
+
-83
|
| 1432 |
+
-81
|
| 1433 |
+
-78
|
| 1434 |
+
-87
|
| 1435 |
+
-83
|
| 1436 |
+
-69
|
| 1437 |
+
-48
|
| 1438 |
+
-19
|
| 1439 |
+
6
|
| 1440 |
+
16
|
| 1441 |
+
7
|
| 1442 |
+
-34
|
| 1443 |
+
-88
|
| 1444 |
+
-141
|
| 1445 |
+
-155
|
| 1446 |
+
-143
|
| 1447 |
+
-124
|
| 1448 |
+
-99
|
| 1449 |
+
-70
|
| 1450 |
+
-39
|
| 1451 |
+
-28
|
| 1452 |
+
-29
|
| 1453 |
+
-50
|
| 1454 |
+
-76
|
| 1455 |
+
-77
|
| 1456 |
+
-61
|
| 1457 |
+
-48
|
| 1458 |
+
-54
|
| 1459 |
+
-74
|
| 1460 |
+
-76
|
| 1461 |
+
-88
|
| 1462 |
+
-109
|
| 1463 |
+
-132
|
| 1464 |
+
-160
|
| 1465 |
+
-175
|
| 1466 |
+
-161
|
| 1467 |
+
-136
|
| 1468 |
+
-117
|
| 1469 |
+
-111
|
| 1470 |
+
-110
|
| 1471 |
+
-95
|
| 1472 |
+
-80
|
| 1473 |
+
-47
|
| 1474 |
+
-24
|
| 1475 |
+
-20
|
| 1476 |
+
-43
|
| 1477 |
+
-87
|
| 1478 |
+
-120
|
| 1479 |
+
-135
|
| 1480 |
+
-117
|
| 1481 |
+
-111
|
| 1482 |
+
-115
|
| 1483 |
+
-121
|
| 1484 |
+
-117
|
| 1485 |
+
-95
|
| 1486 |
+
-65
|
| 1487 |
+
-25
|
| 1488 |
+
-4
|
| 1489 |
+
-12
|
| 1490 |
+
-20
|
| 1491 |
+
-27
|
| 1492 |
+
-14
|
| 1493 |
+
-3
|
| 1494 |
+
3
|
| 1495 |
+
-19
|
| 1496 |
+
-46
|
| 1497 |
+
-86
|
| 1498 |
+
-82
|
| 1499 |
+
-88
|
| 1500 |
+
-78
|
| 1501 |
+
-48
|
| 1502 |
+
-11
|
| 1503 |
+
25
|
| 1504 |
+
44
|
| 1505 |
+
47
|
| 1506 |
+
32
|
| 1507 |
+
15
|
| 1508 |
+
6
|
| 1509 |
+
4
|
| 1510 |
+
-7
|
| 1511 |
+
-18
|
| 1512 |
+
-30
|
| 1513 |
+
-37
|
| 1514 |
+
-41
|
| 1515 |
+
-45
|
| 1516 |
+
-42
|
| 1517 |
+
-30
|
| 1518 |
+
-16
|
| 1519 |
+
-9
|
| 1520 |
+
-24
|
| 1521 |
+
-31
|
| 1522 |
+
-33
|
| 1523 |
+
-27
|
| 1524 |
+
-37
|
| 1525 |
+
-41
|
| 1526 |
+
-42
|
| 1527 |
+
-42
|
| 1528 |
+
-28
|
| 1529 |
+
-16
|
| 1530 |
+
-15
|
| 1531 |
+
-24
|
| 1532 |
+
-36
|
| 1533 |
+
-39
|
| 1534 |
+
-40
|
| 1535 |
+
-21
|
| 1536 |
+
-1
|
| 1537 |
+
17
|
| 1538 |
+
-2
|
| 1539 |
+
-33
|
| 1540 |
+
-86
|
| 1541 |
+
-121
|
| 1542 |
+
-126
|
| 1543 |
+
-109
|
| 1544 |
+
-78
|
| 1545 |
+
-54
|
| 1546 |
+
-42
|
| 1547 |
+
-57
|
| 1548 |
+
-70
|
| 1549 |
+
-91
|
| 1550 |
+
-90
|
| 1551 |
+
-80
|
| 1552 |
+
-53
|
| 1553 |
+
-18
|
| 1554 |
+
11
|
| 1555 |
+
15
|
| 1556 |
+
10
|
| 1557 |
+
1
|
| 1558 |
+
-16
|
| 1559 |
+
-47
|
| 1560 |
+
-78
|
| 1561 |
+
-111
|
| 1562 |
+
-138
|
| 1563 |
+
-155
|
| 1564 |
+
-152
|
| 1565 |
+
-149
|
| 1566 |
+
-120
|
| 1567 |
+
-76
|
| 1568 |
+
-43
|
| 1569 |
+
-29
|
| 1570 |
+
-36
|
| 1571 |
+
-44
|
| 1572 |
+
-53
|
| 1573 |
+
-60
|
| 1574 |
+
-52
|
| 1575 |
+
-47
|
| 1576 |
+
-42
|
| 1577 |
+
-44
|
| 1578 |
+
-44
|
| 1579 |
+
-46
|
| 1580 |
+
-51
|
| 1581 |
+
-50
|
| 1582 |
+
-56
|
| 1583 |
+
-65
|
| 1584 |
+
-72
|
| 1585 |
+
-73
|
| 1586 |
+
-74
|
| 1587 |
+
-59
|
| 1588 |
+
-56
|
| 1589 |
+
-47
|
| 1590 |
+
-64
|
| 1591 |
+
-72
|
| 1592 |
+
-102
|
| 1593 |
+
-124
|
| 1594 |
+
-127
|
| 1595 |
+
-110
|
| 1596 |
+
-94
|
| 1597 |
+
-88
|
| 1598 |
+
-77
|
| 1599 |
+
-70
|
| 1600 |
+
-48
|
| 1601 |
+
-24
|
| 1602 |
+
-10
|
| 1603 |
+
-19
|
| 1604 |
+
-34
|
| 1605 |
+
-62
|
| 1606 |
+
-77
|
| 1607 |
+
-85
|
| 1608 |
+
-83
|
| 1609 |
+
-87
|
| 1610 |
+
-90
|
| 1611 |
+
-98
|
| 1612 |
+
-79
|
| 1613 |
+
-51
|
| 1614 |
+
-16
|
| 1615 |
+
6
|
| 1616 |
+
-2
|
| 1617 |
+
-45
|
| 1618 |
+
-82
|
| 1619 |
+
-89
|
| 1620 |
+
-85
|
| 1621 |
+
-88
|
| 1622 |
+
-98
|
| 1623 |
+
-98
|
| 1624 |
+
-70
|
| 1625 |
+
-22
|
| 1626 |
+
33
|
| 1627 |
+
72
|
| 1628 |
+
87
|
| 1629 |
+
75
|
| 1630 |
+
51
|
| 1631 |
+
3
|
| 1632 |
+
-41
|
| 1633 |
+
-72
|
| 1634 |
+
-93
|
| 1635 |
+
-94
|
| 1636 |
+
-81
|
| 1637 |
+
-39
|
| 1638 |
+
12
|
| 1639 |
+
74
|
| 1640 |
+
118
|
| 1641 |
+
129
|
| 1642 |
+
102
|
| 1643 |
+
51
|
| 1644 |
+
-10
|
| 1645 |
+
-83
|
| 1646 |
+
-137
|
| 1647 |
+
-142
|
| 1648 |
+
-124
|
| 1649 |
+
-83
|
| 1650 |
+
-60
|
| 1651 |
+
-45
|
| 1652 |
+
-29
|
| 1653 |
+
-15
|
| 1654 |
+
3
|
| 1655 |
+
-1
|
| 1656 |
+
-35
|
| 1657 |
+
-75
|
| 1658 |
+
-127
|
| 1659 |
+
-170
|
| 1660 |
+
-192
|
| 1661 |
+
-193
|
| 1662 |
+
-170
|
| 1663 |
+
-146
|
| 1664 |
+
-103
|
| 1665 |
+
-62
|
| 1666 |
+
-21
|
| 1667 |
+
-1
|
| 1668 |
+
-1
|
| 1669 |
+
-22
|
| 1670 |
+
-42
|
| 1671 |
+
-48
|
| 1672 |
+
-44
|
| 1673 |
+
-29
|
| 1674 |
+
-17
|
| 1675 |
+
-6
|
| 1676 |
+
-3
|
| 1677 |
+
-4
|
| 1678 |
+
-12
|
| 1679 |
+
-33
|
| 1680 |
+
-48
|
| 1681 |
+
-45
|
| 1682 |
+
-13
|
| 1683 |
+
-5
|
| 1684 |
+
-11
|
| 1685 |
+
-33
|
| 1686 |
+
-57
|
| 1687 |
+
-80
|
| 1688 |
+
-103
|
| 1689 |
+
-111
|
| 1690 |
+
-115
|
| 1691 |
+
-113
|
| 1692 |
+
-106
|
| 1693 |
+
-100
|
| 1694 |
+
-81
|
| 1695 |
+
-47
|
| 1696 |
+
-9
|
| 1697 |
+
-13
|
| 1698 |
+
-12
|
| 1699 |
+
-35
|
| 1700 |
+
-37
|
| 1701 |
+
-43
|
| 1702 |
+
-40
|
| 1703 |
+
-23
|
| 1704 |
+
-8
|
| 1705 |
+
-4
|
| 1706 |
+
2
|
| 1707 |
+
-15
|
| 1708 |
+
-38
|
| 1709 |
+
-50
|
| 1710 |
+
-54
|
| 1711 |
+
-56
|
| 1712 |
+
-64
|
| 1713 |
+
-75
|
| 1714 |
+
-87
|
| 1715 |
+
-86
|
| 1716 |
+
-70
|
| 1717 |
+
-59
|
| 1718 |
+
-67
|
| 1719 |
+
-87
|
| 1720 |
+
-109
|
| 1721 |
+
-120
|
| 1722 |
+
-123
|
| 1723 |
+
-111
|
| 1724 |
+
-96
|
| 1725 |
+
-95
|
| 1726 |
+
-81
|
| 1727 |
+
-70
|
| 1728 |
+
-53
|
| 1729 |
+
-51
|
| 1730 |
+
-54
|
| 1731 |
+
-68
|
| 1732 |
+
-78
|
| 1733 |
+
-79
|
| 1734 |
+
-74
|
| 1735 |
+
-74
|
| 1736 |
+
-80
|
| 1737 |
+
-72
|
| 1738 |
+
-55
|
| 1739 |
+
-32
|
| 1740 |
+
-27
|
| 1741 |
+
-29
|
| 1742 |
+
-51
|
| 1743 |
+
-74
|
| 1744 |
+
-68
|
| 1745 |
+
-65
|
| 1746 |
+
-33
|
| 1747 |
+
-19
|
| 1748 |
+
-24
|
| 1749 |
+
-51
|
| 1750 |
+
-82
|
| 1751 |
+
-92
|
| 1752 |
+
-81
|
| 1753 |
+
-65
|
| 1754 |
+
-35
|
| 1755 |
+
-11
|
| 1756 |
+
-12
|
| 1757 |
+
-11
|
| 1758 |
+
-130
|
| 1759 |
+
-123
|
| 1760 |
+
-85
|
| 1761 |
+
-45
|
| 1762 |
+
-26
|
| 1763 |
+
-27
|
| 1764 |
+
-40
|
| 1765 |
+
-45
|
| 1766 |
+
-54
|
| 1767 |
+
-57
|
| 1768 |
+
-58
|
| 1769 |
+
-63
|
| 1770 |
+
-72
|
| 1771 |
+
-90
|
| 1772 |
+
-95
|
| 1773 |
+
-98
|
| 1774 |
+
-100
|
| 1775 |
+
-97
|
| 1776 |
+
-101
|
| 1777 |
+
-117
|
| 1778 |
+
-120
|
| 1779 |
+
-109
|
| 1780 |
+
-90
|
| 1781 |
+
-52
|
| 1782 |
+
-21
|
| 1783 |
+
-11
|
| 1784 |
+
-23
|
| 1785 |
+
-32
|
| 1786 |
+
-48
|
| 1787 |
+
-64
|
| 1788 |
+
-87
|
| 1789 |
+
-107
|
| 1790 |
+
-131
|
| 1791 |
+
-156
|
| 1792 |
+
-157
|
| 1793 |
+
-126
|
| 1794 |
+
-71
|
| 1795 |
+
-15
|
| 1796 |
+
20
|
| 1797 |
+
27
|
| 1798 |
+
24
|
| 1799 |
+
26
|
| 1800 |
+
20
|
| 1801 |
+
8
|
| 1802 |
+
5
|
| 1803 |
+
17
|
| 1804 |
+
11
|
| 1805 |
+
-4
|
| 1806 |
+
-27
|
| 1807 |
+
-59
|
| 1808 |
+
-62
|
| 1809 |
+
-58
|
| 1810 |
+
-36
|
| 1811 |
+
-34
|
| 1812 |
+
-31
|
| 1813 |
+
-32
|
| 1814 |
+
-27
|
| 1815 |
+
-19
|
| 1816 |
+
-20
|
| 1817 |
+
-16
|
| 1818 |
+
-34
|
| 1819 |
+
-40
|
| 1820 |
+
-60
|
| 1821 |
+
-71
|
| 1822 |
+
-81
|
| 1823 |
+
-97
|
| 1824 |
+
-95
|
| 1825 |
+
-88
|
| 1826 |
+
-66
|
| 1827 |
+
-44
|
| 1828 |
+
-20
|
| 1829 |
+
-5
|
| 1830 |
+
-4
|
| 1831 |
+
-14
|
| 1832 |
+
-45
|
| 1833 |
+
-37
|
| 1834 |
+
-4
|
| 1835 |
+
31
|
| 1836 |
+
34
|
| 1837 |
+
11
|
| 1838 |
+
-36
|
| 1839 |
+
-61
|
| 1840 |
+
-60
|
| 1841 |
+
-49
|
| 1842 |
+
-44
|
| 1843 |
+
-60
|
| 1844 |
+
-72
|
| 1845 |
+
-79
|
| 1846 |
+
-73
|
| 1847 |
+
-54
|
| 1848 |
+
-37
|
| 1849 |
+
-22
|
| 1850 |
+
-22
|
| 1851 |
+
-22
|
| 1852 |
+
-18
|
| 1853 |
+
-17
|
| 1854 |
+
-9
|
| 1855 |
+
-12
|
| 1856 |
+
-33
|
| 1857 |
+
-85
|
| 1858 |
+
-109
|
| 1859 |
+
-122
|
| 1860 |
+
-107
|
| 1861 |
+
-83
|
| 1862 |
+
-62
|
| 1863 |
+
-58
|
| 1864 |
+
-72
|
| 1865 |
+
-79
|
| 1866 |
+
-79
|
| 1867 |
+
-68
|
| 1868 |
+
-46
|
| 1869 |
+
-30
|
| 1870 |
+
-13
|
| 1871 |
+
-16
|
| 1872 |
+
-15
|
| 1873 |
+
-12
|
| 1874 |
+
-5
|
| 1875 |
+
-15
|
| 1876 |
+
-32
|
| 1877 |
+
-88
|
| 1878 |
+
-123
|
| 1879 |
+
-148
|
| 1880 |
+
-150
|
| 1881 |
+
-148
|
| 1882 |
+
-134
|
| 1883 |
+
-112
|
| 1884 |
+
-91
|
| 1885 |
+
-53
|
| 1886 |
+
-17
|
| 1887 |
+
10
|
| 1888 |
+
12
|
| 1889 |
+
-3
|
| 1890 |
+
-32
|
| 1891 |
+
-72
|
| 1892 |
+
-94
|
| 1893 |
+
-112
|
| 1894 |
+
-121
|
| 1895 |
+
-124
|
| 1896 |
+
-115
|
| 1897 |
+
-85
|
| 1898 |
+
-61
|
| 1899 |
+
-37
|
| 1900 |
+
-6
|
| 1901 |
+
33
|
| 1902 |
+
55
|
| 1903 |
+
61
|
| 1904 |
+
45
|
| 1905 |
+
18
|
| 1906 |
+
-16
|
| 1907 |
+
-47
|
| 1908 |
+
-55
|
| 1909 |
+
-47
|
| 1910 |
+
-24
|
| 1911 |
+
-21
|
| 1912 |
+
-32
|
| 1913 |
+
-43
|
| 1914 |
+
-59
|
| 1915 |
+
-68
|
| 1916 |
+
-83
|
| 1917 |
+
-67
|
| 1918 |
+
-64
|
| 1919 |
+
-50
|
| 1920 |
+
-42
|
| 1921 |
+
-28
|
| 1922 |
+
-29
|
| 1923 |
+
-53
|
| 1924 |
+
-80
|
| 1925 |
+
-120
|
| 1926 |
+
-135
|
| 1927 |
+
-123
|
| 1928 |
+
-103
|
| 1929 |
+
-101
|
| 1930 |
+
-112
|
| 1931 |
+
-107
|
| 1932 |
+
-91
|
| 1933 |
+
-77
|
| 1934 |
+
-69
|
| 1935 |
+
-60
|
| 1936 |
+
-61
|
| 1937 |
+
-56
|
| 1938 |
+
-52
|
| 1939 |
+
-62
|
| 1940 |
+
-81
|
| 1941 |
+
-107
|
| 1942 |
+
-129
|
| 1943 |
+
-141
|
| 1944 |
+
-140
|
| 1945 |
+
-125
|
| 1946 |
+
-120
|
| 1947 |
+
-112
|
| 1948 |
+
-97
|
| 1949 |
+
-59
|
| 1950 |
+
-23
|
| 1951 |
+
2
|
| 1952 |
+
18
|
| 1953 |
+
8
|
| 1954 |
+
-17
|
| 1955 |
+
-39
|
| 1956 |
+
-44
|
| 1957 |
+
-41
|
| 1958 |
+
-31
|
| 1959 |
+
-31
|
| 1960 |
+
-49
|
| 1961 |
+
-88
|
| 1962 |
+
-111
|
| 1963 |
+
-114
|
| 1964 |
+
-90
|
| 1965 |
+
-47
|
| 1966 |
+
-18
|
| 1967 |
+
5
|
| 1968 |
+
-8
|
| 1969 |
+
-27
|
| 1970 |
+
-50
|
| 1971 |
+
-72
|
| 1972 |
+
-68
|
| 1973 |
+
-50
|
| 1974 |
+
-43
|
| 1975 |
+
-54
|
| 1976 |
+
-81
|
| 1977 |
+
-101
|
| 1978 |
+
-112
|
| 1979 |
+
-101
|
| 1980 |
+
-95
|
| 1981 |
+
-86
|
| 1982 |
+
-98
|
| 1983 |
+
-94
|
| 1984 |
+
-97
|
| 1985 |
+
-99
|
| 1986 |
+
-104
|
| 1987 |
+
-109
|
| 1988 |
+
-110
|
| 1989 |
+
-98
|
| 1990 |
+
-81
|
| 1991 |
+
-63
|
| 1992 |
+
-59
|
| 1993 |
+
-44
|
| 1994 |
+
-35
|
| 1995 |
+
-26
|
| 1996 |
+
-26
|
| 1997 |
+
-13
|
| 1998 |
+
-8
|
| 1999 |
+
-13
|
| 2000 |
+
-27
|
| 2001 |
+
-27
|
| 2002 |
+
-27
|
| 2003 |
+
-11
|
| 2004 |
+
0
|
| 2005 |
+
5
|
| 2006 |
+
10
|
| 2007 |
+
13
|
| 2008 |
+
18
|
| 2009 |
+
4
|
| 2010 |
+
-4
|
| 2011 |
+
-16
|
| 2012 |
+
-21
|
| 2013 |
+
-10
|
| 2014 |
+
11
|
| 2015 |
+
34
|
| 2016 |
+
32
|
| 2017 |
+
9
|
| 2018 |
+
-3
|
| 2019 |
+
-6
|
| 2020 |
+
-4
|
| 2021 |
+
-15
|
| 2022 |
+
-47
|
| 2023 |
+
-82
|
| 2024 |
+
-98
|
| 2025 |
+
-89
|
| 2026 |
+
-67
|
| 2027 |
+
-46
|
| 2028 |
+
-22
|
| 2029 |
+
-6
|
| 2030 |
+
-18
|
| 2031 |
+
-32
|
| 2032 |
+
-57
|
| 2033 |
+
-64
|
| 2034 |
+
-74
|
| 2035 |
+
-74
|
| 2036 |
+
-73
|
| 2037 |
+
-65
|
| 2038 |
+
-45
|
| 2039 |
+
-31
|
| 2040 |
+
-17
|
| 2041 |
+
-19
|
| 2042 |
+
-26
|
| 2043 |
+
-45
|
| 2044 |
+
-75
|
| 2045 |
+
-92
|
| 2046 |
+
-97
|
| 2047 |
+
-89
|
| 2048 |
+
-68
|
| 2049 |
+
-45
|
| 2050 |
+
-28
|
| 2051 |
+
-27
|
| 2052 |
+
-28
|
| 2053 |
+
-16
|
| 2054 |
+
-18
|
| 2055 |
+
-25
|
| 2056 |
+
-40
|
| 2057 |
+
-54
|
| 2058 |
+
-53
|
| 2059 |
+
-53
|
| 2060 |
+
-38
|
| 2061 |
+
-27
|
| 2062 |
+
0
|
| 2063 |
+
28
|
| 2064 |
+
40
|
| 2065 |
+
22
|
| 2066 |
+
-25
|
| 2067 |
+
-72
|
| 2068 |
+
-117
|
| 2069 |
+
-109
|
| 2070 |
+
-77
|
| 2071 |
+
-28
|
| 2072 |
+
-5
|
| 2073 |
+
18
|
| 2074 |
+
21
|
| 2075 |
+
10
|
| 2076 |
+
5
|
| 2077 |
+
-6
|
| 2078 |
+
-6
|
| 2079 |
+
-12
|
| 2080 |
+
-20
|
| 2081 |
+
-9
|
| 2082 |
+
-3
|
| 2083 |
+
1
|
| 2084 |
+
-6
|
| 2085 |
+
-21
|
| 2086 |
+
-41
|
| 2087 |
+
-37
|
| 2088 |
+
-34
|
| 2089 |
+
-37
|
| 2090 |
+
-22
|
| 2091 |
+
-10
|
| 2092 |
+
3
|
| 2093 |
+
-8
|
| 2094 |
+
-21
|
| 2095 |
+
-40
|
| 2096 |
+
-48
|
| 2097 |
+
-44
|
| 2098 |
+
-33
|
| 2099 |
+
-2
|
| 2100 |
+
20
|
| 2101 |
+
47
|
| 2102 |
+
65
|
| 2103 |
+
78
|
| 2104 |
+
84
|
| 2105 |
+
74
|
| 2106 |
+
39
|
| 2107 |
+
-6
|
| 2108 |
+
-21
|
| 2109 |
+
-9
|
| 2110 |
+
13
|
| 2111 |
+
43
|
| 2112 |
+
71
|
| 2113 |
+
85
|
| 2114 |
+
88
|
| 2115 |
+
90
|
| 2116 |
+
81
|
| 2117 |
+
68
|
| 2118 |
+
45
|
| 2119 |
+
18
|
| 2120 |
+
-27
|
| 2121 |
+
-75
|
| 2122 |
+
-94
|
| 2123 |
+
-98
|
| 2124 |
+
-57
|
| 2125 |
+
-9
|
| 2126 |
+
12
|
| 2127 |
+
11
|
| 2128 |
+
6
|
| 2129 |
+
6
|
| 2130 |
+
12
|
| 2131 |
+
-1
|
| 2132 |
+
-24
|
| 2133 |
+
-23
|
| 2134 |
+
-19
|
| 2135 |
+
-7
|
| 2136 |
+
-7
|
| 2137 |
+
-34
|
| 2138 |
+
-45
|
| 2139 |
+
-55
|
| 2140 |
+
-49
|
| 2141 |
+
-52
|
| 2142 |
+
-47
|
| 2143 |
+
-43
|
| 2144 |
+
-31
|
| 2145 |
+
-28
|
| 2146 |
+
-32
|
| 2147 |
+
-32
|
| 2148 |
+
-59
|
| 2149 |
+
-72
|
| 2150 |
+
-82
|
| 2151 |
+
-88
|
| 2152 |
+
-93
|
| 2153 |
+
-84
|
| 2154 |
+
-74
|
| 2155 |
+
-77
|
| 2156 |
+
-77
|
| 2157 |
+
-82
|
| 2158 |
+
-87
|
| 2159 |
+
-113
|
| 2160 |
+
-121
|
| 2161 |
+
-112
|
| 2162 |
+
-91
|
| 2163 |
+
-73
|
| 2164 |
+
-69
|
| 2165 |
+
-70
|
| 2166 |
+
-76
|
| 2167 |
+
-84
|
| 2168 |
+
-107
|
| 2169 |
+
-141
|
| 2170 |
+
-172
|
| 2171 |
+
-189
|
| 2172 |
+
-180
|
| 2173 |
+
-151
|
| 2174 |
+
-120
|
| 2175 |
+
-94
|
| 2176 |
+
-84
|
| 2177 |
+
-83
|
| 2178 |
+
-93
|
| 2179 |
+
-127
|
| 2180 |
+
-155
|
| 2181 |
+
-169
|
| 2182 |
+
-162
|
| 2183 |
+
-152
|
| 2184 |
+
-146
|
| 2185 |
+
-136
|
| 2186 |
+
-118
|
| 2187 |
+
-73
|
| 2188 |
+
-22
|
| 2189 |
+
-12
|
| 2190 |
+
-57
|
| 2191 |
+
-96
|
| 2192 |
+
-124
|
| 2193 |
+
-129
|
| 2194 |
+
-129
|
| 2195 |
+
-127
|
| 2196 |
+
-130
|
| 2197 |
+
-139
|
| 2198 |
+
-151
|
| 2199 |
+
-162
|
| 2200 |
+
-158
|
| 2201 |
+
-147
|
| 2202 |
+
-128
|
| 2203 |
+
-115
|
| 2204 |
+
-109
|
| 2205 |
+
-102
|
| 2206 |
+
-85
|
| 2207 |
+
-75
|
| 2208 |
+
-59
|
| 2209 |
+
-43
|
| 2210 |
+
-38
|
| 2211 |
+
-36
|
| 2212 |
+
-33
|
| 2213 |
+
-36
|
| 2214 |
+
-40
|
| 2215 |
+
-34
|
| 2216 |
+
-17
|
| 2217 |
+
3
|
| 2218 |
+
14
|
| 2219 |
+
13
|
| 2220 |
+
25
|
| 2221 |
+
24
|
| 2222 |
+
26
|
| 2223 |
+
16
|
| 2224 |
+
-25
|
| 2225 |
+
-69
|
| 2226 |
+
-104
|
| 2227 |
+
-127
|
| 2228 |
+
-113
|
| 2229 |
+
-98
|
| 2230 |
+
-78
|
| 2231 |
+
-71
|
| 2232 |
+
-78
|
| 2233 |
+
-77
|
| 2234 |
+
-90
|
| 2235 |
+
-98
|
| 2236 |
+
-91
|
| 2237 |
+
-78
|
| 2238 |
+
-62
|
| 2239 |
+
-56
|
| 2240 |
+
-60
|
| 2241 |
+
-70
|
| 2242 |
+
-93
|
| 2243 |
+
-120
|
| 2244 |
+
-127
|
| 2245 |
+
-118
|
| 2246 |
+
-88
|
| 2247 |
+
-46
|
| 2248 |
+
-31
|
| 2249 |
+
-25
|
| 2250 |
+
-41
|
| 2251 |
+
-42
|
| 2252 |
+
-42
|
| 2253 |
+
-33
|
| 2254 |
+
-31
|
| 2255 |
+
-30
|
| 2256 |
+
-35
|
| 2257 |
+
-32
|
| 2258 |
+
-34
|
| 2259 |
+
-51
|
| 2260 |
+
-71
|
| 2261 |
+
-82
|
| 2262 |
+
-87
|
| 2263 |
+
-51
|
| 2264 |
+
-24
|
| 2265 |
+
8
|
| 2266 |
+
1
|
| 2267 |
+
-14
|
| 2268 |
+
-27
|
| 2269 |
+
-20
|
| 2270 |
+
-46
|
| 2271 |
+
-84
|
| 2272 |
+
-131
|
| 2273 |
+
-160
|
| 2274 |
+
-141
|
| 2275 |
+
-95
|
| 2276 |
+
-42
|
| 2277 |
+
-17
|
| 2278 |
+
-2
|
| 2279 |
+
9
|
| 2280 |
+
-2
|
| 2281 |
+
-10
|
| 2282 |
+
-27
|
| 2283 |
+
-32
|
| 2284 |
+
-21
|
| 2285 |
+
0
|
| 2286 |
+
12
|
| 2287 |
+
15
|
| 2288 |
+
13
|
| 2289 |
+
12
|
| 2290 |
+
15
|
| 2291 |
+
0
|
| 2292 |
+
5
|
| 2293 |
+
-1
|
| 2294 |
+
-1
|
| 2295 |
+
-1
|
| 2296 |
+
0
|
| 2297 |
+
8
|
| 2298 |
+
9
|
| 2299 |
+
17
|
| 2300 |
+
-8
|
| 2301 |
+
-42
|
| 2302 |
+
-76
|
| 2303 |
+
-87
|
| 2304 |
+
-82
|
| 2305 |
+
-71
|
| 2306 |
+
-46
|
| 2307 |
+
-47
|
| 2308 |
+
-51
|
| 2309 |
+
-54
|
| 2310 |
+
-36
|
| 2311 |
+
3
|
| 2312 |
+
36
|
| 2313 |
+
53
|
| 2314 |
+
27
|
| 2315 |
+
-7
|
| 2316 |
+
-31
|
| 2317 |
+
-29
|
| 2318 |
+
-13
|
| 2319 |
+
12
|
| 2320 |
+
36
|
| 2321 |
+
55
|
| 2322 |
+
56
|
| 2323 |
+
40
|
| 2324 |
+
21
|
| 2325 |
+
-11
|
| 2326 |
+
-20
|
| 2327 |
+
-22
|
| 2328 |
+
-15
|
| 2329 |
+
-15
|
| 2330 |
+
-16
|
| 2331 |
+
-22
|
| 2332 |
+
-47
|
| 2333 |
+
-67
|
| 2334 |
+
-75
|
| 2335 |
+
-63
|
| 2336 |
+
-41
|
| 2337 |
+
-21
|
| 2338 |
+
-8
|
| 2339 |
+
-7
|
| 2340 |
+
-15
|
| 2341 |
+
-11
|
| 2342 |
+
-19
|
| 2343 |
+
-15
|
| 2344 |
+
-10
|
| 2345 |
+
-11
|
| 2346 |
+
-35
|
| 2347 |
+
-66
|
| 2348 |
+
-79
|
| 2349 |
+
-76
|
| 2350 |
+
-50
|
| 2351 |
+
-30
|
| 2352 |
+
-24
|
| 2353 |
+
-30
|
| 2354 |
+
-60
|
| 2355 |
+
-71
|
| 2356 |
+
-58
|
| 2357 |
+
-48
|
| 2358 |
+
-29
|
| 2359 |
+
-36
|
| 2360 |
+
-58
|
| 2361 |
+
-64
|
| 2362 |
+
-59
|
| 2363 |
+
-37
|
| 2364 |
+
-35
|
| 2365 |
+
-31
|
| 2366 |
+
-33
|
| 2367 |
+
-38
|
| 2368 |
+
-27
|
| 2369 |
+
-17
|
| 2370 |
+
-5
|
| 2371 |
+
-18
|
| 2372 |
+
-25
|
| 2373 |
+
-39
|
| 2374 |
+
-57
|
| 2375 |
+
-85
|
| 2376 |
+
-120
|
| 2377 |
+
-160
|
| 2378 |
+
-173
|
| 2379 |
+
-149
|
| 2380 |
+
-103
|
| 2381 |
+
-60
|
| 2382 |
+
-30
|
| 2383 |
+
-13
|
| 2384 |
+
-24
|
| 2385 |
+
-44
|
| 2386 |
+
-73
|
| 2387 |
+
-84
|
| 2388 |
+
-67
|
| 2389 |
+
-42
|
| 2390 |
+
-17
|
| 2391 |
+
-37
|
| 2392 |
+
-77
|
| 2393 |
+
-124
|
| 2394 |
+
-150
|
| 2395 |
+
-155
|
| 2396 |
+
-132
|
| 2397 |
+
-93
|
| 2398 |
+
-65
|
| 2399 |
+
-45
|
| 2400 |
+
-44
|
| 2401 |
+
-48
|
| 2402 |
+
-64
|
| 2403 |
+
-72
|
| 2404 |
+
-82
|
| 2405 |
+
-99
|
| 2406 |
+
-95
|
| 2407 |
+
-90
|
| 2408 |
+
-87
|
| 2409 |
+
-97
|
| 2410 |
+
-105
|
| 2411 |
+
-99
|
| 2412 |
+
-77
|
| 2413 |
+
-45
|
| 2414 |
+
-10
|
| 2415 |
+
5
|
| 2416 |
+
6
|
| 2417 |
+
-3
|
| 2418 |
+
-19
|
| 2419 |
+
-46
|
| 2420 |
+
-86
|
| 2421 |
+
-120
|
| 2422 |
+
-135
|
| 2423 |
+
-132
|
| 2424 |
+
-102
|
| 2425 |
+
-79
|
| 2426 |
+
-59
|
| 2427 |
+
-44
|
| 2428 |
+
-16
|
| 2429 |
+
-13
|
| 2430 |
+
-28
|
| 2431 |
+
-41
|
| 2432 |
+
-74
|
| 2433 |
+
-98
|
| 2434 |
+
-117
|
| 2435 |
+
-133
|
| 2436 |
+
-143
|
| 2437 |
+
-147
|
| 2438 |
+
-124
|
| 2439 |
+
-105
|
| 2440 |
+
-88
|
| 2441 |
+
-94
|
| 2442 |
+
-90
|
| 2443 |
+
-95
|
| 2444 |
+
-79
|
| 2445 |
+
-61
|
| 2446 |
+
-55
|
| 2447 |
+
-65
|
| 2448 |
+
-71
|
| 2449 |
+
-67
|
| 2450 |
+
-68
|
| 2451 |
+
-62
|
| 2452 |
+
-60
|
| 2453 |
+
-61
|
| 2454 |
+
-51
|
| 2455 |
+
-45
|
| 2456 |
+
-49
|
| 2457 |
+
-63
|
| 2458 |
+
-73
|
| 2459 |
+
-72
|
| 2460 |
+
-56
|
| 2461 |
+
-27
|
| 2462 |
+
6
|
| 2463 |
+
33
|
| 2464 |
+
42
|
| 2465 |
+
34
|
| 2466 |
+
26
|
| 2467 |
+
2
|
| 2468 |
+
-35
|
| 2469 |
+
-85
|
| 2470 |
+
-145
|
| 2471 |
+
-195
|
| 2472 |
+
-201
|
| 2473 |
+
-167
|
| 2474 |
+
-113
|
| 2475 |
+
-82
|
| 2476 |
+
-61
|
| 2477 |
+
-52
|
| 2478 |
+
-47
|
| 2479 |
+
-41
|
| 2480 |
+
-44
|
| 2481 |
+
-54
|
| 2482 |
+
-77
|
| 2483 |
+
-80
|
| 2484 |
+
-78
|
| 2485 |
+
-77
|
| 2486 |
+
-75
|
| 2487 |
+
-77
|
| 2488 |
+
-70
|
| 2489 |
+
-49
|
| 2490 |
+
-23
|
| 2491 |
+
2
|
| 2492 |
+
18
|
| 2493 |
+
15
|
| 2494 |
+
1
|
| 2495 |
+
-14
|
| 2496 |
+
-28
|
| 2497 |
+
-30
|
| 2498 |
+
-45
|
| 2499 |
+
-47
|
| 2500 |
+
-45
|
| 2501 |
+
-31
|
| 2502 |
+
-20
|
| 2503 |
+
-22
|
| 2504 |
+
-21
|
| 2505 |
+
-23
|
| 2506 |
+
-7
|
| 2507 |
+
8
|
| 2508 |
+
22
|
| 2509 |
+
13
|
| 2510 |
+
1
|
| 2511 |
+
-14
|
| 2512 |
+
-17
|
| 2513 |
+
-7
|
| 2514 |
+
-1
|
| 2515 |
+
11
|
| 2516 |
+
2
|
| 2517 |
+
5
|
| 2518 |
+
25
|
| 2519 |
+
59
|
| 2520 |
+
78
|
| 2521 |
+
77
|
| 2522 |
+
60
|
| 2523 |
+
34
|
| 2524 |
+
28
|
| 2525 |
+
22
|
| 2526 |
+
9
|
| 2527 |
+
-19
|
| 2528 |
+
-46
|
| 2529 |
+
-56
|
| 2530 |
+
-60
|
| 2531 |
+
-59
|
| 2532 |
+
-41
|
| 2533 |
+
-30
|
| 2534 |
+
-31
|
| 2535 |
+
-21
|
| 2536 |
+
-7
|
| 2537 |
+
-3
|
| 2538 |
+
-2
|
| 2539 |
+
-19
|
| 2540 |
+
-36
|
| 2541 |
+
-49
|
| 2542 |
+
-39
|
| 2543 |
+
-39
|
| 2544 |
+
-51
|
| 2545 |
+
-66
|
| 2546 |
+
-79
|
| 2547 |
+
-74
|
| 2548 |
+
-62
|
| 2549 |
+
-44
|
| 2550 |
+
-47
|
| 2551 |
+
-51
|
| 2552 |
+
-51
|
| 2553 |
+
-50
|
| 2554 |
+
-56
|
| 2555 |
+
-56
|
| 2556 |
+
-51
|
| 2557 |
+
-41
|
| 2558 |
+
-44
|
| 2559 |
+
-44
|
| 2560 |
+
-52
|
| 2561 |
+
-59
|
| 2562 |
+
-60
|
| 2563 |
+
-53
|
| 2564 |
+
-59
|
| 2565 |
+
-77
|
| 2566 |
+
-116
|
| 2567 |
+
-156
|
| 2568 |
+
-179
|
| 2569 |
+
-167
|
| 2570 |
+
-139
|
| 2571 |
+
-92
|
| 2572 |
+
-50
|
| 2573 |
+
-8
|
| 2574 |
+
24
|
| 2575 |
+
40
|
| 2576 |
+
43
|
| 2577 |
+
47
|
| 2578 |
+
20
|
| 2579 |
+
-16
|
| 2580 |
+
-45
|
| 2581 |
+
-40
|
| 2582 |
+
-35
|
| 2583 |
+
-23
|
| 2584 |
+
-29
|
| 2585 |
+
-31
|
| 2586 |
+
-29
|
| 2587 |
+
-8
|
| 2588 |
+
13
|
| 2589 |
+
23
|
| 2590 |
+
25
|
| 2591 |
+
25
|
| 2592 |
+
31
|
| 2593 |
+
27
|
| 2594 |
+
21
|
| 2595 |
+
-3
|
| 2596 |
+
-33
|
| 2597 |
+
-67
|
| 2598 |
+
-92
|
| 2599 |
+
-107
|
| 2600 |
+
-123
|
| 2601 |
+
-135
|
| 2602 |
+
-139
|
| 2603 |
+
-138
|
| 2604 |
+
-104
|
| 2605 |
+
-53
|
| 2606 |
+
9
|
| 2607 |
+
74
|
| 2608 |
+
142
|
| 2609 |
+
169
|
| 2610 |
+
159
|
| 2611 |
+
108
|
| 2612 |
+
45
|
| 2613 |
+
-18
|
| 2614 |
+
-84
|
| 2615 |
+
-97
|
| 2616 |
+
-116
|
| 2617 |
+
-107
|
| 2618 |
+
-109
|
| 2619 |
+
-102
|
| 2620 |
+
-90
|
| 2621 |
+
-78
|
| 2622 |
+
-60
|
| 2623 |
+
-50
|
| 2624 |
+
-38
|
| 2625 |
+
-29
|
| 2626 |
+
-16
|
| 2627 |
+
-20
|
| 2628 |
+
-33
|
| 2629 |
+
-50
|
| 2630 |
+
-94
|
| 2631 |
+
-124
|
| 2632 |
+
-150
|
| 2633 |
+
-138
|
| 2634 |
+
-123
|
| 2635 |
+
-110
|
| 2636 |
+
-81
|
| 2637 |
+
-71
|
| 2638 |
+
-58
|
| 2639 |
+
-52
|
| 2640 |
+
-53
|
| 2641 |
+
-67
|
| 2642 |
+
-78
|
| 2643 |
+
-91
|
| 2644 |
+
-86
|
| 2645 |
+
-70
|
| 2646 |
+
-50
|
| 2647 |
+
-37
|
| 2648 |
+
-44
|
| 2649 |
+
-47
|
| 2650 |
+
-46
|
| 2651 |
+
-46
|
| 2652 |
+
-37
|
| 2653 |
+
-25
|
| 2654 |
+
-2
|
| 2655 |
+
-15
|
| 2656 |
+
-25
|
| 2657 |
+
-37
|
| 2658 |
+
-32
|
| 2659 |
+
-25
|
| 2660 |
+
-29
|
| 2661 |
+
-55
|
| 2662 |
+
-103
|
| 2663 |
+
-152
|
| 2664 |
+
-167
|
| 2665 |
+
-163
|
| 2666 |
+
-131
|
| 2667 |
+
-78
|
| 2668 |
+
-34
|
| 2669 |
+
-12
|
| 2670 |
+
-22
|
| 2671 |
+
-47
|
| 2672 |
+
-75
|
| 2673 |
+
-91
|
| 2674 |
+
-88
|
| 2675 |
+
-87
|
| 2676 |
+
-86
|
| 2677 |
+
-85
|
| 2678 |
+
-81
|
| 2679 |
+
-70
|
| 2680 |
+
-70
|
| 2681 |
+
-55
|
| 2682 |
+
-52
|
| 2683 |
+
-64
|
| 2684 |
+
-72
|
| 2685 |
+
-83
|
| 2686 |
+
-87
|
| 2687 |
+
-85
|
| 2688 |
+
-70
|
| 2689 |
+
-58
|
| 2690 |
+
-47
|
| 2691 |
+
-43
|
| 2692 |
+
-37
|
| 2693 |
+
-37
|
| 2694 |
+
-54
|
| 2695 |
+
-59
|
| 2696 |
+
-74
|
| 2697 |
+
-82
|
| 2698 |
+
-84
|
| 2699 |
+
-81
|
| 2700 |
+
-73
|
| 2701 |
+
-60
|
| 2702 |
+
-49
|
| 2703 |
+
-43
|
| 2704 |
+
-51
|
| 2705 |
+
-59
|
| 2706 |
+
-55
|
| 2707 |
+
-65
|
| 2708 |
+
-55
|
| 2709 |
+
-55
|
| 2710 |
+
-64
|
| 2711 |
+
-84
|
| 2712 |
+
-107
|
| 2713 |
+
-107
|
| 2714 |
+
-91
|
| 2715 |
+
-68
|
| 2716 |
+
-57
|
| 2717 |
+
-54
|
| 2718 |
+
-60
|
| 2719 |
+
-65
|
| 2720 |
+
-64
|
| 2721 |
+
-70
|
| 2722 |
+
-66
|
| 2723 |
+
-61
|
| 2724 |
+
-56
|
| 2725 |
+
-67
|
| 2726 |
+
-64
|
| 2727 |
+
-73
|
| 2728 |
+
-77
|
| 2729 |
+
-77
|
| 2730 |
+
-72
|
| 2731 |
+
-59
|
| 2732 |
+
-47
|
| 2733 |
+
-44
|
| 2734 |
+
-51
|
| 2735 |
+
-80
|
| 2736 |
+
-111
|
| 2737 |
+
-135
|
| 2738 |
+
-137
|
| 2739 |
+
-133
|
| 2740 |
+
-108
|
| 2741 |
+
-95
|
| 2742 |
+
-88
|
| 2743 |
+
-75
|
| 2744 |
+
-57
|
| 2745 |
+
-26
|
| 2746 |
+
-23
|
| 2747 |
+
-15
|
| 2748 |
+
-37
|
| 2749 |
+
-46
|
| 2750 |
+
-38
|
| 2751 |
+
-24
|
| 2752 |
+
-18
|
| 2753 |
+
-41
|
| 2754 |
+
-61
|
| 2755 |
+
-84
|
| 2756 |
+
-101
|
| 2757 |
+
-116
|
| 2758 |
+
-122
|
| 2759 |
+
-121
|
| 2760 |
+
-113
|
| 2761 |
+
-84
|
| 2762 |
+
-70
|
| 2763 |
+
-53
|
| 2764 |
+
-53
|
| 2765 |
+
-49
|
| 2766 |
+
-51
|
| 2767 |
+
-49
|
| 2768 |
+
-52
|
| 2769 |
+
-52
|
| 2770 |
+
-56
|
| 2771 |
+
-56
|
| 2772 |
+
-39
|
| 2773 |
+
-35
|
| 2774 |
+
-24
|
| 2775 |
+
-25
|
| 2776 |
+
-37
|
| 2777 |
+
-55
|
| 2778 |
+
-67
|
| 2779 |
+
-69
|
| 2780 |
+
-86
|
| 2781 |
+
-92
|
| 2782 |
+
-100
|
| 2783 |
+
-116
|
| 2784 |
+
-128
|
| 2785 |
+
-138
|
| 2786 |
+
-143
|
| 2787 |
+
-128
|
| 2788 |
+
-118
|
| 2789 |
+
-108
|
| 2790 |
+
-99
|
| 2791 |
+
-101
|
| 2792 |
+
-92
|
| 2793 |
+
-89
|
| 2794 |
+
-87
|
| 2795 |
+
-74
|
| 2796 |
+
-54
|
| 2797 |
+
-50
|
| 2798 |
+
-61
|
| 2799 |
+
-70
|
| 2800 |
+
-86
|
| 2801 |
+
-80
|
| 2802 |
+
-72
|
| 2803 |
+
-44
|
| 2804 |
+
-23
|
| 2805 |
+
-6
|
| 2806 |
+
3
|
| 2807 |
+
4
|
| 2808 |
+
-6
|
| 2809 |
+
-1
|
| 2810 |
+
0
|
| 2811 |
+
8
|
| 2812 |
+
8
|
| 2813 |
+
13
|
| 2814 |
+
8
|
| 2815 |
+
6
|
| 2816 |
+
-1
|
| 2817 |
+
-7
|
| 2818 |
+
-17
|
| 2819 |
+
-28
|
| 2820 |
+
-18
|
| 2821 |
+
-18
|
| 2822 |
+
-21
|
| 2823 |
+
-31
|
| 2824 |
+
-20
|
| 2825 |
+
-24
|
| 2826 |
+
-23
|
| 2827 |
+
-34
|
| 2828 |
+
-55
|
| 2829 |
+
-58
|
| 2830 |
+
-48
|
| 2831 |
+
-23
|
| 2832 |
+
-9
|
| 2833 |
+
-6
|
| 2834 |
+
2
|
| 2835 |
+
0
|
| 2836 |
+
-1
|
| 2837 |
+
-1
|
| 2838 |
+
6
|
| 2839 |
+
6
|
| 2840 |
+
-4
|
| 2841 |
+
-6
|
| 2842 |
+
-21
|
| 2843 |
+
-34
|
| 2844 |
+
-58
|
| 2845 |
+
-67
|
| 2846 |
+
-73
|
| 2847 |
+
-64
|
| 2848 |
+
-49
|
| 2849 |
+
-35
|
| 2850 |
+
-22
|
| 2851 |
+
-18
|
| 2852 |
+
-19
|
| 2853 |
+
-46
|
| 2854 |
+
-64
|
| 2855 |
+
-72
|
| 2856 |
+
-67
|
| 2857 |
+
-45
|
| 2858 |
+
-28
|
| 2859 |
+
-18
|
| 2860 |
+
-10
|
| 2861 |
+
-11
|
| 2862 |
+
-24
|
| 2863 |
+
-38
|
| 2864 |
+
-62
|
| 2865 |
+
-54
|
| 2866 |
+
-51
|
| 2867 |
+
-48
|
| 2868 |
+
-37
|
| 2869 |
+
-27
|
| 2870 |
+
-11
|
| 2871 |
+
-6
|
| 2872 |
+
-12
|
| 2873 |
+
-29
|
| 2874 |
+
-58
|
| 2875 |
+
-74
|
| 2876 |
+
-75
|
| 2877 |
+
-79
|
| 2878 |
+
-84
|
| 2879 |
+
-91
|
| 2880 |
+
-92
|
| 2881 |
+
-94
|
| 2882 |
+
-82
|
| 2883 |
+
-71
|
| 2884 |
+
-65
|
| 2885 |
+
-67
|
| 2886 |
+
-55
|
| 2887 |
+
-43
|
| 2888 |
+
-25
|
| 2889 |
+
-27
|
| 2890 |
+
-38
|
| 2891 |
+
-66
|
| 2892 |
+
-78
|
| 2893 |
+
-80
|
| 2894 |
+
-62
|
| 2895 |
+
-36
|
| 2896 |
+
-9
|
| 2897 |
+
5
|
| 2898 |
+
-5
|
| 2899 |
+
-4
|
| 2900 |
+
15
|
| 2901 |
+
26
|
| 2902 |
+
26
|
| 2903 |
+
6
|
| 2904 |
+
-14
|
| 2905 |
+
-38
|
| 2906 |
+
-43
|
| 2907 |
+
-28
|
| 2908 |
+
-16
|
| 2909 |
+
-5
|
| 2910 |
+
-6
|
| 2911 |
+
-13
|
| 2912 |
+
-40
|
| 2913 |
+
-80
|
| 2914 |
+
-110
|
| 2915 |
+
-127
|
| 2916 |
+
-128
|
| 2917 |
+
-110
|
| 2918 |
+
-83
|
| 2919 |
+
-74
|
| 2920 |
+
-57
|
| 2921 |
+
-58
|
| 2922 |
+
-63
|
| 2923 |
+
-73
|
| 2924 |
+
-87
|
| 2925 |
+
-93
|
| 2926 |
+
-105
|
| 2927 |
+
-97
|
| 2928 |
+
-83
|
| 2929 |
+
-68
|
| 2930 |
+
-68
|
| 2931 |
+
-75
|
| 2932 |
+
-93
|
| 2933 |
+
-111
|
| 2934 |
+
-131
|
| 2935 |
+
-129
|
| 2936 |
+
-113
|
| 2937 |
+
-91
|
| 2938 |
+
-74
|
| 2939 |
+
-76
|
| 2940 |
+
-72
|
| 2941 |
+
-74
|
| 2942 |
+
-55
|
| 2943 |
+
-49
|
| 2944 |
+
-38
|
| 2945 |
+
-27
|
| 2946 |
+
-39
|
| 2947 |
+
-58
|
| 2948 |
+
-89
|
| 2949 |
+
-100
|
| 2950 |
+
-97
|
| 2951 |
+
-91
|
| 2952 |
+
-63
|
| 2953 |
+
-42
|
| 2954 |
+
-27
|
| 2955 |
+
-8
|
| 2956 |
+
-17
|
| 2957 |
+
-47
|
| 2958 |
+
-66
|
| 2959 |
+
-84
|
| 2960 |
+
-87
|
| 2961 |
+
-74
|
| 2962 |
+
-58
|
| 2963 |
+
-31
|
| 2964 |
+
-24
|
| 2965 |
+
-22
|
| 2966 |
+
-38
|
| 2967 |
+
-59
|
| 2968 |
+
-80
|
| 2969 |
+
-93
|
| 2970 |
+
-66
|
| 2971 |
+
-44
|
| 2972 |
+
-12
|
| 2973 |
+
0
|
| 2974 |
+
-9
|
| 2975 |
+
-27
|
| 2976 |
+
-51
|
| 2977 |
+
-76
|
| 2978 |
+
-106
|
| 2979 |
+
-127
|
| 2980 |
+
-135
|
| 2981 |
+
-134
|
| 2982 |
+
-115
|
| 2983 |
+
-85
|
| 2984 |
+
-62
|
| 2985 |
+
-48
|
| 2986 |
+
-49
|
| 2987 |
+
-51
|
| 2988 |
+
-46
|
| 2989 |
+
-49
|
| 2990 |
+
-42
|
| 2991 |
+
-36
|
| 2992 |
+
-26
|
| 2993 |
+
-1
|
| 2994 |
+
20
|
| 2995 |
+
17
|
| 2996 |
+
-3
|
| 2997 |
+
-18
|
| 2998 |
+
-36
|
| 2999 |
+
-44
|
| 3000 |
+
-62
|
| 3001 |
+
-73
|
| 3002 |
+
-78
|
| 3003 |
+
-79
|
| 3004 |
+
-73
|
| 3005 |
+
-61
|
| 3006 |
+
-32
|
| 3007 |
+
-3
|
| 3008 |
+
31
|
| 3009 |
+
29
|
| 3010 |
+
19
|
| 3011 |
+
7
|
| 3012 |
+
-14
|
| 3013 |
+
-51
|
| 3014 |
+
-107
|
| 3015 |
+
-149
|
| 3016 |
+
-188
|
| 3017 |
+
-204
|
| 3018 |
+
-180
|
| 3019 |
+
-148
|
| 3020 |
+
-105
|
| 3021 |
+
-71
|
| 3022 |
+
-21
|
| 3023 |
+
-9
|
| 3024 |
+
7
|
| 3025 |
+
-10
|
| 3026 |
+
-47
|
| 3027 |
+
-81
|
| 3028 |
+
-93
|
| 3029 |
+
-79
|
| 3030 |
+
-59
|
| 3031 |
+
-33
|
| 3032 |
+
-16
|
| 3033 |
+
-6
|
| 3034 |
+
-15
|
| 3035 |
+
-25
|
| 3036 |
+
-22
|
| 3037 |
+
-32
|
| 3038 |
+
-45
|
| 3039 |
+
-66
|
| 3040 |
+
-96
|
| 3041 |
+
-151
|
| 3042 |
+
-192
|
| 3043 |
+
-235
|
| 3044 |
+
-254
|
| 3045 |
+
-246
|
| 3046 |
+
-207
|
| 3047 |
+
-166
|
| 3048 |
+
-132
|
| 3049 |
+
-99
|
| 3050 |
+
-92
|
| 3051 |
+
-97
|
| 3052 |
+
-108
|
| 3053 |
+
-108
|
| 3054 |
+
-99
|
| 3055 |
+
-101
|
| 3056 |
+
-96
|
| 3057 |
+
-98
|
| 3058 |
+
-91
|
| 3059 |
+
-73
|
| 3060 |
+
-42
|
| 3061 |
+
-24
|
| 3062 |
+
-27
|
| 3063 |
+
-31
|
| 3064 |
+
-50
|
| 3065 |
+
-61
|
| 3066 |
+
-74
|
| 3067 |
+
-98
|
| 3068 |
+
-130
|
| 3069 |
+
-156
|
| 3070 |
+
-150
|
| 3071 |
+
-123
|
| 3072 |
+
-101
|
| 3073 |
+
-90
|
| 3074 |
+
-79
|
| 3075 |
+
-54
|
| 3076 |
+
-42
|
| 3077 |
+
-26
|
| 3078 |
+
-36
|
| 3079 |
+
-40
|
| 3080 |
+
-33
|
| 3081 |
+
-2
|
| 3082 |
+
15
|
| 3083 |
+
-7
|
| 3084 |
+
-34
|
| 3085 |
+
-62
|
| 3086 |
+
-70
|
| 3087 |
+
-56
|
| 3088 |
+
-25
|
| 3089 |
+
-7
|
| 3090 |
+
-1
|
| 3091 |
+
-8
|
| 3092 |
+
-45
|
| 3093 |
+
-73
|
| 3094 |
+
-103
|
| 3095 |
+
-119
|
| 3096 |
+
-135
|
| 3097 |
+
-116
|
| 3098 |
+
-84
|
| 3099 |
+
-39
|
| 3100 |
+
-7
|
| 3101 |
+
-11
|
| 3102 |
+
-21
|
| 3103 |
+
-65
|
| 3104 |
+
-100
|
| 3105 |
+
-98
|
| 3106 |
+
-75
|
| 3107 |
+
-60
|
| 3108 |
+
-37
|
| 3109 |
+
-53
|
| 3110 |
+
-58
|
| 3111 |
+
-63
|
| 3112 |
+
-71
|
| 3113 |
+
-84
|
| 3114 |
+
-95
|
| 3115 |
+
-92
|
| 3116 |
+
-92
|
| 3117 |
+
-91
|
| 3118 |
+
-77
|
| 3119 |
+
-52
|
| 3120 |
+
-22
|
| 3121 |
+
-12
|
| 3122 |
+
-11
|
| 3123 |
+
-11
|
| 3124 |
+
-24
|
| 3125 |
+
-34
|
| 3126 |
+
-18
|
| 3127 |
+
-32
|
| 3128 |
+
-33
|
| 3129 |
+
-48
|
| 3130 |
+
-75
|
| 3131 |
+
-93
|
| 3132 |
+
-88
|
| 3133 |
+
-49
|
| 3134 |
+
-4
|
| 3135 |
+
16
|
| 3136 |
+
14
|
| 3137 |
+
-29
|
| 3138 |
+
-78
|
| 3139 |
+
-115
|
| 3140 |
+
-105
|
| 3141 |
+
-86
|
| 3142 |
+
-57
|
| 3143 |
+
-53
|
| 3144 |
+
-45
|
| 3145 |
+
-48
|
| 3146 |
+
-19
|
| 3147 |
+
1
|
| 3148 |
+
9
|
| 3149 |
+
7
|
| 3150 |
+
-1
|
| 3151 |
+
-12
|
| 3152 |
+
-29
|
| 3153 |
+
-40
|
| 3154 |
+
-53
|
| 3155 |
+
-43
|
| 3156 |
+
-38
|
| 3157 |
+
-41
|
| 3158 |
+
-64
|
| 3159 |
+
-97
|
| 3160 |
+
-109
|
| 3161 |
+
-106
|
| 3162 |
+
-97
|
| 3163 |
+
-86
|
| 3164 |
+
-84
|
| 3165 |
+
-79
|
| 3166 |
+
-67
|
| 3167 |
+
-53
|
| 3168 |
+
-38
|
| 3169 |
+
-45
|
| 3170 |
+
-62
|
| 3171 |
+
-74
|
| 3172 |
+
-85
|
| 3173 |
+
-98
|
| 3174 |
+
-91
|
| 3175 |
+
-61
|
| 3176 |
+
-24
|
| 3177 |
+
1
|
| 3178 |
+
14
|
| 3179 |
+
5
|
| 3180 |
+
-30
|
| 3181 |
+
-32
|
| 3182 |
+
-33
|
| 3183 |
+
-28
|
| 3184 |
+
-31
|
| 3185 |
+
-53
|
| 3186 |
+
-65
|
| 3187 |
+
-81
|
| 3188 |
+
-74
|
| 3189 |
+
-65
|
| 3190 |
+
-55
|
| 3191 |
+
-41
|
| 3192 |
+
-33
|
| 3193 |
+
-30
|
| 3194 |
+
-44
|
| 3195 |
+
-59
|
| 3196 |
+
-74
|
| 3197 |
+
-85
|
| 3198 |
+
-93
|
| 3199 |
+
-101
|
| 3200 |
+
-115
|
| 3201 |
+
-119
|
| 3202 |
+
-130
|
| 3203 |
+
-145
|
| 3204 |
+
-158
|
| 3205 |
+
-157
|
| 3206 |
+
-149
|
| 3207 |
+
-152
|
| 3208 |
+
-153
|
| 3209 |
+
-143
|
| 3210 |
+
-125
|
| 3211 |
+
-106
|
| 3212 |
+
-92
|
| 3213 |
+
-79
|
| 3214 |
+
-81
|
| 3215 |
+
-88
|
| 3216 |
+
-102
|
| 3217 |
+
-103
|
| 3218 |
+
-110
|
| 3219 |
+
-95
|
| 3220 |
+
-71
|
| 3221 |
+
-60
|
| 3222 |
+
-36
|
| 3223 |
+
-17
|
| 3224 |
+
3
|
| 3225 |
+
15
|
| 3226 |
+
13
|
| 3227 |
+
8
|
| 3228 |
+
-12
|
| 3229 |
+
-23
|
| 3230 |
+
-42
|
| 3231 |
+
-84
|
| 3232 |
+
-125
|
| 3233 |
+
-155
|
| 3234 |
+
-167
|
| 3235 |
+
-153
|
| 3236 |
+
-128
|
| 3237 |
+
-84
|
| 3238 |
+
-37
|
| 3239 |
+
-9
|
| 3240 |
+
17
|
| 3241 |
+
19
|
| 3242 |
+
0
|
| 3243 |
+
-33
|
| 3244 |
+
-67
|
| 3245 |
+
-78
|
| 3246 |
+
-88
|
| 3247 |
+
-92
|
| 3248 |
+
-113
|
| 3249 |
+
-133
|
| 3250 |
+
-129
|
| 3251 |
+
-109
|
| 3252 |
+
-86
|
| 3253 |
+
-76
|
| 3254 |
+
-77
|
| 3255 |
+
-96
|
| 3256 |
+
-108
|
| 3257 |
+
-90
|
| 3258 |
+
-37
|
| 3259 |
+
3
|
| 3260 |
+
15
|
| 3261 |
+
-17
|
| 3262 |
+
-54
|
| 3263 |
+
-78
|
| 3264 |
+
-80
|
| 3265 |
+
-41
|
| 3266 |
+
-16
|
| 3267 |
+
1
|
| 3268 |
+
7
|
| 3269 |
+
0
|
| 3270 |
+
-1
|
| 3271 |
+
10
|
| 3272 |
+
33
|
| 3273 |
+
43
|
| 3274 |
+
58
|
| 3275 |
+
68
|
| 3276 |
+
82
|
| 3277 |
+
84
|
| 3278 |
+
71
|
| 3279 |
+
41
|
| 3280 |
+
-11
|
| 3281 |
+
-44
|
| 3282 |
+
-58
|
| 3283 |
+
-51
|
| 3284 |
+
-38
|
| 3285 |
+
-31
|
| 3286 |
+
-23
|
| 3287 |
+
-39
|
| 3288 |
+
-42
|
| 3289 |
+
-27
|
| 3290 |
+
8
|
| 3291 |
+
39
|
| 3292 |
+
69
|
| 3293 |
+
79
|
| 3294 |
+
65
|
| 3295 |
+
45
|
| 3296 |
+
2
|
| 3297 |
+
-18
|
| 3298 |
+
-40
|
| 3299 |
+
-25
|
| 3300 |
+
-22
|
| 3301 |
+
-25
|
| 3302 |
+
-28
|
| 3303 |
+
-32
|
| 3304 |
+
-25
|
| 3305 |
+
-24
|
| 3306 |
+
-20
|
| 3307 |
+
-19
|
| 3308 |
+
-24
|
| 3309 |
+
-25
|
| 3310 |
+
-25
|
| 3311 |
+
-15
|
| 3312 |
+
-3
|
| 3313 |
+
8
|
| 3314 |
+
-6
|
| 3315 |
+
-41
|
| 3316 |
+
-77
|
| 3317 |
+
-71
|
| 3318 |
+
-44
|
| 3319 |
+
-19
|
| 3320 |
+
-17
|
| 3321 |
+
-39
|
| 3322 |
+
-62
|
| 3323 |
+
-60
|
| 3324 |
+
-42
|
| 3325 |
+
-31
|
| 3326 |
+
-36
|
| 3327 |
+
-59
|
| 3328 |
+
-89
|
| 3329 |
+
-116
|
| 3330 |
+
-113
|
| 3331 |
+
-89
|
| 3332 |
+
-76
|
| 3333 |
+
-78
|
| 3334 |
+
-97
|
| 3335 |
+
-110
|
| 3336 |
+
-115
|
| 3337 |
+
-107
|
| 3338 |
+
-75
|
| 3339 |
+
-59
|
| 3340 |
+
-44
|
| 3341 |
+
-27
|
| 3342 |
+
-31
|
| 3343 |
+
-36
|
| 3344 |
+
-31
|
| 3345 |
+
-2
|
| 3346 |
+
19
|
| 3347 |
+
16
|
| 3348 |
+
-8
|
| 3349 |
+
-54
|
| 3350 |
+
-88
|
| 3351 |
+
-103
|
| 3352 |
+
-99
|
| 3353 |
+
-93
|
| 3354 |
+
-83
|
| 3355 |
+
-78
|
| 3356 |
+
-71
|
| 3357 |
+
-77
|
| 3358 |
+
-74
|
| 3359 |
+
-52
|
| 3360 |
+
-45
|
| 3361 |
+
-32
|
| 3362 |
+
-32
|
| 3363 |
+
-48
|
| 3364 |
+
-65
|
| 3365 |
+
-77
|
| 3366 |
+
-83
|
| 3367 |
+
-89
|
| 3368 |
+
-76
|
| 3369 |
+
-66
|
| 3370 |
+
-47
|
| 3371 |
+
-13
|
| 3372 |
+
33
|
| 3373 |
+
67
|
| 3374 |
+
76
|
| 3375 |
+
53
|
| 3376 |
+
25
|
| 3377 |
+
-7
|
| 3378 |
+
-41
|
| 3379 |
+
-69
|
| 3380 |
+
-90
|
| 3381 |
+
-94
|
| 3382 |
+
-86
|
| 3383 |
+
-78
|
| 3384 |
+
-75
|
| 3385 |
+
-75
|
| 3386 |
+
-61
|
| 3387 |
+
-40
|
| 3388 |
+
-30
|
| 3389 |
+
-27
|
| 3390 |
+
-36
|
| 3391 |
+
-48
|
| 3392 |
+
-29
|
| 3393 |
+
-6
|
| 3394 |
+
13
|
| 3395 |
+
-1
|
| 3396 |
+
-34
|
| 3397 |
+
-56
|
| 3398 |
+
-62
|
| 3399 |
+
-26
|
| 3400 |
+
18
|
| 3401 |
+
41
|
| 3402 |
+
21
|
| 3403 |
+
-36
|
| 3404 |
+
-90
|
| 3405 |
+
-139
|
| 3406 |
+
-143
|
| 3407 |
+
-119
|
| 3408 |
+
-79
|
| 3409 |
+
-39
|
| 3410 |
+
-4
|
| 3411 |
+
27
|
| 3412 |
+
40
|
| 3413 |
+
52
|
| 3414 |
+
52
|
| 3415 |
+
34
|
| 3416 |
+
-1
|
| 3417 |
+
-30
|
| 3418 |
+
-49
|
| 3419 |
+
-68
|
| 3420 |
+
-95
|
| 3421 |
+
-123
|
| 3422 |
+
-144
|
| 3423 |
+
-147
|
| 3424 |
+
-114
|
| 3425 |
+
-67
|
| 3426 |
+
-36
|
| 3427 |
+
-22
|
| 3428 |
+
-5
|
| 3429 |
+
29
|
| 3430 |
+
53
|
| 3431 |
+
84
|
| 3432 |
+
86
|
| 3433 |
+
80
|
| 3434 |
+
47
|
| 3435 |
+
7
|
| 3436 |
+
-53
|
| 3437 |
+
-94
|
| 3438 |
+
-106
|
| 3439 |
+
-90
|
| 3440 |
+
-67
|
| 3441 |
+
-47
|
| 3442 |
+
-55
|
| 3443 |
+
-79
|
| 3444 |
+
-113
|
| 3445 |
+
-122
|
| 3446 |
+
-110
|
| 3447 |
+
-75
|
| 3448 |
+
-48
|
| 3449 |
+
-47
|
| 3450 |
+
-54
|
| 3451 |
+
-70
|
| 3452 |
+
-55
|
| 3453 |
+
-31
|
| 3454 |
+
-18
|
| 3455 |
+
-13
|
| 3456 |
+
-24
|
| 3457 |
+
-61
|
| 3458 |
+
-68
|
| 3459 |
+
-58
|
| 3460 |
+
-29
|
| 3461 |
+
1
|
| 3462 |
+
7
|
| 3463 |
+
-4
|
| 3464 |
+
-35
|
| 3465 |
+
-69
|
| 3466 |
+
-80
|
| 3467 |
+
-100
|
| 3468 |
+
-108
|
| 3469 |
+
-114
|
| 3470 |
+
-99
|
| 3471 |
+
-77
|
| 3472 |
+
-51
|
| 3473 |
+
-27
|
| 3474 |
+
-17
|
| 3475 |
+
-4
|
| 3476 |
+
-1
|
| 3477 |
+
-7
|
| 3478 |
+
-12
|
| 3479 |
+
-25
|
| 3480 |
+
-29
|
| 3481 |
+
-40
|
| 3482 |
+
-60
|
| 3483 |
+
-73
|
| 3484 |
+
-78
|
| 3485 |
+
-89
|
| 3486 |
+
-88
|
| 3487 |
+
-89
|
| 3488 |
+
-88
|
| 3489 |
+
-105
|
| 3490 |
+
-112
|
| 3491 |
+
-109
|
| 3492 |
+
-106
|
| 3493 |
+
-86
|
| 3494 |
+
-60
|
| 3495 |
+
-52
|
| 3496 |
+
-58
|
| 3497 |
+
-60
|
| 3498 |
+
-47
|
| 3499 |
+
-25
|
| 3500 |
+
-15
|
| 3501 |
+
-17
|
| 3502 |
+
-30
|
| 3503 |
+
-50
|
| 3504 |
+
-58
|
| 3505 |
+
-63
|
| 3506 |
+
-62
|
| 3507 |
+
-55
|
| 3508 |
+
-46
|
| 3509 |
+
-45
|
| 3510 |
+
-66
|
| 3511 |
+
-59
|
| 3512 |
+
-70
|
| 3513 |
+
-80
|
| 3514 |
+
-91
|
| 3515 |
+
-93
|
| 3516 |
+
-87
|
| 3517 |
+
-70
|
| 3518 |
+
-50
|
| 3519 |
+
-39
|
| 3520 |
+
-41
|
| 3521 |
+
-43
|
| 3522 |
+
-38
|
| 3523 |
+
-30
|
| 3524 |
+
-18
|
| 3525 |
+
3
|
| 3526 |
+
9
|
| 3527 |
+
0
|
| 3528 |
+
-28
|
| 3529 |
+
-45
|
| 3530 |
+
-62
|
| 3531 |
+
-75
|
| 3532 |
+
-77
|
| 3533 |
+
-79
|
| 3534 |
+
-70
|
| 3535 |
+
-54
|
| 3536 |
+
-46
|
| 3537 |
+
-58
|
| 3538 |
+
-77
|
| 3539 |
+
-82
|
| 3540 |
+
-67
|
| 3541 |
+
-60
|
| 3542 |
+
-53
|
| 3543 |
+
-57
|
| 3544 |
+
-79
|
| 3545 |
+
-93
|
| 3546 |
+
-90
|
| 3547 |
+
-67
|
| 3548 |
+
-50
|
| 3549 |
+
-36
|
| 3550 |
+
-40
|
| 3551 |
+
-49
|
| 3552 |
+
-56
|
| 3553 |
+
-34
|
| 3554 |
+
-18
|
| 3555 |
+
0
|
| 3556 |
+
19
|
| 3557 |
+
38
|
| 3558 |
+
53
|
| 3559 |
+
53
|
| 3560 |
+
40
|
| 3561 |
+
23
|
| 3562 |
+
0
|
| 3563 |
+
-17
|
| 3564 |
+
-46
|
| 3565 |
+
-67
|
| 3566 |
+
-69
|
| 3567 |
+
-54
|
| 3568 |
+
-28
|
| 3569 |
+
-1
|
| 3570 |
+
30
|
| 3571 |
+
45
|
| 3572 |
+
41
|
| 3573 |
+
20
|
| 3574 |
+
1
|
| 3575 |
+
-14
|
| 3576 |
+
-25
|
| 3577 |
+
-44
|
| 3578 |
+
-56
|
| 3579 |
+
-73
|
| 3580 |
+
-60
|
| 3581 |
+
-50
|
| 3582 |
+
-50
|
| 3583 |
+
-45
|
| 3584 |
+
-34
|
| 3585 |
+
-13
|
| 3586 |
+
-9
|
| 3587 |
+
-26
|
| 3588 |
+
-47
|
| 3589 |
+
-67
|
| 3590 |
+
-78
|
| 3591 |
+
-60
|
| 3592 |
+
-50
|
| 3593 |
+
-56
|
| 3594 |
+
-58
|
| 3595 |
+
-61
|
| 3596 |
+
-57
|
| 3597 |
+
-51
|
| 3598 |
+
-40
|
| 3599 |
+
-50
|
| 3600 |
+
-69
|
| 3601 |
+
-99
|
| 3602 |
+
-123
|
| 3603 |
+
-144
|
| 3604 |
+
-156
|
| 3605 |
+
-166
|
| 3606 |
+
-182
|
| 3607 |
+
-200
|
| 3608 |
+
-211
|
| 3609 |
+
-205
|
| 3610 |
+
-183
|
| 3611 |
+
-156
|
| 3612 |
+
-129
|
| 3613 |
+
-120
|
| 3614 |
+
-111
|
| 3615 |
+
-89
|
| 3616 |
+
-76
|
| 3617 |
+
-74
|
| 3618 |
+
-77
|
| 3619 |
+
-87
|
| 3620 |
+
-88
|
| 3621 |
+
-67
|
| 3622 |
+
-37
|
| 3623 |
+
-10
|
| 3624 |
+
-14
|
| 3625 |
+
-30
|
| 3626 |
+
-63
|
| 3627 |
+
-85
|
| 3628 |
+
-103
|
| 3629 |
+
-106
|
| 3630 |
+
-87
|
| 3631 |
+
-78
|
| 3632 |
+
-72
|
| 3633 |
+
-64
|
| 3634 |
+
-70
|
| 3635 |
+
-80
|
| 3636 |
+
-72
|
| 3637 |
+
-62
|
| 3638 |
+
-49
|
| 3639 |
+
-28
|
| 3640 |
+
-24
|
| 3641 |
+
-35
|
| 3642 |
+
-55
|
| 3643 |
+
-63
|
| 3644 |
+
-72
|
| 3645 |
+
-67
|
| 3646 |
+
-61
|
| 3647 |
+
-56
|
| 3648 |
+
-60
|
| 3649 |
+
-53
|
| 3650 |
+
-39
|
| 3651 |
+
-24
|
| 3652 |
+
-18
|
| 3653 |
+
-14
|
| 3654 |
+
1
|
| 3655 |
+
6
|
| 3656 |
+
-1
|
| 3657 |
+
-15
|
| 3658 |
+
-44
|
| 3659 |
+
-65
|
| 3660 |
+
-76
|
| 3661 |
+
-70
|
| 3662 |
+
-72
|
| 3663 |
+
-58
|
| 3664 |
+
-51
|
| 3665 |
+
-29
|
| 3666 |
+
-25
|
| 3667 |
+
-19
|
| 3668 |
+
-16
|
| 3669 |
+
-31
|
| 3670 |
+
-52
|
| 3671 |
+
-67
|
| 3672 |
+
-77
|
| 3673 |
+
-78
|
| 3674 |
+
-68
|
| 3675 |
+
-59
|
| 3676 |
+
-63
|
| 3677 |
+
-90
|
| 3678 |
+
-105
|
| 3679 |
+
-103
|
| 3680 |
+
-73
|
| 3681 |
+
-29
|
| 3682 |
+
6
|
| 3683 |
+
13
|
| 3684 |
+
20
|
| 3685 |
+
24
|
| 3686 |
+
32
|
| 3687 |
+
10
|
| 3688 |
+
-21
|
| 3689 |
+
-78
|
| 3690 |
+
-126
|
| 3691 |
+
-150
|
| 3692 |
+
-136
|
| 3693 |
+
-113
|
| 3694 |
+
-75
|
| 3695 |
+
-34
|
| 3696 |
+
-5
|
| 3697 |
+
0
|
| 3698 |
+
-22
|
| 3699 |
+
-50
|
| 3700 |
+
-85
|
| 3701 |
+
-117
|
| 3702 |
+
-112
|
| 3703 |
+
-115
|
| 3704 |
+
-86
|
| 3705 |
+
-44
|
| 3706 |
+
3
|
| 3707 |
+
47
|
| 3708 |
+
79
|
| 3709 |
+
85
|
| 3710 |
+
55
|
| 3711 |
+
0
|
| 3712 |
+
-55
|
| 3713 |
+
-91
|
| 3714 |
+
-119
|
| 3715 |
+
-121
|
| 3716 |
+
-106
|
| 3717 |
+
-90
|
| 3718 |
+
-83
|
| 3719 |
+
-72
|
| 3720 |
+
-54
|
| 3721 |
+
-29
|
| 3722 |
+
-7
|
| 3723 |
+
10
|
| 3724 |
+
13
|
| 3725 |
+
0
|
| 3726 |
+
-29
|
| 3727 |
+
-55
|
| 3728 |
+
-92
|
| 3729 |
+
-113
|
| 3730 |
+
-115
|
| 3731 |
+
-113
|
| 3732 |
+
-102
|
| 3733 |
+
-92
|
| 3734 |
+
-89
|
| 3735 |
+
-94
|
| 3736 |
+
-92
|
| 3737 |
+
-72
|
| 3738 |
+
-32
|
| 3739 |
+
7
|
| 3740 |
+
28
|
| 3741 |
+
36
|
| 3742 |
+
29
|
| 3743 |
+
6
|
| 3744 |
+
-23
|
| 3745 |
+
-44
|
| 3746 |
+
-48
|
| 3747 |
+
-23
|
| 3748 |
+
-1
|
| 3749 |
+
8
|
| 3750 |
+
18
|
| 3751 |
+
19
|
| 3752 |
+
4
|
| 3753 |
+
-41
|
| 3754 |
+
-84
|
| 3755 |
+
-115
|
| 3756 |
+
-126
|
| 3757 |
+
-116
|
| 3758 |
+
-91
|
| 3759 |
+
-70
|
| 3760 |
+
-44
|
| 3761 |
+
-30
|
| 3762 |
+
-32
|
| 3763 |
+
-55
|
| 3764 |
+
-74
|
| 3765 |
+
-75
|
| 3766 |
+
-62
|
| 3767 |
+
-51
|
| 3768 |
+
-28
|
| 3769 |
+
-15
|
| 3770 |
+
2
|
| 3771 |
+
10
|
| 3772 |
+
6
|
| 3773 |
+
-21
|
| 3774 |
+
-66
|
| 3775 |
+
-111
|
| 3776 |
+
-144
|
| 3777 |
+
-151
|
| 3778 |
+
-143
|
| 3779 |
+
-115
|
| 3780 |
+
-107
|
| 3781 |
+
-102
|
| 3782 |
+
-86
|
| 3783 |
+
-69
|
| 3784 |
+
-41
|
| 3785 |
+
-19
|
| 3786 |
+
6
|
| 3787 |
+
20
|
| 3788 |
+
27
|
| 3789 |
+
17
|
| 3790 |
+
-7
|
| 3791 |
+
-53
|
| 3792 |
+
-115
|
| 3793 |
+
-180
|
| 3794 |
+
-235
|
| 3795 |
+
-242
|
| 3796 |
+
-220
|
| 3797 |
+
-179
|
| 3798 |
+
-153
|
| 3799 |
+
-120
|
| 3800 |
+
-94
|
| 3801 |
+
-75
|
| 3802 |
+
-67
|
| 3803 |
+
-58
|
| 3804 |
+
-45
|
| 3805 |
+
-29
|
| 3806 |
+
-9
|
| 3807 |
+
-8
|
| 3808 |
+
-25
|
| 3809 |
+
-32
|
| 3810 |
+
-25
|
| 3811 |
+
-11
|
| 3812 |
+
-3
|
| 3813 |
+
-7
|
| 3814 |
+
-32
|
| 3815 |
+
-55
|
| 3816 |
+
-71
|
| 3817 |
+
-74
|
| 3818 |
+
-74
|
| 3819 |
+
-100
|
| 3820 |
+
-116
|
| 3821 |
+
-135
|
| 3822 |
+
-138
|
| 3823 |
+
-116
|
| 3824 |
+
-78
|
| 3825 |
+
-49
|
| 3826 |
+
-31
|
| 3827 |
+
-26
|
| 3828 |
+
-30
|
| 3829 |
+
-26
|
| 3830 |
+
-21
|
| 3831 |
+
-17
|
| 3832 |
+
-10
|
| 3833 |
+
-10
|
| 3834 |
+
-1
|
| 3835 |
+
-16
|
| 3836 |
+
-13
|
| 3837 |
+
-19
|
| 3838 |
+
3
|
| 3839 |
+
14
|
| 3840 |
+
30
|
| 3841 |
+
39
|
| 3842 |
+
37
|
| 3843 |
+
24
|
| 3844 |
+
18
|
| 3845 |
+
26
|
| 3846 |
+
22
|
| 3847 |
+
18
|
| 3848 |
+
0
|
| 3849 |
+
-15
|
| 3850 |
+
-24
|
| 3851 |
+
-29
|
| 3852 |
+
-35
|
| 3853 |
+
-49
|
| 3854 |
+
-64
|
| 3855 |
+
-68
|
| 3856 |
+
-59
|
| 3857 |
+
-41
|
| 3858 |
+
-29
|
| 3859 |
+
-24
|
| 3860 |
+
-37
|
| 3861 |
+
-46
|
| 3862 |
+
-45
|
| 3863 |
+
-45
|
| 3864 |
+
-51
|
| 3865 |
+
-52
|
| 3866 |
+
-54
|
| 3867 |
+
-59
|
| 3868 |
+
-47
|
| 3869 |
+
-27
|
| 3870 |
+
-4
|
| 3871 |
+
-7
|
| 3872 |
+
-8
|
| 3873 |
+
-16
|
| 3874 |
+
-6
|
| 3875 |
+
-1
|
| 3876 |
+
4
|
| 3877 |
+
5
|
| 3878 |
+
-9
|
| 3879 |
+
-9
|
| 3880 |
+
-19
|
| 3881 |
+
-22
|
| 3882 |
+
-38
|
| 3883 |
+
-53
|
| 3884 |
+
-59
|
| 3885 |
+
-71
|
| 3886 |
+
-70
|
| 3887 |
+
-83
|
| 3888 |
+
-91
|
| 3889 |
+
-82
|
| 3890 |
+
-50
|
| 3891 |
+
-13
|
| 3892 |
+
22
|
| 3893 |
+
51
|
| 3894 |
+
58
|
| 3895 |
+
48
|
| 3896 |
+
27
|
| 3897 |
+
17
|
| 3898 |
+
13
|
| 3899 |
+
4
|
| 3900 |
+
5
|
| 3901 |
+
-4
|
| 3902 |
+
-15
|
| 3903 |
+
-29
|
| 3904 |
+
-40
|
| 3905 |
+
-55
|
| 3906 |
+
-63
|
| 3907 |
+
-63
|
| 3908 |
+
-78
|
| 3909 |
+
-76
|
| 3910 |
+
-81
|
| 3911 |
+
-73
|
| 3912 |
+
-74
|
| 3913 |
+
-63
|
| 3914 |
+
-45
|
| 3915 |
+
-14
|
| 3916 |
+
-18
|
| 3917 |
+
-35
|
| 3918 |
+
-58
|
| 3919 |
+
-87
|
| 3920 |
+
-95
|
| 3921 |
+
-86
|
| 3922 |
+
-67
|
| 3923 |
+
-44
|
| 3924 |
+
-33
|
| 3925 |
+
-33
|
| 3926 |
+
-44
|
| 3927 |
+
-21
|
| 3928 |
+
17
|
| 3929 |
+
53
|
| 3930 |
+
47
|
| 3931 |
+
33
|
| 3932 |
+
6
|
| 3933 |
+
-20
|
| 3934 |
+
-34
|
| 3935 |
+
-39
|
| 3936 |
+
-34
|
| 3937 |
+
-30
|
| 3938 |
+
-3
|
| 3939 |
+
1
|
| 3940 |
+
12
|
| 3941 |
+
10
|
| 3942 |
+
11
|
| 3943 |
+
10
|
| 3944 |
+
0
|
| 3945 |
+
-7
|
| 3946 |
+
-10
|
| 3947 |
+
-24
|
| 3948 |
+
-23
|
| 3949 |
+
-33
|
| 3950 |
+
-41
|
| 3951 |
+
-59
|
| 3952 |
+
-76
|
| 3953 |
+
-85
|
| 3954 |
+
-94
|
| 3955 |
+
-91
|
| 3956 |
+
-84
|
| 3957 |
+
-76
|
| 3958 |
+
-62
|
| 3959 |
+
-39
|
| 3960 |
+
-22
|
| 3961 |
+
-14
|
| 3962 |
+
-21
|
| 3963 |
+
-23
|
| 3964 |
+
-27
|
| 3965 |
+
-39
|
| 3966 |
+
-44
|
| 3967 |
+
-55
|
| 3968 |
+
-74
|
| 3969 |
+
-95
|
| 3970 |
+
-103
|
| 3971 |
+
-102
|
| 3972 |
+
-75
|
| 3973 |
+
-28
|
| 3974 |
+
15
|
| 3975 |
+
27
|
| 3976 |
+
7
|
| 3977 |
+
-13
|
| 3978 |
+
-45
|
| 3979 |
+
-56
|
| 3980 |
+
-83
|
| 3981 |
+
-110
|
| 3982 |
+
-138
|
| 3983 |
+
-145
|
| 3984 |
+
-115
|
| 3985 |
+
-76
|
| 3986 |
+
-29
|
| 3987 |
+
-3
|
| 3988 |
+
11
|
| 3989 |
+
-6
|
| 3990 |
+
-16
|
| 3991 |
+
-27
|
| 3992 |
+
-28
|
| 3993 |
+
-32
|
| 3994 |
+
-43
|
| 3995 |
+
-69
|
| 3996 |
+
-91
|
| 3997 |
+
-96
|
| 3998 |
+
-94
|
| 3999 |
+
-93
|
| 4000 |
+
-79
|
| 4001 |
+
-62
|
| 4002 |
+
-44
|
| 4003 |
+
-26
|
| 4004 |
+
-10
|
| 4005 |
+
-13
|
| 4006 |
+
-29
|
| 4007 |
+
-55
|
| 4008 |
+
-53
|
| 4009 |
+
-39
|
| 4010 |
+
-16
|
| 4011 |
+
13
|
| 4012 |
+
16
|
| 4013 |
+
12
|
| 4014 |
+
0
|
| 4015 |
+
-11
|
| 4016 |
+
-28
|
| 4017 |
+
-34
|
| 4018 |
+
-36
|
| 4019 |
+
-39
|
| 4020 |
+
-35
|
| 4021 |
+
-37
|
| 4022 |
+
-3
|
| 4023 |
+
6
|
| 4024 |
+
18
|
| 4025 |
+
-1
|
| 4026 |
+
-13
|
| 4027 |
+
-28
|
| 4028 |
+
-36
|
| 4029 |
+
-38
|
| 4030 |
+
-51
|
| 4031 |
+
-53
|
| 4032 |
+
-45
|
| 4033 |
+
-31
|
| 4034 |
+
-20
|
| 4035 |
+
-17
|
| 4036 |
+
-11
|
| 4037 |
+
-10
|
| 4038 |
+
-5
|
| 4039 |
+
-17
|
| 4040 |
+
-48
|
| 4041 |
+
-85
|
| 4042 |
+
-100
|
| 4043 |
+
-83
|
| 4044 |
+
-74
|
| 4045 |
+
-62
|
| 4046 |
+
-64
|
| 4047 |
+
-65
|
| 4048 |
+
-67
|
| 4049 |
+
-56
|
| 4050 |
+
-42
|
| 4051 |
+
-38
|
| 4052 |
+
-57
|
| 4053 |
+
-85
|
| 4054 |
+
-127
|
| 4055 |
+
-157
|
| 4056 |
+
-170
|
| 4057 |
+
-156
|
| 4058 |
+
-146
|
| 4059 |
+
-134
|
| 4060 |
+
-138
|
| 4061 |
+
-136
|
| 4062 |
+
-144
|
| 4063 |
+
-141
|
| 4064 |
+
-146
|
| 4065 |
+
-141
|
| 4066 |
+
-117
|
| 4067 |
+
-67
|
| 4068 |
+
-20
|
| 4069 |
+
5
|
| 4070 |
+
17
|
| 4071 |
+
-5
|
| 4072 |
+
-31
|
| 4073 |
+
-75
|
| 4074 |
+
-119
|
| 4075 |
+
-160
|
| 4076 |
+
-201
|
| 4077 |
+
-214
|
| 4078 |
+
-220
|
| 4079 |
+
-206
|
| 4080 |
+
-187
|
| 4081 |
+
-162
|
| 4082 |
+
-139
|
| 4083 |
+
-118
|
| 4084 |
+
-77
|
| 4085 |
+
-49
|
| 4086 |
+
-37
|
| 4087 |
+
-43
|
| 4088 |
+
-63
|
| 4089 |
+
-82
|
| 4090 |
+
-114
|
| 4091 |
+
-138
|
| 4092 |
+
-159
|
| 4093 |
+
-172
|
| 4094 |
+
-180
|
| 4095 |
+
-173
|
| 4096 |
+
-162
|
| 4097 |
+
-82
|
NeuroKit/source/data/eeg_1min_200hz.pickle
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b19f2b5d600f1dd267e45dd3ec269a9ccf13747bf7d1f9db7d81c03bc622ffaa
|
| 3 |
+
size 9743902
|
NeuroKit/source/data/eeg_1min_200hz.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pickle
|
| 2 |
+
|
| 3 |
+
import mne
|
| 4 |
+
|
| 5 |
+
raw = mne.io.read_raw_fif(
|
| 6 |
+
mne.datasets.sample.data_path() / "MEG/sample/sample_audvis_raw.fif",
|
| 7 |
+
preload=True,
|
| 8 |
+
verbose=False,
|
| 9 |
+
)
|
| 10 |
+
raw = raw.pick(["eeg", "eog", "stim"], verbose=False)
|
| 11 |
+
raw = raw.crop(0, 60)
|
| 12 |
+
raw = raw.resample(200)
|
| 13 |
+
|
| 14 |
+
# raw.ch_names
|
| 15 |
+
|
| 16 |
+
# raw.info["sfreq"]
|
| 17 |
+
|
| 18 |
+
# Store data (serialize)
|
| 19 |
+
with open("eeg_1min_200hz.pickle", "wb") as handle:
|
| 20 |
+
pickle.dump(raw, handle, protocol=pickle.HIGHEST_PROTOCOL)
|
NeuroKit/source/data/eeg_resting_8min.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import mne
|
| 2 |
+
import numpy as np
|
| 3 |
+
import TruScanEEGpy
|
| 4 |
+
|
| 5 |
+
import neurokit2 as nk
|
| 6 |
+
|
| 7 |
+
# EDF TO FIF
|
| 8 |
+
# ==========
|
| 9 |
+
# Read original file (too big to be uploaded on github)
|
| 10 |
+
raw = mne.io.read_raw_edf("eeg_restingstate_3000hz.edf", preload=True)
|
| 11 |
+
|
| 12 |
+
# Find event onset and cut
|
| 13 |
+
event = nk.events_find(raw.copy().pick_channels(["Foto"]).to_data_frame()["Foto"])
|
| 14 |
+
tmin = event["onset"][0] / 3000
|
| 15 |
+
raw = raw.crop(tmin=tmin, tmax=tmin + 8 * 60)
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
# EOG
|
| 19 |
+
eog = raw.copy().pick_channels(["124", "125"]).to_data_frame()
|
| 20 |
+
eog = eog["124"] - eog["125"]
|
| 21 |
+
raw = nk.eeg_add_channel(raw, eog, channel_type="eog", channel_name="EOG")
|
| 22 |
+
raw = raw.drop_channels(["124", "125"])
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
# Montage
|
| 26 |
+
mne.rename_channels(
|
| 27 |
+
raw.info, dict(zip(raw.info["ch_names"], TruScanEEGpy.convert_to_tenfive(raw.info["ch_names"])))
|
| 28 |
+
)
|
| 29 |
+
montage = TruScanEEGpy.montage_mne_128(TruScanEEGpy.layout_128(names="10-5"))
|
| 30 |
+
extra_channels = np.array(raw.info["ch_names"])[
|
| 31 |
+
np.array([i not in montage.ch_names for i in raw.info["ch_names"]])
|
| 32 |
+
]
|
| 33 |
+
raw = raw.drop_channels(extra_channels[np.array([i not in ["EOG"] for i in extra_channels])])
|
| 34 |
+
raw = raw.set_montage(montage)
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
# Save
|
| 38 |
+
raw = raw.resample(300)
|
| 39 |
+
raw.save("eeg_restingstate_300hz.fif", overwrite=True)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
## Convert to df
|
| 43 |
+
# df = pd.DataFrame(raw.get_data().T)
|
| 44 |
+
# df.columns = raw.info["ch_names"]
|
| 45 |
+
# df.to_csv("eeg_restingstate_300hz.csv")
|
NeuroKit/source/data/eeg_resting_8min_300hz.fif
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e479e9b1bd5ab06e1ff47dd2305e74995b2168b1586589b4c8c077b9da4d7afc
|
| 3 |
+
size 73179119
|
NeuroKit/source/data/eog_100hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/eog_200hz.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/eogdb/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
The folder where to put the EOGDB dataset containing vertical EOG signals.
|
NeuroKit/source/data/fantasia/download_fantasia.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script for formatting the Fantasia Database
|
| 3 |
+
|
| 4 |
+
The database consists of twenty young and twenty elderly healthy subjects. All subjects remained in a resting state in sinus rhythm while watching the movie Fantasia (Disney, 1940) to help maintain wakefulness. The continuous ECG signals were digitized at 250 Hz. Each heartbeat was annotated using an automated arrhythmia detection algorithm, and each beat annotation was verified by visual inspection.
|
| 5 |
+
|
| 6 |
+
Steps:
|
| 7 |
+
1. Download the ZIP database from https://physionet.org/content/fantasia/1.0.0/
|
| 8 |
+
2. Open it with a zip-opener (WinZip, 7zip).
|
| 9 |
+
3. Extract the folder of the same name (named 'fantasia-database-1.0.0') to the same folder as this script.
|
| 10 |
+
4. Run this script.
|
| 11 |
+
"""
|
| 12 |
+
import pandas as pd
|
| 13 |
+
import numpy as np
|
| 14 |
+
import wfdb
|
| 15 |
+
import os
|
| 16 |
+
import pathlib
|
| 17 |
+
|
| 18 |
+
import neurokit2 as nk
|
| 19 |
+
|
| 20 |
+
database_path = "./fantasia-database-1.0.0/"
|
| 21 |
+
|
| 22 |
+
# Check if expected folder exists
|
| 23 |
+
if not os.path.exists(database_path):
|
| 24 |
+
url = "https://physionet.org/static/published-projects/fantasia/fantasia-database-1.0.0.zip"
|
| 25 |
+
download_successful = nk.download_zip(url, database_path)
|
| 26 |
+
if not download_successful:
|
| 27 |
+
raise ValueError(
|
| 28 |
+
"NeuroKit error: download of Fantasia database failed. "
|
| 29 |
+
"Please download it manually from https://physionet.org/content/fantasia/1.0.0/ "
|
| 30 |
+
"and unzip it in the same folder as this script."
|
| 31 |
+
)
|
| 32 |
+
|
| 33 |
+
files = os.listdir(database_path)
|
| 34 |
+
files = [s.replace('.dat', '') for s in files if ".dat" in s]
|
| 35 |
+
|
| 36 |
+
dfs_ecg = []
|
| 37 |
+
dfs_rpeaks = []
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
for i, participant in enumerate(files):
|
| 41 |
+
|
| 42 |
+
data, info = wfdb.rdsamp(str(pathlib.Path(database_path, participant)))
|
| 43 |
+
|
| 44 |
+
# Get signal
|
| 45 |
+
data = pd.DataFrame(data, columns=info["sig_name"])
|
| 46 |
+
data = data[["ECG"]]
|
| 47 |
+
data["Participant"] = "Fantasia_" + participant
|
| 48 |
+
data["Sample"] = range(len(data))
|
| 49 |
+
data["Sampling_Rate"] = info['fs']
|
| 50 |
+
data["Database"] = "Fantasia"
|
| 51 |
+
|
| 52 |
+
# Get annotations
|
| 53 |
+
anno = wfdb.rdann(str(pathlib.Path(database_path, participant)), 'ecg')
|
| 54 |
+
anno = anno.sample[np.where(np.array(anno.symbol) == "N")[0]]
|
| 55 |
+
anno = pd.DataFrame({"Rpeaks": anno})
|
| 56 |
+
anno["Participant"] = "Fantasia_" + participant
|
| 57 |
+
anno["Sampling_Rate"] = info['fs']
|
| 58 |
+
anno["Database"] = "Fantasia"
|
| 59 |
+
|
| 60 |
+
# Store with the rest
|
| 61 |
+
dfs_ecg.append(data)
|
| 62 |
+
dfs_rpeaks.append(anno)
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
# Save
|
| 66 |
+
df_ecg = pd.concat(dfs_ecg).to_csv("ECGs.csv", index=False)
|
| 67 |
+
df_rpeaks = pd.concat(dfs_rpeaks).to_csv("Rpeaks.csv", index=False)
|
NeuroKit/source/data/gudb/download_gudb.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script for downloading, formatting and saving the GUDB database (https://github.com/berndporr/ECG-GUDB).
|
| 3 |
+
|
| 4 |
+
It contains ECGs from 25 subjects. Each subject was recorded performing 5 different tasks for two minutes:
|
| 5 |
+
- sitting
|
| 6 |
+
- a maths test on a tablet
|
| 7 |
+
- walking on a treadmill
|
| 8 |
+
- running on a treadmill
|
| 9 |
+
- using a hand bike
|
| 10 |
+
|
| 11 |
+
The sampling rate is 250Hz for all experiments.
|
| 12 |
+
|
| 13 |
+
Credits and citation:
|
| 14 |
+
- Howell, L., & Porr, B. (2018). High precision ECG Database with annotated R peaks,
|
| 15 |
+
recorded and filmed under realistic conditions.
|
| 16 |
+
"""
|
| 17 |
+
import pandas as pd
|
| 18 |
+
import ecg_gudb_database
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
dfs_ecg = []
|
| 22 |
+
dfs_rpeaks = []
|
| 23 |
+
|
| 24 |
+
for participant in range(25):
|
| 25 |
+
print("Participant: " + str(participant+1) + "/25")
|
| 26 |
+
for i, experiment in enumerate(ecg_gudb_database.GUDb.experiments):
|
| 27 |
+
print(" - Condition " + str(i+1) + "/5")
|
| 28 |
+
# creating class which loads the experiment
|
| 29 |
+
ecg_class = ecg_gudb_database.GUDb(participant, experiment)
|
| 30 |
+
|
| 31 |
+
# Chest Strap Data - only download if R-peaks annotations are available
|
| 32 |
+
if ecg_class.anno_cs_exists:
|
| 33 |
+
|
| 34 |
+
data = pd.DataFrame({"ECG": ecg_class.cs_V2_V1})
|
| 35 |
+
data["Participant"] = "GUDB_%.2i" %(participant)
|
| 36 |
+
data["Sample"] = range(len(data))
|
| 37 |
+
data["Sampling_Rate"] = 250
|
| 38 |
+
data["Database"] = "GUDB_" + experiment
|
| 39 |
+
|
| 40 |
+
# getting annotations
|
| 41 |
+
anno = pd.DataFrame({"Rpeaks": ecg_class.anno_cs})
|
| 42 |
+
anno["Participant"] = "GUDB_%.2i" %(participant)
|
| 43 |
+
anno["Sampling_Rate"] = 250
|
| 44 |
+
anno["Database"] = "GUDB_" + experiment
|
| 45 |
+
|
| 46 |
+
# Store with the rest
|
| 47 |
+
dfs_ecg.append(data)
|
| 48 |
+
dfs_rpeaks.append(anno)
|
| 49 |
+
|
| 50 |
+
# Einthoven leads
|
| 51 |
+
# if ecg_class.anno_cables_exists:
|
| 52 |
+
# cables_anno = ecg_class.anno_cables
|
| 53 |
+
# einthoven_i = ecg_class.einthoven_I
|
| 54 |
+
# einthoven_ii = ecg_class.einthoven_II
|
| 55 |
+
# einthoven_iii = ecg_class.einthoven_III
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
# Save
|
| 60 |
+
df_ecg = pd.concat(dfs_ecg).to_csv("ECGs.csv", index=False)
|
| 61 |
+
dfs_rpeaks = pd.concat(dfs_rpeaks).to_csv("Rpeaks.csv", index=False)
|
NeuroKit/source/data/labstreaminglayer.xdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:371561b965580453cbe1fdce473d7ca56903db89bcd2c8b7a632244069ee0ec3
|
| 3 |
+
size 11316158
|
NeuroKit/source/data/lemon/download_lemon.py
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script for formatting the LEMON EEG dataset
|
| 3 |
+
|
| 4 |
+
https://ftp.gwdg.de/pub/misc/MPI-Leipzig_Mind-Brain-Body-LEMON/EEG_MPILMBB_LEMON/EEG_Preprocessed_BIDS_ID/EEG_Preprocessed/
|
| 5 |
+
|
| 6 |
+
Credits:
|
| 7 |
+
pycrostates package by Mathieu Scheltienne and Victor Férat
|
| 8 |
+
"""
|
| 9 |
+
import os
|
| 10 |
+
|
| 11 |
+
import mne
|
| 12 |
+
import numpy as np
|
| 13 |
+
import pooch
|
| 14 |
+
|
| 15 |
+
# Path of the database
|
| 16 |
+
path = "https://ftp.gwdg.de/pub/misc/MPI-Leipzig_Mind-Brain-Body-LEMON/EEG_MPILMBB_LEMON/EEG_Preprocessed_BIDS_ID/EEG_Preprocessed/"
|
| 17 |
+
|
| 18 |
+
# Create a registry with the file names
|
| 19 |
+
files = {
|
| 20 |
+
f"sub-01{i:04d}_{j}.{k}": None
|
| 21 |
+
for i in range(2, 319)
|
| 22 |
+
for j in ["EC", "EO"]
|
| 23 |
+
for k in ["fdt", "set"]
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
# Create fetcher
|
| 27 |
+
fetcher = pooch.create(
|
| 28 |
+
path="lemon/",
|
| 29 |
+
base_url=path,
|
| 30 |
+
registry=files,
|
| 31 |
+
)
|
| 32 |
+
|
| 33 |
+
# Download the files
|
| 34 |
+
for sub in files.keys():
|
| 35 |
+
try:
|
| 36 |
+
_ = fetcher.fetch(sub)
|
| 37 |
+
except:
|
| 38 |
+
pass
|
| 39 |
+
|
| 40 |
+
print("Finished downloading!")
|
| 41 |
+
|
| 42 |
+
# Preprocessing
|
| 43 |
+
|
| 44 |
+
# fmt: off
|
| 45 |
+
standard_channels = [
|
| 46 |
+
"Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5",
|
| 47 |
+
"FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8",
|
| 48 |
+
"CP5", "CP1", "CP2", "CP6", "AFz", "P7", "P3", "Pz",
|
| 49 |
+
"P4", "P8", "PO9", "O1", "Oz", "O2", "PO10", "AF7",
|
| 50 |
+
"AF3", "AF4", "AF8", "F5", "F1", "F2", "F6", "FT7",
|
| 51 |
+
"FC3", "FC4", "FT8", "C5", "C1", "C2", "C6", "TP7",
|
| 52 |
+
"CP3", "CPz", "CP4", "TP8", "P5", "P1", "P2", "P6",
|
| 53 |
+
"PO7", "PO3", "POz", "PO4", "PO8",
|
| 54 |
+
]
|
| 55 |
+
# fmt: on
|
| 56 |
+
|
| 57 |
+
for sub in os.listdir("lemon/"):
|
| 58 |
+
if sub.endswith("fdt") is True or sub.endswith("fif") or "sub" not in sub:
|
| 59 |
+
continue
|
| 60 |
+
raw = mne.io.read_raw_eeglab("lemon/" + sub, preload=True)
|
| 61 |
+
|
| 62 |
+
missing_channels = list(set(standard_channels) - set(raw.info["ch_names"]))
|
| 63 |
+
|
| 64 |
+
if len(missing_channels) != 0:
|
| 65 |
+
# add the missing channels as bads (array of zeros)
|
| 66 |
+
missing_data = np.zeros((len(missing_channels), raw.n_times))
|
| 67 |
+
data = np.vstack([raw.get_data(), missing_data])
|
| 68 |
+
ch_names = raw.info["ch_names"] + missing_channels
|
| 69 |
+
ch_types = raw.get_channel_types() + ["eeg"] * len(missing_channels)
|
| 70 |
+
info = mne.create_info(ch_names=ch_names, ch_types=ch_types, sfreq=raw.info["sfreq"])
|
| 71 |
+
raw = mne.io.RawArray(data=data, info=info)
|
| 72 |
+
raw.info["bads"].extend(missing_channels)
|
| 73 |
+
|
| 74 |
+
raw = raw.add_reference_channels("FCz")
|
| 75 |
+
raw = raw.reorder_channels(standard_channels)
|
| 76 |
+
raw = raw.set_montage("standard_1005")
|
| 77 |
+
raw = raw.interpolate_bads()
|
| 78 |
+
raw = raw.set_eeg_reference("average").apply_proj()
|
| 79 |
+
|
| 80 |
+
raw.save("lemon/" + sub.replace(".set", "") + "_raw.fif", overwrite=True)
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
# Clean-up
|
| 84 |
+
for sub in os.listdir("lemon/"):
|
| 85 |
+
if sub.endswith("fif"):
|
| 86 |
+
continue
|
| 87 |
+
os.remove(f"lemon/{sub}")
|
| 88 |
+
|
| 89 |
+
print("FINISHED.")
|
NeuroKit/source/data/ludb/download_ludb.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script for formatting the Lobachevsky University Electrocardiography Database
|
| 3 |
+
|
| 4 |
+
The database consists of 200 10-second 12-lead ECG signal records representing different morphologies of the ECG signal. The ECGs were collected from healthy volunteers and patients, which had various cardiovascular diseases. The boundaries of P, T waves and QRS complexes were manually annotated by cardiologists for all 200 records.
|
| 5 |
+
|
| 6 |
+
Steps:
|
| 7 |
+
1. Download zipped data base from https://physionet.org/content/ludb/1.0.1/
|
| 8 |
+
2. Unzip the folder so that you have a `lobachevsky-university-electrocardiography-database-1.0.1/` folder'
|
| 9 |
+
3. Run this script.
|
| 10 |
+
"""
|
| 11 |
+
import pandas as pd
|
| 12 |
+
import numpy as np
|
| 13 |
+
import wfdb
|
| 14 |
+
import os
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
dfs_ecg = []
|
| 18 |
+
dfs_rpeaks = []
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
for participant in range(200):
|
| 22 |
+
filename = str(participant + 1)
|
| 23 |
+
|
| 24 |
+
data, info = wfdb.rdsamp(
|
| 25 |
+
"./lobachevsky-university-electrocardiography-database-1.0.1/data/" + filename
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
# Get signal
|
| 29 |
+
data = pd.DataFrame(data, columns=info["sig_name"])
|
| 30 |
+
data = data[["i"]].rename(columns={"i": "ECG"})
|
| 31 |
+
data["Participant"] = "LUDB_%.2i" % (participant + 1)
|
| 32 |
+
data["Sample"] = range(len(data))
|
| 33 |
+
data["Sampling_Rate"] = info["fs"]
|
| 34 |
+
data["Database"] = "LUDB"
|
| 35 |
+
|
| 36 |
+
# Get annotations
|
| 37 |
+
anno = wfdb.rdann(
|
| 38 |
+
"./lobachevsky-university-electrocardiography-database-1.0.1/data/" + filename, "i"
|
| 39 |
+
)
|
| 40 |
+
anno = anno.sample[np.where(np.array(anno.symbol) == "N")[0]]
|
| 41 |
+
anno = pd.DataFrame({"Rpeaks": anno})
|
| 42 |
+
anno["Participant"] = "LUDB_%.2i" % (participant + 1)
|
| 43 |
+
anno["Sampling_Rate"] = info["fs"]
|
| 44 |
+
anno["Database"] = "LUDB"
|
| 45 |
+
|
| 46 |
+
# Store with the rest
|
| 47 |
+
dfs_ecg.append(data)
|
| 48 |
+
dfs_rpeaks.append(anno)
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
# Save
|
| 52 |
+
df_ecg = pd.concat(dfs_ecg).to_csv("ECGs.csv", index=False)
|
| 53 |
+
dfs_rpeaks = pd.concat(dfs_rpeaks).to_csv("Rpeaks.csv", index=False)
|
NeuroKit/source/data/mit_arrhythmia/download_mit_arrhythmia.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script for formatting the MIT-Arrhythmia database
|
| 3 |
+
|
| 4 |
+
Steps:
|
| 5 |
+
1. Download the ZIP database from https://alpha.physionet.org/content/mitdb/1.0.0/
|
| 6 |
+
2. Open it with a zip-opener (WinZip, 7zip).
|
| 7 |
+
3. Extract the folder of the same name (named 'mit-bih-arrhythmia-database-1.0.0') to the same folder as this script.
|
| 8 |
+
4. Run this script.
|
| 9 |
+
|
| 10 |
+
Credits:
|
| 11 |
+
https://github.com/berndporr/py-ecg-detectors/blob/master/tester_MITDB.py by Bernd Porr
|
| 12 |
+
"""
|
| 13 |
+
import pandas as pd
|
| 14 |
+
import numpy as np
|
| 15 |
+
import wfdb
|
| 16 |
+
import os
|
| 17 |
+
import neurokit2 as nk
|
| 18 |
+
|
| 19 |
+
database_path = "./mit-bih-arrhythmia-database-1.0.0/"
|
| 20 |
+
|
| 21 |
+
# Check if expected folder exists
|
| 22 |
+
if not os.path.exists(database_path):
|
| 23 |
+
url = "https://physionet.org/static/published-projects/mitdb/mit-bih-arrhythmia-database-1.0.0.zip"
|
| 24 |
+
download_successful = nk.download_zip(url, database_path)
|
| 25 |
+
if not download_successful:
|
| 26 |
+
raise ValueError(
|
| 27 |
+
"NeuroKit error: download of MIT-Arrhythmia database failed. "
|
| 28 |
+
"Please download it manually from https://alpha.physionet.org/content/mitdb/1.0.0/ "
|
| 29 |
+
"and unzip it in the same folder as this script."
|
| 30 |
+
)
|
| 31 |
+
|
| 32 |
+
data_files = [database_path + file for file in os.listdir(database_path) if ".dat" in file]
|
| 33 |
+
|
| 34 |
+
def read_file(file, participant):
|
| 35 |
+
"""Utility function
|
| 36 |
+
"""
|
| 37 |
+
# Get signal
|
| 38 |
+
data = pd.DataFrame({"ECG": wfdb.rdsamp(file[:-4])[0][:, 0]})
|
| 39 |
+
data["Participant"] = "MIT-Arrhythmia_%.2i" %(participant)
|
| 40 |
+
data["Sample"] = range(len(data))
|
| 41 |
+
data["Sampling_Rate"] = 360
|
| 42 |
+
data["Database"] = "MIT-Arrhythmia-x" if "x_mitdb" in file else "MIT-Arrhythmia"
|
| 43 |
+
|
| 44 |
+
# getting annotations
|
| 45 |
+
anno = wfdb.rdann(file[:-4], 'atr')
|
| 46 |
+
anno = np.unique(anno.sample[np.in1d(anno.symbol, ['N', 'L', 'R', 'B', 'A', 'a', 'J', 'S', 'V', 'r', 'F', 'e', 'j', 'n', 'E', '/', 'f', 'Q', '?'])])
|
| 47 |
+
anno = pd.DataFrame({"Rpeaks": anno})
|
| 48 |
+
anno["Participant"] = "MIT-Arrhythmia_%.2i" %(participant)
|
| 49 |
+
anno["Sampling_Rate"] = 360
|
| 50 |
+
anno["Database"] = "MIT-Arrhythmia-x" if "x_mitdb" in file else "MIT-Arrhythmia"
|
| 51 |
+
|
| 52 |
+
return data, anno
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
dfs_ecg = []
|
| 58 |
+
dfs_rpeaks = []
|
| 59 |
+
|
| 60 |
+
for participant, file in enumerate(data_files):
|
| 61 |
+
|
| 62 |
+
print("Participant: " + str(participant + 1) + "/" + str(len(data_files)))
|
| 63 |
+
|
| 64 |
+
data, anno = read_file(file, participant)
|
| 65 |
+
|
| 66 |
+
# Store with the rest
|
| 67 |
+
dfs_ecg.append(data)
|
| 68 |
+
dfs_rpeaks.append(anno)
|
| 69 |
+
|
| 70 |
+
# Store additional recording if available
|
| 71 |
+
if "x_" + file.replace(database_path, "") in os.listdir(database_path + "x_mitdb/"):
|
| 72 |
+
print(" - Additional recording detected.")
|
| 73 |
+
data, anno = read_file(database_path + "/x_mitdb/" + "x_" + file.replace(database_path, ""), participant)
|
| 74 |
+
# Store with the rest
|
| 75 |
+
dfs_ecg.append(data)
|
| 76 |
+
dfs_rpeaks.append(anno)
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
# Save
|
| 81 |
+
df_ecg = pd.concat(dfs_ecg).to_csv("ECGs.csv", index=False)
|
| 82 |
+
dfs_rpeaks = pd.concat(dfs_rpeaks).to_csv("Rpeaks.csv", index=False)
|
| 83 |
+
|
| 84 |
+
# Quick test
|
| 85 |
+
#import neurokit2 as nk
|
| 86 |
+
#nk.events_plot(anno["Rpeaks"][anno["Rpeaks"] <= 1000], data["ECG"][0:1002])
|
NeuroKit/source/data/mit_long-term/Rpeaks.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
NeuroKit/source/data/mit_long-term/download_mit_long-term.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script for formatting the MIT-Long-Term ECG Database
|
| 3 |
+
|
| 4 |
+
Steps:
|
| 5 |
+
1. Download the ZIP database from https://physionet.org/content/ltdb/1.0.0/
|
| 6 |
+
2. Open it with a zip-opener (WinZip, 7zip).
|
| 7 |
+
3. Extract the folder of the same name (named 'mit-bih-long-term-ecg-database-1.0.0') to the same folder as this script.
|
| 8 |
+
4. Run this script.
|
| 9 |
+
|
| 10 |
+
Credits:
|
| 11 |
+
https://github.com/berndporr/py-ecg-detectors/blob/master/tester_MITDB.py by Bernd Porr
|
| 12 |
+
"""
|
| 13 |
+
import os
|
| 14 |
+
|
| 15 |
+
import numpy as np
|
| 16 |
+
import pandas as pd
|
| 17 |
+
import wfdb
|
| 18 |
+
|
| 19 |
+
data_files = ["mit-bih-long-term-ecg-database-1.0.0/" + file for file in os.listdir("mit-bih-long-term-ecg-database-1.0.0") if ".dat" in file]
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
dfs_ecg = []
|
| 24 |
+
dfs_rpeaks = []
|
| 25 |
+
|
| 26 |
+
for participant, file in enumerate(data_files):
|
| 27 |
+
|
| 28 |
+
print("Participant: " + str(participant + 1) + "/" + str(len(data_files)))
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
# Get signal
|
| 32 |
+
data = pd.DataFrame({"ECG": wfdb.rdsamp(file[:-4])[0][:, 1]})
|
| 33 |
+
data["Participant"] = "MIT-LongTerm_%.2i" %(participant)
|
| 34 |
+
data["Sample"] = range(len(data))
|
| 35 |
+
data["Sampling_Rate"] = 128
|
| 36 |
+
data["Database"] = "MIT-LongTerm"
|
| 37 |
+
|
| 38 |
+
# getting annotations
|
| 39 |
+
anno = wfdb.rdann(file[:-4], 'atr')
|
| 40 |
+
anno = anno.sample[np.where(np.array(anno.symbol) == "N")[0]]
|
| 41 |
+
anno = pd.DataFrame({"Rpeaks": anno})
|
| 42 |
+
anno["Participant"] = "MIT-LongTerm_%.2i" %(participant)
|
| 43 |
+
anno["Sampling_Rate"] = 128
|
| 44 |
+
anno["Database"] = "MIT-LongTerm"
|
| 45 |
+
|
| 46 |
+
# Select only 2h of recording (otherwise it's too big)
|
| 47 |
+
data = data[460800:460800*3].reset_index(drop=True)
|
| 48 |
+
anno = anno[(anno["Rpeaks"] > 460800) & (anno["Rpeaks"] <= 460800*3)].reset_index(drop=True)
|
| 49 |
+
anno["Rpeaks"] = anno["Rpeaks"] - 460800
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
# Store with the rest
|
| 53 |
+
dfs_ecg.append(data)
|
| 54 |
+
dfs_rpeaks.append(anno)
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
# Save
|
| 59 |
+
df_ecg = pd.concat(dfs_ecg).to_csv("ECGs.csv", index=False)
|
| 60 |
+
dfs_rpeaks = pd.concat(dfs_rpeaks).to_csv("Rpeaks.csv", index=False)
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
# Quick test
|
| 64 |
+
#import neurokit2 as nk
|
| 65 |
+
#nk.events_plot(anno["Rpeaks"][anno["Rpeaks"] <= 1000], data["ECG"][0:1001])
|
NeuroKit/source/data/mit_long-term/mit-bih-long-term-ecg-database-1.0.0/14046.atr
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:195e59e805e3ea6fe9e545f230274be947bf22f3cc9d5d6b3748260e0d05beb1
|
| 3 |
+
size 230570
|