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,236 +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 ${poly5_to_edf_converter.py}
26
- * @brief Poly5 to EDF converter
27
- *
28
- */
29
-
30
-
31
- """
32
-
33
- import sys
34
- import numpy as np
35
- import tkinter as tk
36
- from tkinter import filedialog
37
- import os
38
-
39
- from os.path import join, dirname, realpath
40
-
41
- Reader_dir = dirname(realpath(__file__)) # directory of this file
42
- modules_dir = join(Reader_dir, "../../") # directory with all modules
43
-
44
- from TMSiFileFormats.file_readers import Poly5Reader
45
- from scipy.signal import sosfiltfilt, butter
46
- from EDFlib.edfwriter import EDFwriter
47
-
48
-
49
- class Poly5_to_EDF_Converter:
50
- def __init__(self, batch=None, filename=None, foldername=None, f_c=0.1):
51
- """Converts poly5-file(s) to edf format. Either a single file or all
52
- poly5 files in a folder and its subfolders.
53
- batch: True or False: convert batch of files or single file
54
- filename: full path to file
55
- foldername: full path to folder
56
- f_c: single value or list of two values; cut-off frequency/frequencies of high pass or bandpass filter"""
57
- self.f_c = f_c
58
- if not batch:
59
- if filename == None:
60
- root = tk.Tk()
61
- filename = filedialog.askopenfilename()
62
- root.withdraw()
63
- self.convertFile(filename)
64
- else:
65
- if foldername == None:
66
- root = tk.Tk()
67
- foldername = filedialog.askdirectory()
68
- root.withdraw()
69
- n_poly5 = 0
70
- conversion_files = []
71
- for root, dirs, files in os.walk(foldername):
72
- for file in files:
73
- if file.endswith(".poly5") or file.endswith(".Poly5"):
74
- n_poly5 = n_poly5 + 1
75
- edf_filename = file.replace("poly5", "edf")
76
- edf_filename = edf_filename.replace("Poly5", "edf")
77
- if not os.path.isfile(os.path.join(root, edf_filename)):
78
- conversion_files.append(os.path.join(root, file))
79
- print("Convert all poly5-files in folder and subfolders to edf")
80
- print("\tFolder: ", foldername)
81
- print("\tTotal number of poly5-files: ", n_poly5)
82
- print(
83
- "\tFiles already converted: ", n_poly5 - len(conversion_files)
84
- )
85
- print("\tFiles to be converted: ", len(conversion_files))
86
- for i in range(len(conversion_files)):
87
- print("\n\nConvert file ", i + 1, "of", len(conversion_files))
88
- self.convertFile(conversion_files[i])
89
-
90
- def convertFile(self, filename):
91
- self._readData(filename)
92
- self._remove_empty_samples()
93
- self._filter_data()
94
- self._write_edf_meta_data()
95
- self._write_edf_data()
96
-
97
- def _readData(self, filename):
98
- self.data = Poly5Reader(filename)
99
- self.fs = self.data.sample_rate
100
- self.n_signals = len(self.data.samples)
101
-
102
- self.n_analogue = 0
103
- for chan in range(0, self.n_signals):
104
- if "Volt" in self.data.ch_unit_names[chan]:
105
- # analogue channels
106
- self.n_analogue = self.n_analogue + 1
107
-
108
- def _remove_empty_samples(self):
109
- """remove padding zeros, based on COUNTER channel"""
110
- empty_samples = list(np.where(self.data.samples[-1, :] == 0)[0])
111
- self.data.samples = np.delete(self.data.samples, empty_samples, axis=1)
112
-
113
- def _filter_data(self):
114
- """low-pass filter data of analogue channels to remove offset and drift"""
115
- if not isinstance(self.f_c, list):
116
- print(
117
- "Data is low-pass filtered with cut-off frequency ",
118
- self.f_c,
119
- "Hz",
120
- )
121
- sos = butter(
122
- 1, self.f_c / (self.fs / 2), btype="highpass", output="sos"
123
- )
124
- self.data.samples[: self.n_analogue, :] = sosfiltfilt(
125
- sos, self.data.samples[: self.n_analogue, :]
126
- )
127
- else:
128
- print(
129
- "Data is band-pass filtered with cut-off frequencies ",
130
- self.f_c[0],
131
- "Hz and",
132
- self.f_c[1],
133
- "Hz",
134
- )
135
- sos = butter(
136
- 1,
137
- [self.f_c[0] / (self.fs / 2), self.f_c[1] / (self.fs / 2)],
138
- btype="bandpass",
139
- output="sos",
140
- )
141
- self.data.samples[: self.n_analogue, :] = sosfiltfilt(
142
- sos, self.data.samples[: self.n_analogue, :]
143
- )
144
-
145
- def _write_edf_meta_data(self):
146
- """ "write edf meta-data to file"""
147
- self.edf_filename = self.data.filename.replace("poly5", "edf")
148
- self.edf_filename = self.edf_filename.replace("Poly5", "edf")
149
- print("Writing to file ", self.edf_filename)
150
-
151
- self.hdl = EDFwriter(
152
- self.edf_filename, EDFwriter.EDFLIB_FILETYPE_EDFPLUS, self.n_signals
153
- )
154
-
155
- for chan in range(0, self.n_signals):
156
- # write sample frequency, channel name and dimension
157
- self.hdl.setSampleFrequency(chan, self.fs)
158
- self.hdl.setSignalLabel(chan, self.data.ch_names[chan])
159
- self.hdl.setPhysicalDimension(chan, self.data.ch_unit_names[chan])
160
-
161
- # write minima and maxima
162
- if max(self.data.samples[chan, :]) == min(
163
- self.data.samples[chan, :]
164
- ):
165
- self.hdl.setPhysicalMaximum(
166
- chan, max(self.data.samples[chan, :]) + 100
167
- )
168
- self.hdl.setPhysicalMinimum(
169
- chan, min(self.data.samples[chan, :])
170
- )
171
- self.hdl.setDigitalMaximum(chan, 32767)
172
- self.hdl.setDigitalMinimum(chan, -32768)
173
- elif "V" in self.data.ch_unit_names[chan]:
174
- # analogue channels
175
- self.hdl.setPhysicalMaximum(
176
- chan, max(self.data.samples[chan, :])
177
- )
178
- self.hdl.setPhysicalMinimum(
179
- chan, min(self.data.samples[chan, :])
180
- )
181
- self.hdl.setDigitalMaximum(chan, 32767)
182
- self.hdl.setDigitalMinimum(chan, -32768)
183
- if not isinstance(self.f_c, list):
184
- self.hdl.setPreFilter(chan, "HP:" + str(self.f_c) + "Hz")
185
- else:
186
- self.hdl.setPreFilter(
187
- chan,
188
- "HP:"
189
- + str(self.f_c[0])
190
- + "Hz LP:"
191
- + str(self.f_c[1])
192
- + "Hz",
193
- )
194
- elif "count" in self.data.ch_names[chan].lower():
195
- # counter channel
196
- self.hdl.setPhysicalMaximum(chan, self.fs)
197
- self.hdl.setPhysicalMinimum(chan, 0)
198
- self.hdl.setDigitalMaximum(chan, self.fs)
199
- self.hdl.setDigitalMinimum(chan, 0)
200
- else:
201
- # other digital channels
202
- self.hdl.setPhysicalMaximum(
203
- chan, max(self.data.samples[chan, :])
204
- )
205
- if min(self.data.samples[chan, :]) < 0:
206
- self.hdl.setPhysicalMinimum(
207
- chan, min(self.data.samples[chan, :])
208
- )
209
- else:
210
- self.hdl.setPhysicalMinimum(chan, 0)
211
- self.hdl.setDigitalMaximum(chan, 32767)
212
- self.hdl.setDigitalMinimum(chan, -32768)
213
-
214
- def _write_edf_data(self):
215
- """write data to edf-file"""
216
- n_blocks = np.int64(
217
- np.floor((np.size(self.data.samples) / self.n_signals) / self.fs)
218
- )
219
- fs = self.fs
220
-
221
- for i in range(0, n_blocks):
222
- for j in range(0, self.n_signals - 1):
223
-
224
- self.hdl.writeSamples(
225
- self.data.samples[j, i * self.fs : (i + 1) * fs]
226
- )
227
-
228
- j = j + 1
229
- self.hdl.writeSamples(
230
- self.data.samples[j, i * fs : (i + 1) * fs] % fs
231
- )
232
-
233
- print("\rProgress: % 0.1f %%" % (100 * i / n_blocks), end="\r")
234
-
235
- self.hdl.close()
236
- print("Done writing data")