From c52dbdf9b8b9b720180b99c0935df5c9175109f2 Mon Sep 17 00:00:00 2001 From: Theodore Papadopoulo Date: Sun, 1 Jun 2025 15:03:07 +0200 Subject: [PATCH 1/3] Do not ignore the file_id. --- mne/_fiff/tag.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mne/_fiff/tag.py b/mne/_fiff/tag.py index 6a4636ef264..7f53cd21bf5 100644 --- a/mne/_fiff/tag.py +++ b/mne/_fiff/tag.py @@ -361,9 +361,9 @@ def _read_old_pack(fid, tag, shape, rlims): def _read_dir_entry_struct(fid, tag, shape, rlims): """Read dir entry struct tag.""" - pos = tag.pos + 16 + pos = tag.pos entries = list() - for offset in range(1, tag.size // 16): + for offset in range(tag.size // 16): ent = _read_tag_header(fid, pos + offset * 16) # The position of the real tag on disk is stored in the "next" entry within the # directory, so we need to overwrite ent.pos. For safety let's also overwrite From 873ec22d14be8076ef30530011cc3e368ccc3c1c Mon Sep 17 00:00:00 2001 From: Theodore Papadopoulo Date: Sun, 1 Jun 2025 17:06:11 +0200 Subject: [PATCH 2/3] Implement FIFF_DATA_SKIP_SAMP. --- mne/io/fiff/raw.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/mne/io/fiff/raw.py b/mne/io/fiff/raw.py index f9e10a0039d..5d4abe98d26 100644 --- a/mne/io/fiff/raw.py +++ b/mne/io/fiff/raw.py @@ -281,6 +281,8 @@ def _read_raw_file( FIFF.FIFFT_COMPLEX_DOUBLE: "double", } + nskip = 0 + nskip_in_samples = 0 for k in range(first, nent): ent = directory[k] # There can be skips in the data (e.g., if the user unclicked) @@ -305,16 +307,20 @@ def _read_raw_file( # Do we have a skip pending? if nskip > 0: + nskip_in_samples += nskip * nsamp + nskip = 0 + + if nskip_in_samples > 0: raw_extras.append( dict( ent=None, first=first_samp, - nsamp=nskip * nsamp, - last=first_samp + nskip * nsamp - 1, + nsamp=nskip_in_samples, + last=first_samp + nskip_in_samples - 1, ) ) - first_samp += nskip * nsamp - nskip = 0 + first_samp += nskip_in_samples + nskip_in_samples = 0 # Add a data buffer raw_extras.append( @@ -328,7 +334,10 @@ def _read_raw_file( first_samp += nsamp elif ent.kind == FIFF.FIFF_DATA_SKIP: tag = read_tag(fid, ent.pos) - nskip = int(tag.data.item()) + nskip += int(tag.data.item()) + elif ent.kind == FIFF.FIFF_DATA_SKIP_SAMP: + tag = read_tag(fid, ent.pos) + nskip_in_samples += int(tag.data.item()) next_fname = _get_next_fname(fid, _path_from_fname(fname), tree) From 03cefe41e63ae29d35ef1a0e00385da549e480a6 Mon Sep 17 00:00:00 2001 From: Theodore Papadopoulo Date: Sun, 1 Jun 2025 17:24:36 +0200 Subject: [PATCH 3/3] Also handle multiple skip at start. Small simplification. --- mne/io/fiff/raw.py | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/mne/io/fiff/raw.py b/mne/io/fiff/raw.py index 5d4abe98d26..f6b2027d8f5 100644 --- a/mne/io/fiff/raw.py +++ b/mne/io/fiff/raw.py @@ -231,7 +231,6 @@ def _read_raw_file( nchan = int(info["nchan"]) first = 0 first_samp = 0 - first_skip = 0 # Get first sample tag if it is there if directory[first].kind == FIFF.FIFF_FIRST_SAMPLE: @@ -240,14 +239,6 @@ def _read_raw_file( first += 1 _check_entry(first, nent) - # Omit initial skip - if directory[first].kind == FIFF.FIFF_DATA_SKIP: - # This first skip can be applied only after we know the bufsize - tag = read_tag(fid, directory[first].pos) - first_skip = int(tag.data.item()) - first += 1 - _check_entry(first, nent) - raw = _RawShell() raw.first_samp = first_samp if info["meas_date"] is None and annotations is not None: @@ -283,6 +274,7 @@ def _read_raw_file( nskip = 0 nskip_in_samples = 0 + first_data_buffer = True for k in range(first, nent): ent = directory[k] # There can be skips in the data (e.g., if the user unclicked) @@ -299,12 +291,6 @@ def _read_raw_file( if orig_format is None: orig_format = _orig_format_dict[ent.type] - # Do we have an initial skip pending? - if first_skip > 0: - first_samp += nsamp * first_skip - raw.first_samp = first_samp - first_skip = 0 - # Do we have a skip pending? if nskip > 0: nskip_in_samples += nskip * nsamp @@ -322,6 +308,12 @@ def _read_raw_file( first_samp += nskip_in_samples nskip_in_samples = 0 + # Handle an initial skip. + + if first_data_buffer: + raw.first_samp = first_samp + first_data_buffer = False + # Add a data buffer raw_extras.append( dict(