From f77dc4f44e291bed1bb70b85618383733bf51160 Mon Sep 17 00:00:00 2001 From: Heberto Mayorquin Date: Fri, 2 Oct 2026 11:04:41 -0600 Subject: [PATCH 1/2] Read the last spike from the unit end offsets in NwbSortingExtractor --- src/spikeinterface/extractors/nwbextractors.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/spikeinterface/extractors/nwbextractors.py b/src/spikeinterface/extractors/nwbextractors.py index 5f7f88e996..a82aefbe14 100644 --- a/src/spikeinterface/extractors/nwbextractors.py +++ b/src/spikeinterface/extractors/nwbextractors.py @@ -1456,6 +1456,21 @@ def _compute_and_cache_spike_vector(self) -> None: self._cached_spike_vector = spikes self._cached_spike_vector_segment_slices = np.array([[0, num_spikes]], dtype="int64") + def get_last_spike_frame(self, segment_index: int | None = None) -> int: + # Performance: the generic BaseSorting version builds the full spike vector to take one maximum. + # spike_times_index holds the end offset of each unit's spikes, so reading only the last spike of + # each unit is enough. This assumes spike times are ordered within each unit, an NWB best practice + # checked by nwbinspector, so each unit's last stored time is its latest. + segment_index = self._check_segment_index(segment_index) + segment = self.segments[segment_index] + unit_ends = np.asarray(segment.spike_times_index_data[:], dtype="int64") + unit_counts = np.diff(unit_ends, prepend=0) + last_spike_positions = unit_ends[unit_counts > 0] - 1 + if last_spike_positions.size == 0: + return 0 + last_spike_times = np.asarray(segment.spike_times_data[last_spike_positions], dtype="float64") + return int(segment._times_to_samples(last_spike_times).max()) + @staticmethod def fetch_available_units_tables( file_path: str | Path, From 65e55cc7ac273d2b58a04d0602f469b27a964ed0 Mon Sep 17 00:00:00 2001 From: Heberto Mayorquin Date: Mon, 5 Oct 2026 15:15:04 -0600 Subject: [PATCH 2/2] improve readability --- src/spikeinterface/extractors/nwbextractors.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/spikeinterface/extractors/nwbextractors.py b/src/spikeinterface/extractors/nwbextractors.py index a82aefbe14..7ba2dd02d1 100644 --- a/src/spikeinterface/extractors/nwbextractors.py +++ b/src/spikeinterface/extractors/nwbextractors.py @@ -1469,7 +1469,9 @@ def get_last_spike_frame(self, segment_index: int | None = None) -> int: if last_spike_positions.size == 0: return 0 last_spike_times = np.asarray(segment.spike_times_data[last_spike_positions], dtype="float64") - return int(segment._times_to_samples(last_spike_times).max()) + last_spike_time = last_spike_times.max() + last_spike_frame = segment._times_to_samples(last_spike_time) + return int(last_spike_frame) @staticmethod def fetch_available_units_tables(