py-neuromodulation 0.0.3__py3-none-any.whl → 0.0.4__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 (176) 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 +106 -0
  4. py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +119 -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/data/README +6 -0
  10. py_neuromodulation/data/dataset_description.json +8 -0
  11. py_neuromodulation/data/participants.json +32 -0
  12. py_neuromodulation/data/participants.tsv +2 -0
  13. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +5 -0
  14. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +11 -0
  15. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +11 -0
  16. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
  17. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +18 -0
  18. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +35 -0
  19. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +13 -0
  20. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +2 -0
  21. py_neuromodulation/grid_cortex.tsv +40 -0
  22. py_neuromodulation/grid_subcortex.tsv +1429 -0
  23. py_neuromodulation/nm_settings.json +338 -0
  24. py_neuromodulation/nm_stream_offline.py +7 -6
  25. py_neuromodulation/plots/STN_surf.mat +0 -0
  26. py_neuromodulation/plots/Vertices.mat +0 -0
  27. py_neuromodulation/plots/faces.mat +0 -0
  28. py_neuromodulation/plots/grid.mat +0 -0
  29. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.4.dist-info}/METADATA +182 -182
  30. py_neuromodulation-0.0.4.dist-info/RECORD +72 -0
  31. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.4.dist-info}/WHEEL +1 -2
  32. docs/build/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
  33. docs/build/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -233
  34. docs/build/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  35. docs/build/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
  36. docs/build/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  37. docs/build/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
  38. docs/build/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  39. docs/build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
  40. docs/build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -239
  41. docs/build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  42. docs/build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
  43. docs/build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  44. docs/build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
  45. docs/build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  46. docs/source/_build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -76
  47. docs/source/_build/html/_downloads/0d0d0a76e8f648d5d3cbc47da6351932/plot_real_time_demo.py +0 -97
  48. docs/source/_build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -240
  49. docs/source/_build/html/_downloads/5d73cadc59a8805c47e3b84063afc157/plot_example_BIDS.py +0 -233
  50. docs/source/_build/html/_downloads/7660317fa5a6bfbd12fcca9961457fc4/plot_example_rmap_computing.py +0 -63
  51. docs/source/_build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  52. docs/source/_build/html/_downloads/839e5b319379f7fd9e867deb00fd797f/plot_example_gridPointProjection.py +0 -210
  53. docs/source/_build/html/_downloads/ae8be19afe5e559f011fc9b138968ba0/plot_first_demo.py +0 -192
  54. docs/source/_build/html/_downloads/b8b06cacc17969d3725a0b6f1d7741c5/plot_example_sharpwave_analysis.py +0 -219
  55. docs/source/_build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -121
  56. docs/source/_build/html/_downloads/c31a86c0b68cb4167d968091ace8080d/plot_example_add_feature.py +0 -68
  57. docs/source/_build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  58. docs/source/_build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -189
  59. docs/source/_build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  60. docs/source/auto_examples/plot_0_first_demo.py +0 -189
  61. docs/source/auto_examples/plot_1_example_BIDS.py +0 -240
  62. docs/source/auto_examples/plot_2_example_add_feature.py +0 -76
  63. docs/source/auto_examples/plot_3_example_sharpwave_analysis.py +0 -219
  64. docs/source/auto_examples/plot_4_example_gridPointProjection.py +0 -210
  65. docs/source/auto_examples/plot_5_example_rmap_computing.py +0 -64
  66. docs/source/auto_examples/plot_6_real_time_demo.py +0 -121
  67. docs/source/conf.py +0 -105
  68. examples/plot_0_first_demo.py +0 -189
  69. examples/plot_1_example_BIDS.py +0 -240
  70. examples/plot_2_example_add_feature.py +0 -76
  71. examples/plot_3_example_sharpwave_analysis.py +0 -219
  72. examples/plot_4_example_gridPointProjection.py +0 -210
  73. examples/plot_5_example_rmap_computing.py +0 -64
  74. examples/plot_6_real_time_demo.py +0 -121
  75. packages/realtime_decoding/build/lib/realtime_decoding/__init__.py +0 -4
  76. packages/realtime_decoding/build/lib/realtime_decoding/decoder.py +0 -104
  77. packages/realtime_decoding/build/lib/realtime_decoding/features.py +0 -163
  78. packages/realtime_decoding/build/lib/realtime_decoding/helpers.py +0 -15
  79. packages/realtime_decoding/build/lib/realtime_decoding/run_decoding.py +0 -345
  80. packages/realtime_decoding/build/lib/realtime_decoding/trainer.py +0 -54
  81. packages/tmsi/build/lib/TMSiFileFormats/__init__.py +0 -37
  82. packages/tmsi/build/lib/TMSiFileFormats/file_formats/__init__.py +0 -36
  83. packages/tmsi/build/lib/TMSiFileFormats/file_formats/lsl_stream_writer.py +0 -200
  84. packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_file_writer.py +0 -496
  85. packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_to_edf_converter.py +0 -236
  86. packages/tmsi/build/lib/TMSiFileFormats/file_formats/xdf_file_writer.py +0 -977
  87. packages/tmsi/build/lib/TMSiFileFormats/file_readers/__init__.py +0 -35
  88. packages/tmsi/build/lib/TMSiFileFormats/file_readers/edf_reader.py +0 -116
  89. packages/tmsi/build/lib/TMSiFileFormats/file_readers/poly5reader.py +0 -294
  90. packages/tmsi/build/lib/TMSiFileFormats/file_readers/xdf_reader.py +0 -229
  91. packages/tmsi/build/lib/TMSiFileFormats/file_writer.py +0 -102
  92. packages/tmsi/build/lib/TMSiPlotters/__init__.py +0 -2
  93. packages/tmsi/build/lib/TMSiPlotters/gui/__init__.py +0 -39
  94. packages/tmsi/build/lib/TMSiPlotters/gui/_plotter_gui.py +0 -234
  95. packages/tmsi/build/lib/TMSiPlotters/gui/plotting_gui.py +0 -440
  96. packages/tmsi/build/lib/TMSiPlotters/plotters/__init__.py +0 -44
  97. packages/tmsi/build/lib/TMSiPlotters/plotters/hd_emg_plotter.py +0 -446
  98. packages/tmsi/build/lib/TMSiPlotters/plotters/impedance_plotter.py +0 -589
  99. packages/tmsi/build/lib/TMSiPlotters/plotters/signal_plotter.py +0 -1326
  100. packages/tmsi/build/lib/TMSiSDK/__init__.py +0 -54
  101. packages/tmsi/build/lib/TMSiSDK/device.py +0 -588
  102. packages/tmsi/build/lib/TMSiSDK/devices/__init__.py +0 -34
  103. packages/tmsi/build/lib/TMSiSDK/devices/saga/TMSi_Device_API.py +0 -1764
  104. packages/tmsi/build/lib/TMSiSDK/devices/saga/__init__.py +0 -34
  105. packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_device.py +0 -1366
  106. packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_types.py +0 -520
  107. packages/tmsi/build/lib/TMSiSDK/devices/saga/xml_saga_config.py +0 -165
  108. packages/tmsi/build/lib/TMSiSDK/error.py +0 -95
  109. packages/tmsi/build/lib/TMSiSDK/sample_data.py +0 -63
  110. packages/tmsi/build/lib/TMSiSDK/sample_data_server.py +0 -99
  111. packages/tmsi/build/lib/TMSiSDK/settings.py +0 -45
  112. packages/tmsi/build/lib/TMSiSDK/tmsi_device.py +0 -111
  113. packages/tmsi/build/lib/__init__.py +0 -4
  114. packages/tmsi/build/lib/apex_sdk/__init__.py +0 -34
  115. packages/tmsi/build/lib/apex_sdk/device/__init__.py +0 -41
  116. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API.py +0 -1009
  117. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_enums.py +0 -239
  118. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_structures.py +0 -668
  119. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_device.py +0 -1611
  120. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_dongle.py +0 -38
  121. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_event_reader.py +0 -57
  122. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_channel.py +0 -44
  123. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_config.py +0 -150
  124. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_const.py +0 -36
  125. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_impedance_channel.py +0 -48
  126. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_info.py +0 -108
  127. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/dongle_info.py +0 -39
  128. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/download_measurement.py +0 -77
  129. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/eeg_measurement.py +0 -150
  130. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/impedance_measurement.py +0 -129
  131. packages/tmsi/build/lib/apex_sdk/device/threads/conversion_thread.py +0 -59
  132. packages/tmsi/build/lib/apex_sdk/device/threads/sampling_thread.py +0 -57
  133. packages/tmsi/build/lib/apex_sdk/device/tmsi_channel.py +0 -83
  134. packages/tmsi/build/lib/apex_sdk/device/tmsi_device.py +0 -201
  135. packages/tmsi/build/lib/apex_sdk/device/tmsi_device_enums.py +0 -103
  136. packages/tmsi/build/lib/apex_sdk/device/tmsi_dongle.py +0 -43
  137. packages/tmsi/build/lib/apex_sdk/device/tmsi_event_reader.py +0 -50
  138. packages/tmsi/build/lib/apex_sdk/device/tmsi_measurement.py +0 -118
  139. packages/tmsi/build/lib/apex_sdk/sample_data_server/__init__.py +0 -33
  140. packages/tmsi/build/lib/apex_sdk/sample_data_server/event_data.py +0 -44
  141. packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data.py +0 -50
  142. packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data_server.py +0 -136
  143. packages/tmsi/build/lib/apex_sdk/tmsi_errors/error.py +0 -126
  144. packages/tmsi/build/lib/apex_sdk/tmsi_sdk.py +0 -113
  145. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/apex/apex_structure_generator.py +0 -134
  146. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/decorators.py +0 -60
  147. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/logger_filter.py +0 -42
  148. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/singleton.py +0 -42
  149. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/support_functions.py +0 -72
  150. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/tmsi_logger.py +0 -98
  151. py_neuromodulation-0.0.3.dist-info/RECORD +0 -188
  152. py_neuromodulation-0.0.3.dist-info/top_level.txt +0 -5
  153. tests/__init__.py +0 -0
  154. tests/conftest.py +0 -117
  155. tests/test_all_examples.py +0 -10
  156. tests/test_all_features.py +0 -63
  157. tests/test_bispectra.py +0 -70
  158. tests/test_bursts.py +0 -105
  159. tests/test_feature_sampling_rates.py +0 -143
  160. tests/test_fooof.py +0 -16
  161. tests/test_initalization_offline_stream.py +0 -41
  162. tests/test_multiprocessing.py +0 -58
  163. tests/test_nan_values.py +0 -29
  164. tests/test_nm_filter.py +0 -95
  165. tests/test_nm_resample.py +0 -63
  166. tests/test_normalization_settings.py +0 -146
  167. tests/test_notch_filter.py +0 -31
  168. tests/test_osc_features.py +0 -424
  169. tests/test_preprocessing_filter.py +0 -151
  170. tests/test_rereference.py +0 -171
  171. tests/test_sampling.py +0 -57
  172. tests/test_settings_change_after_init.py +0 -76
  173. tests/test_sharpwave.py +0 -165
  174. tests/test_target_channel_add.py +0 -100
  175. tests/test_timing.py +0 -80
  176. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.4.dist-info/licenses}/LICENSE +0 -0
@@ -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])
tests/test_nm_filter.py DELETED
@@ -1,95 +0,0 @@
1
- """Test the nm_filter module."""
2
- import numpy as np
3
- from py_neuromodulation import nm_filter
4
- import pytest
5
-
6
-
7
- class TestMNEFilterData:
8
- """Test filter_data method of MNEFilter class."""
9
-
10
- @pytest.mark.parametrize(
11
- "filter_length",
12
- ["500ms", "999ms", "1999ms", "3999ms", "2s"],
13
- )
14
- def test_filter_length(self, filter_length) -> None:
15
- """Test different filter lengths."""
16
- f_ranges = [
17
- [13, 35],
18
- ]
19
- sfreq = 4000
20
- duration = 10
21
- times = np.linspace(0, duration, int(duration * sfreq))
22
- bandpass_filter = nm_filter.MNEFilter(
23
- f_ranges=f_ranges,
24
- sfreq=sfreq,
25
- filter_length=filter_length,
26
- l_trans_bandwidth=8, # transition bandwidth needs to be adjusted for smaller filter length
27
- h_trans_bandwidth=8,
28
- verbose=None,
29
- )
30
- oscill_freqs = 50
31
- data = np.sin(2 * np.pi * times * oscill_freqs)
32
- data_filtered = bandpass_filter.filter_data(data)
33
- assert data_filtered.shape == (
34
- 1,
35
- len(f_ranges),
36
- duration * sfreq,
37
- )
38
-
39
- def test_filter_1d(self) -> None:
40
- """Test filtering of 1d array with multiple frequency ranges."""
41
- f_ranges = [
42
- [4, 8],
43
- [8, 12],
44
- [13, 35],
45
- [60, 200],
46
- [200, 500],
47
- ]
48
- sfreq = 4000
49
- duration = 10
50
- times = np.linspace(0, duration, int(duration * sfreq))
51
- bandpass_filter = nm_filter.MNEFilter(
52
- f_ranges=f_ranges,
53
- sfreq=sfreq,
54
- filter_length="999ms",
55
- l_trans_bandwidth=4,
56
- h_trans_bandwidth=4,
57
- verbose=None,
58
- )
59
- oscill_freqs = 50
60
- data = np.sin(2 * np.pi * times * oscill_freqs)
61
- data_filtered = bandpass_filter.filter_data(data)
62
- assert data_filtered.shape == (
63
- 1,
64
- len(f_ranges),
65
- duration * sfreq,
66
- )
67
-
68
- def test_filter_2d(self) -> None:
69
- """Test filtering of 2d array with multiple frequency ranges and multiple channels."""
70
- f_ranges = [
71
- [4, 8],
72
- [8, 12],
73
- [13, 35],
74
- [60, 200],
75
- [200, 500],
76
- ]
77
- sfreq = 4000
78
- duration = 10
79
- times = np.linspace(0, duration, int(duration * sfreq))
80
- bandpass_filter = nm_filter.MNEFilter(
81
- f_ranges=f_ranges,
82
- sfreq=sfreq,
83
- filter_length="999ms",
84
- l_trans_bandwidth=4,
85
- h_trans_bandwidth=4,
86
- verbose=None,
87
- )
88
- oscill_freqs = np.expand_dims(np.arange(10, 51, 10), axis=-1)
89
- data = np.sin(2 * np.pi * times * oscill_freqs)
90
- data_filtered = bandpass_filter.filter_data(data)
91
- assert data_filtered.shape == (
92
- oscill_freqs.shape[0],
93
- len(f_ranges),
94
- duration * sfreq,
95
- )
tests/test_nm_resample.py DELETED
@@ -1,63 +0,0 @@
1
- """Test the nm_resample module."""
2
- import numpy as np
3
-
4
- from py_neuromodulation import nm_resample
5
-
6
-
7
- def test_upsample():
8
- """Test case where data is upsampled."""
9
- sfreq_old = 4000.0
10
- duration = 10
11
- times = np.linspace(0, duration, int(duration * sfreq_old))
12
- oscill_freqs = np.expand_dims(np.arange(10, 51, 10), axis=-1)
13
- data = np.sin(2 * np.pi * times * oscill_freqs)
14
-
15
- sfreq_new = 1000.0
16
- resample = nm_resample.Resampler(
17
- resample_freq_hz=sfreq_new,
18
- sfreq=sfreq_old,
19
- )
20
- data_resampled = resample.process(data)
21
- assert data_resampled.shape[-1] == int(duration * sfreq_new)
22
- # This test only works when ratio of old and new sfreq is an integer
23
- # It will also only work up to a certain decimal precision.
24
- resampled_naive = data[..., :: int(sfreq_old / sfreq_new)]
25
- np.testing.assert_array_almost_equal(
26
- data[..., :: int(sfreq_old / sfreq_new)],
27
- resampled_naive,
28
- decimal=2,
29
- )
30
-
31
-
32
- def test_downsample():
33
- """Test case where data is downsampled."""
34
- sfreq_old = 1000.0
35
- duration = 10
36
- times = np.linspace(0, duration, int(duration * sfreq_old))
37
- oscill_freqs = np.expand_dims(np.arange(10, 51, 10), axis=-1)
38
- data = np.sin(2 * np.pi * times * oscill_freqs)
39
-
40
- sfreq_new = 4000.0
41
- resample = nm_resample.Resampler(
42
- resample_freq_hz=sfreq_new,
43
- sfreq=sfreq_old,
44
- )
45
- data_resampled = resample.process(data)
46
- assert data_resampled.shape[-1] == int(duration * sfreq_new)
47
-
48
-
49
- def test_no_resample():
50
- """Test case where no resampling is performed."""
51
- sfreq_old = 1000.0
52
- duration = 10
53
- times = np.linspace(0, duration, int(duration * sfreq_old))
54
- oscill_freqs = np.expand_dims(np.arange(10, 51, 10), axis=-1)
55
- data = np.sin(2 * np.pi * times * oscill_freqs)
56
-
57
- sfreq_new = 1000.0
58
- resample = nm_resample.Resampler(
59
- resample_freq_hz=sfreq_new,
60
- sfreq=sfreq_old,
61
- )
62
- data_resampled = resample.process(data)
63
- np.testing.assert_array_almost_equal(data, data_resampled)
@@ -1,146 +0,0 @@
1
- import os
2
- import unittest
3
- import pytest
4
- import numpy as np
5
-
6
- from py_neuromodulation import nm_normalization
7
-
8
-
9
- def test_raw_normalization_init():
10
- with pytest.raises(Exception):
11
- nm_normalization.RawNormalizer(
12
- sfreq=1000,
13
- sampling_rate_features_hz=500,
14
- normalization_method="meann",
15
- normalization_time_s=30,
16
- clip=3,
17
- )
18
-
19
-
20
- def test_feature_normalization_init():
21
- with pytest.raises(Exception):
22
- nm_normalization.FeatureNormalizer(
23
- sampling_rate_features_hz=500,
24
- normalization_method="meann",
25
- normalization_time_s=30,
26
- clip=3,
27
- )
28
-
29
-
30
- def test_process_norm_features():
31
- norm = nm_normalization.FeatureNormalizer(
32
- sampling_rate_features_hz=500,
33
- normalization_method="mean",
34
- normalization_time_s=30,
35
- clip=3,
36
- )
37
- data = np.ones([1, 5])
38
- data_normed = norm.process(data)
39
-
40
- assert np.all(np.isfinite(data_normed) == True)
41
-
42
- assert np.all(np.equal(data, norm.previous) == 1)
43
-
44
-
45
- def test_previous_size_FeatureNorm():
46
- norm = nm_normalization.FeatureNormalizer(
47
- sampling_rate_features_hz=10,
48
- normalization_method="zscore",
49
- normalization_time_s=10,
50
- clip=3,
51
- )
52
-
53
- num_features = 5
54
-
55
- for _ in range(150):
56
- np.random.seed(0)
57
- data = norm.process(np.random.random([1, num_features]))
58
-
59
- assert norm.previous.shape[0] < norm.num_samples_normalize
60
-
61
-
62
- def test_zscore_feature_analysis():
63
- norm = nm_normalization.FeatureNormalizer(
64
- sampling_rate_features_hz=10,
65
- normalization_method="zscore",
66
- normalization_time_s=30,
67
- clip=False,
68
- )
69
-
70
- num_features = 5
71
-
72
- for _ in range(400):
73
- np.random.seed(0)
74
- data_to_norm = np.random.random([1, num_features])
75
- data_normed = norm.process(data_to_norm)
76
-
77
- expect_res = (
78
- norm.previous[:, 0].std() * data_normed[0, 0]
79
- + norm.previous[:, 0].mean()
80
- )
81
-
82
- assert pytest.approx(expect_res, 0.1) == data_to_norm[0, 0]
83
-
84
-
85
- def test_zscore_raw_analysis():
86
- norm = nm_normalization.RawNormalizer(
87
- sampling_rate_features_hz=10,
88
- normalization_method="zscore",
89
- normalization_time_s=30,
90
- sfreq=10,
91
- clip=False,
92
- )
93
-
94
- num_samples = 100
95
-
96
- for _ in range(400):
97
- data_to_norm = np.random.random([1, num_samples])
98
- data_normed = norm.process(data_to_norm)
99
-
100
- expect_res = (
101
- norm.previous[:, 0].std() * data_normed[0, 0]
102
- + norm.previous[:, 0].mean()
103
- )
104
-
105
- np.testing.assert_allclose(
106
- expect_res, data_to_norm[0, 0], rtol=0.1, atol=0.1
107
- )
108
-
109
-
110
- def test_all_norm_methods_raw():
111
- for norm_method in [e.value for e in nm_normalization.NORM_METHODS]:
112
- norm = nm_normalization.RawNormalizer(
113
- sampling_rate_features_hz=10,
114
- normalization_method=norm_method,
115
- normalization_time_s=30,
116
- sfreq=10,
117
- clip=False,
118
- )
119
-
120
- num_samples = 10
121
-
122
- for _ in range(10):
123
- np.random.seed(0)
124
- data_to_norm = np.random.random([1, num_samples])
125
- data_normed = norm.process(data_to_norm)
126
-
127
- assert np.all(np.isfinite(data_normed) == True)
128
-
129
-
130
- def test_all_norm_methods_feature():
131
- for norm_method in [e.value for e in nm_normalization.NORM_METHODS]:
132
- norm = nm_normalization.FeatureNormalizer(
133
- sampling_rate_features_hz=10,
134
- normalization_method=norm_method,
135
- normalization_time_s=30,
136
- clip=False,
137
- )
138
-
139
- num_samples = 10
140
-
141
- for i in range(10):
142
- np.random.seed(i)
143
- data_to_norm = np.random.random([1, num_samples])
144
- data_normed = norm.process(data_to_norm)
145
-
146
- assert np.all(np.isfinite(data_normed) == True)
@@ -1,31 +0,0 @@
1
- import numpy as np
2
- import pytest
3
- from scipy import fft, signal
4
-
5
- from py_neuromodulation import nm_filter
6
-
7
-
8
- def test_notch_filter_setup():
9
-
10
- # by Nyquist theorem, frequencies are computed up to half sfreq
11
- for sfreq in [150, 200, 500, 1000]:
12
- line_noise = 50
13
-
14
- notch_filter = nm_filter.NotchFilter(sfreq, line_noise)
15
-
16
- # the computed filter is saved in self.filter_bank
17
-
18
- data = np.random.random(sfreq)
19
- filtered_dat = notch_filter.process(data)
20
-
21
- Z_filtered = np.abs(fft.rfft(filtered_dat))
22
- Z_nonfiltered = np.abs(fft.rfft(data))
23
- freqs = fft.rfftfreq(sfreq, 1 / sfreq)
24
- idx = (np.abs(freqs - line_noise)).argmin()
25
-
26
- assert np.mean(Z_filtered[idx - 1 : idx + 1]) < np.mean(
27
- Z_nonfiltered[idx - 1 : idx + 1]
28
- ), (
29
- f"testing notch filter with sampling frequency {line_noise} failed"
30
- f" for comparison fft power vs no filtering"
31
- )