py-neuromodulation 0.0.7__tar.gz → 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/.github/workflows/docs_pages.yml +2 -2
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/.gitignore +17 -3
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/PKG-INFO +18 -4
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/README.rst +2 -0
- py_neuromodulation-0.1.0/docs/source/RMAP.rst +8 -0
- py_neuromodulation-0.1.0/docs/source/_static/Screenshot 2025-03-05 at 13.30.42.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/Screenshot 2025-03-05 at 13.35.25.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/channelselection.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/decoding.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/fileselection.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/graphs.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/lslselection.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/pydantic.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/settings.png +0 -0
- py_neuromodulation-0.1.0/docs/source/_static/sourceselection.png +0 -0
- py_neuromodulation-0.1.0/docs/source/api_documentation.rst +84 -0
- py_neuromodulation-0.1.0/docs/source/artifacts.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/bandpower.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/bispectra.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/bursts.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/channels.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/coherence.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/contributing.rst +87 -0
- py_neuromodulation-0.1.0/docs/source/database.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/decode.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/feature_reader.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/fooof.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/generator.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/gui.rst +112 -0
- py_neuromodulation-0.1.0/docs/source/hjorth.rst +5 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/index.rst +1 -0
- py_neuromodulation-0.1.0/docs/source/io.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/linelength.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/logging.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/mne_connectivity.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/mne_filter.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/mnelsl_player.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/mnelsl_stream.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/nolds.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/normalization.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/notch_filter.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/oscillatory.rst +11 -0
- py_neuromodulation-0.1.0/docs/source/plots.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/projection.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/rereference.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/resample.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/settings.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/sharpwaves.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/stats.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/stream.rst +5 -0
- py_neuromodulation-0.1.0/docs/source/types.rst +5 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/usage.rst +1 -1
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/plot_2_example_add_feature.py +11 -13
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/plot_4_example_gridPointProjection.py +1 -1
- py_neuromodulation-0.1.0/examples/plot_7_lsl_example.py +129 -0
- py_neuromodulation-0.1.0/gui_dev/.eslintrc.cjs +21 -0
- py_neuromodulation-0.1.0/gui_dev/.gitattributes +3 -0
- py_neuromodulation-0.1.0/gui_dev/.gitignore +21 -0
- py_neuromodulation-0.1.0/gui_dev/bun.lock +1904 -0
- py_neuromodulation-0.1.0/gui_dev/eslint.config.js +51 -0
- py_neuromodulation-0.1.0/gui_dev/index.html +13 -0
- py_neuromodulation-0.1.0/gui_dev/jsconfig.json +13 -0
- py_neuromodulation-0.1.0/gui_dev/package.json +49 -0
- py_neuromodulation-0.1.0/gui_dev/public/charite.svg +16 -0
- py_neuromodulation-0.1.0/gui_dev/scripts/wdyr.js +35 -0
- py_neuromodulation-0.1.0/gui_dev/src/App.jsx +88 -0
- py_neuromodulation-0.1.0/gui_dev/src/assets/fonts/figtree/Figtree-Italic-VariableFont_wght.ttf +0 -0
- py_neuromodulation-0.1.0/gui_dev/src/assets/fonts/figtree/Figtree-VariableFont_wght.ttf +0 -0
- py_neuromodulation-0.1.0/gui_dev/src/assets/fonts/figtree/OFL.txt +93 -0
- py_neuromodulation-0.1.0/gui_dev/src/assets/fonts/figtree/README.txt +77 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/AppBar/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/AppBar.jsx +65 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/AppInfoModal.jsx +90 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/BandPowerGraph.jsx +199 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/CollapsibleBox.jsx +80 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/DecodingGraph.jsx +340 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Drawer/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/FileBrowser/FileBrowser.jsx +460 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/FileBrowser/QuickAccess.jsx +104 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Graph/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/HeatmapGraph.jsx +311 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/PSDGraph.jsx +235 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/RawDataGraph.jsx +324 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Settings/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Sidebar/Sidebar.jsx +137 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Sidebar/Sidebar.module.css +116 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Sidebar/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/ResizeHandle.jsx +99 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/ResizeHandle.module.css +25 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/SocketStatus.jsx +64 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/StatusBar.jsx +34 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/StatusBar.module.css +41 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/WebviewStatus.jsx +7 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/StatusBar/resize_handle.svg +4 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/Switch/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/TitledBox.jsx +35 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/WindowButtons.jsx +46 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/index.js +11 -0
- py_neuromodulation-0.1.0/gui_dev/src/components/utils.jsx +60 -0
- py_neuromodulation-0.1.0/gui_dev/src/main.jsx +20 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/Channels/Channels.jsx +244 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/Dashboard.jsx +103 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/Settings/Settings.jsx +393 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/Settings/components/FrequencyRange.jsx +165 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/Settings/components/OrderableLiteralListField.jsx +129 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/Settings/components/PrimitiveComponents.jsx +73 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/SourceSelection/DecodingModel.jsx +48 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/SourceSelection/FileSelector.jsx +125 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/SourceSelection/SourceSelection.jsx +61 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/SourceSelection/StreamParameters.jsx +74 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/SourceSelection/StreamSelector.jsx +191 -0
- py_neuromodulation-0.1.0/gui_dev/src/pages/index.js +4 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/appInfoStore.js +25 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/createStore.js +26 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/dragAndDropStore.js +18 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/index.js +7 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/sessionStore.js +359 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/settingsStore.js +128 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/socketStore.js +149 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/uiStore.js +53 -0
- py_neuromodulation-0.1.0/gui_dev/src/stores/webviewStore.js +51 -0
- py_neuromodulation-0.1.0/gui_dev/src/styles/reset.css +86 -0
- py_neuromodulation-0.1.0/gui_dev/src/theme.js +94 -0
- py_neuromodulation-0.1.0/gui_dev/src/utils/DataBuffer.js +63 -0
- py_neuromodulation-0.1.0/gui_dev/src/utils/FileInfo.js +137 -0
- py_neuromodulation-0.1.0/gui_dev/src/utils/FileManager.js +85 -0
- py_neuromodulation-0.1.0/gui_dev/src/utils/debounced_sync.js +49 -0
- py_neuromodulation-0.1.0/gui_dev/src/utils/index.js +1 -0
- py_neuromodulation-0.1.0/gui_dev/src/utils/utils.js +78 -0
- py_neuromodulation-0.1.0/gui_dev/vite.config.js +52 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +0 -1
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +0 -2
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/__init__.py +12 -4
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/analysis/RMAP.py +3 -3
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/analysis/decode.py +55 -2
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/analysis/feature_reader.py +1 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/analysis/stats.py +3 -3
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/default_settings.yaml +24 -17
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/bandpower.py +65 -23
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/bursts.py +9 -8
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/coherence.py +7 -4
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/feature_processor.py +4 -4
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/fooof.py +7 -6
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/mne_connectivity.py +25 -3
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/oscillatory.py +5 -4
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/sharpwaves.py +21 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/filter/kalman_filter.py +17 -6
- py_neuromodulation-0.1.0/py_neuromodulation/gui/__init__.py +3 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/backend/app_backend.py +419 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/backend/app_manager.py +345 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/backend/app_pynm.py +244 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/backend/app_socket.py +95 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/backend/app_utils.py +306 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/backend/app_window.py +202 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/assets/Figtree-VariableFont_wght-CkXbWBDP.ttf +0 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/assets/index-NbJiOU5a.js +300133 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/assets/plotly-DTCwMlpS.js +23594 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/charite.svg +16 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/index.html +14 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/window_api.py +115 -0
- py_neuromodulation-0.1.0/py_neuromodulation/lsl_api.cfg +3 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/data_preprocessor.py +9 -2
- py_neuromodulation-0.1.0/py_neuromodulation/processing/filter_preprocessing.py +94 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/normalization.py +32 -17
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/projection.py +2 -2
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/resample.py +6 -2
- py_neuromodulation-0.1.0/py_neuromodulation/run_gui.py +36 -0
- py_neuromodulation-0.1.0/py_neuromodulation/stream/__init__.py +9 -0
- py_neuromodulation-0.1.0/py_neuromodulation/stream/backend_interface.py +47 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/stream/data_processor.py +24 -3
- py_neuromodulation-0.1.0/py_neuromodulation/stream/mnelsl_player.py +194 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/stream/mnelsl_stream.py +9 -17
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/stream/settings.py +80 -34
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/stream/stream.py +82 -62
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/utils/channels.py +1 -1
- py_neuromodulation-0.1.0/py_neuromodulation/utils/file_writer.py +110 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/utils/io.py +46 -5
- py_neuromodulation-0.1.0/py_neuromodulation/utils/perf.py +156 -0
- py_neuromodulation-0.1.0/py_neuromodulation/utils/pydantic_extensions.py +322 -0
- py_neuromodulation-0.1.0/py_neuromodulation/utils/types.py +177 -0
- py_neuromodulation-0.1.0/py_neuromodulation.code-workspace +40 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/pyproject.toml +42 -8
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/conftest.py +5 -1
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_bursts.py +4 -4
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_coherence.py +14 -18
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_lsl_stream.py +26 -11
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_osc_features.py +2 -2
- py_neuromodulation-0.0.7/docs/source/api_documentation.rst +0 -51
- py_neuromodulation-0.0.7/docs/source/contributing.rst +0 -36
- py_neuromodulation-0.0.7/docs/source/nm_IO.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_RMAP.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_analysis.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_bursts.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_coherence.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_decode.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_define_nmchannels.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_features.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_filter.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_fooof.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_generator.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_hjorth.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_kalmanfilter.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_linelength.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_mne_connectivity.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_nolds.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_normalization.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_oscillatory.rst +0 -11
- py_neuromodulation-0.0.7/docs/source/nm_plots.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_projection.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_rereference.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_resample.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_run_analysis.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_settings.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_sharpwaves.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_stats.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_stream.rst +0 -5
- py_neuromodulation-0.0.7/docs/source/nm_stream_abc.rst +0 -5
- py_neuromodulation-0.0.7/examples/plot_7_lsl_example.py +0 -124
- py_neuromodulation-0.0.7/py_neuromodulation/processing/filter_preprocessing.py +0 -78
- py_neuromodulation-0.0.7/py_neuromodulation/stream/__init__.py +0 -3
- py_neuromodulation-0.0.7/py_neuromodulation/stream/mnelsl_player.py +0 -94
- py_neuromodulation-0.0.7/py_neuromodulation/utils/types.py +0 -251
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/.github/workflows/python-publish.yml +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/.github/workflows/tests.yml +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/LICENSE +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/Makefile +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/make.bat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/_static/CEBRA_embedding.png +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/_static/RMAP_figure.png +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/_static/css/RMAP_figure.png +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/_static/css/project-template.css +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/_templates/custom-class-template.rst +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/_templates/custom-module-template.rst +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/conf.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/docs/source/installation.rst +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/README.rst +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/example_cebra_decoding.html +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/example_cebra_decoding.ipynb +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/example_rmap.ipynb +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/plot_3_example_sharpwave_analysis.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/plot_5_example_rmap_computing.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/plot_6_real_time_demo.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/examples/plot_8_cebra_example.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/analysis/__init__.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/analysis/plots.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/README +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/dataset_description.json +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/participants.json +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/participants.tsv +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/__init__.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/bispectra.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/hjorth_raw.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/linelength.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/features/nolds.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/filter/__init__.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/filter/kalman_filter_external.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/filter/mne_filter.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/filter/notch_filter.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/grid_cortex.tsv +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/grid_subcortex.tsv +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/libpugixml.so.1.12 +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/plots/STN_surf.mat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/plots/Vertices.mat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/plots/faces.mat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/plots/grid.mat +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/__init__.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/artifacts.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/processing/rereference.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/stream/generator.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/utils/__init__.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/utils/database.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/utils/keyboard.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/py_neuromodulation/utils/logging.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/__init__.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_all_examples.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_all_features.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_bispectra.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_database.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_feature_sampling_rates.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_fooof.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_initalization_offline_stream.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_nan_values.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_nm_filter.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_nm_resample.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_normalization_settings.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_notch_filter.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_preprocessing_filter.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_rereference.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_sampling.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_settings_change_after_init.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_sharpwave.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_target_channel_add.py +0 -0
- {py_neuromodulation-0.0.7 → py_neuromodulation-0.1.0}/tests/test_timing.py +0 -0
|
@@ -24,13 +24,13 @@ jobs:
|
|
|
24
24
|
- name: Set up Python with uv
|
|
25
25
|
uses: drivendataorg/setup-python-uv-action@v1
|
|
26
26
|
with:
|
|
27
|
-
python-version: '3.
|
|
27
|
+
python-version: '3.11'
|
|
28
28
|
cache: packages
|
|
29
29
|
cache-dependency-path: pyproject.toml
|
|
30
30
|
|
|
31
31
|
- name: Install dependencies
|
|
32
32
|
run: |
|
|
33
|
-
|
|
33
|
+
pip install .[docs]
|
|
34
34
|
|
|
35
35
|
- name: make the sphinx docs
|
|
36
36
|
run: |
|
|
@@ -191,9 +191,23 @@ out_per
|
|
|
191
191
|
# Profiler files
|
|
192
192
|
/*.prof
|
|
193
193
|
/profiling/*
|
|
194
|
-
|
|
194
|
+
# Test output
|
|
195
|
+
test_data/
|
|
196
|
+
# various lock files
|
|
197
|
+
package-lock.json
|
|
198
|
+
package-lock.json.bak
|
|
199
|
+
uv.lock
|
|
200
|
+
# temporarily ignore the frontend build
|
|
201
|
+
/gui_dev/dist
|
|
202
|
+
/gui/frontend
|
|
203
|
+
# Node modules
|
|
195
204
|
gui_dev/node_modules/*
|
|
205
|
+
# LSL log file
|
|
206
|
+
lsllog.txt
|
|
207
|
+
#Old Bun binary lockfile
|
|
208
|
+
bun.lockb
|
|
196
209
|
test/data/*
|
|
197
|
-
|
|
198
210
|
uv.lock
|
|
199
|
-
|
|
211
|
+
|
|
212
|
+
sub_SETTINGS.yaml
|
|
213
|
+
sub_SIDECAR.json
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: py_neuromodulation
|
|
3
|
-
Version: 0.0
|
|
3
|
+
Version: 0.1.0
|
|
4
4
|
Summary: Real-time analysis of intracranial neurophysiology recordings.
|
|
5
|
-
Project-URL:
|
|
6
|
-
Project-URL:
|
|
5
|
+
Project-URL: Homepage, https://neuromodulation.github.io/py_neuromodulation/
|
|
6
|
+
Project-URL: Documentation, https://neuromodulation.github.io/py_neuromodulation/
|
|
7
|
+
Project-URL: Repository, https://github.com/neuromodulation/py_neuromodulation
|
|
8
|
+
Project-URL: Issues, https://github.com/neuromodulation/py_neuromodulation/issues
|
|
7
9
|
Author-email: Timon Merk <timon.merk@charite.de>
|
|
8
10
|
Maintainer: Timon Merk
|
|
9
11
|
License: MIT License
|
|
@@ -34,7 +36,10 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
34
36
|
Classifier: Programming Language :: Python
|
|
35
37
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
36
38
|
Requires-Python: >=3.11
|
|
39
|
+
Requires-Dist: cbor2>=5.6.4
|
|
40
|
+
Requires-Dist: fastapi
|
|
37
41
|
Requires-Dist: fooof
|
|
42
|
+
Requires-Dist: imbalanced-learn
|
|
38
43
|
Requires-Dist: joblib>=1.3.2
|
|
39
44
|
Requires-Dist: llvmlite>=0.43.0
|
|
40
45
|
Requires-Dist: matplotlib>=3.9.0
|
|
@@ -43,18 +48,25 @@ Requires-Dist: mne-bids>=0.8
|
|
|
43
48
|
Requires-Dist: mne-connectivity
|
|
44
49
|
Requires-Dist: mne-lsl>=1.2.0
|
|
45
50
|
Requires-Dist: mrmr-selection
|
|
51
|
+
Requires-Dist: msgpack>=1.1.0
|
|
52
|
+
Requires-Dist: nibabel>=5.3.2
|
|
46
53
|
Requires-Dist: nolds>=0.6.1
|
|
47
54
|
Requires-Dist: numba>=0.60.0
|
|
48
55
|
Requires-Dist: numpy>=1.21.2
|
|
56
|
+
Requires-Dist: numpy>=2.0.0
|
|
49
57
|
Requires-Dist: pandas>=2.0.0
|
|
50
58
|
Requires-Dist: pyarrow>=14.0.2
|
|
51
59
|
Requires-Dist: pybispectra>=1.2.0
|
|
52
60
|
Requires-Dist: pydantic>=2.7.3
|
|
53
61
|
Requires-Dist: pyparrm
|
|
62
|
+
Requires-Dist: pywebview
|
|
54
63
|
Requires-Dist: scikit-learn>=0.24.2
|
|
55
64
|
Requires-Dist: scikit-optimize
|
|
56
65
|
Requires-Dist: scipy>=1.7.1
|
|
57
66
|
Requires-Dist: seaborn>=0.11
|
|
67
|
+
Requires-Dist: skops>=0.10.0
|
|
68
|
+
Requires-Dist: uvicorn[standard]>=0.30.6
|
|
69
|
+
Requires-Dist: uvloop; platform_system != 'Windows'
|
|
58
70
|
Provides-Extra: dev
|
|
59
71
|
Requires-Dist: notebook; extra == 'dev'
|
|
60
72
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
@@ -81,6 +93,8 @@ Description-Content-Type: text/x-rst
|
|
|
81
93
|
py_neuromodulation
|
|
82
94
|
==================
|
|
83
95
|
|
|
96
|
+
Documentation: https://neuromodulation.github.io/py_neuromodulation/
|
|
97
|
+
|
|
84
98
|
Analyzing neural data can be a troublesome, trial and error prone,
|
|
85
99
|
and beginner unfriendly process. *py_neuromodulation* allows using a simple
|
|
86
100
|
interface for extraction of established neurophysiological features and includes commonly applied pre -and postprocessing methods.
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
py_neuromodulation
|
|
2
2
|
==================
|
|
3
3
|
|
|
4
|
+
Documentation: https://neuromodulation.github.io/py_neuromodulation/
|
|
5
|
+
|
|
4
6
|
Analyzing neural data can be a troublesome, trial and error prone,
|
|
5
7
|
and beginner unfriendly process. *py_neuromodulation* allows using a simple
|
|
6
8
|
interface for extraction of established neurophysiological features and includes commonly applied pre -and postprocessing methods.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
API Documentation
|
|
2
|
+
=================
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
Analysis
|
|
6
|
+
--------
|
|
7
|
+
|
|
8
|
+
.. toctree::
|
|
9
|
+
:maxdepth: 4
|
|
10
|
+
|
|
11
|
+
decode
|
|
12
|
+
feature_reader
|
|
13
|
+
plots
|
|
14
|
+
RMAP
|
|
15
|
+
stats
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
Feature Classes
|
|
19
|
+
---------------
|
|
20
|
+
|
|
21
|
+
.. toctree::
|
|
22
|
+
:maxdepth: 4
|
|
23
|
+
|
|
24
|
+
bispectra
|
|
25
|
+
bursts
|
|
26
|
+
coherence
|
|
27
|
+
fooof
|
|
28
|
+
hjorth
|
|
29
|
+
linelength
|
|
30
|
+
mne_connectivity
|
|
31
|
+
nolds
|
|
32
|
+
oscillatory
|
|
33
|
+
sharpwaves
|
|
34
|
+
bandpower
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
Filter
|
|
38
|
+
------
|
|
39
|
+
|
|
40
|
+
.. toctree::
|
|
41
|
+
:maxdepth: 4
|
|
42
|
+
|
|
43
|
+
mne_filter
|
|
44
|
+
notch_filter
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
Processing
|
|
48
|
+
----------
|
|
49
|
+
|
|
50
|
+
.. toctree::
|
|
51
|
+
:maxdepth: 4
|
|
52
|
+
|
|
53
|
+
artifacts
|
|
54
|
+
normalization
|
|
55
|
+
projection
|
|
56
|
+
rereference
|
|
57
|
+
resample
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
stream
|
|
61
|
+
------
|
|
62
|
+
|
|
63
|
+
.. toctree::
|
|
64
|
+
:maxdepth: 4
|
|
65
|
+
|
|
66
|
+
generator
|
|
67
|
+
mnelsl_player
|
|
68
|
+
mnelsl_stream
|
|
69
|
+
settings
|
|
70
|
+
stream
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
utils
|
|
74
|
+
-----
|
|
75
|
+
|
|
76
|
+
.. toctree::
|
|
77
|
+
:maxdepth: 4
|
|
78
|
+
|
|
79
|
+
channels
|
|
80
|
+
database
|
|
81
|
+
io
|
|
82
|
+
logging
|
|
83
|
+
types
|
|
84
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
Contribution Guide
|
|
2
|
+
==================
|
|
3
|
+
|
|
4
|
+
Welcome to the contributing guide of py_neuromodulation! We are very happy that you are interested in our project.
|
|
5
|
+
|
|
6
|
+
In general we recommend placing questions and issues in the `GitHub issue tracker <https://github.com/neuromodulation/py_neuromodulation/issues>`_.
|
|
7
|
+
|
|
8
|
+
For code formatting we use `ruff <https://docs.astral.sh/ruff/formatter/>`_.
|
|
9
|
+
|
|
10
|
+
For code development, we recommend using the package manager `uv <https://docs.astral.sh/uv/getting-started/installation/>`_.
|
|
11
|
+
|
|
12
|
+
To setup the python environment, type
|
|
13
|
+
|
|
14
|
+
::
|
|
15
|
+
|
|
16
|
+
uv python install 3.11
|
|
17
|
+
uv venv
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
Depending on your operating system, activate the rye virtual environment:
|
|
21
|
+
|
|
22
|
+
::
|
|
23
|
+
|
|
24
|
+
. .venv/bin/activate
|
|
25
|
+
|
|
26
|
+
And install the pyproject.toml dependencies:
|
|
27
|
+
|
|
28
|
+
::
|
|
29
|
+
|
|
30
|
+
then sync the environment with
|
|
31
|
+
|
|
32
|
+
::
|
|
33
|
+
|
|
34
|
+
uv sync
|
|
35
|
+
|
|
36
|
+
To install the documentation dependencies use pip:
|
|
37
|
+
|
|
38
|
+
::
|
|
39
|
+
|
|
40
|
+
uv pip install -e .[docs]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
GUI development
|
|
44
|
+
---------------
|
|
45
|
+
|
|
46
|
+
Backend
|
|
47
|
+
~~~~~~~
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
The GUI is setup as a react application with a `FastAPI <https://fastapi.tiangolo.com/>`_ backend with a `uvicorn <https://www.uvicorn.org/>`_ server.
|
|
51
|
+
The ``gui/backend/app_manager.py`` is the main entry point for the GUI backend. Here multiple tasks are defined and started using python `multiprocessing`.
|
|
52
|
+
In debug mode, `vite <https://vite.dev/>`_ is within ``gui/backend/app_manager.run_vite`` used to serve the frontend. In a subprocess ``bun run dev`` is called.
|
|
53
|
+
In production mode ``gui/backend/app_manager.run_backend`` directly serves the frontend from the `gui/frontend` directory, if `debug=False`.
|
|
54
|
+
Uvicorn (``gui/backend/app_manager.run_uvicorn``) runs an ASGI server, which deploys the FastAPI backend (``gui/backend/app_backend.PyNMBackend``).
|
|
55
|
+
Within the backend, multiple `get` and `post` routes are setup to interact with the frontend.
|
|
56
|
+
|
|
57
|
+
.. raw:: html
|
|
58
|
+
|
|
59
|
+
<br>
|
|
60
|
+
|
|
61
|
+
A *py_neuromodulation* state object is defined within the ``gui/backend/app_pynm.PyNMState`` class.
|
|
62
|
+
The state is initialized at the beginning of each App launch, and the settings and channels of the `nm.stream` are then modified during runtime.
|
|
63
|
+
Importantly, a ``stream.backend_interface`` is defined which creates an `asyncio` loop to interact with the `nm.stream` object.
|
|
64
|
+
Python `multiprocessing.Queue` objects are used for frontend communication, for starting or stopping the stream, or sending data to the frontend through websockets.
|
|
65
|
+
Within the ``gui/backend/app_socket.WebSocketManger``, the computed features and raw values are first serialized through `CBOR <https://cbor2.readthedocs.io/en/latest/usage.html>`_ and then sent to the frontend.
|
|
66
|
+
|
|
67
|
+
Frontend
|
|
68
|
+
~~~~~~~~
|
|
69
|
+
|
|
70
|
+
The frontend is a `react <https://react.dev/>`_ application, which is stored in the `gui_dev` directory.
|
|
71
|
+
There are session, settings and socket `zustand <https://zustand-demo.pmnd.rs/>`_ stores.
|
|
72
|
+
Additionally, different pages and components are defined. `Plotly <https://plotly.com/javascript/>`_ is used for real-time dashboard visualization.
|
|
73
|
+
|
|
74
|
+
For GUI build, `bun <https://bun.sh/package-manager>`_ can be used to build the package. It is then saved into the `gui/frontend` directory.
|
|
75
|
+
|
|
76
|
+
Building the GUI in *gui_dev* folder:
|
|
77
|
+
|
|
78
|
+
::
|
|
79
|
+
|
|
80
|
+
bun run build
|
|
81
|
+
|
|
82
|
+
Additionally, the script ``run_gui.py`` can be modified to be in `dev` mode:
|
|
83
|
+
|
|
84
|
+
::
|
|
85
|
+
|
|
86
|
+
App(dev=True).launch()
|
|
87
|
+
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
GUI
|
|
2
|
+
===
|
|
3
|
+
|
|
4
|
+
In this section we will explain the setup and use of the *py_neuromodulation* GUI.
|
|
5
|
+
First, the GUI dependencies can be installed with `uv`:
|
|
6
|
+
|
|
7
|
+
.. code-block:: bash
|
|
8
|
+
|
|
9
|
+
uv pip install -e .[gui]
|
|
10
|
+
|
|
11
|
+
The GUI can be started by running the following command:
|
|
12
|
+
|
|
13
|
+
.. code-block:: bash
|
|
14
|
+
|
|
15
|
+
run_gui
|
|
16
|
+
|
|
17
|
+
The ``run_gui`` command also starts a LabStreamingLayer stream from the `py_neuromodulation/data/` example directory.
|
|
18
|
+
The GUI is a react application, that can then be accessed via the browser at the following address:
|
|
19
|
+
|
|
20
|
+
.. code-block:: bash
|
|
21
|
+
|
|
22
|
+
http://localhost:50001
|
|
23
|
+
|
|
24
|
+
The GUI is divided into three main sections:
|
|
25
|
+
* **Source selection**: Data input which could be:
|
|
26
|
+
* offline stored file, e.g. in `mne.io.read_raw <https://mne.tools/1.8/generated/mne.io.read_raw.html>`_ format or a simply `.txt` or `.npy` file
|
|
27
|
+
* a `LabStreamingLayer <https://labstreaminglayer.org/#/>`_ stream
|
|
28
|
+
* **channel selection**: Definition of re-referencing, usage, target selection for the list of available channels
|
|
29
|
+
* **Feature selection**: Choosing the features for computation with the corresponding parameters
|
|
30
|
+
|
|
31
|
+
The source selection is shown in the following image:
|
|
32
|
+
|
|
33
|
+
.. image:: ../_static/sourceselection.png
|
|
34
|
+
:alt: GUI
|
|
35
|
+
:align: center
|
|
36
|
+
|
|
37
|
+
When clicking on the `SELECT FILE` button, a file dialog will open, where the user can select the file to be loaded:
|
|
38
|
+
|
|
39
|
+
.. image:: ../_static/fileselection.png
|
|
40
|
+
:alt: GUI
|
|
41
|
+
:align: center
|
|
42
|
+
|
|
43
|
+
Internally, available meta data such as sampling rate, line noise, available channel names will be read and a stream initialized.
|
|
44
|
+
Alternatively, the user can select a LabStreamingLayer stream by clicking on the upper `LSL STREAM` button. The available streams will be shown in a menu:
|
|
45
|
+
|
|
46
|
+
.. image:: ../_static/lslselection.png
|
|
47
|
+
:alt: GUI
|
|
48
|
+
:align: center
|
|
49
|
+
|
|
50
|
+
Clicking on the row of the desired stream will initialize then a stream with the read sampling rate, channel names and default settings.
|
|
51
|
+
A `.skops` decoding model, such as an openly-published `movement decoding model <https://zenodo.org/records/10794370>`_ can be loaded by clicking on the `LOAD MODEL` button.
|
|
52
|
+
|
|
53
|
+
Next, by selecting `SELECT CHANNELS`, the user is directed to the channel selection section:
|
|
54
|
+
|
|
55
|
+
.. image:: ../_static/channelselection.png
|
|
56
|
+
:alt: GUI
|
|
57
|
+
:align: center
|
|
58
|
+
|
|
59
|
+
Here the channel names, re-referencing, `mne supported types <https://mne.tools/stable/generated/mne.pick_types.html>`_ and target selection can be defined.
|
|
60
|
+
Next, by clicking on `SETTINGS`, the user is directed to the feature selection:
|
|
61
|
+
|
|
62
|
+
.. image:: ../_static/settings.png
|
|
63
|
+
:alt: GUI
|
|
64
|
+
:align: center
|
|
65
|
+
|
|
66
|
+
Here, many pre-processing, feature estimation and post-processing settings can be defined.
|
|
67
|
+
The main settings
|
|
68
|
+
|
|
69
|
+
* `sampling rate features [Hz]`
|
|
70
|
+
* `segment length features [ms]`
|
|
71
|
+
|
|
72
|
+
are defined the upper left section.
|
|
73
|
+
Additionally, frequency bands can be modified, added or deleted.
|
|
74
|
+
Once the settings are modified, they are internally validated for potential errors which would then be displayed:
|
|
75
|
+
|
|
76
|
+
.. image:: ../_static/pydantic.png
|
|
77
|
+
:alt: GUI
|
|
78
|
+
:align: center
|
|
79
|
+
|
|
80
|
+
Once the settings are correct, the user can click `SAVE & RUN STREAM` to jump to the stream control and feature visualization panel.
|
|
81
|
+
Here, different graphs can be selected by clicking on the corresponding graph list:
|
|
82
|
+
|
|
83
|
+
* `Raw data`
|
|
84
|
+
* `PSD plot`
|
|
85
|
+
* `Heatmap`
|
|
86
|
+
* `Band power graph`
|
|
87
|
+
* `Decoding graph`
|
|
88
|
+
|
|
89
|
+
When clicking on `RUN STREAM`, the stream will start and the selected features will be computed in real-time.
|
|
90
|
+
In the terminal the feature computation is logged, and features and raw signals are displayed in the GUI:
|
|
91
|
+
|
|
92
|
+
.. image:: ../_static/graphs.png
|
|
93
|
+
:alt: GUI
|
|
94
|
+
:align: center
|
|
95
|
+
|
|
96
|
+
Additionally, a heatmap with selected features can be displayed with the decoded model output:
|
|
97
|
+
|
|
98
|
+
.. image:: ../_static/decoding.png
|
|
99
|
+
:alt: GUI
|
|
100
|
+
:align: center
|
|
101
|
+
|
|
102
|
+
.. raw:: html
|
|
103
|
+
|
|
104
|
+
<br>
|
|
105
|
+
|
|
106
|
+
In the :doc:`contributing </contributing>` section we explain in further detail the GUI setup.
|
|
107
|
+
|
|
108
|
+
Known issues
|
|
109
|
+
~~~~~~~~~~~~
|
|
110
|
+
|
|
111
|
+
Currently the GUI dashboard for live feature visualization is not fully functional with too many selected channels and PSD features.
|
|
112
|
+
The websocket connection will then be broken off and no further features will be visualized, but the backend *nm.stream* will still be running, and raw data continued to be processed and saved.
|