BaseSorting.select_periods() drops properties, annotations and the registered recording

Aperta
#4,915 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@AxelNoun ci sta già lavorando.

Dal 5/11/2026.

  • #4921 di @AxelNoun — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
20/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

The issue points to src/spikeinterface/core/sorting_tools.py around select_sorting_periods and describes a reproduction using BaseSorting.select_periods(). Read that function and the related tests in test_basesorting.py; verify that the selected sorting retains properties, annotations, its registered recording, and correct returned spike times. An open pull request, #4921, is already linked to this issue.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug core

select_sorting_periods overwrites sorting with the new object, then copies the metadata from this object onto itself:

sorting = NumpySorting(
    sliced_spike_vector, sampling_frequency=sorting.sampling_frequency, unit_ids=sorting.unit_ids
)
sorting.copy_metadata(sorting)
return sorting

So after select_periods, all properties and annotations are lost. The recording is also no longer registered, so get_unit_spike_train(..., return_times=True) ignores the start time or time vector of the recording.

Reproduction

main at 9ef464e66, Linux (WSL Ubuntu 24.04), Python 3.12.3, numpy 2.5.4:

import numpy as np
import spikeinterface.core as sc
from spikeinterface.core.base import unit_period_dtype

fs = 1000.0
rec = sc.generate_recording(num_channels=2, sampling_frequency=fs, durations=[10.0], seed=0)
rec.shift_times(500.0)  # the recording starts at t = 500 s
sorting = sc.NumpySorting.from_unit_dict(
    {"a": np.array([10, 2000, 5000]), "b": np.array([30, 3000])}, sampling_frequency=fs
)
sorting.set_property("quality", np.array(["good", "mua"]))
sorting.annotate(probe_name="NP2.0")
sorting.register_recording(rec)

periods = np.array([(0, 0, 4000, 0), (0, 0, 4000, 1)], dtype=unit_period_dtype)
selected = sorting.select_periods(periods)

print("properties:   ", sorting.get_property_keys(), "->", selected.get_property_keys())
print("annotations:  ", sorting.get_annotation_keys(), "->", selected.get_annotation_keys())
print("has_recording:", sorting.has_recording(), "->", selected.has_recording())
print("spike times of 'a' (s):", sorting.get_unit_spike_train("a", return_times=True)[:2],
      "->", selected.get_unit_spike_train("a", return_times=True))
properties:    ['quality'] -> []
annotations:   ['probe_name'] -> []
has_recording: True -> False
spike times of 'a' (s): [500.01 502.  ] -> [0.01 2.  ]

The spike times are off by 500 s.

Possible fix
-        sorting = NumpySorting(
+        new_sorting = NumpySorting(
             sliced_spike_vector, sampling_frequency=sorting.sampling_frequency, unit_ids=sorting.unit_ids
         )
-        sorting.copy_metadata(sorting)
-        return sorting
+        sorting.copy_metadata(new_sorting)
+        if sorting.has_recording():
+            new_sorting.register_recording(sorting._recording)
+        return new_sorting

With this, the properties, annotations and spike times are preserved in the example above. test_basesorting.py, test_baserecording.py, test_binaryfolder.py, test_binaryrecordingextractor.py and test_numpy_extractors.py still pass (33 tests).

I found no existing report, and no open PR changes this line. It comes from #4316. #4796 fixed a similar loss of start times in NumpySorting.from_sorting. I can open a PR with this change and a test.

Lingua principale
Python
Stelle
870
Fork
284
Merge medio
3g 1h
PR unite (30g)
41

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di SpikeInterface/spikeinterface

Tutte le issue di SpikeInterface/spikeinterface

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.