Exemple #1
0
def test_apply_interbundle_correction(bedmaster_reader: BedmasterReader):
    def _create_ib_corr_dict(signal: BedmasterSignal, cut_idx: int, time_corr: int):
        source_corr = {
            "maxTime": signal.time[cut_idx],
            "timeCorr": time_corr,
        }
        return source_corr

    def _apply_and_assert_ib(signal: Optional[BedmasterSignal], sig_type: str):
        if signal is None:
            assert False
        signal.time_corr_arr = np.unpackbits(signal.time_corr_arr)
        signal_original = copy.deepcopy(signal)
        bedmaster_reader.interbundle_corr[sig_type] = _create_ib_corr_dict(
            signal,
            cut_idx[sig_type],
            time_corr[sig_type],
        )
        bedmaster_reader.apply_ibcorr(signal)
        _assert_ib_correction(
            signal_original,
            signal,
            cut_idx[sig_type],
            time_corr[sig_type],
        )
        bedmaster_reader.interbundle_corr[sig_type] = None

    cut_idx = {"wv": 10, "vs": 4}
    time_corr = {"wv": 5, "vs": 3}

    # Standard case
    ecgi = bedmaster_reader.get_wv("ch7", "I")
    _apply_and_assert_ib(ecgi, "wv")

    cuff = bedmaster_reader.get_vs("CUFF")
    _apply_and_assert_ib(cuff, "vs")

    # With DE
    ecgv = bedmaster_reader.get_wv("ch10", "V")
    _apply_and_assert_ib(ecgv, "wv")

    hr = bedmaster_reader.get_vs("HR")
    _apply_and_assert_ib(hr, "vs")

    # With missing values
    ecgiii = bedmaster_reader.get_wv("ch9", "prova")
    _apply_and_assert_ib(ecgiii, "wv")

    # Multiple sf
    ecgii = bedmaster_reader.get_wv("ch8", "II")
    _apply_and_assert_ib(ecgii, "wv")
Exemple #2
0
def test_get_vs(bedmaster_reader: BedmasterReader, matfile: h5py.File):
    def _linearize(arr):
        return np.transpose(arr)[0]

    # Standard case
    heart_rate = bedmaster_reader.get_vs("HR")
    if heart_rate is None:
        assert False
    assert heart_rate.name == "HR"
    assert np.array_equal(heart_rate.value, _linearize(matfile["vs/HR"][()]))
    assert np.array_equal(
        heart_rate.time,
        _linearize(matfile["vs_time_corrected/HR/res_vs"][()]),
    )
    assert heart_rate.scale_factor == 0.5
    assert heart_rate.units == "Bpm"
    assert heart_rate.sample_freq == np.array([(0.5, 0)], dtype="float,int")

    # Check that dataevents are collected
    time_corr_arr = np.unpackbits(heart_rate.time_corr_arr, axis=None)
    irregularities = np.where(time_corr_arr)[0]
    expected_irr_idx = np.array([2, 3, 11])
    assert np.array_equal(irregularities, expected_irr_idx)

    # Check that interbundle correction is applied
    bedmaster_reader.interbundle_corr["vs"] = {
        "maxTime": heart_rate.time[10],
        "timeCorr": 3,
    }
    heart_rate_corr = bedmaster_reader.get_vs("HR")
    if heart_rate_corr is None:
        assert False
    assert len(heart_rate_corr.time) == len(heart_rate.time) - 11
    assert len(heart_rate_corr.value) == len(heart_rate.value) - 11

    # Case with unknown scale factor and unit
    spo2r = bedmaster_reader.get_vs("SPO2R")
    if spo2r is None:
        assert False
    assert spo2r.scale_factor == 1
    assert spo2r.units == "UNKNOWN"
    assert spo2r.sample_freq == np.array([(0.5, 0)], dtype="float,int")
Exemple #3
0
def test_contiguous_nparrays(bedmaster_reader: BedmasterReader):
    heart_rate = bedmaster_reader.get_vs("HR")
    if heart_rate is None:
        assert False
    ecgv = bedmaster_reader.get_wv("ch10", "V")
    if ecgv is None:
        assert False
    signals = [heart_rate, ecgv]
    for signal in signals:
        assert not signal.value.dtype == object
        assert not signal.time.dtype == object
Exemple #4
0
def test_get_interbundle_correction(bedmaster_reader: BedmasterReader):
    art1d = bedmaster_reader.get_vs("CO")
    if art1d is None:
        assert False
    ch10 = bedmaster_reader.get_wv("ch10", "v")
    if ch10 is None:
        assert False

    no_correction = {"vs": None, "wv": None}
    prev_max_vs = {
        "segmentNo": 2,
        "maxTime": art1d.time[4],
        "signalName": "CO",
    }
    prev_max_wv = {
        "segmentNo": 1,
        "maxTime": ch10.time[14],
        "signalName": "ch10",
    }
    prev_max_info = {"vs": prev_max_vs, "wv": prev_max_wv}

    expected_vs = {"maxTime": art1d.time[3], "timeCorr": 2}
    expected_wv = {"maxTime": ch10.time[15], "timeCorr": -0.25}

    def _change_ibcor_dict(source_type, **kwargs):
        new_dict = prev_max_info.copy()
        for source in source_type:
            for key in kwargs:
                new_dict[source][key] = kwargs[key]
        return new_dict

    assert bedmaster_reader.interbundle_corr == no_correction

    # Normal case:
    bedmaster_reader.get_interbundle_correction(prev_max_info)
    assert bedmaster_reader.interbundle_corr["vs"] == expected_vs
    assert bedmaster_reader.interbundle_corr["wv"] == expected_wv

    # Case: signal does not exist on current bundle
    previous = _change_ibcor_dict(["vs", "wv"], signalName="Random")
    bedmaster_reader.get_interbundle_correction(previous)
    assert bedmaster_reader.interbundle_corr == no_correction

    # Case: no overlap between previous and current bundle
    previous = _change_ibcor_dict(["vs", "wv"], segmentNo=-1)
    bedmaster_reader.get_interbundle_correction(previous)
    assert bedmaster_reader.interbundle_corr == no_correction

    # Case: complete overlap between previous and current
    previous = _change_ibcor_dict(["vs", "wv"], segmentNo=100)
    bedmaster_reader.get_interbundle_correction(previous)
    assert bedmaster_reader.interbundle_corr == no_correction
Exemple #5
0
def test_max_segment(bedmaster_reader: BedmasterReader):
    def _create_max_seg_dict(seg_no, max_time, signal_name):
        return {
            "segmentNo": seg_no,
            "maxTime": max_time,
            "signalName": signal_name,
        }

    empty_vs_dict = _create_max_seg_dict(0, -1, "")
    empty_wv_dict = _create_max_seg_dict(0, -1, "")
    expected_wv_max = _create_max_seg_dict(
        seg_no=6,
        max_time=1452438403.75,
        signal_name="ch10",
    )
    expected_vs_max = _create_max_seg_dict(
        seg_no=6,
        max_time=1452438402.0,
        signal_name="CO",
    )

    assert bedmaster_reader.max_segment["vs"] == empty_vs_dict
    assert bedmaster_reader.max_segment["wv"] == empty_wv_dict

    wv_signals = bedmaster_reader.list_wv()
    for wv_signal_name, channel in wv_signals.items():
        bedmaster_reader.get_wv(channel, wv_signal_name)

    assert bedmaster_reader.max_segment["vs"] == empty_vs_dict
    assert bedmaster_reader.max_segment["wv"] == expected_wv_max

    vs_signals = bedmaster_reader.list_vs()
    for vs_signal_name in vs_signals:
        bedmaster_reader.get_vs(vs_signal_name)
    assert bedmaster_reader.max_segment["vs"] == expected_vs_max
    assert bedmaster_reader.max_segment["wv"] == expected_wv_max