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
@@ -1,150 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file eeg_measurement.py
26
- * @brief
27
- * Class to handle the communication with the device for EEG acquisition.
28
- */
29
-
30
-
31
- """
32
-
33
- from copy import deepcopy
34
- from ctypes import *
35
- import time
36
-
37
- from .....tmsi_utilities.tmsi_logger import TMSiLogger as logger
38
- from .....sample_data_server.sample_data_server import SampleDataServer
39
- from .....sample_data_server.sample_data import SampleData
40
- from .....tmsi_utilities import support_functions
41
- from .....tmsi_utilities.decorators import LogPerformances
42
- from ..apex_API_structures import TMSiDevSampleRequest
43
- from ..apex_API_enums import SampleControl, TMSiDeviceRetVal
44
- from ....tmsi_measurement import TMSiMeasurement
45
-
46
-
47
- class EEGMeasurement(TMSiMeasurement):
48
- def __init__(self, dev, name="EEG Measurement"):
49
- super().__init__(dev=dev, name=name)
50
- self._sample_data_buffer = (c_float * self._sample_data_buffer_size)(0)
51
- self._num_samples_per_set = dev.get_num_channels()
52
- self._converter = {}
53
- channels = self._dev.get_device_channels()
54
- for i in range(self._num_samples_per_set):
55
- conversion_factor = 10 ** channels[i].get_channel_exp()
56
- if conversion_factor in self._converter:
57
- self._converter[conversion_factor].append(i)
58
- else:
59
- self._converter[conversion_factor] = [i]
60
-
61
- @LogPerformances
62
- def start(self):
63
- self._dev.reset_device_data_buffer()
64
- measurement_request = TMSiDevSampleRequest()
65
- measurement_request.DisableLiveImp = self._disable_live_impedance
66
- measurement_request.DisableAvrRefCalc = (
67
- self._disable_average_reference_calculation
68
- )
69
- measurement_request.StartStop = SampleControl.StartSampling.value
70
- self._dev.set_device_sampling_request(measurement_request)
71
- self._sampling_thread.start()
72
- self._conversion_thread.start()
73
-
74
- @LogPerformances
75
- def stop(self):
76
- measurement_request = TMSiDevSampleRequest()
77
- measurement_request.DisableLiveImp = self._disable_live_impedance
78
- measurement_request.DisableAvrRefCalc = (
79
- self._disable_average_reference_calculation
80
- )
81
- measurement_request.StartStop = SampleControl.StopSampling.value
82
- self._dev.set_device_sampling_request(measurement_request)
83
- self._sampling_thread.stop()
84
- self._conversion_thread.stop()
85
-
86
- @LogPerformances
87
- def _conversion_function(self):
88
- while not self._conversion_queue.empty():
89
- (
90
- sample_data_buffer,
91
- retrieved_sample_sets,
92
- ) = self._conversion_queue.get()
93
- if retrieved_sample_sets > 0:
94
- sample_mat = support_functions.array_to_matrix(
95
- sample_data_buffer[
96
- : self._num_samples_per_set * retrieved_sample_sets
97
- ],
98
- self._num_samples_per_set,
99
- )
100
- for i in self._float_channels:
101
- sample_mat[i] = support_functions.float_to_uint(
102
- sample_mat[i]
103
- )
104
- for factor in self._converter.keys():
105
- for channel in self._converter[factor]:
106
- sample_mat[channel] = [
107
- i / factor for i in sample_mat[channel]
108
- ]
109
- samples = support_functions.matrix_to_multiplexed_array(
110
- sample_mat
111
- )
112
- samples = [
113
- 0.0 if i == 4294967296000000.0 else i for i in samples
114
- ]
115
- sd = SampleData(
116
- retrieved_sample_sets, self._num_samples_per_set, samples
117
- )
118
- logger().debug(
119
- "Data delivered to sample data server: {} channels, {} samples".format(
120
- self._num_samples_per_set, retrieved_sample_sets
121
- )
122
- )
123
- SampleDataServer().put_sample_data(self._dev.get_id(), sd)
124
-
125
- @LogPerformances
126
- def _sampling_function(self):
127
- ret = self._dev.get_device_data(
128
- pointer(self._sample_data_buffer),
129
- self._sample_data_buffer_size,
130
- pointer(self._retrieved_sample_sets),
131
- pointer(self._retrieved_data_type),
132
- )
133
- if ret == TMSiDeviceRetVal.TMSiStatusOK:
134
- if self._retrieved_sample_sets.value > 0:
135
- self._conversion_queue.put(
136
- (
137
- deepcopy(self._sample_data_buffer),
138
- self._retrieved_sample_sets.value,
139
- )
140
- )
141
- self._tic_timeout = time.perf_counter()
142
- self._empty_read_counter = 0
143
- else:
144
- if self._empty_read_counter == 0:
145
- self._empty_read_counter = 1
146
- if self._download_samples_limit is not None:
147
- self._downloaded_samples += self._retrieved_sample_sets.value
148
- self._download_percentage = (
149
- self._downloaded_samples * 100.0 / self._download_samples_limit
150
- )
@@ -1,129 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file impedance_measurement.py
26
- * @brief
27
- * Class to handle the communication with the device for impedance acquisition.
28
- */
29
-
30
-
31
- """
32
-
33
- from copy import deepcopy
34
- from ctypes import *
35
- import time
36
-
37
- from .....tmsi_utilities.tmsi_logger import TMSiLogger as logger
38
- from .....sample_data_server.sample_data_server import SampleDataServer
39
- from .....sample_data_server.sample_data import SampleData
40
- from .....tmsi_utilities.decorators import LogPerformances
41
- from ..apex_API_structures import TMSiImpedanceSample, TMSiDevImpedanceRequest
42
- from ..apex_API_enums import ImpedanceControl, TMSiDeviceRetVal
43
- from ....tmsi_measurement import TMSiMeasurement
44
-
45
-
46
- class ImpedanceMeasurement(TMSiMeasurement):
47
- def __init__(self, dev, name="Impedance Measurement"):
48
- super().__init__(dev=dev, name=name)
49
- self._sample_data_buffer = (
50
- TMSiImpedanceSample * self._sample_data_buffer_size
51
- )(TMSiImpedanceSample())
52
- self._num_samples_per_set = dev.get_num_impedance_channels()
53
-
54
- @LogPerformances
55
- def _sampling_function(self):
56
- ret = self._dev.get_device_impedance_data(
57
- pointer(self._sample_data_buffer),
58
- self._sample_data_buffer_size,
59
- pointer(self._retrieved_sample_sets),
60
- )
61
- if ret == TMSiDeviceRetVal.TMSiStatusOK:
62
- if self._retrieved_sample_sets.value > 0:
63
- self._conversion_queue.put(
64
- (
65
- deepcopy(self._sample_data_buffer),
66
- self._retrieved_sample_sets.value,
67
- )
68
- )
69
- self._empty_read_counter = 0
70
- else:
71
- if self._empty_read_counter == 0:
72
- self._tic_timeout = time.perf_counter()
73
- self._empty_read_counter += 1
74
-
75
- @LogPerformances
76
- def _conversion_function(self):
77
- while not self._conversion_queue.empty():
78
- (
79
- sample_data_buffer,
80
- retrieved_sample_sets,
81
- ) = self._conversion_queue.get()
82
- if retrieved_sample_sets > 0:
83
- sample_mat = [
84
- sample_data_buffer[
85
- ii : retrieved_sample_sets
86
- * self._num_samples_per_set : self._num_samples_per_set
87
- ]
88
- for ii in range(self._num_samples_per_set)
89
- ]
90
- samples_exploded = [
91
- [
92
- i.ImpedanceRe if ii % 2 == 0 else i.ImpedanceIm
93
- for i in sample_mat[ii // 2]
94
- ]
95
- for ii in range(self._num_samples_per_set * 2)
96
- ]
97
- samples_exploded_inline = [
98
- samples_exploded[i][j]
99
- for j in range(len(samples_exploded[0]))
100
- for i in range(len(samples_exploded))
101
- ]
102
- sd = SampleData(
103
- retrieved_sample_sets,
104
- self._num_samples_per_set * 2,
105
- samples_exploded_inline,
106
- )
107
- logger().debug(
108
- "Data delivered to sample data server: {} channels, {} samples".format(
109
- self._num_samples_per_set, retrieved_sample_sets
110
- )
111
- )
112
- SampleDataServer().put_sample_data(self._dev.get_id(), sd)
113
-
114
- @LogPerformances
115
- def start(self):
116
- self._dev.reset_device_data_buffer()
117
- measurement_request = TMSiDevImpedanceRequest()
118
- measurement_request.StartStop = ImpedanceControl.StartImpedance.value
119
- self._dev.set_device_impedance_request(measurement_request)
120
- self._sampling_thread.start()
121
- self._conversion_thread.start()
122
-
123
- @LogPerformances
124
- def stop(self):
125
- measurement_request = TMSiDevImpedanceRequest()
126
- measurement_request.StartStop = ImpedanceControl.StopImpedance.value
127
- self._dev.set_device_impedance_request(measurement_request)
128
- self._sampling_thread.stop()
129
- self._conversion_thread.stop()
@@ -1,59 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file conversion_thread.py
26
- * @brief
27
- * Conversion Thread interface.
28
- */
29
-
30
-
31
- """
32
-
33
- import threading
34
- import time
35
-
36
-
37
- class ConversionThread(threading.Thread):
38
- def __init__(
39
- self, conversion_function, pause=0.01, name="Conversion Thread"
40
- ):
41
- super().__init__()
42
- self.__name = name
43
- self.__conversion_function = conversion_function
44
- self.__pause = pause
45
-
46
- def get_pause(self):
47
- return self.__pause
48
-
49
- def run(self):
50
- self.__converting = True
51
- while self.__converting:
52
- self.__conversion_function()
53
- time.sleep(self.__pause)
54
-
55
- def set_pause(self, pause):
56
- self.__pause = pause
57
-
58
- def stop(self):
59
- self.__converting = False
@@ -1,57 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file sampling_thread.py
26
- * @brief
27
- * Sampling Thread interface
28
- */
29
-
30
-
31
- """
32
-
33
- import threading
34
- import time
35
-
36
-
37
- class SamplingThread(threading.Thread):
38
- def __init__(self, sampling_function, pause=0.01, name="Sampling Thread"):
39
- super().__init__()
40
- self.__name = name
41
- self.__sampling_function = sampling_function
42
- self.__pause = pause
43
-
44
- def get_pause(self):
45
- return self.__pause
46
-
47
- def run(self):
48
- self.__sampling = True
49
- while self.__sampling:
50
- self.__sampling_function()
51
- time.sleep(self.__pause)
52
-
53
- def set_pause(self, pause):
54
- self.__pause = pause
55
-
56
- def stop(self):
57
- self.__sampling = False
@@ -1,83 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file tmsi_channel.py
26
- * @brief
27
- * TMSi Channel interface.
28
- */
29
-
30
-
31
- """
32
-
33
- from .tmsi_device_enums import ChannelType
34
-
35
-
36
- class TMSiChannel:
37
- def __init__(self):
38
- self._alt_name = "-"
39
- self._chan_divider = -1
40
- self._def_name = "-"
41
- self._enabled = False
42
- self._exp = 0
43
- self._format = 0
44
- self._is_reference = 0
45
- self._imp_divider = -1
46
- self._sample_rate = 0
47
- self._type = ChannelType.unknown
48
- self._unit_name = "-"
49
-
50
- def get_channel_exp(self):
51
- return self._exp
52
-
53
- def get_channel_format(self):
54
- return self._format
55
-
56
- def get_channel_name(self):
57
- return self._alt_name
58
-
59
- def get_channel_type(self):
60
- return self._type
61
-
62
- def get_channel_unit_name(self):
63
- return self._unit_name
64
-
65
- def is_reference(self):
66
- if self._is_reference == 1:
67
- return 1
68
- else:
69
- return 0
70
-
71
- def set_device_channel_information(self):
72
- raise NotImplementedError("method not available for this channel")
73
-
74
- def set_device_channel_names(
75
- self, default_channel_name=None, alternative_channel_name=None
76
- ):
77
- if default_channel_name is not None:
78
- self._def_name = default_channel_name
79
- if alternative_channel_name is not None:
80
- self._alt_name = alternative_channel_name
81
-
82
- def set_device_reference(self, is_reference):
83
- self._is_reference = is_reference
@@ -1,201 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file tmsi_device.py
26
- * @brief
27
- * TMSi Device interface.
28
- */
29
-
30
-
31
- """
32
-
33
-
34
- class TMSiDevice:
35
- def __init__(self):
36
- raise NotImplementedError("method not available for this device")
37
-
38
- def close(*args, **kwargs):
39
- raise NotImplementedError("method not available for this device")
40
-
41
- def discover(*args, **kwargs):
42
- raise NotImplementedError("method not available for this device")
43
-
44
- def download_file_from_device(*args, **kwargs):
45
- raise NotImplementedError("method not available for this device")
46
-
47
- def export_configuration(*args, **kwargs):
48
- raise NotImplementedError("method not available for this device")
49
-
50
- def import_configuration(*args, **kwargs):
51
- raise NotImplementedError("method not available for this device")
52
-
53
- def get_card_recording_config(*args, **kwargs):
54
- raise NotImplementedError("method not available for this device")
55
-
56
- def get_card_status(*args, **kwargs):
57
- raise NotImplementedError("method not available for this device")
58
-
59
- def get_device_active_channels(*args, **kwargs):
60
- raise NotImplementedError("method not available for this device")
61
-
62
- def get_device_card_file_info(*args, **kwargs):
63
- raise NotImplementedError("method not available for this device")
64
-
65
- def get_device_card_file_list(*args, **kwargs):
66
- raise NotImplementedError("method not available for this device")
67
-
68
- def get_device_channels(*args, **kwargs):
69
- raise NotImplementedError("method not available for this device")
70
-
71
- def get_device_data(*args, **kwargs):
72
- raise NotImplementedError("method not available for this device")
73
-
74
- def get_device_handle_value(*args, **kwargs):
75
- raise NotImplementedError("method not available for this device")
76
-
77
- def get_device_impedance_channels(*args, **kwargs):
78
- raise NotImplementedError("method not available for this device")
79
-
80
- def get_device_impedance_data(*args, **kwargs):
81
- raise NotImplementedError("method not available for this device")
82
-
83
- def get_device_info_report(*args, **kwargs):
84
- raise NotImplementedError("method not available for this device")
85
-
86
- def get_device_interface_status(*args, **kwargs):
87
- raise NotImplementedError("method not available for this device")
88
-
89
- def get_device_list(*args, **kwargs):
90
- raise NotImplementedError("method not available for this device")
91
-
92
- def get_device_power_status(*args, **kwargs):
93
- raise NotImplementedError("method not available for this device")
94
-
95
- def get_device_sampling_config(*args, **kwargs):
96
- raise NotImplementedError("method not available for this device")
97
-
98
- def get_device_sampling_frequency(*args, **kwargs):
99
- raise NotImplementedError("method not available for this device")
100
-
101
- def get_device_serial_number(*args, **kwargs):
102
- raise NotImplementedError("method not available for this device")
103
-
104
- def get_device_state(*args, **kwargs):
105
- raise NotImplementedError("method not available for this device")
106
-
107
- def get_device_time(*args, **kwargs):
108
- raise NotImplementedError("method not available for this device")
109
-
110
- def get_device_type(*args, **kwargs):
111
- raise NotImplementedError("method not available for this device")
112
-
113
- def get_dongle_list(*args, **kwargs):
114
- raise NotImplementedError("method not available for this device")
115
-
116
- def get_dongle_serial_number(*args, **kwargs):
117
- raise NotImplementedError("method not available for this device")
118
-
119
- def get_downloaded_percentage(*args, **kwargs):
120
- raise NotImplementedError("method not available for this device")
121
-
122
- def get_dr_interface(*args, **kwargs):
123
- raise NotImplementedError("method not available for this device")
124
-
125
- def get_event(*args, **kwargs):
126
- raise NotImplementedError("method not available for this device")
127
-
128
- def get_event_buffer(*args, **kwargs):
129
- raise NotImplementedError("method not available for this device")
130
-
131
- def get_id(*args, **kwargs):
132
- raise NotImplementedError("method not available for this device")
133
-
134
- def get_live_impedance(*args, **kwargs):
135
- raise NotImplementedError("method not available for this device")
136
-
137
- def get_num_channels(*args, **kwargs):
138
- raise NotImplementedError("method not available for this device")
139
-
140
- def get_num_impedance_channels(*args, **kwargs):
141
- raise NotImplementedError("method not available for this device")
142
-
143
- def get_sdk(*args, **kwargs):
144
- raise NotImplementedError("method not available for this device")
145
-
146
- def open(*args, **kwargs):
147
- raise NotImplementedError("method not available for this device")
148
-
149
- def pair_device(*args, **kwargs):
150
- raise NotImplementedError("method not available for this device")
151
-
152
- def reset_device_card(*args, **kwargs):
153
- raise NotImplementedError("method not available for this device")
154
-
155
- def reset_device_data_buffer(*args, **kwargs):
156
- raise NotImplementedError("method not available for this device")
157
-
158
- def reset_device_event_buffer(*args, **kwargs):
159
- raise NotImplementedError("method not available for this device")
160
-
161
- def reset_to_factory_default(*args, **kwargs):
162
- raise NotImplementedError("method not available for this device")
163
-
164
- def set_card_recording_config(*args, **kwargs):
165
- raise NotImplementedError("method not available for this device")
166
-
167
- def set_device_channel_names(*args, **kwargs):
168
- raise NotImplementedError("method not available for this device")
169
-
170
- def set_device_download_file_request(*args, **kwargs):
171
- raise NotImplementedError("method not available for this device")
172
-
173
- def set_device_impedance_request(*args, **kwargs):
174
- raise NotImplementedError("method not available for this device")
175
-
176
- def set_device_interface(*args, **kwargs):
177
- raise NotImplementedError("method not available for this device")
178
-
179
- def set_device_references(*args, **kwargs):
180
- raise NotImplementedError("method not available for this device")
181
-
182
- def set_device_sampling_config(*args, **kwargs):
183
- raise NotImplementedError("method not available for this device")
184
-
185
- def set_device_sampling_request(*args, **kwargs):
186
- raise NotImplementedError("method not available for this device")
187
-
188
- def set_device_time(*args, **kwargs):
189
- raise NotImplementedError("method not available for this device")
190
-
191
- def start_download_file(*args, **kwargs):
192
- raise NotImplementedError("method not available for this device")
193
-
194
- def start_measurement(*args, **kwargs):
195
- raise NotImplementedError("method not available for this device")
196
-
197
- def stop_download_file(*args, **kwargs):
198
- raise NotImplementedError("method not available for this device")
199
-
200
- def stop_measurement(*args, **kwargs):
201
- raise NotImplementedError("method not available for this device")