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")
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")
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
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
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