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.
- py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
- py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +34 -0
- py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +106 -0
- py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +119 -0
- py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
- py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
- py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
- py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
- py_neuromodulation/data/README +6 -0
- py_neuromodulation/data/dataset_description.json +8 -0
- py_neuromodulation/data/participants.json +32 -0
- py_neuromodulation/data/participants.tsv +2 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +5 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +11 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +11 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +18 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +35 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +13 -0
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +2 -0
- py_neuromodulation/grid_cortex.tsv +40 -0
- py_neuromodulation/grid_subcortex.tsv +1429 -0
- py_neuromodulation/nm_settings.json +338 -0
- py_neuromodulation/nm_stream_offline.py +7 -6
- py_neuromodulation/plots/STN_surf.mat +0 -0
- py_neuromodulation/plots/Vertices.mat +0 -0
- py_neuromodulation/plots/faces.mat +0 -0
- py_neuromodulation/plots/grid.mat +0 -0
- {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.4.dist-info}/METADATA +182 -182
- py_neuromodulation-0.0.4.dist-info/RECORD +72 -0
- {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.4.dist-info}/WHEEL +1 -2
- docs/build/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
- docs/build/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -233
- docs/build/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
- docs/build/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
- docs/build/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
- docs/build/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
- docs/build/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
- docs/build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
- docs/build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -239
- docs/build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
- docs/build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
- docs/build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
- docs/build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
- docs/build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
- docs/source/_build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -76
- docs/source/_build/html/_downloads/0d0d0a76e8f648d5d3cbc47da6351932/plot_real_time_demo.py +0 -97
- docs/source/_build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -240
- docs/source/_build/html/_downloads/5d73cadc59a8805c47e3b84063afc157/plot_example_BIDS.py +0 -233
- docs/source/_build/html/_downloads/7660317fa5a6bfbd12fcca9961457fc4/plot_example_rmap_computing.py +0 -63
- docs/source/_build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
- docs/source/_build/html/_downloads/839e5b319379f7fd9e867deb00fd797f/plot_example_gridPointProjection.py +0 -210
- docs/source/_build/html/_downloads/ae8be19afe5e559f011fc9b138968ba0/plot_first_demo.py +0 -192
- docs/source/_build/html/_downloads/b8b06cacc17969d3725a0b6f1d7741c5/plot_example_sharpwave_analysis.py +0 -219
- docs/source/_build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -121
- docs/source/_build/html/_downloads/c31a86c0b68cb4167d968091ace8080d/plot_example_add_feature.py +0 -68
- docs/source/_build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
- docs/source/_build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -189
- docs/source/_build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
- docs/source/auto_examples/plot_0_first_demo.py +0 -189
- docs/source/auto_examples/plot_1_example_BIDS.py +0 -240
- docs/source/auto_examples/plot_2_example_add_feature.py +0 -76
- docs/source/auto_examples/plot_3_example_sharpwave_analysis.py +0 -219
- docs/source/auto_examples/plot_4_example_gridPointProjection.py +0 -210
- docs/source/auto_examples/plot_5_example_rmap_computing.py +0 -64
- docs/source/auto_examples/plot_6_real_time_demo.py +0 -121
- docs/source/conf.py +0 -105
- examples/plot_0_first_demo.py +0 -189
- examples/plot_1_example_BIDS.py +0 -240
- examples/plot_2_example_add_feature.py +0 -76
- examples/plot_3_example_sharpwave_analysis.py +0 -219
- examples/plot_4_example_gridPointProjection.py +0 -210
- examples/plot_5_example_rmap_computing.py +0 -64
- examples/plot_6_real_time_demo.py +0 -121
- packages/realtime_decoding/build/lib/realtime_decoding/__init__.py +0 -4
- packages/realtime_decoding/build/lib/realtime_decoding/decoder.py +0 -104
- packages/realtime_decoding/build/lib/realtime_decoding/features.py +0 -163
- packages/realtime_decoding/build/lib/realtime_decoding/helpers.py +0 -15
- packages/realtime_decoding/build/lib/realtime_decoding/run_decoding.py +0 -345
- packages/realtime_decoding/build/lib/realtime_decoding/trainer.py +0 -54
- packages/tmsi/build/lib/TMSiFileFormats/__init__.py +0 -37
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/__init__.py +0 -36
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/lsl_stream_writer.py +0 -200
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_file_writer.py +0 -496
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_to_edf_converter.py +0 -236
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/xdf_file_writer.py +0 -977
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/__init__.py +0 -35
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/edf_reader.py +0 -116
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/poly5reader.py +0 -294
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/xdf_reader.py +0 -229
- packages/tmsi/build/lib/TMSiFileFormats/file_writer.py +0 -102
- packages/tmsi/build/lib/TMSiPlotters/__init__.py +0 -2
- packages/tmsi/build/lib/TMSiPlotters/gui/__init__.py +0 -39
- packages/tmsi/build/lib/TMSiPlotters/gui/_plotter_gui.py +0 -234
- packages/tmsi/build/lib/TMSiPlotters/gui/plotting_gui.py +0 -440
- packages/tmsi/build/lib/TMSiPlotters/plotters/__init__.py +0 -44
- packages/tmsi/build/lib/TMSiPlotters/plotters/hd_emg_plotter.py +0 -446
- packages/tmsi/build/lib/TMSiPlotters/plotters/impedance_plotter.py +0 -589
- packages/tmsi/build/lib/TMSiPlotters/plotters/signal_plotter.py +0 -1326
- packages/tmsi/build/lib/TMSiSDK/__init__.py +0 -54
- packages/tmsi/build/lib/TMSiSDK/device.py +0 -588
- packages/tmsi/build/lib/TMSiSDK/devices/__init__.py +0 -34
- packages/tmsi/build/lib/TMSiSDK/devices/saga/TMSi_Device_API.py +0 -1764
- packages/tmsi/build/lib/TMSiSDK/devices/saga/__init__.py +0 -34
- packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_device.py +0 -1366
- packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_types.py +0 -520
- packages/tmsi/build/lib/TMSiSDK/devices/saga/xml_saga_config.py +0 -165
- packages/tmsi/build/lib/TMSiSDK/error.py +0 -95
- packages/tmsi/build/lib/TMSiSDK/sample_data.py +0 -63
- packages/tmsi/build/lib/TMSiSDK/sample_data_server.py +0 -99
- packages/tmsi/build/lib/TMSiSDK/settings.py +0 -45
- packages/tmsi/build/lib/TMSiSDK/tmsi_device.py +0 -111
- packages/tmsi/build/lib/__init__.py +0 -4
- packages/tmsi/build/lib/apex_sdk/__init__.py +0 -34
- packages/tmsi/build/lib/apex_sdk/device/__init__.py +0 -41
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API.py +0 -1009
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_enums.py +0 -239
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_structures.py +0 -668
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_device.py +0 -1611
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_dongle.py +0 -38
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_event_reader.py +0 -57
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_channel.py +0 -44
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_config.py +0 -150
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_const.py +0 -36
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_impedance_channel.py +0 -48
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_info.py +0 -108
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/dongle_info.py +0 -39
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/download_measurement.py +0 -77
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/eeg_measurement.py +0 -150
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/impedance_measurement.py +0 -129
- packages/tmsi/build/lib/apex_sdk/device/threads/conversion_thread.py +0 -59
- packages/tmsi/build/lib/apex_sdk/device/threads/sampling_thread.py +0 -57
- packages/tmsi/build/lib/apex_sdk/device/tmsi_channel.py +0 -83
- packages/tmsi/build/lib/apex_sdk/device/tmsi_device.py +0 -201
- packages/tmsi/build/lib/apex_sdk/device/tmsi_device_enums.py +0 -103
- packages/tmsi/build/lib/apex_sdk/device/tmsi_dongle.py +0 -43
- packages/tmsi/build/lib/apex_sdk/device/tmsi_event_reader.py +0 -50
- packages/tmsi/build/lib/apex_sdk/device/tmsi_measurement.py +0 -118
- packages/tmsi/build/lib/apex_sdk/sample_data_server/__init__.py +0 -33
- packages/tmsi/build/lib/apex_sdk/sample_data_server/event_data.py +0 -44
- packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data.py +0 -50
- packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data_server.py +0 -136
- packages/tmsi/build/lib/apex_sdk/tmsi_errors/error.py +0 -126
- packages/tmsi/build/lib/apex_sdk/tmsi_sdk.py +0 -113
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/apex/apex_structure_generator.py +0 -134
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/decorators.py +0 -60
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/logger_filter.py +0 -42
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/singleton.py +0 -42
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/support_functions.py +0 -72
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/tmsi_logger.py +0 -98
- py_neuromodulation-0.0.3.dist-info/RECORD +0 -188
- py_neuromodulation-0.0.3.dist-info/top_level.txt +0 -5
- tests/__init__.py +0 -0
- tests/conftest.py +0 -117
- tests/test_all_examples.py +0 -10
- tests/test_all_features.py +0 -63
- tests/test_bispectra.py +0 -70
- tests/test_bursts.py +0 -105
- tests/test_feature_sampling_rates.py +0 -143
- tests/test_fooof.py +0 -16
- tests/test_initalization_offline_stream.py +0 -41
- tests/test_multiprocessing.py +0 -58
- tests/test_nan_values.py +0 -29
- tests/test_nm_filter.py +0 -95
- tests/test_nm_resample.py +0 -63
- tests/test_normalization_settings.py +0 -146
- tests/test_notch_filter.py +0 -31
- tests/test_osc_features.py +0 -424
- tests/test_preprocessing_filter.py +0 -151
- tests/test_rereference.py +0 -171
- tests/test_sampling.py +0 -57
- tests/test_settings_change_after_init.py +0 -76
- tests/test_sharpwave.py +0 -165
- tests/test_target_channel_add.py +0 -100
- tests/test_timing.py +0 -80
- {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")
|