py-neuromodulation 0.0.6__tar.gz → 0.0.7__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 (173) hide show
  1. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/.github/workflows/python-publish.yml +1 -1
  2. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/.gitignore +3 -0
  3. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/PKG-INFO +10 -19
  4. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/README.rst +6 -16
  5. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/default_settings.yaml +1 -0
  6. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/bispectra.py +3 -7
  7. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/coherence.py +11 -6
  8. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/pyproject.toml +5 -3
  9. py_neuromodulation-0.0.7/tests/test_coherence.py +119 -0
  10. py_neuromodulation-0.0.6/sub_SETTINGS.yaml +0 -112
  11. py_neuromodulation-0.0.6/sub_SIDECAR.json +0 -6
  12. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/.github/workflows/docs_pages.yml +0 -0
  13. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/.github/workflows/tests.yml +0 -0
  14. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/LICENSE +0 -0
  15. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/Makefile +0 -0
  16. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/make.bat +0 -0
  17. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/_static/CEBRA_embedding.png +0 -0
  18. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/_static/RMAP_figure.png +0 -0
  19. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/_static/css/RMAP_figure.png +0 -0
  20. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/_static/css/project-template.css +0 -0
  21. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/_templates/custom-class-template.rst +0 -0
  22. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/_templates/custom-module-template.rst +0 -0
  23. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/api_documentation.rst +0 -0
  24. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/conf.py +0 -0
  25. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/contributing.rst +0 -0
  26. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/index.rst +0 -0
  27. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/installation.rst +0 -0
  28. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_IO.rst +0 -0
  29. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_RMAP.rst +0 -0
  30. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_analysis.rst +0 -0
  31. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_bursts.rst +0 -0
  32. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_coherence.rst +0 -0
  33. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_decode.rst +0 -0
  34. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_define_nmchannels.rst +0 -0
  35. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_features.rst +0 -0
  36. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_filter.rst +0 -0
  37. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_fooof.rst +0 -0
  38. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_generator.rst +0 -0
  39. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_hjorth.rst +0 -0
  40. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_kalmanfilter.rst +0 -0
  41. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_linelength.rst +0 -0
  42. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_mne_connectivity.rst +0 -0
  43. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_nolds.rst +0 -0
  44. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_normalization.rst +0 -0
  45. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_oscillatory.rst +0 -0
  46. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_plots.rst +0 -0
  47. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_projection.rst +0 -0
  48. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_rereference.rst +0 -0
  49. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_resample.rst +0 -0
  50. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_run_analysis.rst +0 -0
  51. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_settings.rst +0 -0
  52. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_sharpwaves.rst +0 -0
  53. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_stats.rst +0 -0
  54. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_stream.rst +0 -0
  55. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/nm_stream_abc.rst +0 -0
  56. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/docs/source/usage.rst +0 -0
  57. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/README.rst +0 -0
  58. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/example_cebra_decoding.html +0 -0
  59. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/example_cebra_decoding.ipynb +0 -0
  60. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/example_rmap.ipynb +0 -0
  61. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_2_example_add_feature.py +0 -0
  62. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_3_example_sharpwave_analysis.py +0 -0
  63. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_4_example_gridPointProjection.py +0 -0
  64. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_5_example_rmap_computing.py +0 -0
  65. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_6_real_time_demo.py +0 -0
  66. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_7_lsl_example.py +0 -0
  67. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/examples/plot_8_cebra_example.py +0 -0
  68. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
  69. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +0 -0
  70. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +0 -0
  71. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +0 -0
  72. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
  73. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
  74. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
  75. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
  76. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/__init__.py +0 -0
  77. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/analysis/RMAP.py +0 -0
  78. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/analysis/__init__.py +0 -0
  79. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/analysis/decode.py +0 -0
  80. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/analysis/feature_reader.py +0 -0
  81. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/analysis/plots.py +0 -0
  82. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/analysis/stats.py +0 -0
  83. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/README +0 -0
  84. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/dataset_description.json +0 -0
  85. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/participants.json +0 -0
  86. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/participants.tsv +0 -0
  87. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +0 -0
  88. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +0 -0
  89. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +0 -0
  90. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
  91. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +0 -0
  92. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +0 -0
  93. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +0 -0
  94. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +0 -0
  95. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/__init__.py +0 -0
  96. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/bandpower.py +0 -0
  97. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/bursts.py +0 -0
  98. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/feature_processor.py +0 -0
  99. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/fooof.py +0 -0
  100. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/hjorth_raw.py +0 -0
  101. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/linelength.py +0 -0
  102. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/mne_connectivity.py +0 -0
  103. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/nolds.py +0 -0
  104. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/oscillatory.py +0 -0
  105. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/features/sharpwaves.py +0 -0
  106. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/filter/__init__.py +0 -0
  107. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/filter/kalman_filter.py +0 -0
  108. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/filter/kalman_filter_external.py +0 -0
  109. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/filter/mne_filter.py +0 -0
  110. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/filter/notch_filter.py +0 -0
  111. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/grid_cortex.tsv +0 -0
  112. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/grid_subcortex.tsv +0 -0
  113. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/libpugixml.so.1.12 +0 -0
  114. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
  115. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
  116. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
  117. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
  118. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
  119. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
  120. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
  121. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
  122. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
  123. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
  124. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/plots/STN_surf.mat +0 -0
  125. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/plots/Vertices.mat +0 -0
  126. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/plots/faces.mat +0 -0
  127. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/plots/grid.mat +0 -0
  128. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/__init__.py +0 -0
  129. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/artifacts.py +0 -0
  130. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/data_preprocessor.py +0 -0
  131. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/filter_preprocessing.py +0 -0
  132. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/normalization.py +0 -0
  133. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/projection.py +0 -0
  134. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/rereference.py +0 -0
  135. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/processing/resample.py +0 -0
  136. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/__init__.py +0 -0
  137. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/data_processor.py +0 -0
  138. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/generator.py +0 -0
  139. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/mnelsl_player.py +0 -0
  140. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/mnelsl_stream.py +0 -0
  141. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/settings.py +0 -0
  142. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/stream/stream.py +0 -0
  143. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/__init__.py +0 -0
  144. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/channels.py +0 -0
  145. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/database.py +0 -0
  146. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/io.py +0 -0
  147. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/keyboard.py +0 -0
  148. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/logging.py +0 -0
  149. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/py_neuromodulation/utils/types.py +0 -0
  150. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/__init__.py +0 -0
  151. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/conftest.py +0 -0
  152. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_all_examples.py +0 -0
  153. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_all_features.py +0 -0
  154. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_bispectra.py +0 -0
  155. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_bursts.py +0 -0
  156. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_database.py +0 -0
  157. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_feature_sampling_rates.py +0 -0
  158. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_fooof.py +0 -0
  159. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_initalization_offline_stream.py +0 -0
  160. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_lsl_stream.py +0 -0
  161. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_nan_values.py +0 -0
  162. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_nm_filter.py +0 -0
  163. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_nm_resample.py +0 -0
  164. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_normalization_settings.py +0 -0
  165. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_notch_filter.py +0 -0
  166. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_osc_features.py +0 -0
  167. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_preprocessing_filter.py +0 -0
  168. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_rereference.py +0 -0
  169. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_sampling.py +0 -0
  170. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_settings_change_after_init.py +0 -0
  171. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_sharpwave.py +0 -0
  172. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_target_channel_add.py +0 -0
  173. {py_neuromodulation-0.0.6 → py_neuromodulation-0.0.7}/tests/test_timing.py +0 -0
@@ -3,7 +3,7 @@ name: Publish Python Package
3
3
  on:
4
4
  push:
5
5
  tags:
6
- - 'v*' # Only trigger on tag pushes like v1.0.0
6
+ - 'v[0-9]+.[0-9]+.[0-9]+'
7
7
 
8
8
  jobs:
9
9
  publish:
@@ -194,3 +194,6 @@ out_per
194
194
 
195
195
  gui_dev/node_modules/*
196
196
  test/data/*
197
+
198
+ uv.lock
199
+ lsllog.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: py_neuromodulation
3
- Version: 0.0.6
3
+ Version: 0.0.7
4
4
  Summary: Real-time analysis of intracranial neurophysiology recordings.
5
5
  Project-URL: bugtracker, https://github.com/neuromodulation/py_neuromodulation/issues
6
6
  Project-URL: repository, https://github.com/neuromodulation/py_neuromodulation
@@ -36,20 +36,21 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
36
36
  Requires-Python: >=3.11
37
37
  Requires-Dist: fooof
38
38
  Requires-Dist: joblib>=1.3.2
39
+ Requires-Dist: llvmlite>=0.43.0
39
40
  Requires-Dist: matplotlib>=3.9.0
40
41
  Requires-Dist: mne
41
42
  Requires-Dist: mne-bids>=0.8
42
43
  Requires-Dist: mne-connectivity
43
44
  Requires-Dist: mne-lsl>=1.2.0
44
45
  Requires-Dist: mrmr-selection
45
- Requires-Dist: nolds
46
+ Requires-Dist: nolds>=0.6.1
47
+ Requires-Dist: numba>=0.60.0
46
48
  Requires-Dist: numpy>=1.21.2
47
49
  Requires-Dist: pandas>=2.0.0
48
50
  Requires-Dist: pyarrow>=14.0.2
49
51
  Requires-Dist: pybispectra>=1.2.0
50
52
  Requires-Dist: pydantic>=2.7.3
51
53
  Requires-Dist: pyparrm
52
- Requires-Dist: pyqt5
53
54
  Requires-Dist: scikit-learn>=0.24.2
54
55
  Requires-Dist: scikit-optimize
55
56
  Requires-Dist: scipy>=1.7.1
@@ -108,7 +109,7 @@ The original intention for writing this toolbox was movement decoding from invas
108
109
  The application however could be any neural decoding problem.
109
110
  *py_neuromodulation* offers wrappers around common practice machine learning methods for efficient analysis.
110
111
 
111
- Find the documentation here http://py-neuromodulation.readthedocs.io for example usage and parametrization.
112
+ Find the documentation here neuromodulation.github.io/py_neuromodulation/ for example usage and parametrization.
112
113
 
113
114
  Installation
114
115
  ============
@@ -119,25 +120,15 @@ py_neuromodulation requires at least python 3.10. For installation you can use p
119
120
 
120
121
  pip install py-neuromodulation
121
122
 
122
- Alternatively you can also install the package in a conda environment:
123
+ Alternatively you can also clone the pacakge and install it using `uv <https://docs.astral.sh/uv/>`_:
123
124
 
124
125
  .. code-block::
125
126
 
126
- conda create -n pynm-test python=3.11
127
- conda activate pynm-test
127
+ uv python install 3.10
128
+ uv venv
129
+ . .venv/bin/activate
130
+ uv sync
128
131
 
129
- Then install the packages listed in the `pyproject.toml`:
130
-
131
- .. code-block::
132
-
133
- pip install .
134
-
135
-
136
- Optionally the ipython kernel can be specified for the installed pynm-test conda environment:
137
-
138
- .. code-block::
139
-
140
- ipython kernel install --user --name=pynm-test
141
132
 
142
133
  Then *py_neuromodulation* can be imported via:
143
134
 
@@ -29,7 +29,7 @@ The original intention for writing this toolbox was movement decoding from invas
29
29
  The application however could be any neural decoding problem.
30
30
  *py_neuromodulation* offers wrappers around common practice machine learning methods for efficient analysis.
31
31
 
32
- Find the documentation here http://py-neuromodulation.readthedocs.io for example usage and parametrization.
32
+ Find the documentation here neuromodulation.github.io/py_neuromodulation/ for example usage and parametrization.
33
33
 
34
34
  Installation
35
35
  ============
@@ -40,25 +40,15 @@ py_neuromodulation requires at least python 3.10. For installation you can use p
40
40
 
41
41
  pip install py-neuromodulation
42
42
 
43
- Alternatively you can also install the package in a conda environment:
43
+ Alternatively you can also clone the pacakge and install it using `uv <https://docs.astral.sh/uv/>`_:
44
44
 
45
45
  .. code-block::
46
46
 
47
- conda create -n pynm-test python=3.11
48
- conda activate pynm-test
47
+ uv python install 3.10
48
+ uv venv
49
+ . .venv/bin/activate
50
+ uv sync
49
51
 
50
- Then install the packages listed in the `pyproject.toml`:
51
-
52
- .. code-block::
53
-
54
- pip install .
55
-
56
-
57
- Optionally the ipython kernel can be specified for the installed pynm-test conda environment:
58
-
59
- .. code-block::
60
-
61
- ipython kernel install --user --name=pynm-test
62
52
 
63
53
  Then *py_neuromodulation* can be imported via:
64
54
 
@@ -193,6 +193,7 @@ coherence_settings:
193
193
  method:
194
194
  coh: true
195
195
  icoh: true
196
+ nperseg: 128
196
197
 
197
198
  fooof_settings:
198
199
  aperiodic:
@@ -96,11 +96,8 @@ class Bispectra(NMFeature):
96
96
  def calc_feature(self, data: np.ndarray) -> dict:
97
97
  from pybispectra import compute_fft, WaveShape
98
98
 
99
- # PyBispectra's compute_fft uses PQDM to parallelize the calculation per channel
100
- # Is this necessary? Maybe the overhead of parallelization is not worth it
101
- # considering that we incur in it once per batch of data
102
99
  fft_coeffs, freqs = compute_fft(
103
- data=np.expand_dims(data, axis=(0)),
100
+ data=np.expand_dims(data, axis=0),
104
101
  sampling_freq=self.sfreq,
105
102
  n_points=data.shape[1],
106
103
  verbose=False,
@@ -127,12 +124,11 @@ class Bispectra(NMFeature):
127
124
  f1s=tuple(self.settings.f1s), # type: ignore
128
125
  f2s=tuple(self.settings.f2s), # type: ignore
129
126
  )
127
+ waveshape = waveshape.results.get_results(copy=False) # can overwrite obj with array
130
128
 
131
129
  feature_results = {}
132
130
  for ch_idx, ch_name in enumerate(self.ch_names):
133
- bispectrum = waveshape._bicoherence[
134
- ch_idx
135
- ] # Same as waveshape.results._data, skips a copy
131
+ bispectrum = waveshape[ch_idx]
136
132
 
137
133
  for component in self.settings.components.get_enabled():
138
134
  spectrum_ch = COMPONENT_DICT[component](bispectrum)
@@ -26,7 +26,7 @@ class CoherenceFeatures(BoolSelector):
26
26
  mean_fband: bool = True
27
27
  max_fband: bool = True
28
28
  max_allfbands: bool = True
29
-
29
+
30
30
 
31
31
  ListOfTwoStr = Annotated[list[str], Field(min_length=2, max_length=2)]
32
32
 
@@ -35,6 +35,7 @@ class CoherenceSettings(NMBaseModel):
35
35
  features: CoherenceFeatures = CoherenceFeatures()
36
36
  method: CoherenceMethods = CoherenceMethods()
37
37
  channels: list[ListOfTwoStr] = []
38
+ nperseg: int = Field(default=128, ge=0)
38
39
  frequency_bands: list[str] = Field(default=["high_beta"], min_length=1)
39
40
 
40
41
  @field_validator("frequency_bands")
@@ -49,6 +50,7 @@ class CoherenceObject:
49
50
  window: str,
50
51
  fbands: list[FrequencyRange],
51
52
  fband_names: list[str],
53
+ nperseg: int,
52
54
  ch_1_name: str,
53
55
  ch_2_name: str,
54
56
  ch_1_idx: int,
@@ -65,6 +67,7 @@ class CoherenceObject:
65
67
  self.ch_2 = ch_2_name
66
68
  self.ch_1_idx = ch_1_idx
67
69
  self.ch_2_idx = ch_2_idx
70
+ self.nperseg = nperseg
68
71
  self.coh = coh
69
72
  self.icoh = icoh
70
73
  self.features_coh = features_coh
@@ -79,14 +82,15 @@ class CoherenceObject:
79
82
  def get_coh(self, feature_results, x, y):
80
83
  from scipy.signal import welch, csd
81
84
 
82
- self.f, self.Pxx = welch(x, self.sfreq, self.window, nperseg=128)
83
- self.Pyy = welch(y, self.sfreq, self.window, nperseg=128)[1]
84
- self.Pxy = csd(x, y, self.sfreq, self.window, nperseg=128)[1]
85
+ self.f, self.Pxx = welch(x, self.sfreq, self.window, nperseg=self.nperseg)
86
+ self.Pyy = welch(y, self.sfreq, self.window, nperseg=self.nperseg)[1]
87
+ self.Pxy = csd(x, y, self.sfreq, self.window, nperseg=self.nperseg)[1]
85
88
 
86
89
  if self.coh:
87
- self.coh_val = np.abs(self.Pxy**2) / (self.Pxx * self.Pyy)
90
+ # XXX: gives different output to abs(Sxy) / sqrt(Sxx * Syy)
91
+ self.coh_val = np.abs(self.Pxy) ** 2 / (self.Pxx * self.Pyy)
88
92
  if self.icoh:
89
- self.icoh_val = np.array(self.Pxy / (self.Pxx * self.Pyy)).imag
93
+ self.icoh_val = self.Pxy.imag / np.sqrt(self.Pxx * self.Pyy)
90
94
 
91
95
  for coh_idx, coh_type in enumerate([self.coh, self.icoh]):
92
96
  if coh_type:
@@ -180,6 +184,7 @@ class Coherence(NMFeature):
180
184
  "hann",
181
185
  fband_specs,
182
186
  fband_names,
187
+ self.settings.nperseg,
183
188
  ch_1_name,
184
189
  ch_2_name,
185
190
  ch_1_idx,
@@ -4,7 +4,7 @@ requires = ["hatchling"]
4
4
 
5
5
  [project]
6
6
  name = "py_neuromodulation"
7
- version = "0.0.6"
7
+ version = "0.0.7"
8
8
  authors = [{ name = "Timon Merk", email = "timon.merk@charite.de" }]
9
9
  classifiers = [
10
10
  "Development Status :: 2 - Pre-Alpha",
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "mne-bids >= 0.8",
36
36
  "mne-connectivity",
37
37
  "mrmr_selection",
38
- "nolds",
38
+ "nolds >= 0.6.1",
39
39
  "numpy >= 1.21.2",
40
40
  "pandas >= 2.0.0",
41
41
  "scikit-learn >= 0.24.2",
@@ -46,9 +46,11 @@ dependencies = [
46
46
  "pyarrow>=14.0.2",
47
47
  "joblib>=1.3.2",
48
48
  "mne-lsl>=1.2.0",
49
- "pyqt5",
49
+ #"pyqt5",
50
50
  "pydantic>=2.7.3",
51
51
  "seaborn >= 0.11",
52
+ "llvmlite>=0.43.0",
53
+ "numba>=0.60.0",
52
54
  ]
53
55
 
54
56
  [project.optional-dependencies]
@@ -0,0 +1,119 @@
1
+ import numpy as np
2
+ from mne_connectivity import make_signals_in_freq_bands
3
+
4
+ import py_neuromodulation as nm
5
+
6
+
7
+ def test_coherence():
8
+ """Check that coherence features compute properly and match expected values."""
9
+ # Simulate connectivity data (interaction at specified frequency band)
10
+ sfreq = 500 # Hz
11
+ n_epochs = 1
12
+ n_times = sfreq * 2 # samples
13
+ fband = (15, 20) # frequency band of interaction, Hz
14
+ trans = 2 # transition bandwidth of signal, Hz
15
+ delay = 50 # samples
16
+ epochs = make_signals_in_freq_bands(
17
+ n_seeds=1,
18
+ n_targets=1,
19
+ freq_band=fband,
20
+ n_epochs=n_epochs,
21
+ n_times=n_times,
22
+ sfreq=sfreq,
23
+ trans_bandwidth=trans,
24
+ connection_delay=delay,
25
+ ch_names=["seed", "target"],
26
+ snr=0.7, # change here requires change in `signal/noise_con` vars below
27
+ rng_seed=44
28
+ )
29
+
30
+ # Set up py_nm channels info
31
+ ch_names = epochs.ch_names
32
+ ch_types = epochs.get_channel_types()
33
+ channels = nm.utils.set_channels(
34
+ ch_names=ch_names,
35
+ ch_types=ch_types,
36
+ reference="default",
37
+ bads=None,
38
+ new_names="default",
39
+ used_types=tuple(np.unique(ch_types)),
40
+ target_keywords=None,
41
+ )
42
+
43
+ # Set up pn_nm processing settings
44
+ settings = nm.NMSettings.get_default()
45
+ settings.reset()
46
+ settings.features.coherence = True
47
+
48
+ # redefine freq. bands of interest
49
+ # (accounts for signal-noise transition bandwdith when defining frequencies)
50
+ settings.frequency_ranges_hz = {
51
+ "signal": { # strong connectivity expected
52
+ "frequency_low_hz": fband[0],
53
+ "frequency_high_hz": fband[1],
54
+ },
55
+ "noise_low": { # weak connectivity expected from 1 Hz to start of interaction
56
+ "frequency_low_hz": 1,
57
+ "frequency_high_hz": fband[0] - trans * 2,
58
+ },
59
+ "noise_high": { # weak connectivity expected from end of interaction to Nyquist
60
+ "frequency_low_hz": fband[1] + trans * 2,
61
+ "frequency_high_hz": sfreq // 2 - 1,
62
+ },
63
+ }
64
+ settings.coherence_settings.frequency_bands = ["signal", "noise_low", "noise_high"]
65
+
66
+ # only average within each band required
67
+ settings.coherence_settings.features = {
68
+ "mean_fband": True, "max_fband": False, "max_allfbands": False
69
+ }
70
+
71
+ # unique all-to-all connectivity indices, i.e.: ([0], [1])
72
+ # XXX: avoids pydantic ValidationError that lists are too short (length == 1)
73
+ settings.coherence_settings.channels = [ch_names]
74
+
75
+ # do not normalise features for this test!
76
+ # (normalisation changes interpretability of connectivity values, making it harder to
77
+ # define 'expected' connectivity values)
78
+ settings.postprocessing.feature_normalization = False
79
+
80
+ # Set up py_nm stream
81
+ stream = nm.Stream(
82
+ settings=settings,
83
+ channels=channels,
84
+ path_grids=None,
85
+ verbose=True,
86
+ sfreq=epochs.info["sfreq"],
87
+ )
88
+
89
+ # Compute connectivity
90
+ features = stream.run(
91
+ epochs.get_data(copy=False)[0], # extract first (and only) epoch from obj
92
+ out_dir="./test_data",
93
+ experiment_name="test_coherence",
94
+ )
95
+
96
+ # Aggregate results over windows
97
+ results = {key: None for key in features.keys()}
98
+ results.pop("time")
99
+ for key in results.keys():
100
+ # average over windows; take absolute before averaging icoh values
101
+ results[key] = np.abs(features[key].values).mean()
102
+
103
+ node_name = "seed_to_target"
104
+ for con_method in ["coh", "icoh"]:
105
+ # Define expected connectivity values for signal and noise frequencies
106
+ noise_con = 0.15
107
+ signal_con = 0.25
108
+
109
+ # Assert that frequencies of simulated interaction have strong connectivity
110
+ np.testing.assert_array_less(
111
+ signal_con, results[f"{con_method}_{node_name}_mean_fband_signal"]
112
+ )
113
+ # Assert that frequencies of noise have weak connectivity
114
+ np.testing.assert_array_less(
115
+ results[f"{con_method}_{node_name}_mean_fband_noise_low"], noise_con
116
+ )
117
+ np.testing.assert_array_less(
118
+ results[f"{con_method}_{node_name}_mean_fband_noise_high"], noise_con
119
+ )
@@ -1,112 +0,0 @@
1
- bandpass_filter_settings:
2
- bandpower_features: {activity: true, complexity: false, mobility: false}
3
- kalman_filter: false
4
- log_transform: true
5
- segment_lengths_ms: {HFA: 100, alpha: 500, high_beta: 333, high_gamma: 100, low_beta: 333,
6
- low_gamma: 100, theta: 1000}
7
- bispectrum_settings:
8
- bispectrum_features: {mean: true, sum: true, var: true}
9
- components: {absolute: true, imag: true, phase: true, real: true}
10
- compute_features_for_whole_fband_range: true
11
- f1s: {frequency_high_hz: 35.0, frequency_low_hz: 5.0}
12
- f2s: {frequency_high_hz: 35.0, frequency_low_hz: 5.0}
13
- frequency_bands: [theta, alpha, low_beta, high_beta]
14
- burst_settings:
15
- burst_features: {amplitude: true, burst_rate_per_s: true, duration: true, in_burst: true}
16
- frequency_bands: [low_beta, high_beta, low_gamma]
17
- threshold: 75.0
18
- time_duration_s: 30.0
19
- coherence_settings:
20
- channels: []
21
- features: {max_allfbands: true, max_fband: true, mean_fband: true}
22
- frequency_bands: [high_beta]
23
- method: {coh: true, icoh: true}
24
- feature_normalization_settings: {clip: 3.0, normalization_method: zscore, normalization_time_s: 30.0}
25
- features: {bandpass_filter: false, bispectrum: false, bursts: false, coherence: false,
26
- fft: false, fooof: false, linelength: false, mne_connectivity: false, nolds: false,
27
- raw_hjorth: false, return_raw: false, sharpwave_analysis: true, stft: false, welch: false}
28
- fft_settings:
29
- features: {max: false, mean: true, median: false, std: false}
30
- log_transform: true
31
- return_spectrum: false
32
- windowlength_ms: 1000
33
- fooof_settings:
34
- aperiodic: {exponent: true, knee: true, offset: true}
35
- freq_range_hz: {frequency_high_hz: 40.0, frequency_low_hz: 2.0}
36
- knee: true
37
- max_n_peaks: 3
38
- min_peak_height: 0.0
39
- peak_threshold: 2.0
40
- peak_width_limits: {frequency_high_hz: 12.0, frequency_low_hz: 0.5}
41
- periodic: {band_width: false, center_frequency: false, height_over_ap: false}
42
- windowlength_ms: 800.0
43
- frequency_ranges_hz:
44
- HFA: {frequency_high_hz: 400.0, frequency_low_hz: 200.0}
45
- alpha: {frequency_high_hz: 12.0, frequency_low_hz: 8.0}
46
- high_beta: {frequency_high_hz: 35.0, frequency_low_hz: 20.0}
47
- high_gamma: {frequency_high_hz: 200.0, frequency_low_hz: 90.0}
48
- low_beta: {frequency_high_hz: 20.0, frequency_low_hz: 13.0}
49
- low_gamma: {frequency_high_hz: 80.0, frequency_low_hz: 60.0}
50
- theta: {frequency_high_hz: 8.0, frequency_low_hz: 4.0}
51
- kalman_filter_settings:
52
- Tp: 0.1
53
- frequency_bands: [theta, alpha, low_beta, high_beta, low_gamma, high_gamma, HFA]
54
- sigma_v: 1.0
55
- sigma_w: 0.7
56
- mne_connectivity_settings: {method: plv, mode: multitaper}
57
- mne_connectiviy_settings: {method: plv, mode: multitaper}
58
- nolds_settings:
59
- correlation_dimension: false
60
- data:
61
- frequency_bands: [low_beta]
62
- raw: true
63
- detrended_fluctutaion_analysis: false
64
- features: {correlation_dimension: false, detrended_fluctuation_analysis: false,
65
- hurst_exponent: false, lyapunov_exponent: true, sample_entropy: false}
66
- frequency_bands: [low_beta]
67
- hurst_exponent: false
68
- lyapunov_exponent: true
69
- raw: true
70
- sample_entropy: false
71
- postprocessing: {feature_normalization: false, project_cortex: false, project_subcortex: false}
72
- preprocessing: []
73
- preprocessing_filter:
74
- bandpass_filter: true
75
- bandpass_filter_settings: {frequency_high_hz: 200.0, frequency_low_hz: 3.0}
76
- bandstop_filter: true
77
- bandstop_filter_settings: {frequency_high_hz: 160.0, frequency_low_hz: 100.0}
78
- highpass_filter: true
79
- highpass_filter_cutoff_hz: 3.0
80
- lowpass_filter: true
81
- lowpass_filter_cutoff_hz: 200.0
82
- project_cortex_settings: {max_dist_mm: 20.0}
83
- project_subcortex_settings: {max_dist_mm: 5.0}
84
- raw_normalization_settings: {clip: 3.0, normalization_method: zscore, normalization_time_s: 30.0}
85
- raw_resampling_settings: {resample_freq_hz: 1000.0}
86
- sampling_rate_features_hz: 10.0
87
- segment_length_features_ms: 1000.0
88
- sharpwave_analysis_settings:
89
- apply_estimator_between_peaks_and_troughs: true
90
- detect_peaks: {distance_peaks_ms: 10.0, distance_troughs_ms: 5.0, estimate: true}
91
- detect_troughs: {distance_peaks_ms: 5.0, distance_troughs_ms: 10.0, estimate: true}
92
- estimator:
93
- max: [prominence, sharpness]
94
- mean: [interval]
95
- median: []
96
- min: []
97
- var: []
98
- filter_ranges_hz:
99
- - {frequency_high_hz: 80.0, frequency_low_hz: 5.0}
100
- sharpwave_features: {decay_steepness: false, decay_time: false, interval: true,
101
- num_peaks: false, peak_left: false, peak_right: false, prominence: true, rise_steepness: false,
102
- rise_time: false, sharpness: true, slope_ratio: false, trough: false, width: false}
103
- stft_settings:
104
- features: {max: false, mean: true, median: false, std: false}
105
- log_transform: true
106
- return_spectrum: false
107
- windowlength_ms: 500
108
- welch_settings:
109
- features: {max: false, mean: true, median: false, std: false}
110
- log_transform: true
111
- return_spectrum: false
112
- windowlength_ms: 1000
@@ -1,6 +0,0 @@
1
- {
2
- "original_fs": 1000.0,
3
- "final_fs": 1000.0,
4
- "sfreq": 10.0,
5
- "sess_right": null
6
- }