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/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
- )