py-neuromodulation 0.1.0__tar.gz → 0.1.2__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.1.2/.gitattributes +1 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/.github/workflows/python-publish.yml +4 -2
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/PKG-INFO +6 -1
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/README.rst +5 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/contributing.rst +5 -6
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/gui.rst +11 -15
- py_neuromodulation-0.1.2/docs/source/installation.rst +58 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Settings/Settings.jsx +15 -14
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/SourceSelection/StreamSelector.jsx +1 -1
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/sessionStore.js +2 -2
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/default_settings.yaml +16 -18
- py_neuromodulation-0.1.2/py_neuromodulation/features/mne_connectivity.py +121 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_pynm.py +16 -7
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_socket.py +2 -0
- py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/assets/index-NbJiOU5a.js → py_neuromodulation-0.1.2/py_neuromodulation/gui/frontend/assets/index-_6V8ZfAS.js +258 -254
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/frontend/index.html +1 -1
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/run_gui.py +1 -1
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/backend_interface.py +7 -7
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/mnelsl_stream.py +1 -1
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/stream.py +1 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/pyproject.toml +2 -2
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_coherence.py +1 -2
- py_neuromodulation-0.1.2/tests/test_mne_connectivity.py +143 -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/installation.rst +0 -46
- py_neuromodulation-0.1.0/py_neuromodulation/features/mne_connectivity.py +0 -170
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/.github/workflows/docs_pages.yml +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/.github/workflows/tests.yml +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/.gitignore +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/LICENSE +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/Makefile +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/make.bat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/RMAP.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/CEBRA_embedding.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/RMAP_figure.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/channelselection.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/css/RMAP_figure.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/css/project-template.css +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/decoding.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/fileselection.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/graphs.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/lslselection.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/pydantic.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/settings.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_static/sourceselection.png +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_templates/custom-class-template.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/_templates/custom-module-template.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/api_documentation.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/artifacts.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/bandpower.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/bispectra.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/bursts.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/channels.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/coherence.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/conf.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/database.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/decode.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/feature_reader.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/fooof.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/generator.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/hjorth.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/index.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/io.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/linelength.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/logging.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/mne_connectivity.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/mne_filter.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/mnelsl_player.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/mnelsl_stream.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/nolds.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/normalization.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/notch_filter.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/oscillatory.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/plots.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/projection.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/rereference.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/resample.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/settings.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/sharpwaves.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/stats.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/stream.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/types.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/docs/source/usage.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/README.rst +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/example_cebra_decoding.html +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/example_cebra_decoding.ipynb +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/example_rmap.ipynb +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_2_example_add_feature.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_3_example_sharpwave_analysis.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_4_example_gridPointProjection.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_5_example_rmap_computing.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_6_real_time_demo.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_7_lsl_example.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/examples/plot_8_cebra_example.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/.eslintrc.cjs +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/.gitattributes +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/.gitignore +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/bun.lock +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/eslint.config.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/index.html +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/jsconfig.json +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/package.json +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/public/charite.svg +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/scripts/wdyr.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/App.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/assets/fonts/figtree/Figtree-Italic-VariableFont_wght.ttf +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/assets/fonts/figtree/Figtree-VariableFont_wght.ttf +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/assets/fonts/figtree/OFL.txt +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/assets/fonts/figtree/README.txt +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/AppBar/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/AppBar.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/AppInfoModal.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/BandPowerGraph.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/CollapsibleBox.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/DecodingGraph.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Drawer/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/FileBrowser/FileBrowser.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/FileBrowser/QuickAccess.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Graph/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/HeatmapGraph.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/PSDGraph.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/RawDataGraph.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Settings/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Sidebar/Sidebar.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Sidebar/Sidebar.module.css +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Sidebar/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/ResizeHandle.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/ResizeHandle.module.css +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/SocketStatus.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/StatusBar.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/StatusBar.module.css +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/WebviewStatus.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/StatusBar/resize_handle.svg +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/Switch/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/TitledBox.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/WindowButtons.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/components/utils.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/main.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Channels/Channels.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Dashboard.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Settings/components/FrequencyRange.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Settings/components/OrderableLiteralListField.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Settings/components/PrimitiveComponents.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/SourceSelection/DecodingModel.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/SourceSelection/FileSelector.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/SourceSelection/SourceSelection.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/SourceSelection/StreamParameters.jsx +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/appInfoStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/createStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/dragAndDropStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/settingsStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/socketStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/uiStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/stores/webviewStore.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/styles/reset.css +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/theme.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/utils/DataBuffer.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/utils/FileInfo.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/utils/FileManager.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/utils/debounced_sync.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/utils/index.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/utils/utils.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/vite.config.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/analysis/RMAP.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/analysis/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/analysis/decode.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/analysis/feature_reader.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/analysis/plots.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/analysis/stats.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/README +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/dataset_description.json +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/participants.json +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/participants.tsv +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/bandpower.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/bispectra.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/bursts.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/coherence.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/feature_processor.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/fooof.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/hjorth_raw.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/linelength.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/nolds.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/oscillatory.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/features/sharpwaves.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/filter/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/filter/kalman_filter.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/filter/kalman_filter_external.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/filter/mne_filter.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/filter/notch_filter.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/grid_cortex.tsv +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/grid_subcortex.tsv +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_backend.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_manager.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_utils.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_window.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/frontend/assets/Figtree-VariableFont_wght-CkXbWBDP.ttf +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/frontend/assets/plotly-DTCwMlpS.js +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/frontend/charite.svg +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/window_api.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/libpugixml.so.1.12 +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/lsl_api.cfg +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/plots/STN_surf.mat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/plots/Vertices.mat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/plots/faces.mat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/plots/grid.mat +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/artifacts.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/data_preprocessor.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/filter_preprocessing.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/normalization.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/projection.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/rereference.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/processing/resample.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/data_processor.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/generator.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/mnelsl_player.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/stream/settings.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/channels.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/database.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/file_writer.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/io.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/keyboard.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/logging.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/perf.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/pydantic_extensions.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/utils/types.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation.code-workspace +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/__init__.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/conftest.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_all_examples.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_all_features.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_bispectra.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_bursts.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_database.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_feature_sampling_rates.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_fooof.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_initalization_offline_stream.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_lsl_stream.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_nan_values.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_nm_filter.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_nm_resample.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_normalization_settings.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_notch_filter.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_osc_features.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_preprocessing_filter.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_rereference.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_sampling.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_settings_change_after_init.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_sharpwave.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_target_channel_add.py +0 -0
- {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/tests/test_timing.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
py_neuromodulation/gui/frontend/assets/* linguist-vendored
|
|
@@ -21,13 +21,15 @@ jobs:
|
|
|
21
21
|
- name: Install dependencies
|
|
22
22
|
run: |
|
|
23
23
|
python -m pip install --upgrade pip
|
|
24
|
-
pip install build
|
|
24
|
+
python -m pip install build
|
|
25
|
+
python -m pip install pkginfo
|
|
26
|
+
python -m pip install twine
|
|
25
27
|
|
|
26
28
|
- name: Build package
|
|
27
29
|
run: python -m build
|
|
28
30
|
|
|
29
31
|
- name: Publish to PyPI
|
|
30
|
-
uses: pypa/gh-action-pypi-publish@v1.
|
|
32
|
+
uses: pypa/gh-action-pypi-publish@v1.12.4
|
|
31
33
|
with:
|
|
32
34
|
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
33
35
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: py_neuromodulation
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Real-time analysis of intracranial neurophysiology recordings.
|
|
5
5
|
Project-URL: Homepage, https://neuromodulation.github.io/py_neuromodulation/
|
|
6
6
|
Project-URL: Documentation, https://neuromodulation.github.io/py_neuromodulation/
|
|
@@ -175,6 +175,11 @@ Contact information
|
|
|
175
175
|
For any question or suggestion please find my contact
|
|
176
176
|
information at `my GitHub profile <https://github.com/timonmerk>`_.
|
|
177
177
|
|
|
178
|
+
Contributing guide
|
|
179
|
+
------------------
|
|
180
|
+
https://neuromodulation.github.io/py_neuromodulation/contributing.html
|
|
181
|
+
|
|
182
|
+
|
|
178
183
|
References
|
|
179
184
|
----------
|
|
180
185
|
|
|
@@ -83,6 +83,11 @@ Contact information
|
|
|
83
83
|
For any question or suggestion please find my contact
|
|
84
84
|
information at `my GitHub profile <https://github.com/timonmerk>`_.
|
|
85
85
|
|
|
86
|
+
Contributing guide
|
|
87
|
+
------------------
|
|
88
|
+
https://neuromodulation.github.io/py_neuromodulation/contributing.html
|
|
89
|
+
|
|
90
|
+
|
|
86
91
|
References
|
|
87
92
|
----------
|
|
88
93
|
|
|
@@ -17,17 +17,13 @@ To setup the python environment, type
|
|
|
17
17
|
uv venv
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
Depending on your operating system, activate the
|
|
20
|
+
Depending on your operating system, activate the python virtual environment:
|
|
21
21
|
|
|
22
22
|
::
|
|
23
23
|
|
|
24
24
|
. .venv/bin/activate
|
|
25
25
|
|
|
26
|
-
And install the pyproject.toml dependencies
|
|
27
|
-
|
|
28
|
-
::
|
|
29
|
-
|
|
30
|
-
then sync the environment with
|
|
26
|
+
And install the pyproject.toml dependencies and sync the environment with
|
|
31
27
|
|
|
32
28
|
::
|
|
33
29
|
|
|
@@ -85,3 +81,6 @@ Additionally, the script ``run_gui.py`` can be modified to be in `dev` mode:
|
|
|
85
81
|
|
|
86
82
|
App(dev=True).launch()
|
|
87
83
|
|
|
84
|
+
|
|
85
|
+
.. note::
|
|
86
|
+
Antonio Brotons wrote an amazing introduction and motivation behind the GUI development this `GitHub discussion <https://github.com/neuromodulation/py_neuromodulation/issues/351#issuecomment-2199932210>`_.
|
|
@@ -2,13 +2,9 @@ GUI
|
|
|
2
2
|
===
|
|
3
3
|
|
|
4
4
|
In this section we will explain the setup and use of the *py_neuromodulation* GUI.
|
|
5
|
-
First, the GUI dependencies
|
|
5
|
+
First, the GUI dependencies are directly included in the default dependencies.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
uv pip install -e .[gui]
|
|
10
|
-
|
|
11
|
-
The GUI can be started by running the following command:
|
|
7
|
+
The GUI can be started after installing *py_neuromodulation* by running the following command:
|
|
12
8
|
|
|
13
9
|
.. code-block:: bash
|
|
14
10
|
|
|
@@ -30,20 +26,20 @@ The GUI is divided into three main sections:
|
|
|
30
26
|
|
|
31
27
|
The source selection is shown in the following image:
|
|
32
28
|
|
|
33
|
-
.. image::
|
|
29
|
+
.. image:: _static/sourceselection.png
|
|
34
30
|
:alt: GUI
|
|
35
31
|
:align: center
|
|
36
32
|
|
|
37
33
|
When clicking on the `SELECT FILE` button, a file dialog will open, where the user can select the file to be loaded:
|
|
38
34
|
|
|
39
|
-
.. image::
|
|
35
|
+
.. image:: _static/fileselection.png
|
|
40
36
|
:alt: GUI
|
|
41
37
|
:align: center
|
|
42
38
|
|
|
43
39
|
Internally, available meta data such as sampling rate, line noise, available channel names will be read and a stream initialized.
|
|
44
40
|
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
41
|
|
|
46
|
-
.. image::
|
|
42
|
+
.. image:: _static/lslselection.png
|
|
47
43
|
:alt: GUI
|
|
48
44
|
:align: center
|
|
49
45
|
|
|
@@ -52,14 +48,14 @@ A `.skops` decoding model, such as an openly-published `movement decoding model
|
|
|
52
48
|
|
|
53
49
|
Next, by selecting `SELECT CHANNELS`, the user is directed to the channel selection section:
|
|
54
50
|
|
|
55
|
-
.. image::
|
|
51
|
+
.. image:: _static/channelselection.png
|
|
56
52
|
:alt: GUI
|
|
57
53
|
:align: center
|
|
58
54
|
|
|
59
55
|
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
56
|
Next, by clicking on `SETTINGS`, the user is directed to the feature selection:
|
|
61
57
|
|
|
62
|
-
.. image::
|
|
58
|
+
.. image:: _static/settings.png
|
|
63
59
|
:alt: GUI
|
|
64
60
|
:align: center
|
|
65
61
|
|
|
@@ -73,7 +69,7 @@ are defined the upper left section.
|
|
|
73
69
|
Additionally, frequency bands can be modified, added or deleted.
|
|
74
70
|
Once the settings are modified, they are internally validated for potential errors which would then be displayed:
|
|
75
71
|
|
|
76
|
-
.. image::
|
|
72
|
+
.. image:: _static/pydantic.png
|
|
77
73
|
:alt: GUI
|
|
78
74
|
:align: center
|
|
79
75
|
|
|
@@ -89,13 +85,13 @@ Here, different graphs can be selected by clicking on the corresponding graph li
|
|
|
89
85
|
When clicking on `RUN STREAM`, the stream will start and the selected features will be computed in real-time.
|
|
90
86
|
In the terminal the feature computation is logged, and features and raw signals are displayed in the GUI:
|
|
91
87
|
|
|
92
|
-
.. image::
|
|
88
|
+
.. image:: _static/graphs.png
|
|
93
89
|
:alt: GUI
|
|
94
90
|
:align: center
|
|
95
91
|
|
|
96
92
|
Additionally, a heatmap with selected features can be displayed with the decoded model output:
|
|
97
93
|
|
|
98
|
-
.. image::
|
|
94
|
+
.. image:: _static/decoding.png
|
|
99
95
|
:alt: GUI
|
|
100
96
|
:align: center
|
|
101
97
|
|
|
@@ -103,7 +99,7 @@ Additionally, a heatmap with selected features can be displayed with the decoded
|
|
|
103
99
|
|
|
104
100
|
<br>
|
|
105
101
|
|
|
106
|
-
In the :doc:`contributing </contributing>` section we explain in further detail the GUI setup.
|
|
102
|
+
In the :doc:`contributing </contributing>` section we explain in further detail the GUI setup.
|
|
107
103
|
|
|
108
104
|
Known issues
|
|
109
105
|
~~~~~~~~~~~~
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
Installation
|
|
2
|
+
============
|
|
3
|
+
|
|
4
|
+
py_neuromodulation requires at least python 3.11. For installation you can use pip:
|
|
5
|
+
|
|
6
|
+
.. code-block::
|
|
7
|
+
|
|
8
|
+
pip install py-neuromodulation
|
|
9
|
+
|
|
10
|
+
We recommend, however, using the package manager `uv <https://docs.astral.sh/uv/getting-started/installation/>`_, and setting up a clean virtual environment:
|
|
11
|
+
|
|
12
|
+
.. code-block::
|
|
13
|
+
|
|
14
|
+
git clone https://github.com/neuromodulation/py_neuromodulation.git
|
|
15
|
+
uv python install 3.11
|
|
16
|
+
uv venv
|
|
17
|
+
|
|
18
|
+
And then activating the virtual environment e.g. in Windows using:
|
|
19
|
+
|
|
20
|
+
.. code-block::
|
|
21
|
+
|
|
22
|
+
.\.venv\Scripts\activate
|
|
23
|
+
|
|
24
|
+
or in unix-based systems:
|
|
25
|
+
|
|
26
|
+
.. code-block::
|
|
27
|
+
|
|
28
|
+
source .venv/bin/activate
|
|
29
|
+
|
|
30
|
+
Then install the packages listed in the `pyproject.toml`:
|
|
31
|
+
|
|
32
|
+
.. code-block::
|
|
33
|
+
|
|
34
|
+
uv sync
|
|
35
|
+
|
|
36
|
+
The GUI can then simply be started by running:
|
|
37
|
+
|
|
38
|
+
.. code-block::
|
|
39
|
+
|
|
40
|
+
run_gui
|
|
41
|
+
|
|
42
|
+
If needed, install the documentation dependencies:
|
|
43
|
+
|
|
44
|
+
.. code-block::
|
|
45
|
+
|
|
46
|
+
uv pip install -e .[docs]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
Alternatively, you can also install the package in a conda environment:
|
|
50
|
+
|
|
51
|
+
conda create -n pynm-test python=3.11
|
|
52
|
+
conda activate pynm-test
|
|
53
|
+
|
|
54
|
+
Then install the packages listed in the `pyproject.toml`:
|
|
55
|
+
|
|
56
|
+
.. code-block::
|
|
57
|
+
|
|
58
|
+
pip install .
|
{py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/gui_dev/src/pages/Settings/Settings.jsx
RENAMED
|
@@ -310,20 +310,8 @@ export const Settings = () => {
|
|
|
310
310
|
))}
|
|
311
311
|
</TitledBox>
|
|
312
312
|
|
|
313
|
-
<TitledBox title="Postprocessing Settings" sx={{ borderRadius: 3 }}>
|
|
314
|
-
{postprocessingSettingsKeys.map((key) => (
|
|
315
|
-
<SettingsSection
|
|
316
|
-
key={`${key}_settingsSection`}
|
|
317
|
-
settings={settings[key]}
|
|
318
|
-
path={[key]}
|
|
319
|
-
onChange={handleChangeSettings}
|
|
320
|
-
errors={validationErrors}
|
|
321
|
-
/>
|
|
322
|
-
))}
|
|
323
|
-
</TitledBox>
|
|
324
|
-
|
|
325
313
|
{/* FEATURE SETTINGS */}
|
|
326
|
-
<TitledBox title="Feature Settings">
|
|
314
|
+
<TitledBox title="Feature Settings" >
|
|
327
315
|
<Stack direction="row" gap={2}>
|
|
328
316
|
<Box alignSelf={"flex-start"}>
|
|
329
317
|
<SettingsSection
|
|
@@ -334,7 +322,7 @@ export const Settings = () => {
|
|
|
334
322
|
errors={validationErrors}
|
|
335
323
|
/>
|
|
336
324
|
</Box>
|
|
337
|
-
<Stack alignSelf={"flex-start"}>
|
|
325
|
+
<Stack alignSelf={"flex-start"} >
|
|
338
326
|
{Object.entries(enabledFeatures).map(
|
|
339
327
|
([feature, featureSettings]) => (
|
|
340
328
|
<CollapsibleBox
|
|
@@ -355,6 +343,19 @@ export const Settings = () => {
|
|
|
355
343
|
</Stack>
|
|
356
344
|
</Stack>
|
|
357
345
|
</TitledBox>
|
|
346
|
+
|
|
347
|
+
<TitledBox title="Postprocessing Settings" sx={{ borderRadius: 3 }}>
|
|
348
|
+
{postprocessingSettingsKeys.map((key) => (
|
|
349
|
+
<SettingsSection
|
|
350
|
+
key={`${key}_settingsSection`}
|
|
351
|
+
settings={settings[key]}
|
|
352
|
+
path={[key]}
|
|
353
|
+
onChange={handleChangeSettings}
|
|
354
|
+
errors={validationErrors}
|
|
355
|
+
/>
|
|
356
|
+
))}
|
|
357
|
+
</TitledBox>
|
|
358
|
+
|
|
358
359
|
{/* END SETTINGS LAYOUT */}
|
|
359
360
|
</Stack>
|
|
360
361
|
|
|
@@ -118,7 +118,7 @@ export const StreamSelector = () => {
|
|
|
118
118
|
|
|
119
119
|
const handleConnectStream = async () => {
|
|
120
120
|
if (isStreamNameValid) {
|
|
121
|
-
await initializeLSLStream(); // selectedStreamName
|
|
121
|
+
await initializeLSLStream(selectedStreamName); // selectedStreamName
|
|
122
122
|
}
|
|
123
123
|
};
|
|
124
124
|
|
|
@@ -157,7 +157,7 @@ export const useSessionStore = createStore("session", (set, get) => ({
|
|
|
157
157
|
}
|
|
158
158
|
},
|
|
159
159
|
|
|
160
|
-
initializeLSLStream: async () => {
|
|
160
|
+
initializeLSLStream: async (lslStreamName) => {
|
|
161
161
|
const lslSource = get().lslSource;
|
|
162
162
|
const streamParameters = get().streamParameters;
|
|
163
163
|
|
|
@@ -169,7 +169,7 @@ export const useSessionStore = createStore("session", (set, get) => ({
|
|
|
169
169
|
"Content-Type": "application/json",
|
|
170
170
|
},
|
|
171
171
|
body: JSON.stringify({
|
|
172
|
-
stream_name: lslSource.availableStreams[0].name,
|
|
172
|
+
stream_name: lslStreamName, //lslSource.availableStreams[0].name,
|
|
173
173
|
line_noise: streamParameters.lineNoise,
|
|
174
174
|
}),
|
|
175
175
|
});
|
{py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/default_settings.yaml
RENAMED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# the
|
|
9
|
-
# settings
|
|
10
|
-
# format
|
|
11
|
-
# here
|
|
1
|
+
# Settings should be modified either directly through
|
|
2
|
+
# the default_settings.yaml file or by creating a new
|
|
3
|
+
# settings.yaml file than can be loaded with
|
|
4
|
+
# settings.NMSettings.load(FILE_PATH)
|
|
5
|
+
#
|
|
6
|
+
# Alternatively, the settings can also be modified through the
|
|
7
|
+
# settings object directly, e.g. settings.features.raw_hjorth = False
|
|
12
8
|
|
|
13
9
|
########################
|
|
14
10
|
### General settings ###
|
|
@@ -21,9 +17,9 @@ frequency_ranges_hz: # frequency band ranges can be added, removed and altered
|
|
|
21
17
|
alpha: [8, 12]
|
|
22
18
|
low_beta: [13, 20]
|
|
23
19
|
high_beta: [20, 35]
|
|
24
|
-
low_gamma: [60, 80]
|
|
25
|
-
high_gamma: [90, 200]
|
|
26
|
-
HFA: [200, 400]
|
|
20
|
+
#low_gamma: [60, 80]
|
|
21
|
+
#high_gamma: [90, 200]
|
|
22
|
+
#HFA: [200, 400]
|
|
27
23
|
|
|
28
24
|
# Enabled features
|
|
29
25
|
features:
|
|
@@ -99,7 +95,7 @@ fft_settings:
|
|
|
99
95
|
median: false
|
|
100
96
|
std: false
|
|
101
97
|
max: false
|
|
102
|
-
return_spectrum:
|
|
98
|
+
return_spectrum: false
|
|
103
99
|
|
|
104
100
|
welch_settings:
|
|
105
101
|
windowlength_ms: 1000
|
|
@@ -109,7 +105,7 @@ welch_settings:
|
|
|
109
105
|
median: false
|
|
110
106
|
std: false
|
|
111
107
|
max: false
|
|
112
|
-
return_spectrum:
|
|
108
|
+
return_spectrum: false
|
|
113
109
|
|
|
114
110
|
stft_settings:
|
|
115
111
|
windowlength_ms: 500
|
|
@@ -147,7 +143,7 @@ kalman_filter_settings:
|
|
|
147
143
|
bursts_settings:
|
|
148
144
|
threshold: 75
|
|
149
145
|
time_duration_s: 30
|
|
150
|
-
frequency_bands: [low_beta, high_beta
|
|
146
|
+
frequency_bands: [low_beta, high_beta] # low_gamma
|
|
151
147
|
burst_features:
|
|
152
148
|
duration: true
|
|
153
149
|
amplitude: true
|
|
@@ -190,7 +186,7 @@ sharpwave_analysis_settings:
|
|
|
190
186
|
apply_estimator_between_peaks_and_troughs: true
|
|
191
187
|
|
|
192
188
|
coherence_settings:
|
|
193
|
-
channels: [] # List of channel pairs, empty by default. Each pair is a list of two channels.
|
|
189
|
+
channels: [] # List of channel pairs, empty by default. Each pair is a list of two channels, where the first channel is the seed and the second channel is the target.
|
|
194
190
|
# Example channels: [[STN_RIGHT_0, ECOG_RIGHT_0], [STN_RIGHT_1, ECOG_RIGHT_1]]
|
|
195
191
|
frequency_bands: [high_beta]
|
|
196
192
|
features:
|
|
@@ -230,6 +226,8 @@ nolds_settings:
|
|
|
230
226
|
frequency_bands: [low_beta]
|
|
231
227
|
|
|
232
228
|
mne_connectiviy_settings:
|
|
229
|
+
channels: [] # List of channel pairs, empty by default. Each pair is a list of two channels, where the first channel is the seed and the second channel is the target.
|
|
230
|
+
# Example channels: [[STN_RIGHT_0, ECOG_RIGHT_0], [STN_RIGHT_1, ECOG_RIGHT_1]]
|
|
233
231
|
method: plv # One of ['coh', 'cohy', 'imcoh', 'cacoh', 'mic', 'mim', 'plv', 'ciplv', 'ppc', 'pli', 'dpli','wpli', 'wpli2_debiased', 'gc', 'gc_tr']
|
|
234
232
|
mode: multitaper # One of ['multitaper', 'fourier', 'cwt_morlet']
|
|
235
233
|
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from collections.abc import Iterable
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
from typing import TYPE_CHECKING, Annotated, Literal
|
|
5
|
+
from pydantic import Field
|
|
6
|
+
|
|
7
|
+
from py_neuromodulation.utils.types import NMFeature, NMBaseModel
|
|
8
|
+
from py_neuromodulation.utils.pydantic_extensions import NMField
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from py_neuromodulation import NMSettings
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
ListOfTwoStr = Annotated[list[str], Field(min_length=2, max_length=2)]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
MNE_CONNECTIVITY_METHOD = Literal[
|
|
18
|
+
"coh",
|
|
19
|
+
"cohy",
|
|
20
|
+
"imcoh",
|
|
21
|
+
"cacoh",
|
|
22
|
+
"mic",
|
|
23
|
+
"mim",
|
|
24
|
+
"plv",
|
|
25
|
+
"ciplv",
|
|
26
|
+
"ppc",
|
|
27
|
+
"pli",
|
|
28
|
+
"dpli",
|
|
29
|
+
"wpli",
|
|
30
|
+
"wpli2_debiased",
|
|
31
|
+
"gc",
|
|
32
|
+
"gc_tr",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
MNE_CONNECTIVITY_MODE = Literal["multitaper", "fourier", "cwt_morlet"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class MNEConnectivitySettings(NMBaseModel):
|
|
39
|
+
method: MNE_CONNECTIVITY_METHOD = NMField(default="plv")
|
|
40
|
+
mode: MNE_CONNECTIVITY_MODE = NMField(default="multitaper")
|
|
41
|
+
channels: list[ListOfTwoStr] = []
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class MNEConnectivity(NMFeature):
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
settings: "NMSettings",
|
|
48
|
+
ch_names: Iterable[str],
|
|
49
|
+
sfreq: float,
|
|
50
|
+
) -> None:
|
|
51
|
+
self.settings = settings
|
|
52
|
+
|
|
53
|
+
self.ch_names = ch_names
|
|
54
|
+
self.sfreq = sfreq
|
|
55
|
+
|
|
56
|
+
self.channels = settings.mne_connectivity_settings.channels
|
|
57
|
+
|
|
58
|
+
# Params used by spectral_connectivity_epochs
|
|
59
|
+
self.mode = settings.mne_connectivity_settings.mode
|
|
60
|
+
self.method = settings.mne_connectivity_settings.method
|
|
61
|
+
self.indices = ([], []) # convert channel names to channel indices in data
|
|
62
|
+
for con_idx in range(len(self.channels)):
|
|
63
|
+
seed_name = self.channels[con_idx][0]
|
|
64
|
+
target_name = self.channels[con_idx][1]
|
|
65
|
+
seed_name_reref = [ch for ch in self.ch_names if ch.startswith(seed_name)][0]
|
|
66
|
+
target_name_reref = [ch for ch in self.ch_names if ch.startswith(target_name)][0]
|
|
67
|
+
self.indices[0].append(self.ch_names.index(seed_name_reref))
|
|
68
|
+
self.indices[1].append(self.ch_names.index(target_name_reref))
|
|
69
|
+
|
|
70
|
+
self.fbands = settings.frequency_ranges_hz
|
|
71
|
+
self.fband_ranges: list = []
|
|
72
|
+
self.result_keys = []
|
|
73
|
+
|
|
74
|
+
self.prev_batch_shape: tuple = (-1, -1) # sentinel value
|
|
75
|
+
|
|
76
|
+
def calc_feature(self, data: np.ndarray) -> dict:
|
|
77
|
+
from mne_connectivity import spectral_connectivity_epochs
|
|
78
|
+
|
|
79
|
+
# n_jobs is here kept to 1, since setup of the multiprocessing Pool
|
|
80
|
+
# takes longer than most batch computing sizes
|
|
81
|
+
spec_out = spectral_connectivity_epochs(
|
|
82
|
+
data=np.expand_dims(data, axis=0), # add singleton epoch dimension
|
|
83
|
+
sfreq=self.sfreq,
|
|
84
|
+
method=self.method,
|
|
85
|
+
mode=self.mode,
|
|
86
|
+
indices=self.indices,
|
|
87
|
+
verbose=False,
|
|
88
|
+
)
|
|
89
|
+
dat_conn: np.ndarray = spec_out.get_data()
|
|
90
|
+
|
|
91
|
+
# Get frequency band ranges only for the first batch, it's already the same
|
|
92
|
+
if len(self.fband_ranges) == 0:
|
|
93
|
+
for fband_range in self.fbands.values():
|
|
94
|
+
self.fband_ranges.append(
|
|
95
|
+
np.where(
|
|
96
|
+
(np.array(spec_out.freqs) >= fband_range[0])
|
|
97
|
+
& (np.array(spec_out.freqs) <= fband_range[1])
|
|
98
|
+
)[0]
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
feature_results = {}
|
|
102
|
+
for con_idx in np.arange(dat_conn.shape[0]):
|
|
103
|
+
for fband_idx, fband_name in enumerate(self.fbands):
|
|
104
|
+
# TODO: Add support for max_fband and max_allfbands
|
|
105
|
+
feature_results[
|
|
106
|
+
"_".join(
|
|
107
|
+
[
|
|
108
|
+
self.method,
|
|
109
|
+
self.channels[con_idx][0], # seed channel name
|
|
110
|
+
"to",
|
|
111
|
+
self.channels[con_idx][1], # target channel name
|
|
112
|
+
"mean_fband",
|
|
113
|
+
fband_name,
|
|
114
|
+
]
|
|
115
|
+
)
|
|
116
|
+
] = np.mean(dat_conn[con_idx, self.fband_ranges[fband_idx]])
|
|
117
|
+
|
|
118
|
+
# Store current experiment parameters to check if re-initialization is needed
|
|
119
|
+
self.prev_batch_shape = data.shape
|
|
120
|
+
|
|
121
|
+
return feature_results
|
{py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_pynm.py
RENAMED
|
@@ -49,7 +49,8 @@ class PyNMState:
|
|
|
49
49
|
self,
|
|
50
50
|
websocket_manager: WebsocketManager | None = None,
|
|
51
51
|
) -> None:
|
|
52
|
-
|
|
52
|
+
# Clear stop event to enable _process_queue
|
|
53
|
+
self.stop_event.clear()
|
|
53
54
|
self.websocket_manager = websocket_manager
|
|
54
55
|
|
|
55
56
|
# Create decoder
|
|
@@ -113,6 +114,7 @@ class PyNMState:
|
|
|
113
114
|
from mne_lsl.lsl import resolve_streams
|
|
114
115
|
|
|
115
116
|
logger.info("resolving streams")
|
|
117
|
+
logger.info(f"passed lsl_stream_name: {lsl_stream_name}")
|
|
116
118
|
lsl_streams = resolve_streams()
|
|
117
119
|
|
|
118
120
|
for stream in lsl_streams:
|
|
@@ -142,14 +144,21 @@ class PyNMState:
|
|
|
142
144
|
# set all used column to 0
|
|
143
145
|
#channels.loc[:, "used"] = 0
|
|
144
146
|
|
|
145
|
-
logger.info(channels)
|
|
147
|
+
logger.info(f"channels: {channels}")
|
|
146
148
|
sfreq = stream.sfreq
|
|
149
|
+
logger.info(f"sfreq: {sfreq}")
|
|
147
150
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
logger.info("Starting setup LSL stream...")
|
|
152
|
+
try:
|
|
153
|
+
self.stream: Stream = Stream(
|
|
154
|
+
sfreq=sfreq,
|
|
155
|
+
line_noise=line_noise,
|
|
156
|
+
channels=channels,
|
|
157
|
+
)
|
|
158
|
+
except Exception as e:
|
|
159
|
+
logger.error(f"Error setting up LSL stream: {e}")
|
|
160
|
+
|
|
161
|
+
logger.info("Finish setup LSL stream...")
|
|
153
162
|
logger.info("stream setup")
|
|
154
163
|
logger.info("settings setup")
|
|
155
164
|
|
{py_neuromodulation-0.1.0 → py_neuromodulation-0.1.2}/py_neuromodulation/gui/backend/app_socket.py
RENAMED
|
@@ -39,6 +39,7 @@ class WebsocketManager:
|
|
|
39
39
|
|
|
40
40
|
# Combine IP and port to create a unique client ID
|
|
41
41
|
async def send_cbor(self, object: dict):
|
|
42
|
+
self.logger.debug(f"app_socket.send_cbor")
|
|
42
43
|
if not self.active_connections:
|
|
43
44
|
self.logger.warning("No active connection to send message.")
|
|
44
45
|
return
|
|
@@ -54,6 +55,7 @@ class WebsocketManager:
|
|
|
54
55
|
for connection in self.active_connections:
|
|
55
56
|
try:
|
|
56
57
|
await connection.send_bytes(cbor_data)
|
|
58
|
+
self.logger.debug(f"CBOR message sent to {connection.client}")
|
|
57
59
|
except RuntimeError as e:
|
|
58
60
|
self.logger.error(f"Error sending CBOR message: {e}")
|
|
59
61
|
self.disconnected.append(connection)
|