From 857916ab01cab13024cfa156fbff0ba87c7ddf39 Mon Sep 17 00:00:00 2001 From: Brian Gow Date: Mon, 12 Jan 2026 13:54:15 -0500 Subject: [PATCH 1/2] enable check segment cohesion --- wfdb/io/record.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wfdb/io/record.py b/wfdb/io/record.py index 6ae5190e..cfd5550d 100644 --- a/wfdb/io/record.py +++ b/wfdb/io/record.py @@ -1177,6 +1177,9 @@ def wrsamp(self, expanded=False, write_dir=""): N/A """ + # Validate segment cohesion before writing anything. + self._check_segment_cohesion() + # Perform field validity and cohesion checks, and write the # header file. self.wrheader(write_dir=write_dir) From b252a0b689e53eb19e1c732a785c97f46e5cde3b Mon Sep 17 00:00:00 2001 From: Brian Gow Date: Mon, 12 Jan 2026 16:29:39 -0500 Subject: [PATCH 2/2] add samps_per_frame segment validation --- wfdb/io/record.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/wfdb/io/record.py b/wfdb/io/record.py index cfd5550d..7fcc9b79 100644 --- a/wfdb/io/record.py +++ b/wfdb/io/record.py @@ -1226,6 +1226,34 @@ def _check_segment_cohesion(self): f"The signal length of segment {seg_num} does not match the corresponding segment length" ) + # If segment has expanded signals, validate samps_per_frame and signal lengths + if segment.e_d_signal is not None or segment.e_p_signal is not None: + expanded_signal = ( + segment.e_d_signal + if segment.e_d_signal is not None + else segment.e_p_signal + ) + + if segment.samps_per_frame is None: + raise ValueError( + f"Segment {seg_num} has expanded signals but 'samps_per_frame' is not set" + ) + + for ch in range(segment.n_sig): + if segment.samps_per_frame[ch] is None: + raise ValueError( + f"Segment {seg_num}, channel {ch}: 'samps_per_frame' must be set for expanded signals" + ) + + expected_len = segment.samps_per_frame[ch] * segment.sig_len + actual_len = len(expanded_signal[ch]) + + if actual_len != expected_len: + raise ValueError( + f"Segment {seg_num}, channel {ch}: expanded signal length ({actual_len}) " + f"does not match samps_per_frame[{ch}] * sig_len ({expected_len})" + ) + # No need to check the sum of sig_lens from each segment object against sig_len # Already effectively done it when checking sum(seg_len) against sig_len