py-neuromodulation 0.0.2__py3-none-any.whl → 0.0.3__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.
- docs/build/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +68 -0
- docs/build/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +233 -0
- docs/build/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +219 -0
- docs/build/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +97 -0
- docs/build/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +64 -0
- docs/build/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +192 -0
- docs/build/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +210 -0
- docs/build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +68 -0
- docs/build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +239 -0
- docs/build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +219 -0
- docs/build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +97 -0
- docs/build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +64 -0
- docs/build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +192 -0
- docs/build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +210 -0
- docs/source/_build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +76 -0
- docs/source/_build/html/_downloads/0d0d0a76e8f648d5d3cbc47da6351932/plot_real_time_demo.py +97 -0
- docs/source/_build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +240 -0
- docs/source/_build/html/_downloads/5d73cadc59a8805c47e3b84063afc157/plot_example_BIDS.py +233 -0
- docs/source/_build/html/_downloads/7660317fa5a6bfbd12fcca9961457fc4/plot_example_rmap_computing.py +63 -0
- docs/source/_build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +219 -0
- docs/source/_build/html/_downloads/839e5b319379f7fd9e867deb00fd797f/plot_example_gridPointProjection.py +210 -0
- docs/source/_build/html/_downloads/ae8be19afe5e559f011fc9b138968ba0/plot_first_demo.py +192 -0
- docs/source/_build/html/_downloads/b8b06cacc17969d3725a0b6f1d7741c5/plot_example_sharpwave_analysis.py +219 -0
- docs/source/_build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +121 -0
- docs/source/_build/html/_downloads/c31a86c0b68cb4167d968091ace8080d/plot_example_add_feature.py +68 -0
- docs/source/_build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +64 -0
- docs/source/_build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +189 -0
- docs/source/_build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +210 -0
- docs/source/auto_examples/plot_0_first_demo.py +189 -0
- docs/source/auto_examples/plot_1_example_BIDS.py +240 -0
- docs/source/auto_examples/plot_2_example_add_feature.py +76 -0
- docs/source/auto_examples/plot_3_example_sharpwave_analysis.py +219 -0
- docs/source/auto_examples/plot_4_example_gridPointProjection.py +210 -0
- docs/source/auto_examples/plot_5_example_rmap_computing.py +64 -0
- docs/source/auto_examples/plot_6_real_time_demo.py +121 -0
- docs/source/conf.py +105 -0
- examples/plot_0_first_demo.py +189 -0
- examples/plot_1_example_BIDS.py +240 -0
- examples/plot_2_example_add_feature.py +76 -0
- examples/plot_3_example_sharpwave_analysis.py +219 -0
- examples/plot_4_example_gridPointProjection.py +210 -0
- examples/plot_5_example_rmap_computing.py +64 -0
- examples/plot_6_real_time_demo.py +121 -0
- packages/realtime_decoding/build/lib/realtime_decoding/__init__.py +4 -0
- packages/realtime_decoding/build/lib/realtime_decoding/decoder.py +104 -0
- packages/realtime_decoding/build/lib/realtime_decoding/features.py +163 -0
- packages/realtime_decoding/build/lib/realtime_decoding/helpers.py +15 -0
- packages/realtime_decoding/build/lib/realtime_decoding/run_decoding.py +345 -0
- packages/realtime_decoding/build/lib/realtime_decoding/trainer.py +54 -0
- packages/tmsi/build/lib/TMSiFileFormats/__init__.py +37 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/__init__.py +36 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/lsl_stream_writer.py +200 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_file_writer.py +496 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_to_edf_converter.py +236 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_formats/xdf_file_writer.py +977 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/__init__.py +35 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/edf_reader.py +116 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/poly5reader.py +294 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_readers/xdf_reader.py +229 -0
- packages/tmsi/build/lib/TMSiFileFormats/file_writer.py +102 -0
- packages/tmsi/build/lib/TMSiPlotters/__init__.py +2 -0
- packages/tmsi/build/lib/TMSiPlotters/gui/__init__.py +39 -0
- packages/tmsi/build/lib/TMSiPlotters/gui/_plotter_gui.py +234 -0
- packages/tmsi/build/lib/TMSiPlotters/gui/plotting_gui.py +440 -0
- packages/tmsi/build/lib/TMSiPlotters/plotters/__init__.py +44 -0
- packages/tmsi/build/lib/TMSiPlotters/plotters/hd_emg_plotter.py +446 -0
- packages/tmsi/build/lib/TMSiPlotters/plotters/impedance_plotter.py +589 -0
- packages/tmsi/build/lib/TMSiPlotters/plotters/signal_plotter.py +1326 -0
- packages/tmsi/build/lib/TMSiSDK/__init__.py +54 -0
- packages/tmsi/build/lib/TMSiSDK/device.py +588 -0
- packages/tmsi/build/lib/TMSiSDK/devices/__init__.py +34 -0
- packages/tmsi/build/lib/TMSiSDK/devices/saga/TMSi_Device_API.py +1764 -0
- packages/tmsi/build/lib/TMSiSDK/devices/saga/__init__.py +34 -0
- packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_device.py +1366 -0
- packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_types.py +520 -0
- packages/tmsi/build/lib/TMSiSDK/devices/saga/xml_saga_config.py +165 -0
- packages/tmsi/build/lib/TMSiSDK/error.py +95 -0
- packages/tmsi/build/lib/TMSiSDK/sample_data.py +63 -0
- packages/tmsi/build/lib/TMSiSDK/sample_data_server.py +99 -0
- packages/tmsi/build/lib/TMSiSDK/settings.py +45 -0
- packages/tmsi/build/lib/TMSiSDK/tmsi_device.py +111 -0
- packages/tmsi/build/lib/__init__.py +4 -0
- packages/tmsi/build/lib/apex_sdk/__init__.py +34 -0
- packages/tmsi/build/lib/apex_sdk/device/__init__.py +41 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API.py +1009 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_enums.py +239 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_structures.py +668 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_device.py +1611 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_dongle.py +38 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_event_reader.py +57 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_channel.py +44 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_config.py +150 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_const.py +36 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_impedance_channel.py +48 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_info.py +108 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/dongle_info.py +39 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/download_measurement.py +77 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/eeg_measurement.py +150 -0
- packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/impedance_measurement.py +129 -0
- packages/tmsi/build/lib/apex_sdk/device/threads/conversion_thread.py +59 -0
- packages/tmsi/build/lib/apex_sdk/device/threads/sampling_thread.py +57 -0
- packages/tmsi/build/lib/apex_sdk/device/tmsi_channel.py +83 -0
- packages/tmsi/build/lib/apex_sdk/device/tmsi_device.py +201 -0
- packages/tmsi/build/lib/apex_sdk/device/tmsi_device_enums.py +103 -0
- packages/tmsi/build/lib/apex_sdk/device/tmsi_dongle.py +43 -0
- packages/tmsi/build/lib/apex_sdk/device/tmsi_event_reader.py +50 -0
- packages/tmsi/build/lib/apex_sdk/device/tmsi_measurement.py +118 -0
- packages/tmsi/build/lib/apex_sdk/sample_data_server/__init__.py +33 -0
- packages/tmsi/build/lib/apex_sdk/sample_data_server/event_data.py +44 -0
- packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data.py +50 -0
- packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data_server.py +136 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_errors/error.py +126 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_sdk.py +113 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/apex/apex_structure_generator.py +134 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/decorators.py +60 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/logger_filter.py +42 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/singleton.py +42 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/support_functions.py +72 -0
- packages/tmsi/build/lib/apex_sdk/tmsi_utilities/tmsi_logger.py +98 -0
- py_neuromodulation/{helper.py → _write_example_dataset_helper.py} +1 -1
- py_neuromodulation/nm_EpochStream.py +2 -3
- py_neuromodulation/nm_IO.py +43 -70
- py_neuromodulation/nm_RMAP.py +308 -11
- py_neuromodulation/nm_analysis.py +1 -1
- py_neuromodulation/nm_artifacts.py +25 -0
- py_neuromodulation/nm_bispectra.py +64 -29
- py_neuromodulation/nm_bursts.py +44 -30
- py_neuromodulation/nm_coherence.py +2 -1
- py_neuromodulation/nm_features.py +4 -2
- py_neuromodulation/nm_filter.py +63 -32
- py_neuromodulation/nm_filter_preprocessing.py +91 -0
- py_neuromodulation/nm_fooof.py +47 -29
- py_neuromodulation/nm_mne_connectivity.py +1 -1
- py_neuromodulation/nm_normalization.py +50 -74
- py_neuromodulation/nm_oscillatory.py +151 -31
- py_neuromodulation/nm_plots.py +13 -10
- py_neuromodulation/nm_rereference.py +10 -8
- py_neuromodulation/nm_run_analysis.py +28 -13
- py_neuromodulation/nm_sharpwaves.py +103 -136
- py_neuromodulation/nm_stats.py +44 -30
- py_neuromodulation/nm_stream_abc.py +18 -10
- py_neuromodulation/nm_stream_offline.py +181 -40
- py_neuromodulation/utils/_logging.py +24 -0
- {py_neuromodulation-0.0.2.dist-info → py_neuromodulation-0.0.3.dist-info}/METADATA +182 -142
- py_neuromodulation-0.0.3.dist-info/RECORD +188 -0
- {py_neuromodulation-0.0.2.dist-info → py_neuromodulation-0.0.3.dist-info}/WHEEL +2 -1
- py_neuromodulation-0.0.3.dist-info/top_level.txt +5 -0
- tests/__init__.py +0 -0
- tests/conftest.py +117 -0
- tests/test_all_examples.py +10 -0
- tests/test_all_features.py +63 -0
- tests/test_bispectra.py +70 -0
- tests/test_bursts.py +105 -0
- tests/test_feature_sampling_rates.py +143 -0
- tests/test_fooof.py +16 -0
- tests/test_initalization_offline_stream.py +41 -0
- tests/test_multiprocessing.py +58 -0
- tests/test_nan_values.py +29 -0
- tests/test_nm_filter.py +95 -0
- tests/test_nm_resample.py +63 -0
- tests/test_normalization_settings.py +146 -0
- tests/test_notch_filter.py +31 -0
- tests/test_osc_features.py +424 -0
- tests/test_preprocessing_filter.py +151 -0
- tests/test_rereference.py +171 -0
- tests/test_sampling.py +57 -0
- tests/test_settings_change_after_init.py +76 -0
- tests/test_sharpwave.py +165 -0
- tests/test_target_channel_add.py +100 -0
- tests/test_timing.py +80 -0
- py_neuromodulation/data/README +0 -6
- py_neuromodulation/data/dataset_description.json +0 -8
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/MOV_aligned_features_ch_ECOG_RIGHT_0_all.png +0 -0
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/all_feature_plt.pdf +0 -0
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_FEATURES.csv +0 -182
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_LM_ML_RES.p +0 -0
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_SETTINGS.json +0 -273
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_SIDECAR.json +0 -6
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_decoding_performance.png +0 -0
- py_neuromodulation/data/derivatives/sub-testsub_ses-EphysMedOff_task-gripforce_run-0/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_nm_channels.csv +0 -11
- py_neuromodulation/data/participants.json +0 -32
- py_neuromodulation/data/participants.tsv +0 -2
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +0 -5
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +0 -11
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +0 -11
- 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 +0 -18
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +0 -35
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +0 -13
- py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +0 -2
- py_neuromodulation/grid_cortex.tsv +0 -40
- py_neuromodulation/grid_subcortex.tsv +0 -1429
- py_neuromodulation/nm_settings.json +0 -290
- 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/py_neuromodulation.egg-info/PKG-INFO +0 -104
- py_neuromodulation/py_neuromodulation.egg-info/dependency_links.txt +0 -1
- py_neuromodulation/py_neuromodulation.egg-info/requires.txt +0 -26
- py_neuromodulation/py_neuromodulation.egg-info/top_level.txt +0 -1
- py_neuromodulation-0.0.2.dist-info/RECORD +0 -73
- /py_neuromodulation/{py_neuromodulation.egg-info/SOURCES.txt → utils/__init__.py} +0 -0
- {py_neuromodulation-0.0.2.dist-info → py_neuromodulation-0.0.3.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,102 @@
|
|
|
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 ${file_writer.py}
|
|
26
|
+
* @brief File Writer Interface
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from enum import Enum
|
|
34
|
+
from TMSiSDK.error import TMSiError, TMSiErrorCode
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class FileFormat(Enum):
|
|
38
|
+
none = 0
|
|
39
|
+
poly5 = 1
|
|
40
|
+
xdf = 2
|
|
41
|
+
lsl = 3
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class FileWriter:
|
|
45
|
+
"""<FileWriter> implements a file-writer for writing sample-data, captured
|
|
46
|
+
during a measurement, to a specific file in a specific data-format.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
data_format_type : <FileFormat> Specifies the data-format of the file.
|
|
50
|
+
This can be poly5, gdf+ or gdf.
|
|
51
|
+
|
|
52
|
+
filename : <string> The path and name of the file, into which the
|
|
53
|
+
measurement-data must be written.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(
|
|
57
|
+
self, data_format_type, filename, add_ch_locs=False, download=False
|
|
58
|
+
):
|
|
59
|
+
if data_format_type == FileFormat.poly5:
|
|
60
|
+
from .file_formats.poly5_file_writer import Poly5Writer
|
|
61
|
+
|
|
62
|
+
self._data_format_type = data_format_type
|
|
63
|
+
self._file_writer = Poly5Writer(filename, download)
|
|
64
|
+
elif data_format_type == FileFormat.xdf:
|
|
65
|
+
from .file_formats.xdf_file_writer import XdfWriter
|
|
66
|
+
|
|
67
|
+
self._data_format_type = data_format_type
|
|
68
|
+
self._file_writer = XdfWriter(filename, add_ch_locs)
|
|
69
|
+
elif data_format_type == FileFormat.lsl:
|
|
70
|
+
from .file_formats.lsl_stream_writer import LSLWriter
|
|
71
|
+
|
|
72
|
+
self._data_format_type = data_format_type
|
|
73
|
+
self._file_writer = LSLWriter(filename)
|
|
74
|
+
else:
|
|
75
|
+
print("Unsupported data format")
|
|
76
|
+
raise TMSiError(TMSiErrorCode.api_incorrect_argument)
|
|
77
|
+
|
|
78
|
+
def open(self, device):
|
|
79
|
+
"""Opens a file-writer session.
|
|
80
|
+
|
|
81
|
+
Must be called BEFORE a measurement is started.
|
|
82
|
+
|
|
83
|
+
Links a 'Device' to a 'Filewriter'-instance and prepares for the
|
|
84
|
+
measurement that will start.
|
|
85
|
+
|
|
86
|
+
In the open-method the file-writer-object will prepare for the receipt
|
|
87
|
+
of sample-data from the 'Device' as next:
|
|
88
|
+
- Retrieve the configuration (e.g. channel-list, sample_rate) from the 'Device'
|
|
89
|
+
to write to the file and to prepare for the receipt of sample-data.
|
|
90
|
+
- Register at the 'sample_data_server' for receipt of the sample-data.
|
|
91
|
+
- Create a dedicated sampling-thread, which is responsible to
|
|
92
|
+
processes during the measurement the incoming sample-data.
|
|
93
|
+
"""
|
|
94
|
+
self._file_writer.open(device)
|
|
95
|
+
|
|
96
|
+
def close(self):
|
|
97
|
+
"""Closes an ongoing file-writer session.
|
|
98
|
+
|
|
99
|
+
Must be called AFTER a measurement is stopped.
|
|
100
|
+
|
|
101
|
+
"""
|
|
102
|
+
self._file_writer.close()
|
|
@@ -0,0 +1,39 @@
|
|
|
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 ${__init__.py}
|
|
26
|
+
* @brief Initialisation of the TMSiPlotters gui directory classes.
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
'''
|
|
32
|
+
|
|
33
|
+
import sys
|
|
34
|
+
from os.path import join, dirname, realpath
|
|
35
|
+
Plotters_dir = dirname(realpath(__file__)) # directory of this file
|
|
36
|
+
modules_dir = join(Plotters_dir, '...') # directory with all modules
|
|
37
|
+
sys.path.append(modules_dir)
|
|
38
|
+
|
|
39
|
+
from .plotting_gui import PlottingGUI
|
|
@@ -0,0 +1,234 @@
|
|
|
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 ${_plotter_gui.py}
|
|
26
|
+
* @brief GUI window used by the different plotter instances.
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
'''
|
|
32
|
+
|
|
33
|
+
from PySide2.QtCore import *
|
|
34
|
+
from PySide2.QtGui import *
|
|
35
|
+
from PySide2.QtWidgets import *
|
|
36
|
+
|
|
37
|
+
from pyqtgraph import GraphicsLayoutWidget
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Ui_MainWindow(object):
|
|
41
|
+
def setupUi(self, MainWindow):
|
|
42
|
+
if not MainWindow.objectName():
|
|
43
|
+
MainWindow.setObjectName(u"MainWindow")
|
|
44
|
+
MainWindow.resize(1134, 704)
|
|
45
|
+
self.centralwidget = QWidget(MainWindow)
|
|
46
|
+
self.centralwidget.setObjectName(u"centralwidget")
|
|
47
|
+
self.gridLayout = QGridLayout(self.centralwidget)
|
|
48
|
+
self.gridLayout.setObjectName(u"gridLayout")
|
|
49
|
+
self.RealTimePlotWidget = GraphicsLayoutWidget(self.centralwidget)
|
|
50
|
+
self.RealTimePlotWidget.setObjectName(u"RealTimePlotWidget")
|
|
51
|
+
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
|
52
|
+
sizePolicy.setHorizontalStretch(0)
|
|
53
|
+
sizePolicy.setVerticalStretch(0)
|
|
54
|
+
sizePolicy.setHeightForWidth(self.RealTimePlotWidget.sizePolicy().hasHeightForWidth())
|
|
55
|
+
self.RealTimePlotWidget.setSizePolicy(sizePolicy)
|
|
56
|
+
|
|
57
|
+
self.gridLayout.addWidget(self.RealTimePlotWidget, 0, 1, 3, 4)
|
|
58
|
+
|
|
59
|
+
self.autoscale_button = QPushButton(self.centralwidget)
|
|
60
|
+
self.autoscale_button.setObjectName(u"autoscale_button")
|
|
61
|
+
|
|
62
|
+
self.gridLayout.addWidget(self.autoscale_button, 3, 3, 1, 1)
|
|
63
|
+
|
|
64
|
+
self.increase_time_button = QPushButton(self.centralwidget)
|
|
65
|
+
self.increase_time_button.setObjectName(u"increase_time_button")
|
|
66
|
+
|
|
67
|
+
self.gridLayout.addWidget(self.increase_time_button, 3, 2, 1, 1)
|
|
68
|
+
|
|
69
|
+
self.verticalLayout = QVBoxLayout()
|
|
70
|
+
self.verticalLayout.setObjectName(u"verticalLayout")
|
|
71
|
+
self.set_range_label = QLabel(self.centralwidget)
|
|
72
|
+
self.set_range_label.setObjectName(u"set_range_label")
|
|
73
|
+
font = QFont()
|
|
74
|
+
font.setBold(True)
|
|
75
|
+
font.setWeight(75)
|
|
76
|
+
self.set_range_label.setFont(font)
|
|
77
|
+
|
|
78
|
+
self.verticalLayout.addWidget(self.set_range_label)
|
|
79
|
+
|
|
80
|
+
self.set_range_box = QComboBox(self.centralwidget)
|
|
81
|
+
self.set_range_box.addItem("")
|
|
82
|
+
self.set_range_box.addItem("")
|
|
83
|
+
self.set_range_box.addItem("")
|
|
84
|
+
self.set_range_box.addItem("")
|
|
85
|
+
self.set_range_box.addItem("")
|
|
86
|
+
self.set_range_box.addItem("")
|
|
87
|
+
self.set_range_box.addItem("")
|
|
88
|
+
self.set_range_box.setObjectName(u"set_range_box")
|
|
89
|
+
|
|
90
|
+
self.verticalLayout.addWidget(self.set_range_box)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
self.gridLayout.addLayout(self.verticalLayout, 3, 4, 1, 1)
|
|
94
|
+
|
|
95
|
+
self.gridLayout_2 = QGridLayout()
|
|
96
|
+
self.gridLayout_2.setObjectName(u"gridLayout_2")
|
|
97
|
+
self.hide_UNI_button = QPushButton(self.centralwidget)
|
|
98
|
+
self.hide_UNI_button.setObjectName(u"hide_UNI_button")
|
|
99
|
+
self.hide_UNI_button.setMaximumSize(QSize(100, 16777215))
|
|
100
|
+
self.hide_UNI_button.setLayoutDirection(Qt.RightToLeft)
|
|
101
|
+
|
|
102
|
+
self.gridLayout_2.addWidget(self.hide_UNI_button, 0, 1, 1, 1)
|
|
103
|
+
|
|
104
|
+
self.show_BIP_button = QPushButton(self.centralwidget)
|
|
105
|
+
self.show_BIP_button.setObjectName(u"show_BIP_button")
|
|
106
|
+
|
|
107
|
+
self.gridLayout_2.addWidget(self.show_BIP_button, 1, 0, 1, 1)
|
|
108
|
+
|
|
109
|
+
self.show_UNI_button = QPushButton(self.centralwidget)
|
|
110
|
+
self.show_UNI_button.setObjectName(u"show_UNI_button")
|
|
111
|
+
self.show_UNI_button.setMaximumSize(QSize(100, 16777215))
|
|
112
|
+
|
|
113
|
+
self.gridLayout_2.addWidget(self.show_UNI_button, 0, 0, 1, 1)
|
|
114
|
+
|
|
115
|
+
self.hide_BIP_button = QPushButton(self.centralwidget)
|
|
116
|
+
self.hide_BIP_button.setObjectName(u"hide_BIP_button")
|
|
117
|
+
self.hide_BIP_button.setLayoutDirection(Qt.RightToLeft)
|
|
118
|
+
|
|
119
|
+
self.gridLayout_2.addWidget(self.hide_BIP_button, 1, 1, 1, 1)
|
|
120
|
+
|
|
121
|
+
self.show_AUX_button = QPushButton(self.centralwidget)
|
|
122
|
+
self.show_AUX_button.setObjectName(u"show_AUX_button")
|
|
123
|
+
|
|
124
|
+
self.gridLayout_2.addWidget(self.show_AUX_button, 2, 0, 1, 1)
|
|
125
|
+
|
|
126
|
+
self.show_DIGI_button = QPushButton(self.centralwidget)
|
|
127
|
+
self.show_DIGI_button.setObjectName(u"show_DIGI_button")
|
|
128
|
+
|
|
129
|
+
self.gridLayout_2.addWidget(self.show_DIGI_button, 3, 0, 1, 1)
|
|
130
|
+
|
|
131
|
+
self.hide_AUX_button = QPushButton(self.centralwidget)
|
|
132
|
+
self.hide_AUX_button.setObjectName(u"hide_AUX_button")
|
|
133
|
+
self.hide_AUX_button.setLayoutDirection(Qt.RightToLeft)
|
|
134
|
+
|
|
135
|
+
self.gridLayout_2.addWidget(self.hide_AUX_button, 2, 1, 1, 1)
|
|
136
|
+
|
|
137
|
+
self.hide_DIGI_button = QPushButton(self.centralwidget)
|
|
138
|
+
self.hide_DIGI_button.setObjectName(u"hide_DIGI_button")
|
|
139
|
+
self.hide_DIGI_button.setLayoutDirection(Qt.RightToLeft)
|
|
140
|
+
|
|
141
|
+
self.gridLayout_2.addWidget(self.hide_DIGI_button, 3, 1, 1, 1)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
self.gridLayout.addLayout(self.gridLayout_2, 2, 0, 1, 1)
|
|
145
|
+
|
|
146
|
+
self.decrease_time_button = QPushButton(self.centralwidget)
|
|
147
|
+
self.decrease_time_button.setObjectName(u"decrease_time_button")
|
|
148
|
+
|
|
149
|
+
self.gridLayout.addWidget(self.decrease_time_button, 3, 1, 1, 1)
|
|
150
|
+
|
|
151
|
+
self.channel_list_groupbox = QGroupBox(self.centralwidget)
|
|
152
|
+
self.channel_list_groupbox.setObjectName(u"channel_list_groupbox")
|
|
153
|
+
sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
|
|
154
|
+
sizePolicy1.setHorizontalStretch(0)
|
|
155
|
+
sizePolicy1.setVerticalStretch(0)
|
|
156
|
+
sizePolicy1.setHeightForWidth(self.channel_list_groupbox.sizePolicy().hasHeightForWidth())
|
|
157
|
+
self.channel_list_groupbox.setSizePolicy(sizePolicy1)
|
|
158
|
+
self.channel_list_groupbox.setMinimumSize(QSize(100, 0))
|
|
159
|
+
self.channel_list_groupbox.setMaximumSize(QSize(400, 16777215))
|
|
160
|
+
font1 = QFont()
|
|
161
|
+
font1.setBold(False)
|
|
162
|
+
font1.setWeight(50)
|
|
163
|
+
self.channel_list_groupbox.setFont(font1)
|
|
164
|
+
|
|
165
|
+
self.gridLayout.addWidget(self.channel_list_groupbox, 0, 0, 1, 1)
|
|
166
|
+
|
|
167
|
+
self.horizontalLayout = QHBoxLayout()
|
|
168
|
+
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
|
169
|
+
self.enable_filter_button = QPushButton(self.centralwidget)
|
|
170
|
+
self.enable_filter_button.setObjectName(u"enable_filter_button")
|
|
171
|
+
|
|
172
|
+
self.horizontalLayout.addWidget(self.enable_filter_button)
|
|
173
|
+
|
|
174
|
+
self.disable_filter_button = QPushButton(self.centralwidget)
|
|
175
|
+
self.disable_filter_button.setObjectName(u"disable_filter_button")
|
|
176
|
+
|
|
177
|
+
self.horizontalLayout.addWidget(self.disable_filter_button)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
self.gridLayout.addLayout(self.horizontalLayout, 3, 0, 1, 1)
|
|
181
|
+
|
|
182
|
+
self.table_live_impedance = QTableWidget(self.centralwidget)
|
|
183
|
+
self.table_live_impedance.setObjectName(u"table_live_impedance")
|
|
184
|
+
sizePolicy2 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
|
|
185
|
+
sizePolicy2.setHorizontalStretch(0)
|
|
186
|
+
sizePolicy2.setVerticalStretch(0)
|
|
187
|
+
sizePolicy2.setHeightForWidth(self.table_live_impedance.sizePolicy().hasHeightForWidth())
|
|
188
|
+
self.table_live_impedance.setSizePolicy(sizePolicy2)
|
|
189
|
+
self.table_live_impedance.setMinimumSize(QSize(220, 0))
|
|
190
|
+
self.table_live_impedance.setMaximumSize(QSize(220, 16777215))
|
|
191
|
+
|
|
192
|
+
self.gridLayout.addWidget(self.table_live_impedance, 0, 5, 3, 1)
|
|
193
|
+
|
|
194
|
+
MainWindow.setCentralWidget(self.centralwidget)
|
|
195
|
+
self.menubar = QMenuBar(MainWindow)
|
|
196
|
+
self.menubar.setObjectName(u"menubar")
|
|
197
|
+
self.menubar.setGeometry(QRect(0, 0, 1134, 21))
|
|
198
|
+
MainWindow.setMenuBar(self.menubar)
|
|
199
|
+
self.statusbar = QStatusBar(MainWindow)
|
|
200
|
+
self.statusbar.setObjectName(u"statusbar")
|
|
201
|
+
MainWindow.setStatusBar(self.statusbar)
|
|
202
|
+
|
|
203
|
+
self.retranslateUi(MainWindow)
|
|
204
|
+
|
|
205
|
+
QMetaObject.connectSlotsByName(MainWindow)
|
|
206
|
+
# setupUi
|
|
207
|
+
|
|
208
|
+
def retranslateUi(self, MainWindow):
|
|
209
|
+
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
|
|
210
|
+
self.autoscale_button.setText(QCoreApplication.translate("MainWindow", u"Auto Scale", None))
|
|
211
|
+
self.increase_time_button.setText(QCoreApplication.translate("MainWindow", u"Increase time range", None))
|
|
212
|
+
self.set_range_label.setText(QCoreApplication.translate("MainWindow", u"<html><head/><body><p>Set Range ('\u00b5Volt')</p></body></html>", None))
|
|
213
|
+
self.set_range_box.setItemText(0, QCoreApplication.translate("MainWindow", u"1", None))
|
|
214
|
+
self.set_range_box.setItemText(1, QCoreApplication.translate("MainWindow", u"20", None))
|
|
215
|
+
self.set_range_box.setItemText(2, QCoreApplication.translate("MainWindow", u"50", None))
|
|
216
|
+
self.set_range_box.setItemText(3, QCoreApplication.translate("MainWindow", u"100", None))
|
|
217
|
+
self.set_range_box.setItemText(4, QCoreApplication.translate("MainWindow", u"250", None))
|
|
218
|
+
self.set_range_box.setItemText(5, QCoreApplication.translate("MainWindow", u"1000", None))
|
|
219
|
+
self.set_range_box.setItemText(6, QCoreApplication.translate("MainWindow", u"10000", None))
|
|
220
|
+
|
|
221
|
+
self.hide_UNI_button.setText(QCoreApplication.translate("MainWindow", u"Hide UNI", None))
|
|
222
|
+
self.show_BIP_button.setText(QCoreApplication.translate("MainWindow", u"Show BIP", None))
|
|
223
|
+
self.show_UNI_button.setText(QCoreApplication.translate("MainWindow", u"Show UNI", None))
|
|
224
|
+
self.hide_BIP_button.setText(QCoreApplication.translate("MainWindow", u"Hide BIP", None))
|
|
225
|
+
self.show_AUX_button.setText(QCoreApplication.translate("MainWindow", u"Show AUX", None))
|
|
226
|
+
self.show_DIGI_button.setText(QCoreApplication.translate("MainWindow", u"Show DIGI", None))
|
|
227
|
+
self.hide_AUX_button.setText(QCoreApplication.translate("MainWindow", u"Hide AUX", None))
|
|
228
|
+
self.hide_DIGI_button.setText(QCoreApplication.translate("MainWindow", u"Hide DIGI", None))
|
|
229
|
+
self.decrease_time_button.setText(QCoreApplication.translate("MainWindow", u"Decrease time range", None))
|
|
230
|
+
self.channel_list_groupbox.setTitle(QCoreApplication.translate("MainWindow", u"Channel list", None))
|
|
231
|
+
self.enable_filter_button.setText(QCoreApplication.translate("MainWindow", u"Enable filter", None))
|
|
232
|
+
self.disable_filter_button.setText(QCoreApplication.translate("MainWindow", u"Disable filter", None))
|
|
233
|
+
# retranslateUi
|
|
234
|
+
|