py-neuromodulation 0.0.3__py3-none-any.whl → 0.0.5__py3-none-any.whl

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 (233) hide show
  1. py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
  2. py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +34 -0
  3. py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +95 -0
  4. py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +107 -0
  5. py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
  6. py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
  7. py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
  8. py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
  9. py_neuromodulation/FieldTrip.py +589 -589
  10. py_neuromodulation/__init__.py +74 -13
  11. py_neuromodulation/_write_example_dataset_helper.py +83 -65
  12. py_neuromodulation/data/README +6 -0
  13. py_neuromodulation/data/dataset_description.json +8 -0
  14. py_neuromodulation/data/participants.json +32 -0
  15. py_neuromodulation/data/participants.tsv +2 -0
  16. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +5 -0
  17. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +11 -0
  18. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +11 -0
  19. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
  20. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +18 -0
  21. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +35 -0
  22. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +13 -0
  23. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +2 -0
  24. py_neuromodulation/grid_cortex.tsv +40 -0
  25. py_neuromodulation/grid_subcortex.tsv +1429 -0
  26. py_neuromodulation/liblsl/libpugixml.so.1.12 +0 -0
  27. py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
  28. py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
  29. py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
  30. py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
  31. py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
  32. py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
  33. py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
  34. py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
  35. py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
  36. py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
  37. py_neuromodulation/nm_IO.py +413 -417
  38. py_neuromodulation/nm_RMAP.py +496 -531
  39. py_neuromodulation/nm_analysis.py +993 -1074
  40. py_neuromodulation/nm_artifacts.py +30 -25
  41. py_neuromodulation/nm_bispectra.py +154 -168
  42. py_neuromodulation/nm_bursts.py +292 -198
  43. py_neuromodulation/nm_coherence.py +251 -205
  44. py_neuromodulation/nm_database.py +149 -0
  45. py_neuromodulation/nm_decode.py +918 -992
  46. py_neuromodulation/nm_define_nmchannels.py +300 -302
  47. py_neuromodulation/nm_features.py +144 -116
  48. py_neuromodulation/nm_filter.py +219 -219
  49. py_neuromodulation/nm_filter_preprocessing.py +79 -91
  50. py_neuromodulation/nm_fooof.py +139 -159
  51. py_neuromodulation/nm_generator.py +45 -37
  52. py_neuromodulation/nm_hjorth_raw.py +52 -73
  53. py_neuromodulation/nm_kalmanfilter.py +71 -58
  54. py_neuromodulation/nm_linelength.py +21 -33
  55. py_neuromodulation/nm_logger.py +66 -0
  56. py_neuromodulation/nm_mne_connectivity.py +149 -112
  57. py_neuromodulation/nm_mnelsl_generator.py +90 -0
  58. py_neuromodulation/nm_mnelsl_stream.py +116 -0
  59. py_neuromodulation/nm_nolds.py +96 -93
  60. py_neuromodulation/nm_normalization.py +173 -214
  61. py_neuromodulation/nm_oscillatory.py +423 -448
  62. py_neuromodulation/nm_plots.py +585 -612
  63. py_neuromodulation/nm_preprocessing.py +83 -0
  64. py_neuromodulation/nm_projection.py +370 -394
  65. py_neuromodulation/nm_rereference.py +97 -95
  66. py_neuromodulation/nm_resample.py +59 -50
  67. py_neuromodulation/nm_run_analysis.py +325 -435
  68. py_neuromodulation/nm_settings.py +289 -68
  69. py_neuromodulation/nm_settings.yaml +244 -0
  70. py_neuromodulation/nm_sharpwaves.py +423 -401
  71. py_neuromodulation/nm_stats.py +464 -480
  72. py_neuromodulation/nm_stream.py +398 -0
  73. py_neuromodulation/nm_stream_abc.py +166 -218
  74. py_neuromodulation/nm_types.py +193 -0
  75. py_neuromodulation/plots/STN_surf.mat +0 -0
  76. py_neuromodulation/plots/Vertices.mat +0 -0
  77. py_neuromodulation/plots/faces.mat +0 -0
  78. py_neuromodulation/plots/grid.mat +0 -0
  79. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info}/METADATA +185 -182
  80. py_neuromodulation-0.0.5.dist-info/RECORD +83 -0
  81. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info}/WHEEL +1 -2
  82. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info/licenses}/LICENSE +21 -21
  83. docs/build/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
  84. docs/build/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -233
  85. docs/build/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  86. docs/build/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
  87. docs/build/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  88. docs/build/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
  89. docs/build/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  90. docs/build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
  91. docs/build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -239
  92. docs/build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  93. docs/build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
  94. docs/build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  95. docs/build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
  96. docs/build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  97. docs/source/_build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -76
  98. docs/source/_build/html/_downloads/0d0d0a76e8f648d5d3cbc47da6351932/plot_real_time_demo.py +0 -97
  99. docs/source/_build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -240
  100. docs/source/_build/html/_downloads/5d73cadc59a8805c47e3b84063afc157/plot_example_BIDS.py +0 -233
  101. docs/source/_build/html/_downloads/7660317fa5a6bfbd12fcca9961457fc4/plot_example_rmap_computing.py +0 -63
  102. docs/source/_build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  103. docs/source/_build/html/_downloads/839e5b319379f7fd9e867deb00fd797f/plot_example_gridPointProjection.py +0 -210
  104. docs/source/_build/html/_downloads/ae8be19afe5e559f011fc9b138968ba0/plot_first_demo.py +0 -192
  105. docs/source/_build/html/_downloads/b8b06cacc17969d3725a0b6f1d7741c5/plot_example_sharpwave_analysis.py +0 -219
  106. docs/source/_build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -121
  107. docs/source/_build/html/_downloads/c31a86c0b68cb4167d968091ace8080d/plot_example_add_feature.py +0 -68
  108. docs/source/_build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  109. docs/source/_build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -189
  110. docs/source/_build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  111. docs/source/auto_examples/plot_0_first_demo.py +0 -189
  112. docs/source/auto_examples/plot_1_example_BIDS.py +0 -240
  113. docs/source/auto_examples/plot_2_example_add_feature.py +0 -76
  114. docs/source/auto_examples/plot_3_example_sharpwave_analysis.py +0 -219
  115. docs/source/auto_examples/plot_4_example_gridPointProjection.py +0 -210
  116. docs/source/auto_examples/plot_5_example_rmap_computing.py +0 -64
  117. docs/source/auto_examples/plot_6_real_time_demo.py +0 -121
  118. docs/source/conf.py +0 -105
  119. examples/plot_0_first_demo.py +0 -189
  120. examples/plot_1_example_BIDS.py +0 -240
  121. examples/plot_2_example_add_feature.py +0 -76
  122. examples/plot_3_example_sharpwave_analysis.py +0 -219
  123. examples/plot_4_example_gridPointProjection.py +0 -210
  124. examples/plot_5_example_rmap_computing.py +0 -64
  125. examples/plot_6_real_time_demo.py +0 -121
  126. packages/realtime_decoding/build/lib/realtime_decoding/__init__.py +0 -4
  127. packages/realtime_decoding/build/lib/realtime_decoding/decoder.py +0 -104
  128. packages/realtime_decoding/build/lib/realtime_decoding/features.py +0 -163
  129. packages/realtime_decoding/build/lib/realtime_decoding/helpers.py +0 -15
  130. packages/realtime_decoding/build/lib/realtime_decoding/run_decoding.py +0 -345
  131. packages/realtime_decoding/build/lib/realtime_decoding/trainer.py +0 -54
  132. packages/tmsi/build/lib/TMSiFileFormats/__init__.py +0 -37
  133. packages/tmsi/build/lib/TMSiFileFormats/file_formats/__init__.py +0 -36
  134. packages/tmsi/build/lib/TMSiFileFormats/file_formats/lsl_stream_writer.py +0 -200
  135. packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_file_writer.py +0 -496
  136. packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_to_edf_converter.py +0 -236
  137. packages/tmsi/build/lib/TMSiFileFormats/file_formats/xdf_file_writer.py +0 -977
  138. packages/tmsi/build/lib/TMSiFileFormats/file_readers/__init__.py +0 -35
  139. packages/tmsi/build/lib/TMSiFileFormats/file_readers/edf_reader.py +0 -116
  140. packages/tmsi/build/lib/TMSiFileFormats/file_readers/poly5reader.py +0 -294
  141. packages/tmsi/build/lib/TMSiFileFormats/file_readers/xdf_reader.py +0 -229
  142. packages/tmsi/build/lib/TMSiFileFormats/file_writer.py +0 -102
  143. packages/tmsi/build/lib/TMSiPlotters/__init__.py +0 -2
  144. packages/tmsi/build/lib/TMSiPlotters/gui/__init__.py +0 -39
  145. packages/tmsi/build/lib/TMSiPlotters/gui/_plotter_gui.py +0 -234
  146. packages/tmsi/build/lib/TMSiPlotters/gui/plotting_gui.py +0 -440
  147. packages/tmsi/build/lib/TMSiPlotters/plotters/__init__.py +0 -44
  148. packages/tmsi/build/lib/TMSiPlotters/plotters/hd_emg_plotter.py +0 -446
  149. packages/tmsi/build/lib/TMSiPlotters/plotters/impedance_plotter.py +0 -589
  150. packages/tmsi/build/lib/TMSiPlotters/plotters/signal_plotter.py +0 -1326
  151. packages/tmsi/build/lib/TMSiSDK/__init__.py +0 -54
  152. packages/tmsi/build/lib/TMSiSDK/device.py +0 -588
  153. packages/tmsi/build/lib/TMSiSDK/devices/__init__.py +0 -34
  154. packages/tmsi/build/lib/TMSiSDK/devices/saga/TMSi_Device_API.py +0 -1764
  155. packages/tmsi/build/lib/TMSiSDK/devices/saga/__init__.py +0 -34
  156. packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_device.py +0 -1366
  157. packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_types.py +0 -520
  158. packages/tmsi/build/lib/TMSiSDK/devices/saga/xml_saga_config.py +0 -165
  159. packages/tmsi/build/lib/TMSiSDK/error.py +0 -95
  160. packages/tmsi/build/lib/TMSiSDK/sample_data.py +0 -63
  161. packages/tmsi/build/lib/TMSiSDK/sample_data_server.py +0 -99
  162. packages/tmsi/build/lib/TMSiSDK/settings.py +0 -45
  163. packages/tmsi/build/lib/TMSiSDK/tmsi_device.py +0 -111
  164. packages/tmsi/build/lib/__init__.py +0 -4
  165. packages/tmsi/build/lib/apex_sdk/__init__.py +0 -34
  166. packages/tmsi/build/lib/apex_sdk/device/__init__.py +0 -41
  167. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API.py +0 -1009
  168. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_enums.py +0 -239
  169. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_structures.py +0 -668
  170. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_device.py +0 -1611
  171. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_dongle.py +0 -38
  172. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_event_reader.py +0 -57
  173. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_channel.py +0 -44
  174. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_config.py +0 -150
  175. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_const.py +0 -36
  176. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_impedance_channel.py +0 -48
  177. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_info.py +0 -108
  178. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/dongle_info.py +0 -39
  179. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/download_measurement.py +0 -77
  180. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/eeg_measurement.py +0 -150
  181. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/impedance_measurement.py +0 -129
  182. packages/tmsi/build/lib/apex_sdk/device/threads/conversion_thread.py +0 -59
  183. packages/tmsi/build/lib/apex_sdk/device/threads/sampling_thread.py +0 -57
  184. packages/tmsi/build/lib/apex_sdk/device/tmsi_channel.py +0 -83
  185. packages/tmsi/build/lib/apex_sdk/device/tmsi_device.py +0 -201
  186. packages/tmsi/build/lib/apex_sdk/device/tmsi_device_enums.py +0 -103
  187. packages/tmsi/build/lib/apex_sdk/device/tmsi_dongle.py +0 -43
  188. packages/tmsi/build/lib/apex_sdk/device/tmsi_event_reader.py +0 -50
  189. packages/tmsi/build/lib/apex_sdk/device/tmsi_measurement.py +0 -118
  190. packages/tmsi/build/lib/apex_sdk/sample_data_server/__init__.py +0 -33
  191. packages/tmsi/build/lib/apex_sdk/sample_data_server/event_data.py +0 -44
  192. packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data.py +0 -50
  193. packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data_server.py +0 -136
  194. packages/tmsi/build/lib/apex_sdk/tmsi_errors/error.py +0 -126
  195. packages/tmsi/build/lib/apex_sdk/tmsi_sdk.py +0 -113
  196. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/apex/apex_structure_generator.py +0 -134
  197. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/decorators.py +0 -60
  198. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/logger_filter.py +0 -42
  199. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/singleton.py +0 -42
  200. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/support_functions.py +0 -72
  201. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/tmsi_logger.py +0 -98
  202. py_neuromodulation/nm_EpochStream.py +0 -92
  203. py_neuromodulation/nm_across_patient_decoding.py +0 -927
  204. py_neuromodulation/nm_cohortwrapper.py +0 -435
  205. py_neuromodulation/nm_eval_timing.py +0 -239
  206. py_neuromodulation/nm_features_abc.py +0 -39
  207. py_neuromodulation/nm_stream_offline.py +0 -358
  208. py_neuromodulation/utils/_logging.py +0 -24
  209. py_neuromodulation-0.0.3.dist-info/RECORD +0 -188
  210. py_neuromodulation-0.0.3.dist-info/top_level.txt +0 -5
  211. tests/__init__.py +0 -0
  212. tests/conftest.py +0 -117
  213. tests/test_all_examples.py +0 -10
  214. tests/test_all_features.py +0 -63
  215. tests/test_bispectra.py +0 -70
  216. tests/test_bursts.py +0 -105
  217. tests/test_feature_sampling_rates.py +0 -143
  218. tests/test_fooof.py +0 -16
  219. tests/test_initalization_offline_stream.py +0 -41
  220. tests/test_multiprocessing.py +0 -58
  221. tests/test_nan_values.py +0 -29
  222. tests/test_nm_filter.py +0 -95
  223. tests/test_nm_resample.py +0 -63
  224. tests/test_normalization_settings.py +0 -146
  225. tests/test_notch_filter.py +0 -31
  226. tests/test_osc_features.py +0 -424
  227. tests/test_preprocessing_filter.py +0 -151
  228. tests/test_rereference.py +0 -171
  229. tests/test_sampling.py +0 -57
  230. tests/test_settings_change_after_init.py +0 -76
  231. tests/test_sharpwave.py +0 -165
  232. tests/test_target_channel_add.py +0 -100
  233. tests/test_timing.py +0 -80
tests/conftest.py DELETED
@@ -1,117 +0,0 @@
1
- import pytest
2
- import numpy as np
3
-
4
- from py_neuromodulation import (
5
- nm_generator,
6
- nm_stream_offline,
7
- nm_settings,
8
- nm_IO,
9
- nm_define_nmchannels,
10
- )
11
-
12
-
13
- @pytest.fixture
14
- def setup_default_stream_fast_compute():
15
- """This test function sets a data batch and automatic initialized M1 datafram
16
-
17
- Args:
18
- PATH_PYNEUROMODULATION (string): Path to py_neuromodulation repository
19
-
20
- Returns:
21
- ieeg_batch (np.ndarray): (channels, samples)
22
- df_M1 (pd Dataframe): auto intialized table for rereferencing
23
- settings_wrapper (settings.py): settings.json
24
- fs (float): example sampling frequency
25
- """
26
-
27
- (
28
- RUN_NAME,
29
- PATH_RUN,
30
- PATH_BIDS,
31
- PATH_OUT,
32
- datatype,
33
- ) = nm_IO.get_paths_example_data()
34
-
35
- (
36
- raw,
37
- data,
38
- sfreq,
39
- line_noise,
40
- coord_list,
41
- coord_names,
42
- ) = nm_IO.read_BIDS_data(
43
- PATH_RUN=PATH_RUN, BIDS_PATH=PATH_BIDS, datatype=datatype
44
- )
45
-
46
- nm_channels = nm_define_nmchannels.set_channels(
47
- ch_names=raw.ch_names,
48
- ch_types=raw.get_channel_types(),
49
- reference="default",
50
- bads=raw.info["bads"],
51
- new_names="default",
52
- used_types=("ecog", "dbs", "seeg"),
53
- target_keywords=("MOV_RIGHT_CLEAN",),
54
- )
55
-
56
- settings = nm_settings.get_default_settings()
57
- settings = nm_settings.reset_settings(settings)
58
- settings["fooof"]["aperiodic"]["exponent"] = True
59
- settings["fooof"]["aperiodic"]["offset"] = True
60
- settings["features"]["fooof"] = True
61
-
62
- stream = nm_stream_offline.Stream(
63
- settings=settings,
64
- nm_channels=nm_channels,
65
- path_grids=None,
66
- verbose=True,
67
- sfreq=sfreq,
68
- line_noise=line_noise,
69
- coord_list=coord_list,
70
- coord_names=coord_names,
71
- )
72
-
73
- return data, stream
74
-
75
-
76
- @pytest.fixture
77
- def setup_databatch():
78
- """This test function sets a data batch and automatic initialized M1 datafram
79
-
80
- Args:
81
- PATH_PYNEUROMODULATION (string): Path to py_neuromodulation repository
82
-
83
- Returns:
84
- ieeg_batch (np.ndarray): (channels, samples)
85
- df_M1 (pd Dataframe): auto intialized table for rereferencing
86
- settings_wrapper (settings.py): settings.json
87
- fs (float): example sampling frequency
88
- """
89
-
90
- (
91
- RUN_NAME,
92
- PATH_RUN,
93
- PATH_BIDS,
94
- PATH_OUT,
95
- datatype,
96
- ) = nm_IO.get_paths_example_data()
97
-
98
- (
99
- raw,
100
- data,
101
- sfreq,
102
- line_noise,
103
- coord_list,
104
- coord_names,
105
- ) = nm_IO.read_BIDS_data(
106
- PATH_RUN=PATH_RUN, BIDS_PATH=PATH_BIDS, datatype=datatype
107
- )
108
-
109
- settings = nm_settings.get_default_settings()
110
- settings = nm_settings.set_settings_fast_compute(settings)
111
-
112
- generator = nm_generator.raw_data_generator(
113
- data, settings, int(np.floor(sfreq))
114
- )
115
- data_batch = next(generator, None)
116
-
117
- return [raw.ch_names, raw.get_channel_types(), raw.info["bads"], data_batch]
@@ -1,10 +0,0 @@
1
- from pathlib import Path
2
- import pytest
3
- import subprocess
4
- import runpy
5
-
6
-
7
- @pytest.mark.parametrize("example_filename", Path("examples").glob("*.py"))
8
- def test_run_through_all_test(example_filename):
9
- print(f"Running {example_filename}")
10
- runpy.run_path(example_filename)
@@ -1,63 +0,0 @@
1
- import numpy as np
2
- import pandas as pd
3
- import pytest
4
-
5
- from py_neuromodulation import (
6
- nm_settings,
7
- nm_stream_offline,
8
- nm_define_nmchannels,
9
- nm_stream_abc,
10
- )
11
-
12
-
13
- def get_example_stream(test_arr: np.array) -> nm_stream_abc.PNStream:
14
- settings = nm_settings.get_default_settings()
15
- settings["features"]["raw_hjorth"] = True
16
- settings["features"]["return_raw"] = True
17
- settings["features"]["bandpass_filter"] = True
18
- settings["features"]["stft"] = True
19
- settings["features"]["fft"] = True
20
- settings["features"]["sharpwave_analysis"] = True
21
- settings["features"]["fooof"] = True
22
- settings["features"]["bursts"] = True
23
- settings["features"]["linelength"] = True
24
- settings["features"]["nolds"] = False
25
- settings["features"]["mne_connectivity"] = False
26
- settings["features"]["coherence"] = False
27
-
28
- nm_channels = nm_define_nmchannels.get_default_channels_from_data(test_arr)
29
-
30
- stream = nm_stream_offline.Stream(
31
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
32
- )
33
- return stream
34
-
35
-
36
- def test_all_features_random_array():
37
- """This test runs's through all enabled features, and check's if they break
38
- """
39
- np.random.seed(0)
40
- arr = np.random.random([2, 2000])
41
- stream = get_example_stream(arr)
42
-
43
- df = stream.run(arr)
44
-
45
- assert df.shape[0] != 0 # terrible test
46
-
47
-
48
- def test_all_features_zero_array():
49
-
50
- arr = np.zeros([2, 2000])
51
- stream = get_example_stream(arr)
52
-
53
- df = stream.run(arr)
54
-
55
-
56
- def test_all_features_NaN_array():
57
-
58
- arr = np.empty([2, 2000])
59
- arr[:] = np.nan
60
-
61
- stream = get_example_stream(arr)
62
-
63
- df = stream.run(arr)
tests/test_bispectra.py DELETED
@@ -1,70 +0,0 @@
1
- import pytest
2
- import mne
3
- import numpy as np
4
-
5
- from py_neuromodulation import (
6
- nm_analysis,
7
- nm_decode,
8
- nm_define_nmchannels,
9
- nm_IO,
10
- nm_plots,
11
- nm_settings,
12
- nm_stream_offline,
13
- )
14
-
15
-
16
- def test_bispectrum():
17
- (
18
- RUN_NAME,
19
- PATH_RUN,
20
- PATH_BIDS,
21
- PATH_OUT,
22
- datatype,
23
- ) = nm_IO.get_paths_example_data()
24
-
25
- (
26
- raw,
27
- data,
28
- sfreq,
29
- line_noise,
30
- coord_list,
31
- coord_names,
32
- ) = nm_IO.read_BIDS_data(
33
- PATH_RUN=PATH_RUN, BIDS_PATH=PATH_BIDS, datatype=datatype
34
- )
35
-
36
- ch_names = raw.ch_names[4]
37
- ch_types = raw.get_channel_types()[4]
38
-
39
- nm_channels = nm_define_nmchannels.set_channels(
40
- ch_names=[ch_names],
41
- ch_types=[ch_types],
42
- reference="default",
43
- bads=None,
44
- new_names="default",
45
- used_types=("ecog", "dbs", "seeg"),
46
- target_keywords=("MOV_RIGHT_CLEAN",),
47
- )
48
-
49
- settings = nm_settings.get_default_settings()
50
- settings = nm_settings.reset_settings(settings)
51
-
52
- settings["features"]["bispectrum"] = True
53
-
54
- stream = nm_stream_offline.Stream(
55
- settings=settings,
56
- nm_channels=nm_channels,
57
- path_grids=None,
58
- verbose=True,
59
- sfreq=sfreq,
60
- line_noise=line_noise,
61
- coord_list=coord_list,
62
- coord_names=coord_names,
63
- )
64
-
65
- features = stream.run(np.expand_dims(data[3, :], axis=0))
66
-
67
- assert (
68
- features["ECOG_RIGHT_1_Bispectrum_phase_mean_whole_fband_range"].sum()
69
- != 0
70
- )
tests/test_bursts.py DELETED
@@ -1,105 +0,0 @@
1
- import pytest
2
- import numpy as np
3
- from py_neuromodulation import (
4
- nm_bursts,
5
- nm_settings,
6
- nm_stream_offline,
7
- nm_define_nmchannels,
8
- )
9
-
10
-
11
- def test_init_wrong_fband():
12
- settings = nm_settings.get_default_settings()
13
- settings["burst_settings"]["frequency_bands"] = ["wrong_band"]
14
- with pytest.raises(Exception):
15
- nm_bursts.Burst.test_settings(
16
- settings,
17
- [
18
- "ch1",
19
- "ch2",
20
- ],
21
- 1000,
22
- )
23
-
24
-
25
- def test_init_wrong_treshold():
26
- settings = nm_settings.get_default_settings()
27
- settings["burst_settings"]["threshold"] = -1
28
- with pytest.raises(Exception):
29
- nm_bursts.Burst.test_settings(
30
- settings,
31
- [
32
- "ch1",
33
- "ch2",
34
- ],
35
- 1000,
36
- )
37
-
38
-
39
- def test_init_wrong_timeduration():
40
- settings = nm_settings.get_default_settings()
41
- settings["burst_settings"]["time_duration_s"] = -1
42
- with pytest.raises(Exception):
43
- nm_bursts.Burst.test_settings(
44
- settings,
45
- [
46
- "ch1",
47
- "ch2",
48
- ],
49
- 1000,
50
- )
51
-
52
-
53
- def test_init_wrong_burst_feature_init():
54
- settings = nm_settings.get_default_settings()
55
- settings["burst_settings"]["burst_features"]["duration"] = -1
56
- with pytest.raises(Exception):
57
- nm_bursts.Burst.test_settings(
58
- settings,
59
- [
60
- "ch1",
61
- "ch2",
62
- ],
63
- 1000,
64
- )
65
-
66
-
67
- def test_bursting_duration():
68
- np.random.seed(0)
69
- settings = nm_settings.get_default_settings()
70
- settings["features"]["bursts"] = True
71
- settings["postprocessing"]["feature_normalization"] = False
72
- TIME_DURATION = 10
73
- sfreq = 1000
74
- NUM_CH = 1
75
- time_points_beta = np.arange(0, 1, 1 / sfreq)
76
- beta_freq = 18
77
-
78
- beta_wave = np.sin(2 * np.pi * beta_freq * time_points_beta)
79
-
80
- ch_names = ["ch0"]
81
-
82
- bursts = nm_bursts.Burst(settings, ch_names, sfreq)
83
-
84
- for _ in range(10):
85
- np.random.seed(0)
86
- data = np.random.random([NUM_CH, 1 * sfreq])
87
- f = bursts.calc_feature(data, {})
88
-
89
- np.random.seed(0)
90
- # the percentile of the hilbert transform of a continuous oscillation will be high
91
- # select better max amplitude
92
- bursts = nm_bursts.Burst(settings, ch_names, sfreq)
93
- f_burst = bursts.calc_feature(
94
- beta_wave + np.random.random([NUM_CH, 1 * sfreq]), {}
95
- )
96
-
97
- assert (
98
- f["ch0_bursts_low beta_amplitude_max"]
99
- < f_burst["ch0_bursts_low beta_amplitude_max"]
100
- )
101
-
102
- assert (
103
- f["ch0_bursts_low beta_duration_max"]
104
- < f_burst["ch0_bursts_low beta_duration_max"]
105
- )
@@ -1,143 +0,0 @@
1
- import numpy as np
2
- import pandas as pd
3
- import pytest
4
-
5
- from py_neuromodulation import (
6
- nm_settings,
7
- nm_stream_offline,
8
- nm_define_nmchannels,
9
- nm_stream_abc,
10
- )
11
-
12
-
13
- def get_example_settings(test_arr: np.array) -> nm_stream_abc.PNStream:
14
- settings = nm_settings.set_settings_fast_compute(
15
- nm_settings.get_default_settings()
16
- )
17
-
18
- nm_channels = nm_define_nmchannels.get_default_channels_from_data(test_arr)
19
-
20
- return settings, nm_channels
21
-
22
-
23
- def test_different_sampling_rate_100Hz():
24
- sampling_rate_features = 100
25
-
26
- arr_test = np.random.random([2, 1020])
27
- settings, nm_channels = get_example_settings(arr_test)
28
-
29
- settings["sampling_rate_features_hz"] = sampling_rate_features
30
- stream = nm_stream_offline.Stream(
31
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
32
- )
33
-
34
- df = stream.run(arr_test)
35
-
36
- # check the difference between time points
37
-
38
- assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
39
-
40
-
41
- def test_different_sampling_rate_10Hz():
42
- sampling_rate_features = 10
43
-
44
- arr_test = np.random.random([2, 1200])
45
- settings, nm_channels = get_example_settings(arr_test)
46
-
47
- settings["sampling_rate_features_hz"] = sampling_rate_features
48
- stream = nm_stream_offline.Stream(
49
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
50
- )
51
-
52
- df = stream.run(arr_test)
53
-
54
- # check the difference between time points
55
-
56
- assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
57
-
58
-
59
- def test_different_sampling_rate_1Hz():
60
- sampling_rate_features = 1
61
-
62
- arr_test = np.random.random([2, 3000])
63
- settings, nm_channels = get_example_settings(arr_test)
64
-
65
- settings["sampling_rate_features_hz"] = sampling_rate_features
66
- stream = nm_stream_offline.Stream(
67
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
68
- )
69
-
70
- df = stream.run(arr_test)
71
-
72
- # check the difference between time points
73
-
74
- assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
75
-
76
-
77
- def test_different_sampling_rate_0DOT1Hz():
78
- sampling_rate_features = 0.1
79
-
80
- arr_test = np.random.random([2, 30000])
81
- settings, nm_channels = get_example_settings(arr_test)
82
-
83
- settings["sampling_rate_features_hz"] = sampling_rate_features
84
- stream = nm_stream_offline.Stream(
85
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
86
- )
87
-
88
- df = stream.run(arr_test)
89
-
90
- # check the difference between time points
91
-
92
- assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
93
-
94
-
95
- def test_wrong_initalization_of_segment_length_features_ms_and_osc_window_length():
96
- segment_length_features_ms = 800
97
-
98
- arr_test = np.random.random([2, 1200])
99
- settings, nm_channels = get_example_settings(arr_test)
100
-
101
- settings["segment_length_features_ms"] = 800
102
- settings["fft_settings"]["windowlength_ms"] = 1000
103
-
104
- with pytest.raises(Exception):
105
- stream = nm_stream_offline.Stream(
106
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
107
- )
108
-
109
-
110
- def test_different_segment_lengths():
111
- segment_length_features_ms = 800
112
-
113
- arr_test = np.random.random([2, 1200])
114
- settings, nm_channels = get_example_settings(arr_test)
115
-
116
- settings["segment_length_features_ms"] = segment_length_features_ms
117
- settings["fft_settings"]["windowlength_ms"] = segment_length_features_ms
118
-
119
- stream = nm_stream_offline.Stream(
120
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
121
- )
122
-
123
- df_seglength_800 = stream.run(arr_test)
124
-
125
- segment_length_features_ms = 1000
126
-
127
- arr_test = np.random.random([2, 1200])
128
- settings, nm_channels = get_example_settings(arr_test)
129
-
130
- settings["segment_length_features_ms"] = segment_length_features_ms
131
- settings["fft_settings"]["windowlength_ms"] = segment_length_features_ms
132
-
133
- stream = nm_stream_offline.Stream(
134
- sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
135
- )
136
-
137
- df_seglength_1000 = stream.run(arr_test)
138
- # check the difference between time points
139
-
140
- assert (
141
- df_seglength_1000.iloc[0]["ch0-avgref_fft_theta_mean"]
142
- != df_seglength_800.iloc[0]["ch0-avgref_fft_theta_mean"]
143
- )
tests/test_fooof.py DELETED
@@ -1,16 +0,0 @@
1
- from py_neuromodulation import nm_generator
2
-
3
-
4
- def test_fooof_features(setup_default_stream_fast_compute):
5
-
6
- data, stream = setup_default_stream_fast_compute
7
-
8
- generator = nm_generator.raw_data_generator(
9
- data, stream.settings, stream.sfreq
10
- )
11
- data_batch = next(generator, None)
12
- feature_series = stream.run_analysis.process(data_batch)
13
- # since the settings can define searching for "max_n_peaks" peaks
14
- # there can be None's in the feature_series
15
- # with a non successful fit, aperiodic features can also be None
16
- assert feature_series is not None
@@ -1,41 +0,0 @@
1
- import numpy as np
2
- import pytest
3
-
4
- import py_neuromodulation as nm
5
-
6
-
7
- def test_stream_init():
8
- """Test if stream initialization with passed data will setup nm_channels correctly"""
9
- np.random.seed(0)
10
- data = np.random.random((10, 1000))
11
- sfreq = 100
12
- stream = nm.Stream(sfreq=sfreq, data=data, sampling_rate_features_hz=11)
13
-
14
- assert stream.nm_channels.shape[0] == 10
15
- assert stream.settings["sampling_rate_features_hz"] == 11
16
-
17
-
18
- def test_stream_init_no_sfreq():
19
- """Check if stream initialization without sfreq will raise an error"""
20
- np.random.seed(0)
21
- data = np.random.random((10, 1000))
22
- with pytest.raises(Exception):
23
- nm.Stream(data=data, sampling_rate_features_hz=11)
24
-
25
-
26
- def test_init_warning_no_used_channel():
27
- """Check if a warning is raised when a stream is initialized with nm_channels, but no row has used == 1 and target == 0"""
28
- np.random.seed(0)
29
- data = np.random.random((10, 1000))
30
- sfreq = 1000
31
- stream = nm.Stream(sfreq=sfreq, data=data, sampling_rate_features_hz=11)
32
- channels = stream.nm_channels
33
- channels["used"] = 0
34
-
35
- with pytest.raises(Exception):
36
- nm.Stream(
37
- sfreq=sfreq,
38
- data=data,
39
- nm_channels=channels,
40
- sampling_rate_features_hz=11,
41
- )
@@ -1,58 +0,0 @@
1
- import py_neuromodulation as pn
2
- import numpy as np
3
- from py_neuromodulation import nm_settings
4
- import pytest
5
-
6
-
7
- @pytest.fixture
8
- def get_stream():
9
- NUM_CHANNELS = 10
10
- NUM_DATA = 10000
11
- sfreq = 1000 # Hz
12
- sampling_rate_features_hz = 3 # Hz
13
-
14
- data = np.random.random([NUM_CHANNELS, NUM_DATA])
15
-
16
- stream = pn.Stream(
17
- sfreq=sfreq,
18
- data=data,
19
- sampling_rate_features_hz=sampling_rate_features_hz,
20
- )
21
- stream.nm_channels.loc[0, "target"] = 1
22
- stream.nm_channels.loc[0, "used"] = 0
23
- stream.settings["postprocessing"]["feature_normalization"] = False
24
- stream.settings["segment_length_features_ms"] = 5000
25
- for feature in stream.settings["features"]:
26
- stream.settings["features"][feature] = False
27
- stream.settings["features"]["nolds"] = False
28
- stream.settings["features"]["fooof"] = True
29
- stream.settings["features"]["bursts"] = False
30
- stream.settings["features"]["mne_connectivity"] = False
31
- stream.settings["coherence"]["channels"] = [["ch1", "ch2"]]
32
- return stream
33
-
34
-
35
- def test_setting_exception(get_stream):
36
- stream = get_stream
37
- stream.settings["features"]["burst"] = True
38
-
39
- with pytest.raises(Exception) as e_info:
40
- stream.run(parallel=True, n_jobs=-1)
41
-
42
-
43
- def test_multiprocessing_and_sequntial_features(get_stream):
44
- stream_seq = get_stream
45
- features_sequential = stream_seq.run(parallel=False)
46
-
47
- stream_par = get_stream
48
- features_multiprocessing = stream_par.run(parallel=True, n_jobs=-1)
49
-
50
- for column in features_sequential.columns:
51
- if "fooof" in column:
52
- # fooof results are different in multiprocessing and sequential processing
53
- # This tests fails on Linux and Windows but passes on Mac OS; no idea why
54
- continue
55
-
56
- assert features_sequential[column].equals(
57
- features_multiprocessing[column]
58
- ), f"Column {column} is not equal between sequential and parallel dataframes computation"
tests/test_nan_values.py DELETED
@@ -1,29 +0,0 @@
1
- import numpy as np
2
-
3
- import py_neuromodulation as nm
4
-
5
-
6
- def test_stream_with_none_data():
7
- """Test if passing None as the data to a Stream object results in None features."""
8
-
9
- fs = 1000
10
- data = np.random.random([2, 2000])
11
- data[0, :] = None
12
-
13
- stream = nm.Stream(fs, data)
14
-
15
- features = stream.run(data)
16
-
17
- # assert if all features if name ch0 are None
18
- assert len(
19
- [f for f in features.columns if "ch0" in f and features[f].isna().all()]
20
- ) == len([f for f in features if "ch0" in f])
21
-
22
- # and check if all features of the second channel are not None
23
- assert len(
24
- [
25
- f
26
- for f in features.columns
27
- if "ch1" in f and features[f].notna().all()
28
- ]
29
- ) == len([f for f in features if "ch1" in f])