py-neuromodulation 0.01__tar.gz → 0.1.1__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.
Files changed (286) hide show
  1. py_neuromodulation-0.1.1/.gitattributes +1 -0
  2. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/.github/workflows/python-publish.yml +4 -2
  3. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/PKG-INFO +6 -1
  4. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/README.rst +5 -0
  5. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/contributing.rst +4 -5
  6. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/gui.rst +11 -15
  7. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/Settings/Settings.jsx +15 -14
  8. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/SourceSelection/StreamSelector.jsx +1 -1
  9. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/sessionStore.js +2 -2
  10. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/default_settings.yaml +16 -18
  11. py_neuromodulation-0.1.1/py_neuromodulation/features/mne_connectivity.py +121 -0
  12. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/backend/app_pynm.py +16 -7
  13. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/backend/app_socket.py +2 -0
  14. py_neuromodulation-0.1.0/py_neuromodulation/gui/frontend/assets/index-NbJiOU5a.js → py_neuromodulation-0.1.1/py_neuromodulation/gui/frontend/assets/index-_6V8ZfAS.js +258 -254
  15. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/frontend/index.html +1 -1
  16. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/run_gui.py +1 -1
  17. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/backend_interface.py +7 -7
  18. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/mnelsl_stream.py +1 -1
  19. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/stream.py +1 -0
  20. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/pyproject.toml +2 -2
  21. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_coherence.py +1 -2
  22. py_neuromodulation-0.1.1/tests/test_mne_connectivity.py +143 -0
  23. py_neuromodulation-0.1.0/docs/source/_static/Screenshot 2025-03-05 at 13.30.42.png +0 -0
  24. py_neuromodulation-0.1.0/docs/source/_static/Screenshot 2025-03-05 at 13.35.25.png +0 -0
  25. py_neuromodulation-0.1.0/py_neuromodulation/features/mne_connectivity.py +0 -170
  26. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/.github/workflows/docs_pages.yml +0 -0
  27. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/.github/workflows/tests.yml +0 -0
  28. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/.gitignore +0 -0
  29. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/LICENSE +0 -0
  30. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/Makefile +0 -0
  31. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/make.bat +0 -0
  32. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/RMAP.rst +0 -0
  33. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/CEBRA_embedding.png +0 -0
  34. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/RMAP_figure.png +0 -0
  35. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/channelselection.png +0 -0
  36. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/css/RMAP_figure.png +0 -0
  37. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/css/project-template.css +0 -0
  38. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/decoding.png +0 -0
  39. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/fileselection.png +0 -0
  40. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/graphs.png +0 -0
  41. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/lslselection.png +0 -0
  42. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/pydantic.png +0 -0
  43. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/settings.png +0 -0
  44. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_static/sourceselection.png +0 -0
  45. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_templates/custom-class-template.rst +0 -0
  46. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/_templates/custom-module-template.rst +0 -0
  47. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/api_documentation.rst +0 -0
  48. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/artifacts.rst +0 -0
  49. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/bandpower.rst +0 -0
  50. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/bispectra.rst +0 -0
  51. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/bursts.rst +0 -0
  52. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/channels.rst +0 -0
  53. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/coherence.rst +0 -0
  54. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/conf.py +0 -0
  55. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/database.rst +0 -0
  56. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/decode.rst +0 -0
  57. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/feature_reader.rst +0 -0
  58. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/fooof.rst +0 -0
  59. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/generator.rst +0 -0
  60. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/hjorth.rst +0 -0
  61. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/index.rst +0 -0
  62. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/installation.rst +0 -0
  63. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/io.rst +0 -0
  64. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/linelength.rst +0 -0
  65. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/logging.rst +0 -0
  66. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/mne_connectivity.rst +0 -0
  67. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/mne_filter.rst +0 -0
  68. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/mnelsl_player.rst +0 -0
  69. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/mnelsl_stream.rst +0 -0
  70. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/nolds.rst +0 -0
  71. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/normalization.rst +0 -0
  72. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/notch_filter.rst +0 -0
  73. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/oscillatory.rst +0 -0
  74. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/plots.rst +0 -0
  75. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/projection.rst +0 -0
  76. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/rereference.rst +0 -0
  77. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/resample.rst +0 -0
  78. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/settings.rst +0 -0
  79. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/sharpwaves.rst +0 -0
  80. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/stats.rst +0 -0
  81. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/stream.rst +0 -0
  82. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/types.rst +0 -0
  83. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/docs/source/usage.rst +0 -0
  84. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/README.rst +0 -0
  85. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/example_cebra_decoding.html +0 -0
  86. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/example_cebra_decoding.ipynb +0 -0
  87. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/example_rmap.ipynb +0 -0
  88. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_2_example_add_feature.py +0 -0
  89. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_3_example_sharpwave_analysis.py +0 -0
  90. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_4_example_gridPointProjection.py +0 -0
  91. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_5_example_rmap_computing.py +0 -0
  92. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_6_real_time_demo.py +0 -0
  93. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_7_lsl_example.py +0 -0
  94. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/examples/plot_8_cebra_example.py +0 -0
  95. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/.eslintrc.cjs +0 -0
  96. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/.gitattributes +0 -0
  97. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/.gitignore +0 -0
  98. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/bun.lock +0 -0
  99. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/eslint.config.js +0 -0
  100. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/index.html +0 -0
  101. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/jsconfig.json +0 -0
  102. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/package.json +0 -0
  103. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/public/charite.svg +0 -0
  104. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/scripts/wdyr.js +0 -0
  105. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/App.jsx +0 -0
  106. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/assets/fonts/figtree/Figtree-Italic-VariableFont_wght.ttf +0 -0
  107. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/assets/fonts/figtree/Figtree-VariableFont_wght.ttf +0 -0
  108. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/assets/fonts/figtree/OFL.txt +0 -0
  109. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/assets/fonts/figtree/README.txt +0 -0
  110. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/AppBar/index.js +0 -0
  111. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/AppBar.jsx +0 -0
  112. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/AppInfoModal.jsx +0 -0
  113. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/BandPowerGraph.jsx +0 -0
  114. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/CollapsibleBox.jsx +0 -0
  115. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/DecodingGraph.jsx +0 -0
  116. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Drawer/index.js +0 -0
  117. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/FileBrowser/FileBrowser.jsx +0 -0
  118. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/FileBrowser/QuickAccess.jsx +0 -0
  119. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Graph/index.js +0 -0
  120. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/HeatmapGraph.jsx +0 -0
  121. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/PSDGraph.jsx +0 -0
  122. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/RawDataGraph.jsx +0 -0
  123. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Settings/index.js +0 -0
  124. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Sidebar/Sidebar.jsx +0 -0
  125. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Sidebar/Sidebar.module.css +0 -0
  126. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Sidebar/index.js +0 -0
  127. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/ResizeHandle.jsx +0 -0
  128. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/ResizeHandle.module.css +0 -0
  129. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/SocketStatus.jsx +0 -0
  130. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/StatusBar.jsx +0 -0
  131. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/StatusBar.module.css +0 -0
  132. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/WebviewStatus.jsx +0 -0
  133. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/index.js +0 -0
  134. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/StatusBar/resize_handle.svg +0 -0
  135. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/Switch/index.js +0 -0
  136. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/TitledBox.jsx +0 -0
  137. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/WindowButtons.jsx +0 -0
  138. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/index.js +0 -0
  139. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/components/utils.jsx +0 -0
  140. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/main.jsx +0 -0
  141. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/Channels/Channels.jsx +0 -0
  142. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/Dashboard.jsx +0 -0
  143. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/Settings/components/FrequencyRange.jsx +0 -0
  144. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/Settings/components/OrderableLiteralListField.jsx +0 -0
  145. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/Settings/components/PrimitiveComponents.jsx +0 -0
  146. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/SourceSelection/DecodingModel.jsx +0 -0
  147. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/SourceSelection/FileSelector.jsx +0 -0
  148. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/SourceSelection/SourceSelection.jsx +0 -0
  149. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/SourceSelection/StreamParameters.jsx +0 -0
  150. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/pages/index.js +0 -0
  151. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/appInfoStore.js +0 -0
  152. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/createStore.js +0 -0
  153. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/dragAndDropStore.js +0 -0
  154. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/index.js +0 -0
  155. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/settingsStore.js +0 -0
  156. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/socketStore.js +0 -0
  157. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/uiStore.js +0 -0
  158. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/stores/webviewStore.js +0 -0
  159. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/styles/reset.css +0 -0
  160. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/theme.js +0 -0
  161. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/utils/DataBuffer.js +0 -0
  162. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/utils/FileInfo.js +0 -0
  163. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/utils/FileManager.js +0 -0
  164. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/utils/debounced_sync.js +0 -0
  165. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/utils/index.js +0 -0
  166. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/src/utils/utils.js +0 -0
  167. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/gui_dev/vite.config.js +0 -0
  168. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
  169. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +0 -0
  170. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +0 -0
  171. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +0 -0
  172. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
  173. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
  174. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
  175. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
  176. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/__init__.py +0 -0
  177. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/analysis/RMAP.py +0 -0
  178. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/analysis/__init__.py +0 -0
  179. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/analysis/decode.py +0 -0
  180. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/analysis/feature_reader.py +0 -0
  181. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/analysis/plots.py +0 -0
  182. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/analysis/stats.py +0 -0
  183. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/README +0 -0
  184. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/dataset_description.json +0 -0
  185. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/participants.json +0 -0
  186. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/participants.tsv +0 -0
  187. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +0 -0
  188. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +0 -0
  189. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +0 -0
  190. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
  191. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +0 -0
  192. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +0 -0
  193. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +0 -0
  194. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +0 -0
  195. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/__init__.py +0 -0
  196. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/bandpower.py +0 -0
  197. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/bispectra.py +0 -0
  198. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/bursts.py +0 -0
  199. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/coherence.py +0 -0
  200. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/feature_processor.py +0 -0
  201. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/fooof.py +0 -0
  202. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/hjorth_raw.py +0 -0
  203. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/linelength.py +0 -0
  204. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/nolds.py +0 -0
  205. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/oscillatory.py +0 -0
  206. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/features/sharpwaves.py +0 -0
  207. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/filter/__init__.py +0 -0
  208. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/filter/kalman_filter.py +0 -0
  209. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/filter/kalman_filter_external.py +0 -0
  210. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/filter/mne_filter.py +0 -0
  211. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/filter/notch_filter.py +0 -0
  212. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/grid_cortex.tsv +0 -0
  213. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/grid_subcortex.tsv +0 -0
  214. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/__init__.py +0 -0
  215. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/backend/app_backend.py +0 -0
  216. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/backend/app_manager.py +0 -0
  217. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/backend/app_utils.py +0 -0
  218. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/backend/app_window.py +0 -0
  219. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/frontend/assets/Figtree-VariableFont_wght-CkXbWBDP.ttf +0 -0
  220. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/frontend/assets/plotly-DTCwMlpS.js +0 -0
  221. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/frontend/charite.svg +0 -0
  222. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/gui/window_api.py +0 -0
  223. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/libpugixml.so.1.12 +0 -0
  224. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
  225. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
  226. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
  227. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
  228. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
  229. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
  230. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
  231. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
  232. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
  233. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
  234. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/lsl_api.cfg +0 -0
  235. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/plots/STN_surf.mat +0 -0
  236. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/plots/Vertices.mat +0 -0
  237. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/plots/faces.mat +0 -0
  238. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/plots/grid.mat +0 -0
  239. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/__init__.py +0 -0
  240. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/artifacts.py +0 -0
  241. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/data_preprocessor.py +0 -0
  242. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/filter_preprocessing.py +0 -0
  243. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/normalization.py +0 -0
  244. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/projection.py +0 -0
  245. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/rereference.py +0 -0
  246. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/processing/resample.py +0 -0
  247. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/__init__.py +0 -0
  248. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/data_processor.py +0 -0
  249. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/generator.py +0 -0
  250. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/mnelsl_player.py +0 -0
  251. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/stream/settings.py +0 -0
  252. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/__init__.py +0 -0
  253. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/channels.py +0 -0
  254. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/database.py +0 -0
  255. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/file_writer.py +0 -0
  256. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/io.py +0 -0
  257. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/keyboard.py +0 -0
  258. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/logging.py +0 -0
  259. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/perf.py +0 -0
  260. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/pydantic_extensions.py +0 -0
  261. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation/utils/types.py +0 -0
  262. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/py_neuromodulation.code-workspace +0 -0
  263. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/__init__.py +0 -0
  264. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/conftest.py +0 -0
  265. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_all_examples.py +0 -0
  266. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_all_features.py +0 -0
  267. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_bispectra.py +0 -0
  268. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_bursts.py +0 -0
  269. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_database.py +0 -0
  270. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_feature_sampling_rates.py +0 -0
  271. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_fooof.py +0 -0
  272. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_initalization_offline_stream.py +0 -0
  273. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_lsl_stream.py +0 -0
  274. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_nan_values.py +0 -0
  275. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_nm_filter.py +0 -0
  276. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_nm_resample.py +0 -0
  277. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_normalization_settings.py +0 -0
  278. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_notch_filter.py +0 -0
  279. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_osc_features.py +0 -0
  280. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_preprocessing_filter.py +0 -0
  281. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_rereference.py +0 -0
  282. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_sampling.py +0 -0
  283. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_settings_change_after_init.py +0 -0
  284. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_sharpwave.py +0 -0
  285. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/tests/test_target_channel_add.py +0 -0
  286. {py_neuromodulation-0.1.0 → py_neuromodulation-0.1.1}/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.10.0
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.0
3
+ Version: 0.1.1
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
 
@@ -23,11 +23,7 @@ Depending on your operating system, activate the rye virtual environment:
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 can be installed with `uv`:
5
+ First, the GUI dependencies are directly included in the default dependencies.
6
6
 
7
- .. code-block:: bash
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:: ../_static/sourceselection.png
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:: ../_static/fileselection.png
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:: ../_static/lslselection.png
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:: ../_static/channelselection.png
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:: ../_static/settings.png
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:: ../_static/pydantic.png
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:: ../_static/graphs.png
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:: ../_static/decoding.png
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
  ~~~~~~~~~~~~
@@ -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
  });
@@ -1,14 +1,10 @@
1
- # We
2
- # should
3
- # have
4
- # a
5
- # brief
6
- # explanation
7
- # of
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: true
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: true
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, low_gamma]
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
@@ -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
- self.stream: Stream = Stream(
149
- sfreq=sfreq,
150
- line_noise=line_noise,
151
- channels=channels,
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
 
@@ -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)