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.
- 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 +95 -0
- py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +107 -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/FieldTrip.py +589 -589
- py_neuromodulation/__init__.py +74 -13
- py_neuromodulation/_write_example_dataset_helper.py +83 -65
- 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/liblsl/libpugixml.so.1.12 +0 -0
- py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
- py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
- py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
- py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
- py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
- py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
- py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
- py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
- py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
- py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
- py_neuromodulation/nm_IO.py +413 -417
- py_neuromodulation/nm_RMAP.py +496 -531
- py_neuromodulation/nm_analysis.py +993 -1074
- py_neuromodulation/nm_artifacts.py +30 -25
- py_neuromodulation/nm_bispectra.py +154 -168
- py_neuromodulation/nm_bursts.py +292 -198
- py_neuromodulation/nm_coherence.py +251 -205
- py_neuromodulation/nm_database.py +149 -0
- py_neuromodulation/nm_decode.py +918 -992
- py_neuromodulation/nm_define_nmchannels.py +300 -302
- py_neuromodulation/nm_features.py +144 -116
- py_neuromodulation/nm_filter.py +219 -219
- py_neuromodulation/nm_filter_preprocessing.py +79 -91
- py_neuromodulation/nm_fooof.py +139 -159
- py_neuromodulation/nm_generator.py +45 -37
- py_neuromodulation/nm_hjorth_raw.py +52 -73
- py_neuromodulation/nm_kalmanfilter.py +71 -58
- py_neuromodulation/nm_linelength.py +21 -33
- py_neuromodulation/nm_logger.py +66 -0
- py_neuromodulation/nm_mne_connectivity.py +149 -112
- py_neuromodulation/nm_mnelsl_generator.py +90 -0
- py_neuromodulation/nm_mnelsl_stream.py +116 -0
- py_neuromodulation/nm_nolds.py +96 -93
- py_neuromodulation/nm_normalization.py +173 -214
- py_neuromodulation/nm_oscillatory.py +423 -448
- py_neuromodulation/nm_plots.py +585 -612
- py_neuromodulation/nm_preprocessing.py +83 -0
- py_neuromodulation/nm_projection.py +370 -394
- py_neuromodulation/nm_rereference.py +97 -95
- py_neuromodulation/nm_resample.py +59 -50
- py_neuromodulation/nm_run_analysis.py +325 -435
- py_neuromodulation/nm_settings.py +289 -68
- py_neuromodulation/nm_settings.yaml +244 -0
- py_neuromodulation/nm_sharpwaves.py +423 -401
- py_neuromodulation/nm_stats.py +464 -480
- py_neuromodulation/nm_stream.py +398 -0
- py_neuromodulation/nm_stream_abc.py +166 -218
- py_neuromodulation/nm_types.py +193 -0
- 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.5.dist-info}/METADATA +185 -182
- py_neuromodulation-0.0.5.dist-info/RECORD +83 -0
- {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info}/WHEEL +1 -2
- {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info/licenses}/LICENSE +21 -21
- 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/nm_EpochStream.py +0 -92
- py_neuromodulation/nm_across_patient_decoding.py +0 -927
- py_neuromodulation/nm_cohortwrapper.py +0 -435
- py_neuromodulation/nm_eval_timing.py +0 -239
- py_neuromodulation/nm_features_abc.py +0 -39
- py_neuromodulation/nm_stream_offline.py +0 -358
- py_neuromodulation/utils/_logging.py +0 -24
- 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
tests/conftest.py
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
import numpy as np
|
|
3
|
-
|
|
4
|
-
from py_neuromodulation import (
|
|
5
|
-
nm_generator,
|
|
6
|
-
nm_stream_offline,
|
|
7
|
-
nm_settings,
|
|
8
|
-
nm_IO,
|
|
9
|
-
nm_define_nmchannels,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@pytest.fixture
|
|
14
|
-
def setup_default_stream_fast_compute():
|
|
15
|
-
"""This test function sets a data batch and automatic initialized M1 datafram
|
|
16
|
-
|
|
17
|
-
Args:
|
|
18
|
-
PATH_PYNEUROMODULATION (string): Path to py_neuromodulation repository
|
|
19
|
-
|
|
20
|
-
Returns:
|
|
21
|
-
ieeg_batch (np.ndarray): (channels, samples)
|
|
22
|
-
df_M1 (pd Dataframe): auto intialized table for rereferencing
|
|
23
|
-
settings_wrapper (settings.py): settings.json
|
|
24
|
-
fs (float): example sampling frequency
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
(
|
|
28
|
-
RUN_NAME,
|
|
29
|
-
PATH_RUN,
|
|
30
|
-
PATH_BIDS,
|
|
31
|
-
PATH_OUT,
|
|
32
|
-
datatype,
|
|
33
|
-
) = nm_IO.get_paths_example_data()
|
|
34
|
-
|
|
35
|
-
(
|
|
36
|
-
raw,
|
|
37
|
-
data,
|
|
38
|
-
sfreq,
|
|
39
|
-
line_noise,
|
|
40
|
-
coord_list,
|
|
41
|
-
coord_names,
|
|
42
|
-
) = nm_IO.read_BIDS_data(
|
|
43
|
-
PATH_RUN=PATH_RUN, BIDS_PATH=PATH_BIDS, datatype=datatype
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
nm_channels = nm_define_nmchannels.set_channels(
|
|
47
|
-
ch_names=raw.ch_names,
|
|
48
|
-
ch_types=raw.get_channel_types(),
|
|
49
|
-
reference="default",
|
|
50
|
-
bads=raw.info["bads"],
|
|
51
|
-
new_names="default",
|
|
52
|
-
used_types=("ecog", "dbs", "seeg"),
|
|
53
|
-
target_keywords=("MOV_RIGHT_CLEAN",),
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
settings = nm_settings.get_default_settings()
|
|
57
|
-
settings = nm_settings.reset_settings(settings)
|
|
58
|
-
settings["fooof"]["aperiodic"]["exponent"] = True
|
|
59
|
-
settings["fooof"]["aperiodic"]["offset"] = True
|
|
60
|
-
settings["features"]["fooof"] = True
|
|
61
|
-
|
|
62
|
-
stream = nm_stream_offline.Stream(
|
|
63
|
-
settings=settings,
|
|
64
|
-
nm_channels=nm_channels,
|
|
65
|
-
path_grids=None,
|
|
66
|
-
verbose=True,
|
|
67
|
-
sfreq=sfreq,
|
|
68
|
-
line_noise=line_noise,
|
|
69
|
-
coord_list=coord_list,
|
|
70
|
-
coord_names=coord_names,
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
return data, stream
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
@pytest.fixture
|
|
77
|
-
def setup_databatch():
|
|
78
|
-
"""This test function sets a data batch and automatic initialized M1 datafram
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
PATH_PYNEUROMODULATION (string): Path to py_neuromodulation repository
|
|
82
|
-
|
|
83
|
-
Returns:
|
|
84
|
-
ieeg_batch (np.ndarray): (channels, samples)
|
|
85
|
-
df_M1 (pd Dataframe): auto intialized table for rereferencing
|
|
86
|
-
settings_wrapper (settings.py): settings.json
|
|
87
|
-
fs (float): example sampling frequency
|
|
88
|
-
"""
|
|
89
|
-
|
|
90
|
-
(
|
|
91
|
-
RUN_NAME,
|
|
92
|
-
PATH_RUN,
|
|
93
|
-
PATH_BIDS,
|
|
94
|
-
PATH_OUT,
|
|
95
|
-
datatype,
|
|
96
|
-
) = nm_IO.get_paths_example_data()
|
|
97
|
-
|
|
98
|
-
(
|
|
99
|
-
raw,
|
|
100
|
-
data,
|
|
101
|
-
sfreq,
|
|
102
|
-
line_noise,
|
|
103
|
-
coord_list,
|
|
104
|
-
coord_names,
|
|
105
|
-
) = nm_IO.read_BIDS_data(
|
|
106
|
-
PATH_RUN=PATH_RUN, BIDS_PATH=PATH_BIDS, datatype=datatype
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
settings = nm_settings.get_default_settings()
|
|
110
|
-
settings = nm_settings.set_settings_fast_compute(settings)
|
|
111
|
-
|
|
112
|
-
generator = nm_generator.raw_data_generator(
|
|
113
|
-
data, settings, int(np.floor(sfreq))
|
|
114
|
-
)
|
|
115
|
-
data_batch = next(generator, None)
|
|
116
|
-
|
|
117
|
-
return [raw.ch_names, raw.get_channel_types(), raw.info["bads"], data_batch]
|
tests/test_all_examples.py
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
import pytest
|
|
3
|
-
import subprocess
|
|
4
|
-
import runpy
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@pytest.mark.parametrize("example_filename", Path("examples").glob("*.py"))
|
|
8
|
-
def test_run_through_all_test(example_filename):
|
|
9
|
-
print(f"Running {example_filename}")
|
|
10
|
-
runpy.run_path(example_filename)
|
tests/test_all_features.py
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
import pandas as pd
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
from py_neuromodulation import (
|
|
6
|
-
nm_settings,
|
|
7
|
-
nm_stream_offline,
|
|
8
|
-
nm_define_nmchannels,
|
|
9
|
-
nm_stream_abc,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def get_example_stream(test_arr: np.array) -> nm_stream_abc.PNStream:
|
|
14
|
-
settings = nm_settings.get_default_settings()
|
|
15
|
-
settings["features"]["raw_hjorth"] = True
|
|
16
|
-
settings["features"]["return_raw"] = True
|
|
17
|
-
settings["features"]["bandpass_filter"] = True
|
|
18
|
-
settings["features"]["stft"] = True
|
|
19
|
-
settings["features"]["fft"] = True
|
|
20
|
-
settings["features"]["sharpwave_analysis"] = True
|
|
21
|
-
settings["features"]["fooof"] = True
|
|
22
|
-
settings["features"]["bursts"] = True
|
|
23
|
-
settings["features"]["linelength"] = True
|
|
24
|
-
settings["features"]["nolds"] = False
|
|
25
|
-
settings["features"]["mne_connectivity"] = False
|
|
26
|
-
settings["features"]["coherence"] = False
|
|
27
|
-
|
|
28
|
-
nm_channels = nm_define_nmchannels.get_default_channels_from_data(test_arr)
|
|
29
|
-
|
|
30
|
-
stream = nm_stream_offline.Stream(
|
|
31
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
32
|
-
)
|
|
33
|
-
return stream
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def test_all_features_random_array():
|
|
37
|
-
"""This test runs's through all enabled features, and check's if they break
|
|
38
|
-
"""
|
|
39
|
-
np.random.seed(0)
|
|
40
|
-
arr = np.random.random([2, 2000])
|
|
41
|
-
stream = get_example_stream(arr)
|
|
42
|
-
|
|
43
|
-
df = stream.run(arr)
|
|
44
|
-
|
|
45
|
-
assert df.shape[0] != 0 # terrible test
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def test_all_features_zero_array():
|
|
49
|
-
|
|
50
|
-
arr = np.zeros([2, 2000])
|
|
51
|
-
stream = get_example_stream(arr)
|
|
52
|
-
|
|
53
|
-
df = stream.run(arr)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def test_all_features_NaN_array():
|
|
57
|
-
|
|
58
|
-
arr = np.empty([2, 2000])
|
|
59
|
-
arr[:] = np.nan
|
|
60
|
-
|
|
61
|
-
stream = get_example_stream(arr)
|
|
62
|
-
|
|
63
|
-
df = stream.run(arr)
|
tests/test_bispectra.py
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
import mne
|
|
3
|
-
import numpy as np
|
|
4
|
-
|
|
5
|
-
from py_neuromodulation import (
|
|
6
|
-
nm_analysis,
|
|
7
|
-
nm_decode,
|
|
8
|
-
nm_define_nmchannels,
|
|
9
|
-
nm_IO,
|
|
10
|
-
nm_plots,
|
|
11
|
-
nm_settings,
|
|
12
|
-
nm_stream_offline,
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def test_bispectrum():
|
|
17
|
-
(
|
|
18
|
-
RUN_NAME,
|
|
19
|
-
PATH_RUN,
|
|
20
|
-
PATH_BIDS,
|
|
21
|
-
PATH_OUT,
|
|
22
|
-
datatype,
|
|
23
|
-
) = nm_IO.get_paths_example_data()
|
|
24
|
-
|
|
25
|
-
(
|
|
26
|
-
raw,
|
|
27
|
-
data,
|
|
28
|
-
sfreq,
|
|
29
|
-
line_noise,
|
|
30
|
-
coord_list,
|
|
31
|
-
coord_names,
|
|
32
|
-
) = nm_IO.read_BIDS_data(
|
|
33
|
-
PATH_RUN=PATH_RUN, BIDS_PATH=PATH_BIDS, datatype=datatype
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
ch_names = raw.ch_names[4]
|
|
37
|
-
ch_types = raw.get_channel_types()[4]
|
|
38
|
-
|
|
39
|
-
nm_channels = nm_define_nmchannels.set_channels(
|
|
40
|
-
ch_names=[ch_names],
|
|
41
|
-
ch_types=[ch_types],
|
|
42
|
-
reference="default",
|
|
43
|
-
bads=None,
|
|
44
|
-
new_names="default",
|
|
45
|
-
used_types=("ecog", "dbs", "seeg"),
|
|
46
|
-
target_keywords=("MOV_RIGHT_CLEAN",),
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
settings = nm_settings.get_default_settings()
|
|
50
|
-
settings = nm_settings.reset_settings(settings)
|
|
51
|
-
|
|
52
|
-
settings["features"]["bispectrum"] = True
|
|
53
|
-
|
|
54
|
-
stream = nm_stream_offline.Stream(
|
|
55
|
-
settings=settings,
|
|
56
|
-
nm_channels=nm_channels,
|
|
57
|
-
path_grids=None,
|
|
58
|
-
verbose=True,
|
|
59
|
-
sfreq=sfreq,
|
|
60
|
-
line_noise=line_noise,
|
|
61
|
-
coord_list=coord_list,
|
|
62
|
-
coord_names=coord_names,
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
features = stream.run(np.expand_dims(data[3, :], axis=0))
|
|
66
|
-
|
|
67
|
-
assert (
|
|
68
|
-
features["ECOG_RIGHT_1_Bispectrum_phase_mean_whole_fband_range"].sum()
|
|
69
|
-
!= 0
|
|
70
|
-
)
|
tests/test_bursts.py
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
import numpy as np
|
|
3
|
-
from py_neuromodulation import (
|
|
4
|
-
nm_bursts,
|
|
5
|
-
nm_settings,
|
|
6
|
-
nm_stream_offline,
|
|
7
|
-
nm_define_nmchannels,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def test_init_wrong_fband():
|
|
12
|
-
settings = nm_settings.get_default_settings()
|
|
13
|
-
settings["burst_settings"]["frequency_bands"] = ["wrong_band"]
|
|
14
|
-
with pytest.raises(Exception):
|
|
15
|
-
nm_bursts.Burst.test_settings(
|
|
16
|
-
settings,
|
|
17
|
-
[
|
|
18
|
-
"ch1",
|
|
19
|
-
"ch2",
|
|
20
|
-
],
|
|
21
|
-
1000,
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def test_init_wrong_treshold():
|
|
26
|
-
settings = nm_settings.get_default_settings()
|
|
27
|
-
settings["burst_settings"]["threshold"] = -1
|
|
28
|
-
with pytest.raises(Exception):
|
|
29
|
-
nm_bursts.Burst.test_settings(
|
|
30
|
-
settings,
|
|
31
|
-
[
|
|
32
|
-
"ch1",
|
|
33
|
-
"ch2",
|
|
34
|
-
],
|
|
35
|
-
1000,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def test_init_wrong_timeduration():
|
|
40
|
-
settings = nm_settings.get_default_settings()
|
|
41
|
-
settings["burst_settings"]["time_duration_s"] = -1
|
|
42
|
-
with pytest.raises(Exception):
|
|
43
|
-
nm_bursts.Burst.test_settings(
|
|
44
|
-
settings,
|
|
45
|
-
[
|
|
46
|
-
"ch1",
|
|
47
|
-
"ch2",
|
|
48
|
-
],
|
|
49
|
-
1000,
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def test_init_wrong_burst_feature_init():
|
|
54
|
-
settings = nm_settings.get_default_settings()
|
|
55
|
-
settings["burst_settings"]["burst_features"]["duration"] = -1
|
|
56
|
-
with pytest.raises(Exception):
|
|
57
|
-
nm_bursts.Burst.test_settings(
|
|
58
|
-
settings,
|
|
59
|
-
[
|
|
60
|
-
"ch1",
|
|
61
|
-
"ch2",
|
|
62
|
-
],
|
|
63
|
-
1000,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def test_bursting_duration():
|
|
68
|
-
np.random.seed(0)
|
|
69
|
-
settings = nm_settings.get_default_settings()
|
|
70
|
-
settings["features"]["bursts"] = True
|
|
71
|
-
settings["postprocessing"]["feature_normalization"] = False
|
|
72
|
-
TIME_DURATION = 10
|
|
73
|
-
sfreq = 1000
|
|
74
|
-
NUM_CH = 1
|
|
75
|
-
time_points_beta = np.arange(0, 1, 1 / sfreq)
|
|
76
|
-
beta_freq = 18
|
|
77
|
-
|
|
78
|
-
beta_wave = np.sin(2 * np.pi * beta_freq * time_points_beta)
|
|
79
|
-
|
|
80
|
-
ch_names = ["ch0"]
|
|
81
|
-
|
|
82
|
-
bursts = nm_bursts.Burst(settings, ch_names, sfreq)
|
|
83
|
-
|
|
84
|
-
for _ in range(10):
|
|
85
|
-
np.random.seed(0)
|
|
86
|
-
data = np.random.random([NUM_CH, 1 * sfreq])
|
|
87
|
-
f = bursts.calc_feature(data, {})
|
|
88
|
-
|
|
89
|
-
np.random.seed(0)
|
|
90
|
-
# the percentile of the hilbert transform of a continuous oscillation will be high
|
|
91
|
-
# select better max amplitude
|
|
92
|
-
bursts = nm_bursts.Burst(settings, ch_names, sfreq)
|
|
93
|
-
f_burst = bursts.calc_feature(
|
|
94
|
-
beta_wave + np.random.random([NUM_CH, 1 * sfreq]), {}
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
assert (
|
|
98
|
-
f["ch0_bursts_low beta_amplitude_max"]
|
|
99
|
-
< f_burst["ch0_bursts_low beta_amplitude_max"]
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
assert (
|
|
103
|
-
f["ch0_bursts_low beta_duration_max"]
|
|
104
|
-
< f_burst["ch0_bursts_low beta_duration_max"]
|
|
105
|
-
)
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
import pandas as pd
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
from py_neuromodulation import (
|
|
6
|
-
nm_settings,
|
|
7
|
-
nm_stream_offline,
|
|
8
|
-
nm_define_nmchannels,
|
|
9
|
-
nm_stream_abc,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def get_example_settings(test_arr: np.array) -> nm_stream_abc.PNStream:
|
|
14
|
-
settings = nm_settings.set_settings_fast_compute(
|
|
15
|
-
nm_settings.get_default_settings()
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
nm_channels = nm_define_nmchannels.get_default_channels_from_data(test_arr)
|
|
19
|
-
|
|
20
|
-
return settings, nm_channels
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def test_different_sampling_rate_100Hz():
|
|
24
|
-
sampling_rate_features = 100
|
|
25
|
-
|
|
26
|
-
arr_test = np.random.random([2, 1020])
|
|
27
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
28
|
-
|
|
29
|
-
settings["sampling_rate_features_hz"] = sampling_rate_features
|
|
30
|
-
stream = nm_stream_offline.Stream(
|
|
31
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
df = stream.run(arr_test)
|
|
35
|
-
|
|
36
|
-
# check the difference between time points
|
|
37
|
-
|
|
38
|
-
assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def test_different_sampling_rate_10Hz():
|
|
42
|
-
sampling_rate_features = 10
|
|
43
|
-
|
|
44
|
-
arr_test = np.random.random([2, 1200])
|
|
45
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
46
|
-
|
|
47
|
-
settings["sampling_rate_features_hz"] = sampling_rate_features
|
|
48
|
-
stream = nm_stream_offline.Stream(
|
|
49
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
df = stream.run(arr_test)
|
|
53
|
-
|
|
54
|
-
# check the difference between time points
|
|
55
|
-
|
|
56
|
-
assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def test_different_sampling_rate_1Hz():
|
|
60
|
-
sampling_rate_features = 1
|
|
61
|
-
|
|
62
|
-
arr_test = np.random.random([2, 3000])
|
|
63
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
64
|
-
|
|
65
|
-
settings["sampling_rate_features_hz"] = sampling_rate_features
|
|
66
|
-
stream = nm_stream_offline.Stream(
|
|
67
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
df = stream.run(arr_test)
|
|
71
|
-
|
|
72
|
-
# check the difference between time points
|
|
73
|
-
|
|
74
|
-
assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def test_different_sampling_rate_0DOT1Hz():
|
|
78
|
-
sampling_rate_features = 0.1
|
|
79
|
-
|
|
80
|
-
arr_test = np.random.random([2, 30000])
|
|
81
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
82
|
-
|
|
83
|
-
settings["sampling_rate_features_hz"] = sampling_rate_features
|
|
84
|
-
stream = nm_stream_offline.Stream(
|
|
85
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
df = stream.run(arr_test)
|
|
89
|
-
|
|
90
|
-
# check the difference between time points
|
|
91
|
-
|
|
92
|
-
assert np.diff(df["time"].iloc[:2]) / 1000 == (1 / sampling_rate_features)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def test_wrong_initalization_of_segment_length_features_ms_and_osc_window_length():
|
|
96
|
-
segment_length_features_ms = 800
|
|
97
|
-
|
|
98
|
-
arr_test = np.random.random([2, 1200])
|
|
99
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
100
|
-
|
|
101
|
-
settings["segment_length_features_ms"] = 800
|
|
102
|
-
settings["fft_settings"]["windowlength_ms"] = 1000
|
|
103
|
-
|
|
104
|
-
with pytest.raises(Exception):
|
|
105
|
-
stream = nm_stream_offline.Stream(
|
|
106
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def test_different_segment_lengths():
|
|
111
|
-
segment_length_features_ms = 800
|
|
112
|
-
|
|
113
|
-
arr_test = np.random.random([2, 1200])
|
|
114
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
115
|
-
|
|
116
|
-
settings["segment_length_features_ms"] = segment_length_features_ms
|
|
117
|
-
settings["fft_settings"]["windowlength_ms"] = segment_length_features_ms
|
|
118
|
-
|
|
119
|
-
stream = nm_stream_offline.Stream(
|
|
120
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
df_seglength_800 = stream.run(arr_test)
|
|
124
|
-
|
|
125
|
-
segment_length_features_ms = 1000
|
|
126
|
-
|
|
127
|
-
arr_test = np.random.random([2, 1200])
|
|
128
|
-
settings, nm_channels = get_example_settings(arr_test)
|
|
129
|
-
|
|
130
|
-
settings["segment_length_features_ms"] = segment_length_features_ms
|
|
131
|
-
settings["fft_settings"]["windowlength_ms"] = segment_length_features_ms
|
|
132
|
-
|
|
133
|
-
stream = nm_stream_offline.Stream(
|
|
134
|
-
sfreq=1000, nm_channels=nm_channels, settings=settings, verbose=True
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
df_seglength_1000 = stream.run(arr_test)
|
|
138
|
-
# check the difference between time points
|
|
139
|
-
|
|
140
|
-
assert (
|
|
141
|
-
df_seglength_1000.iloc[0]["ch0-avgref_fft_theta_mean"]
|
|
142
|
-
!= df_seglength_800.iloc[0]["ch0-avgref_fft_theta_mean"]
|
|
143
|
-
)
|
tests/test_fooof.py
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
from py_neuromodulation import nm_generator
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def test_fooof_features(setup_default_stream_fast_compute):
|
|
5
|
-
|
|
6
|
-
data, stream = setup_default_stream_fast_compute
|
|
7
|
-
|
|
8
|
-
generator = nm_generator.raw_data_generator(
|
|
9
|
-
data, stream.settings, stream.sfreq
|
|
10
|
-
)
|
|
11
|
-
data_batch = next(generator, None)
|
|
12
|
-
feature_series = stream.run_analysis.process(data_batch)
|
|
13
|
-
# since the settings can define searching for "max_n_peaks" peaks
|
|
14
|
-
# there can be None's in the feature_series
|
|
15
|
-
# with a non successful fit, aperiodic features can also be None
|
|
16
|
-
assert feature_series is not None
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
import pytest
|
|
3
|
-
|
|
4
|
-
import py_neuromodulation as nm
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def test_stream_init():
|
|
8
|
-
"""Test if stream initialization with passed data will setup nm_channels correctly"""
|
|
9
|
-
np.random.seed(0)
|
|
10
|
-
data = np.random.random((10, 1000))
|
|
11
|
-
sfreq = 100
|
|
12
|
-
stream = nm.Stream(sfreq=sfreq, data=data, sampling_rate_features_hz=11)
|
|
13
|
-
|
|
14
|
-
assert stream.nm_channels.shape[0] == 10
|
|
15
|
-
assert stream.settings["sampling_rate_features_hz"] == 11
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def test_stream_init_no_sfreq():
|
|
19
|
-
"""Check if stream initialization without sfreq will raise an error"""
|
|
20
|
-
np.random.seed(0)
|
|
21
|
-
data = np.random.random((10, 1000))
|
|
22
|
-
with pytest.raises(Exception):
|
|
23
|
-
nm.Stream(data=data, sampling_rate_features_hz=11)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def test_init_warning_no_used_channel():
|
|
27
|
-
"""Check if a warning is raised when a stream is initialized with nm_channels, but no row has used == 1 and target == 0"""
|
|
28
|
-
np.random.seed(0)
|
|
29
|
-
data = np.random.random((10, 1000))
|
|
30
|
-
sfreq = 1000
|
|
31
|
-
stream = nm.Stream(sfreq=sfreq, data=data, sampling_rate_features_hz=11)
|
|
32
|
-
channels = stream.nm_channels
|
|
33
|
-
channels["used"] = 0
|
|
34
|
-
|
|
35
|
-
with pytest.raises(Exception):
|
|
36
|
-
nm.Stream(
|
|
37
|
-
sfreq=sfreq,
|
|
38
|
-
data=data,
|
|
39
|
-
nm_channels=channels,
|
|
40
|
-
sampling_rate_features_hz=11,
|
|
41
|
-
)
|
tests/test_multiprocessing.py
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import py_neuromodulation as pn
|
|
2
|
-
import numpy as np
|
|
3
|
-
from py_neuromodulation import nm_settings
|
|
4
|
-
import pytest
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@pytest.fixture
|
|
8
|
-
def get_stream():
|
|
9
|
-
NUM_CHANNELS = 10
|
|
10
|
-
NUM_DATA = 10000
|
|
11
|
-
sfreq = 1000 # Hz
|
|
12
|
-
sampling_rate_features_hz = 3 # Hz
|
|
13
|
-
|
|
14
|
-
data = np.random.random([NUM_CHANNELS, NUM_DATA])
|
|
15
|
-
|
|
16
|
-
stream = pn.Stream(
|
|
17
|
-
sfreq=sfreq,
|
|
18
|
-
data=data,
|
|
19
|
-
sampling_rate_features_hz=sampling_rate_features_hz,
|
|
20
|
-
)
|
|
21
|
-
stream.nm_channels.loc[0, "target"] = 1
|
|
22
|
-
stream.nm_channels.loc[0, "used"] = 0
|
|
23
|
-
stream.settings["postprocessing"]["feature_normalization"] = False
|
|
24
|
-
stream.settings["segment_length_features_ms"] = 5000
|
|
25
|
-
for feature in stream.settings["features"]:
|
|
26
|
-
stream.settings["features"][feature] = False
|
|
27
|
-
stream.settings["features"]["nolds"] = False
|
|
28
|
-
stream.settings["features"]["fooof"] = True
|
|
29
|
-
stream.settings["features"]["bursts"] = False
|
|
30
|
-
stream.settings["features"]["mne_connectivity"] = False
|
|
31
|
-
stream.settings["coherence"]["channels"] = [["ch1", "ch2"]]
|
|
32
|
-
return stream
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def test_setting_exception(get_stream):
|
|
36
|
-
stream = get_stream
|
|
37
|
-
stream.settings["features"]["burst"] = True
|
|
38
|
-
|
|
39
|
-
with pytest.raises(Exception) as e_info:
|
|
40
|
-
stream.run(parallel=True, n_jobs=-1)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def test_multiprocessing_and_sequntial_features(get_stream):
|
|
44
|
-
stream_seq = get_stream
|
|
45
|
-
features_sequential = stream_seq.run(parallel=False)
|
|
46
|
-
|
|
47
|
-
stream_par = get_stream
|
|
48
|
-
features_multiprocessing = stream_par.run(parallel=True, n_jobs=-1)
|
|
49
|
-
|
|
50
|
-
for column in features_sequential.columns:
|
|
51
|
-
if "fooof" in column:
|
|
52
|
-
# fooof results are different in multiprocessing and sequential processing
|
|
53
|
-
# This tests fails on Linux and Windows but passes on Mac OS; no idea why
|
|
54
|
-
continue
|
|
55
|
-
|
|
56
|
-
assert features_sequential[column].equals(
|
|
57
|
-
features_multiprocessing[column]
|
|
58
|
-
), f"Column {column} is not equal between sequential and parallel dataframes computation"
|
tests/test_nan_values.py
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
|
|
3
|
-
import py_neuromodulation as nm
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def test_stream_with_none_data():
|
|
7
|
-
"""Test if passing None as the data to a Stream object results in None features."""
|
|
8
|
-
|
|
9
|
-
fs = 1000
|
|
10
|
-
data = np.random.random([2, 2000])
|
|
11
|
-
data[0, :] = None
|
|
12
|
-
|
|
13
|
-
stream = nm.Stream(fs, data)
|
|
14
|
-
|
|
15
|
-
features = stream.run(data)
|
|
16
|
-
|
|
17
|
-
# assert if all features if name ch0 are None
|
|
18
|
-
assert len(
|
|
19
|
-
[f for f in features.columns if "ch0" in f and features[f].isna().all()]
|
|
20
|
-
) == len([f for f in features if "ch0" in f])
|
|
21
|
-
|
|
22
|
-
# and check if all features of the second channel are not None
|
|
23
|
-
assert len(
|
|
24
|
-
[
|
|
25
|
-
f
|
|
26
|
-
for f in features.columns
|
|
27
|
-
if "ch1" in f and features[f].notna().all()
|
|
28
|
-
]
|
|
29
|
-
) == len([f for f in features if "ch1" in f])
|