From 97992dcd9216f1c46f3a9ee0095aab043960846b Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 7 Jan 2026 17:20:04 +0100 Subject: [PATCH 01/24] add apply curation for qt --- spikeinterface_gui/controller.py | 269 ++++++++++++++------------ spikeinterface_gui/correlogramview.py | 4 + spikeinterface_gui/curationview.py | 8 + spikeinterface_gui/probeview.py | 11 ++ spikeinterface_gui/unitlistview.py | 3 + spikeinterface_gui/view_base.py | 20 ++ 6 files changed, 192 insertions(+), 123 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 3034b4f9..1191d9e1 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -12,7 +12,7 @@ import spikeinterface.qualitymetrics from spikeinterface.core.sorting_tools import spike_vector_to_indices from spikeinterface.core.core_tools import check_json -from spikeinterface.curation import validate_curation_dict +from spikeinterface.curation import validate_curation_dict, apply_curation from spikeinterface.curation.curation_model import CurationModel from spikeinterface.widgets.utils import make_units_table_from_analyzer @@ -54,18 +54,118 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.signal_handler = SignalHandler(self, parent=parent) self.with_traces = with_traces + self.main_settings = _default_main_settings.copy() + self.save_on_compute = save_on_compute + self.verbose = verbose + + self.set_analyzer_info(analyzer, extra_unit_properties, displayed_unit_properties) + + self._potential_merges = None + self.curation = curation + # TODO: Reload the dictionary if it already exists + if self.curation: + # rules: + # * if user sends curation_data, then it is used + # * otherwise, if curation_data already exists in folder it is used + # * otherwise create an empty one + + if curation_data is not None: + # validate the curation data + format_version = curation_data.get("format_version", None) + # assume version 2 if not present + if format_version is None: + raise ValueError("Curation data format version is missing and is required in the curation data.") + try: + validate_curation_dict(curation_data) + except Exception as e: + raise ValueError(f"Invalid curation data.\nError: {e}") + + if curation_data.get("merges") is None: + curation_data["merges"] = [] + else: + # here we reset the merges for better formatting (str) + existing_merges = curation_data["merges"] + new_merges = [] + for m in existing_merges: + if "unit_ids" not in m: + continue + if len(m["unit_ids"]) < 2: + continue + new_merges = add_merge(new_merges, m["unit_ids"]) + curation_data["merges"] = new_merges + if curation_data.get("splits") is None: + curation_data["splits"] = [] + if curation_data.get("removed") is None: + curation_data["removed"] = [] + + elif self.analyzer.format == "binary_folder": + json_file = self.analyzer.folder / "spikeinterface_gui" / "curation_data.json" + if json_file.exists(): + with open(json_file, "r") as f: + curation_data = json.load(f) + + elif self.analyzer.format == "zarr": + import zarr + zarr_root = zarr.open(self.analyzer.folder, mode='r') + if "spikeinterface_gui" in zarr_root.keys() and "curation_data" in zarr_root["spikeinterface_gui"].attrs.keys(): + curation_data = zarr_root["spikeinterface_gui"].attrs["curation_data"] + + if curation_data is None: + curation_data = empty_curation_data.copy() + + if curation_data.get("discard_spikes") is None: + curation_data["discard_spikes"] = [] + + self.curation_data = curation_data + + self.has_default_quality_labels = False + if "label_definitions" not in self.curation_data: + if label_definitions is not None: + self.curation_data["label_definitions"] = label_definitions + else: + self.curation_data["label_definitions"] = default_label_definitions.copy() + + if "quality" in self.curation_data["label_definitions"]: + curation_dict_quality_labels = self.curation_data["label_definitions"]["quality"]["label_options"] + default_quality_labels = default_label_definitions["quality"]["label_options"] + if set(curation_dict_quality_labels) == set(default_quality_labels): + if self.verbose: + print('Curation quality labels are the default ones') + self.has_default_quality_labels = True + + def check_is_view_possible(self, view_name): + from .viewlist import get_all_possible_views + possible_class_views = get_all_possible_views() + view_class = possible_class_views[view_name] + if view_class._depend_on is not None: + depencies_ok = all(self.has_extension(k) for k in view_class._depend_on) + if not depencies_ok: + if self.verbose: + print(view_name, 'does not have all dependencies', view_class._depend_on) + return False + return True + + def declare_a_view(self, new_view): + assert new_view not in self.views, 'view already declared {}'.format(self) + self.views.append(new_view) + self.signal_handler.connect_view(new_view) + + @property + def channel_ids(self): + return self.analyzer.channel_ids + + @property + def unit_ids(self): + return self.analyzer.unit_ids + + def set_analyzer_info(self, analyzer, extra_unit_properties, displayed_unit_properties): self.analyzer = analyzer assert self.analyzer.get_extension("random_spikes") is not None self.return_in_uV = self.analyzer.return_in_uV - self.save_on_compute = save_on_compute - - self.verbose = verbose t0 = time.perf_counter() - self.main_settings = _default_main_settings.copy() - self.num_channels = self.analyzer.get_num_channels() # this now private and shoudl be acess using function self._visible_unit_ids = [self.unit_ids[0]] @@ -79,7 +179,7 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.analyzer_sparsity = self.analyzer.sparsity # Mandatory extensions: computation forced - if verbose: + if self.verbose: print('\tLoading templates') temp_ext = self.analyzer.get_extension("templates") if temp_ext is None: @@ -93,7 +193,7 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save else: self.templates_std = None - if verbose: + if self.verbose: print('\tLoading unit_locations') ext = analyzer.get_extension('unit_locations') if ext is None: @@ -103,7 +203,7 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.unit_positions = ext.get_data()[:, :2] # Optional extensions : can be None or skipped - if verbose: + if self.verbose: print('\tLoading noise_levels') ext = analyzer.get_extension('noise_levels') if ext is None and self.has_extension('recording'): @@ -111,12 +211,12 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save ext = analyzer.compute_one_extension('noise_levels') self.noise_levels = ext.get_data() if ext is not None else None - if "quality_metrics" in skip_extensions: + if "quality_metrics" in self.skip_extensions: if self.verbose: print('\tSkipping quality_metrics') self.metrics = None else: - if verbose: + if self.verbose: print('\tLoading quality_metrics') qm_ext = analyzer.get_extension('quality_metrics') if qm_ext is not None: @@ -124,12 +224,12 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save else: self.metrics = None - if "spike_amplitudes" in skip_extensions: + if "spike_amplitudes" in self.skip_extensions: if self.verbose: print('\tSkipping spike_amplitudes') self.spike_amplitudes = None else: - if verbose: + if self.verbose: print('\tLoading spike_amplitudes') sa_ext = analyzer.get_extension('spike_amplitudes') if sa_ext is not None: @@ -137,12 +237,12 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save else: self.spike_amplitudes = None - if "spike_locations" in skip_extensions: + if "spike_locations" in self.skip_extensions: if self.verbose: print('\tSkipping spike_locations') self.spike_depths = None else: - if verbose: + if self.verbose: print('\tLoading spike_locations') sl_ext = analyzer.get_extension('spike_locations') if sl_ext is not None: @@ -150,13 +250,13 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save else: self.spike_depths = None - if "correlograms" in skip_extensions: + if "correlograms" in self.skip_extensions: if self.verbose: print('\tSkipping correlograms') self.correlograms = None self.correlograms_bins = None else: - if verbose: + if self.verbose: print('\tLoading correlograms') ccg_ext = analyzer.get_extension('correlograms') if ccg_ext is not None: @@ -164,13 +264,13 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save else: self.correlograms, self.correlograms_bins = None, None - if "isi_histograms" in skip_extensions: + if "isi_histograms" in self.skip_extensions: if self.verbose: print('\tSkipping isi_histograms') self.isi_histograms = None self.isi_bins = None else: - if verbose: + if self.verbose: print('\tLoading isi_histograms') isi_ext = analyzer.get_extension('isi_histograms') if isi_ext is not None: @@ -179,11 +279,11 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.isi_histograms, self.isi_bins = None, None self._similarity_by_method = {} - if "template_similarity" in skip_extensions: + if "template_similarity" in self.skip_extensions: if self.verbose: print('\tSkipping template_similarity') else: - if verbose: + if self.verbose: print('\tLoading template_similarity') ts_ext = analyzer.get_extension('template_similarity') if ts_ext is not None: @@ -196,12 +296,12 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save ts_ext = analyzer.compute_one_extension('template_similarity', method=method, save=save_on_compute) self._similarity_by_method[method] = ts_ext.get_data() - if "waveforms" in skip_extensions: + if "waveforms" in self.skip_extensions: if self.verbose: print('\tSkipping waveforms') self.waveforms_ext = None else: - if verbose: + if self.verbose: print('\tLoading waveforms') wf_ext = analyzer.get_extension('waveforms') if wf_ext is not None: @@ -209,20 +309,18 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save else: self.waveforms_ext = None self._pc_projections = None - if "principal_components" in skip_extensions: + if "principal_components" in self.skip_extensions: if self.verbose: print('\tSkipping principal_components') self.pc_ext = None else: - if verbose: + if self.verbose: print('\tLoading principal_components') pc_ext = analyzer.get_extension('principal_components') self.pc_ext = pc_ext - self._potential_merges = None - t1 = time.perf_counter() - if verbose: + if self.verbose: print('Loading extensions took', t1 - t0) t0 = time.perf_counter() @@ -287,7 +385,7 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self._spike_index_by_units[unit_id] = np.concatenate(inds) t1 = time.perf_counter() - if verbose: + if self.verbose: print('Gathering all spikes took', t1 - t0) self._spike_visible_indices = np.array([], dtype='int64') @@ -307,99 +405,6 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save # set default time info self.update_time_info() - self.curation = curation - # TODO: Reload the dictionary if it already exists - if self.curation: - # rules: - # * if user sends curation_data, then it is used - # * otherwise, if curation_data already exists in folder it is used - # * otherwise create an empty one - - if curation_data is not None: - # validate the curation data - format_version = curation_data.get("format_version", None) - # assume version 2 if not present - if format_version is None: - raise ValueError("Curation data format version is missing and is required in the curation data.") - try: - validate_curation_dict(curation_data) - except Exception as e: - raise ValueError(f"Invalid curation data.\nError: {e}") - - if curation_data.get("merges") is None: - curation_data["merges"] = [] - else: - # here we reset the merges for better formatting (str) - existing_merges = curation_data["merges"] - new_merges = [] - for m in existing_merges: - if "unit_ids" not in m: - continue - if len(m["unit_ids"]) < 2: - continue - new_merges = add_merge(new_merges, m["unit_ids"]) - curation_data["merges"] = new_merges - if curation_data.get("splits") is None: - curation_data["splits"] = [] - if curation_data.get("removed") is None: - curation_data["removed"] = [] - - elif self.analyzer.format == "binary_folder": - json_file = self.analyzer.folder / "spikeinterface_gui" / "curation_data.json" - if json_file.exists(): - with open(json_file, "r") as f: - curation_data = json.load(f) - - elif self.analyzer.format == "zarr": - import zarr - zarr_root = zarr.open(self.analyzer.folder, mode='r') - if "spikeinterface_gui" in zarr_root.keys() and "curation_data" in zarr_root["spikeinterface_gui"].attrs.keys(): - curation_data = zarr_root["spikeinterface_gui"].attrs["curation_data"] - - if curation_data is None: - curation_data = empty_curation_data.copy() - - self.curation_data = curation_data - - self.has_default_quality_labels = False - if "label_definitions" not in self.curation_data: - if label_definitions is not None: - self.curation_data["label_definitions"] = label_definitions - else: - self.curation_data["label_definitions"] = default_label_definitions.copy() - - if "quality" in self.curation_data["label_definitions"]: - curation_dict_quality_labels = self.curation_data["label_definitions"]["quality"]["label_options"] - default_quality_labels = default_label_definitions["quality"]["label_options"] - if set(curation_dict_quality_labels) == set(default_quality_labels): - if self.verbose: - print('Curation quality labels are the default ones') - self.has_default_quality_labels = True - - def check_is_view_possible(self, view_name): - from .viewlist import get_all_possible_views - possible_class_views = get_all_possible_views() - view_class = possible_class_views[view_name] - if view_class._depend_on is not None: - depencies_ok = all(self.has_extension(k) for k in view_class._depend_on) - if not depencies_ok: - if self.verbose: - print(view_name, 'does not have all dependencies', view_class._depend_on) - return False - return True - - def declare_a_view(self, new_view): - assert new_view not in self.views, 'view already declared {}'.format(self) - self.views.append(new_view) - self.signal_handler.connect_view(new_view) - - @property - def channel_ids(self): - return self.analyzer.channel_ids - - @property - def unit_ids(self): - return self.analyzer.unit_ids def get_time(self): """ @@ -797,7 +802,7 @@ def compute_auto_merge(self, **params): ) return merge_unit_groups, extra - + def curation_can_be_saved(self): return self.analyzer.format != "memory" @@ -808,6 +813,24 @@ def construct_final_curation(self): d.update(self.curation_data.copy()) model = CurationModel(**d) return model + + def apply_curation(self): + + curation = self.construct_final_curation() + curated_analyzer = apply_curation(self.analyzer, curation) + + self.set_analyzer_info(curated_analyzer, None, None) + self.remove_curation() + + self.curation=None + self.refresh_colors() + + for view in self.views: + view.reinitialize() + + def remove_curation(self): + self.curation = None + self.curation_data = empty_curation_data.copy() def save_curation_in_analyzer(self): if self.analyzer.format == "memory": diff --git a/spikeinterface_gui/correlogramview.py b/spikeinterface_gui/correlogramview.py index 9ca6fa63..c4bc965f 100644 --- a/spikeinterface_gui/correlogramview.py +++ b/spikeinterface_gui/correlogramview.py @@ -48,6 +48,10 @@ def _qt_make_layout(self): self.grid = pg.GraphicsLayoutWidget() self.layout.addWidget(self.grid) + def _qt_reinitialize(self): + self.ccg, self.bins = self.controller.get_correlograms() + self.figure_cache = {} + self._qt_refresh() def _qt_refresh(self): import pyqtgraph as pg diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 2018d0ff..39e789ef 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -73,6 +73,11 @@ def _qt_make_layout(self): but = QT.QPushButton("Save in analyzer") tb.addWidget(but) but.clicked.connect(self.save_in_analyzer) + + but_apply = QT.QPushButton("Apply curation") + tb.addWidget(but_apply) + but_apply.clicked.connect(self.apply_curation_to_analyzer) + but = QT.QPushButton("Export JSON") but.clicked.connect(self._qt_export_json) tb.addWidget(but) @@ -278,6 +283,9 @@ def on_manual_curation_updated(self): def save_in_analyzer(self): self.controller.save_curation_in_analyzer() + def apply_curation_to_analyzer(self): + self.controller.apply_curation() + def _qt_export_json(self): from .myqt import QT fd = QT.QFileDialog(fileMode=QT.QFileDialog.AnyFile, acceptMode=QT.QFileDialog.AcceptSave) diff --git a/spikeinterface_gui/probeview.py b/spikeinterface_gui/probeview.py index 56099cec..4914a7ab 100644 --- a/spikeinterface_gui/probeview.py +++ b/spikeinterface_gui/probeview.py @@ -149,6 +149,17 @@ def _qt_make_layout(self): self.roi_units.sigRegionChangeFinished.connect(self._qt_on_roi_units_changed) + def _qt_reinitialize(self): + import pyqtgraph as pg + unit_positions = self.controller.unit_positions + brush = [self.get_unit_color(u) for u in self.controller.unit_ids] + self.scatter = pg.ScatterPlotItem(pos=unit_positions, pxMode=False, size=10, brush=brush) + + xlim0, xlim1, ylim0, ylim1 = self.get_view_bounds() + self.plot.setXRange(xlim0, xlim1) + self.plot.setYRange(ylim0, ylim1) + self._qt_refresh() + def _qt_refresh(self): current_unit_positions = self.controller.unit_positions # if not np.array_equal(current_unit_positions, self._unit_positions): diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index ef6a6958..e3a34b91 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -129,6 +129,9 @@ def _qt_make_layout(self): self.shortcut_noise.setKey(QT.QKeySequence('n')) self.shortcut_noise.activated.connect(lambda: self._qt_set_default_label('noise')) + def _qt_reinitialize(self): + self._qt_full_table_refresh() + self._qt_refresh() def _qt_on_column_moved(self, logical_index, old_visual_index, new_visual_index): # Update stored column order diff --git a/spikeinterface_gui/view_base.py b/spikeinterface_gui/view_base.py index b9417ff6..f6d7df94 100644 --- a/spikeinterface_gui/view_base.py +++ b/spikeinterface_gui/view_base.py @@ -113,6 +113,14 @@ def refresh(self, **kwargs): t1 = time.perf_counter() print(f"Refresh {self.__class__.__name__} took {t1 - t0:.3f} seconds", flush=True) + def reinitialize(self, **kwargs): + if self.controller.verbose: + t0 = time.perf_counter() + self._reinitialize(**kwargs) + if self.controller.verbose: + t1 = time.perf_counter() + print(f"Reinitialize {self.__class__.__name__} took {t1 - t0:.3f} seconds", flush=True) + def compute(self, event=None): with self.busy_cursor(): self._compute() @@ -127,6 +135,12 @@ def _refresh(self, **kwargs): elif self.backend == "panel": self._panel_refresh(**kwargs) + def _reinitialize(self, **kwargs): + if self.backend == "qt": + self._qt_reinitialize(**kwargs) + elif self.backend == "panel": + self._panel_reinitialize(**kwargs) + def warning(self, warning_msg): if self.backend == "qt": self._qt_insert_warning(warning_msg) @@ -249,6 +263,9 @@ def _qt_make_layout(self): def _qt_refresh(self): raise (NotImplementedError) + + def _qt_reinitialize(self): + self._qt_refresh() def _qt_on_spike_selection_changed(self): pass @@ -309,6 +326,9 @@ def _panel_make_layout(self): def _panel_refresh(self): raise (NotImplementedError) + + def _panel_reinitialize(self): + self._panel_refresh() def _panel_on_spike_selection_changed(self): pass From ea0af5a89223025a5aa4a60b413c3ece97a0f708 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 7 Jan 2026 18:05:11 +0100 Subject: [PATCH 02/24] add panel buggy --- spikeinterface_gui/correlogramview.py | 5 +++++ spikeinterface_gui/curationview.py | 11 +++++++++++ spikeinterface_gui/probeview.py | 4 ++++ spikeinterface_gui/unitlistview.py | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/spikeinterface_gui/correlogramview.py b/spikeinterface_gui/correlogramview.py index c4bc965f..eb2664a4 100644 --- a/spikeinterface_gui/correlogramview.py +++ b/spikeinterface_gui/correlogramview.py @@ -121,6 +121,11 @@ def _panel_make_layout(self): sizing_mode="stretch_both", ) + def _panel_reinitialize(self): + self.ccg, self.bins = self.controller.get_correlograms() + self.figure_cache = {} + self._panel_refresh() + def _panel_refresh(self): import panel as pn import bokeh.plotting as bpl diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 39e789ef..bb239862 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -368,6 +368,13 @@ def _panel_make_layout(self): ) save_button.on_click(self._panel_save_in_analyzer) + apply_button = pn.widgets.Button( + name="Apply curation", + button_type="primary", + height=30 + ) + apply_button.on_click(self._panel_apply_curation_to_analyzer) + download_button = pn.widgets.FileDownload( button_type="primary", filename="curation.json", @@ -399,6 +406,7 @@ def _panel_make_layout(self): buttons_save = pn.Row( save_button, download_button, + apply_button, submit_button, sizing_mode="stretch_width", ) @@ -530,6 +538,9 @@ def _panel_restore_units(self, event): def _panel_unmerge(self, event): self.unmerge() + def _panel_apply_curation_to_analyzer(self, event): + self.apply_curation_to_analyzer() + def _panel_save_in_analyzer(self, event): self.save_in_analyzer() self.refresh() diff --git a/spikeinterface_gui/probeview.py b/spikeinterface_gui/probeview.py index 4914a7ab..cf5a7fdd 100644 --- a/spikeinterface_gui/probeview.py +++ b/spikeinterface_gui/probeview.py @@ -540,6 +540,10 @@ def _panel_refresh(self): self.y_range.start = y_min - margin self.y_range.end = y_max + margin + def _panel_reinitialize(self): + self._panel_make_layout() + self._refresh() + def _panel_update_unit_glyphs(self): # Get current data from source current_alphas = self.unit_glyphs.data_source.data['alpha'] diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index e3a34b91..18915e30 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -653,6 +653,10 @@ def _panel_refresh(self): # refresh header self._panel_refresh_header() + def _panel_reinitialize(self): + self._panel_make_layout() + self._refresh() + def _panel_refresh_header(self): unit_ids = self.controller.unit_ids n1 = len(unit_ids) From c9d338af0dcd457fa7f04057030222949ea2c8de Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Wed, 7 Jan 2026 18:54:52 +0100 Subject: [PATCH 03/24] Fix panel reinitialize for unit/probes and Chris's BUG --- spikeinterface_gui/controller.py | 3 --- spikeinterface_gui/curationview.py | 3 ++- spikeinterface_gui/probeview.py | 13 ++++++++----- spikeinterface_gui/unitlistview.py | 27 ++++++++++++++++----------- spikeinterface_gui/view_base.py | 2 +- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 1191d9e1..6d161c31 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -821,15 +821,12 @@ def apply_curation(self): self.set_analyzer_info(curated_analyzer, None, None) self.remove_curation() - - self.curation=None self.refresh_colors() for view in self.views: view.reinitialize() def remove_curation(self): - self.curation = None self.curation_data = empty_curation_data.copy() def save_curation_in_analyzer(self): diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index bb239862..30c431f6 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -284,7 +284,8 @@ def save_in_analyzer(self): self.controller.save_curation_in_analyzer() def apply_curation_to_analyzer(self): - self.controller.apply_curation() + with self.busy_cursor(): + self.controller.apply_curation() def _qt_export_json(self): from .myqt import QT diff --git a/spikeinterface_gui/probeview.py b/spikeinterface_gui/probeview.py index cf5a7fdd..4df724e6 100644 --- a/spikeinterface_gui/probeview.py +++ b/spikeinterface_gui/probeview.py @@ -490,11 +490,14 @@ def _panel_make_layout(self): self.should_resize_unit_circle = None # Main layout - self.layout = pn.Column( - self.figure, - styles={"display": "flex", "flex-direction": "column"}, - sizing_mode="stretch_both", - ) + if self.layout is None: + self.layout = pn.Column( + self.figure, + styles={"display": "flex", "flex-direction": "column"}, + sizing_mode="stretch_both", + ) + else: + self.layout.objects = [self.figure] def _panel_refresh(self): # Only update unit positions if they actually changed diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index 18915e30..bab72100 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -587,16 +587,22 @@ def _panel_make_layout(self): shortcuts_component = KeyboardShortcuts(shortcuts=shortcuts) shortcuts_component.on_msg(self._panel_handle_shortcut) - self.layout = pn.Column( - pn.Row( - self.info_text, - ), - buttons, - sizing_mode="stretch_width", - ) + if self.layout is None: + self.layout = pn.Column( + pn.Row( + self.info_text, + ), + buttons, + sizing_mode="stretch_width", + ) - self.layout.append(self.table) - self.layout.append(shortcuts_component) + self.layout.append(self.table) + self.layout.append(shortcuts_component) + else: + self.layout[0][0] = self.info_text + self.layout[1] = buttons + self.layout[2] = self.table + self.layout[3] = shortcuts_component self.table.tabulator.on_edit(self._panel_on_edit) @@ -655,7 +661,7 @@ def _panel_refresh(self): def _panel_reinitialize(self): self._panel_make_layout() - self._refresh() + self._panel_refresh() def _panel_refresh_header(self): unit_ids = self.controller.unit_ids @@ -682,7 +688,6 @@ def _panel_merge_units_callback(self, event): self.notifier.notify_active_view_updated() def _panel_on_visible_checkbox_toggled(self, row): - # print("checkbox toggled on row", row) unit_ids = self.table.value.index.values selected_unit_id = unit_ids[row] self.controller.set_unit_visibility(selected_unit_id, not self.controller.get_unit_visibility(selected_unit_id)) diff --git a/spikeinterface_gui/view_base.py b/spikeinterface_gui/view_base.py index f6d7df94..e2515578 100644 --- a/spikeinterface_gui/view_base.py +++ b/spikeinterface_gui/view_base.py @@ -38,7 +38,7 @@ def __init__(self, controller=None, parent=None, backend="qt"): create_settings(self) self.notifier = SignalNotifier(view=self) self.busy = pn.indicators.LoadingSpinner(value=True, size=20, name='busy...') - + self.layout = None make_layout() if self._settings is not None: listen_setting_changes(self) From 9700925703fa7bfafac43debb97fb54267b85749 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 8 Jan 2026 08:30:57 +0100 Subject: [PATCH 04/24] Fix label defs in empty curation --- spikeinterface_gui/controller.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 6d161c31..0884ecb0 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -112,19 +112,18 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save if curation_data is None: curation_data = empty_curation_data.copy() + curation_data["label_definitions"] = default_label_definitions.copy() if curation_data.get("discard_spikes") is None: curation_data["discard_spikes"] = [] self.curation_data = curation_data - self.has_default_quality_labels = False if "label_definitions" not in self.curation_data: if label_definitions is not None: self.curation_data["label_definitions"] = label_definitions - else: - self.curation_data["label_definitions"] = default_label_definitions.copy() + self.has_default_quality_labels = False if "quality" in self.curation_data["label_definitions"]: curation_dict_quality_labels = self.curation_data["label_definitions"]["quality"]["label_options"] default_quality_labels = default_label_definitions["quality"]["label_options"] @@ -827,7 +826,10 @@ def apply_curation(self): view.reinitialize() def remove_curation(self): - self.curation_data = empty_curation_data.copy() + label_definitioins = self.curation_data.get("label_definitions", None) + curation_data = empty_curation_data.copy() + curation_data["label_definitions"] = label_definitioins + self.curation_data = curation_data def save_curation_in_analyzer(self): if self.analyzer.format == "memory": From e87c9e155f5ea39033811a01de93cd11524fec31 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Thu, 8 Jan 2026 15:49:12 +0100 Subject: [PATCH 05/24] fix depths amps bug --- spikeinterface_gui/spikeamplitudeview.py | 8 ++++++++ spikeinterface_gui/spikedepthview.py | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/spikeinterface_gui/spikeamplitudeview.py b/spikeinterface_gui/spikeamplitudeview.py index b76b071c..2b1e3978 100644 --- a/spikeinterface_gui/spikeamplitudeview.py +++ b/spikeinterface_gui/spikeamplitudeview.py @@ -48,6 +48,10 @@ def _qt_refresh(self): self.plot2.removeItem(n) self.noise_harea = [] + def _qt_reinitialize(self): + self.spike_data = self.controller.spike_amplitudes + self._qt_refresh() + def _qt_add_noise_area(self): import pyqtgraph as pg @@ -132,6 +136,10 @@ def _panel_refresh(self): super()._panel_refresh() + def _panel_reinitialize(self): + self.spike_data = self.controller.spike_amplitudes + self._panel_refresh() + def _panel_update_noise_areas(self): if self.controller.noise_levels is None or len(self.noise_hareas) == 0: return diff --git a/spikeinterface_gui/spikedepthview.py b/spikeinterface_gui/spikedepthview.py index 0bee9dfb..e9db462a 100644 --- a/spikeinterface_gui/spikedepthview.py +++ b/spikeinterface_gui/spikedepthview.py @@ -17,6 +17,13 @@ def __init__(self, controller=None, parent=None, backend="qt"): spike_data=spike_data, ) + def _qt_reinitialize(self): + self.spike_data = self.controller.spike_depths + self._refresh() + + def _panel_reinitialize(self): + self.spike_data = self.controller.spike_depths + self._refresh() SpikeDepthView._gui_help_txt = """ From 0751c118265f14e89b567e568017830a812e6f75 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Thu, 8 Jan 2026 17:32:25 +0100 Subject: [PATCH 06/24] keep track of new unit ids --- spikeinterface_gui/controller.py | 17 ++++++++++--- spikeinterface_gui/mainsettingsview.py | 20 ++++++++++++++- spikeinterface_gui/mergeview.py | 10 ++++++++ spikeinterface_gui/spikeamplitudeview.py | 6 +---- spikeinterface_gui/spikedepthview.py | 6 +---- spikeinterface_gui/utils_global.py | 31 ++++++++++++++++++++++++ 6 files changed, 75 insertions(+), 15 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 0884ecb0..5a864dcb 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -17,6 +17,7 @@ from spikeinterface.widgets.utils import make_units_table_from_analyzer from .curation_tools import add_merge, default_label_definitions, empty_curation_data +from .utils_global import add_new_unit_ids_to_curation_dict spike_dtype =[('sample_index', 'int64'), ('unit_index', 'int64'), ('channel_index', 'int64'), ('segment_index', 'int64'), @@ -26,7 +27,9 @@ _default_main_settings = dict( max_visible_units=10, color_mode='color_by_unit', - use_times=False + use_times=False, + merge_new_id_strategy = 'take_first', + split_new_id_strategy = 'append', ) from spikeinterface.widgets.sorting_summary import _default_displayed_unit_properties @@ -44,6 +47,7 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.backend = backend self.disable_save_settings_button = disable_save_settings_button self.current_curation_saved = True + self.applied_curations = [] if self.backend == "qt": from .backend_qt import SignalHandler @@ -805,18 +809,23 @@ def compute_auto_merge(self, **params): def curation_can_be_saved(self): return self.analyzer.format != "memory" - def construct_final_curation(self): + def construct_final_curation(self, with_explicit_new_unit_ids=False): d = dict() d["format_version"] = "2" d["unit_ids"] = self.unit_ids.tolist() d.update(self.curation_data.copy()) + if with_explicit_new_unit_ids: + split_new_id_strategy = self.main_settings.get('split_new_id_strategy') + merge_new_id_strategy = self.main_settings.get('merge_new_id_strategy') + d = add_new_unit_ids_to_curation_dict(d, self.analyzer.sorting, split_new_id_strategy=split_new_id_strategy, merge_new_id_strategy=merge_new_id_strategy) model = CurationModel(**d) return model - + def apply_curation(self): - curation = self.construct_final_curation() + curation = self.construct_final_curation(with_explicit_new_unit_ids=True) curated_analyzer = apply_curation(self.analyzer, curation) + self.applied_curations.append(curation) self.set_analyzer_info(curated_analyzer, None, None) self.remove_curation() diff --git a/spikeinterface_gui/mainsettingsview.py b/spikeinterface_gui/mainsettingsview.py index 88ebec7c..05e56bc4 100644 --- a/spikeinterface_gui/mainsettingsview.py +++ b/spikeinterface_gui/mainsettingsview.py @@ -8,7 +8,9 @@ {'name': 'max_visible_units', 'type': 'int', 'value' : 10 }, {'name': 'color_mode', 'type': 'list', 'value' : 'color_by_unit', 'limits': ['color_by_unit', 'color_only_visible', 'color_by_visibility']}, - {'name': 'use_times', 'type': 'bool', 'value': False} + {'name': 'use_times', 'type': 'bool', 'value': False}, + {'name': 'merge_new_id_strategy', 'type': 'list', 'limits' : ['take_first', 'append', 'join']}, + {'name': 'split_new_id_strategy', 'type': 'list', 'limits' : ['append', 'split']}, ] @@ -45,6 +47,12 @@ def on_use_times(self): self.controller.update_time_info() self.notify_use_times_updated() + def on_merge_new_id_strategy(self): + self.controller.main_settings['merge_new_id_strategy'] = self.main_settings['merge_new_id_strategy'] + + def on_split_new_id_strategy(self): + self.controller.main_settings['split_new_id_strategy'] = self.main_settings['split_new_id_strategy'] + def save_current_settings(self, event=None): backend = self.controller.backend @@ -106,6 +114,8 @@ def _qt_make_layout(self): self.main_settings.param('max_visible_units').sigValueChanged.connect(self.on_max_visible_units_changed) self.main_settings.param('color_mode').sigValueChanged.connect(self.on_change_color_mode) self.main_settings.param('use_times').sigValueChanged.connect(self.on_use_times) + self.main_settings.param('merge_new_id_strategy').sigValueChanged.connect(self.on_merge_new_id_strategy) + self.main_settings.param('split_new_id_strategy').sigValueChanged.connect(self.on_split_new_id_strategy) def qt_make_settings_dict(self, view): """For a given view, return the current settings in a dict""" @@ -141,6 +151,8 @@ def _panel_make_layout(self): self.main_settings._parameterized.param.watch(self._panel_on_max_visible_units_changed, 'max_visible_units') self.main_settings._parameterized.param.watch(self._panel_on_change_color_mode, 'color_mode') self.main_settings._parameterized.param.watch(self._panel_on_use_times, 'use_times') + self.main_settings._parameterized.param.watch(self._panel_on_merge_new_id_strategy, 'merge_new_id_strategy') + self.main_settings._parameterized.param.watch(self._panel_on_split_new_id_strategy, 'split_new_id_strategy') self.layout = pn.Column(self.save_setting_button, self.main_settings_layout, sizing_mode="stretch_both") def panel_make_settings_dict(self, view): @@ -160,6 +172,12 @@ def _panel_on_max_visible_units_changed(self, event): def _panel_on_change_color_mode(self, event): self.on_change_color_mode() + def _panel_on_merge_new_id_strategy(self, event): + self.on_merge_new_id_strategy() + + def _panel_on_split_new_id_strategy(self, event): + self.on_split_new_id_strategy() + def _panel_on_use_times(self, event): self.on_use_times() diff --git a/spikeinterface_gui/mergeview.py b/spikeinterface_gui/mergeview.py index 1b07c32a..9867f6cc 100644 --- a/spikeinterface_gui/mergeview.py +++ b/spikeinterface_gui/mergeview.py @@ -304,6 +304,11 @@ def _qt_on_spike_selection_changed(self): def _qt_on_unit_visibility_changed(self): pass + def _qt_reinitialize(self): + self.proposed_merge_unit_groups = [] + self.merge_info = {} + self._qt_refresh() + ## PANEL def _panel_make_layout(self): import panel as pn @@ -403,6 +408,11 @@ def _panel_refresh(self): self.table.on_click(self._panel_on_click) self.table_area.update(self.table) + def _panel_reinitialize(self): + self.proposed_merge_unit_groups = [] + self.merge_info = {} + self._panel_refresh() + def _panel_compute_merges(self, event): self._compute_merges() diff --git a/spikeinterface_gui/spikeamplitudeview.py b/spikeinterface_gui/spikeamplitudeview.py index 2b1e3978..3f6475e2 100644 --- a/spikeinterface_gui/spikeamplitudeview.py +++ b/spikeinterface_gui/spikeamplitudeview.py @@ -48,7 +48,7 @@ def _qt_refresh(self): self.plot2.removeItem(n) self.noise_harea = [] - def _qt_reinitialize(self): + def _reinitialize(self): self.spike_data = self.controller.spike_amplitudes self._qt_refresh() @@ -136,10 +136,6 @@ def _panel_refresh(self): super()._panel_refresh() - def _panel_reinitialize(self): - self.spike_data = self.controller.spike_amplitudes - self._panel_refresh() - def _panel_update_noise_areas(self): if self.controller.noise_levels is None or len(self.noise_hareas) == 0: return diff --git a/spikeinterface_gui/spikedepthview.py b/spikeinterface_gui/spikedepthview.py index e9db462a..032e4b54 100644 --- a/spikeinterface_gui/spikedepthview.py +++ b/spikeinterface_gui/spikedepthview.py @@ -17,11 +17,7 @@ def __init__(self, controller=None, parent=None, backend="qt"): spike_data=spike_data, ) - def _qt_reinitialize(self): - self.spike_data = self.controller.spike_depths - self._refresh() - - def _panel_reinitialize(self): + def _reinitialize(self): self.spike_data = self.controller.spike_depths self._refresh() diff --git a/spikeinterface_gui/utils_global.py b/spikeinterface_gui/utils_global.py index 23fc61df..28b2666c 100644 --- a/spikeinterface_gui/utils_global.py +++ b/spikeinterface_gui/utils_global.py @@ -58,3 +58,34 @@ def get_present_zones_in_half_of_layout(layout_zone, shift): is_present = [views is not None and len(views) > 0 for views in half_dict.values()] present_zones = set(np.array(list(half_dict.keys()))[np.array(is_present)]) return present_zones + + +def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strategy, merge_new_id_strategy): + + from spikeinterface.core.sorting_tools import generate_unit_ids_for_split, generate_unit_ids_for_merge_group + from spikeinterface.curation.curation_model import CurationModel + + curation_model = CurationModel(**curation_dict) + old_unit_ids = curation_model.unit_ids + + print(f"{sorting=}") + + if len(curation_model.splits) > 0: + print(f"{curation_model.splits=}") + print(f"{split_new_id_strategy=}", flush=True) + unit_splits = {split.unit_id: split.get_full_spike_indices(sorting) for split in curation_model.splits} + new_split_unit_ids = generate_unit_ids_for_split(old_unit_ids, unit_splits, new_unit_ids=None, new_id_strategy=split_new_id_strategy) + print(f"{new_split_unit_ids=}") + for split_index, new_unit_ids in enumerate(new_split_unit_ids): + curation_dict['splits'][split_index]['new_unit_ids'] = new_unit_ids + + if len(curation_model.merges) > 0: + merge_unit_groups = [m.unit_ids for m in curation_model.merges] + print(f"{merge_unit_groups=}") + print(f"{merge_new_id_strategy=}", flush=True) + new_merge_unit_ids = generate_unit_ids_for_merge_group(old_unit_ids, merge_unit_groups, new_unit_ids=None, new_id_strategy=merge_new_id_strategy) + print(f"{new_merge_unit_ids=}") + for merge_index, new_unit_id in enumerate(new_merge_unit_ids): + curation_dict['merges'][merge_index]['new_unit_id'] = new_unit_id + + return curation_dict \ No newline at end of file From 46286ebda2566a27c3f328738673027762b45ea0 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Sun, 11 Jan 2026 10:40:11 +0000 Subject: [PATCH 07/24] extra properties, save sequential curation --- spikeinterface_gui/controller.py | 62 +++++++++++++++++++----------- spikeinterface_gui/curationview.py | 21 ++++++++-- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 5a864dcb..652e502b 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -1,4 +1,5 @@ import time +from copy import deepcopy import numpy as np @@ -62,7 +63,20 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.save_on_compute = save_on_compute self.verbose = verbose - self.set_analyzer_info(analyzer, extra_unit_properties, displayed_unit_properties) + self.original_analyzer = None + self.set_analyzer_info(analyzer) + self.units_table = make_units_table_from_analyzer(self.analyzer, extra_properties=extra_unit_properties) + + self.extra_unit_properties_names = list(extra_unit_properties.keys()) + if displayed_unit_properties is None: + displayed_unit_properties = list(_default_displayed_unit_properties) + if extra_unit_properties is not None: + displayed_unit_properties += list(extra_unit_properties.keys()) + displayed_unit_properties = [v for v in displayed_unit_properties if v in self.units_table.columns] + self.displayed_unit_properties = displayed_unit_properties + + # spikeinterface handle colors in matplotlib style tuple values in range (0,1) + self.refresh_colors() self._potential_merges = None self.curation = curation @@ -115,7 +129,7 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save curation_data = zarr_root["spikeinterface_gui"].attrs["curation_data"] if curation_data is None: - curation_data = empty_curation_data.copy() + curation_data = deepcopy(empty_curation_data) curation_data["label_definitions"] = default_label_definitions.copy() if curation_data.get("discard_spikes") is None: @@ -161,7 +175,7 @@ def channel_ids(self): def unit_ids(self): return self.analyzer.unit_ids - def set_analyzer_info(self, analyzer, extra_unit_properties, displayed_unit_properties): + def set_analyzer_info(self, analyzer): self.analyzer = analyzer assert self.analyzer.get_extension("random_spikes") is not None @@ -334,9 +348,6 @@ def set_analyzer_info(self, analyzer, extra_unit_properties, displayed_unit_prop self.num_segments = self.analyzer.get_num_segments() self.sampling_frequency = self.analyzer.sampling_frequency - # spikeinterface handle colors in matplotlib style tuple values in range (0,1) - self.refresh_colors() - # at init, we set the visible channels as the sparsity of the first unit if self.analyzer_sparsity is not None: self.visible_channel_inds = self.analyzer_sparsity.unit_id_to_channel_indices[self.unit_ids[0]].astype("int64") @@ -397,14 +408,6 @@ def set_analyzer_info(self, analyzer, extra_unit_properties, displayed_unit_prop self._traces_cached = {} - self.units_table = make_units_table_from_analyzer(analyzer, extra_properties=extra_unit_properties) - if displayed_unit_properties is None: - displayed_unit_properties = list(_default_displayed_unit_properties) - if extra_unit_properties is not None: - displayed_unit_properties += list(extra_unit_properties.keys()) - displayed_unit_properties = [v for v in displayed_unit_properties if v in self.units_table.columns] - self.displayed_unit_properties = displayed_unit_properties - # set default time info self.update_time_info() @@ -507,15 +510,22 @@ def get_information_txt(self): return txt - def refresh_colors(self): + def refresh_colors(self, existing_colors=None): if self.backend == "qt": self._cached_qcolors = {} elif self.backend == "panel": pass if self.main_settings['color_mode'] == 'color_by_unit': - self.colors = get_unit_colors(self.analyzer.sorting, color_engine='matplotlib', map_name='gist_ncar', - shuffle=True, seed=42) + unit_colors = get_unit_colors(self.analyzer.sorting, color_engine='matplotlib', map_name='gist_ncar', + shuffle=True, seed=42) + if existing_colors is None: + self.colors = unit_colors + else: + for unit_id, unit_color in unit_colors.items(): + if unit_id not in self.colors.keys(): + self.colors[unit_id] = unit_color + elif self.main_settings['color_mode'] == 'color_only_visible': unit_colors = get_unit_colors(self.analyzer.sorting, color_engine='matplotlib', map_name='gist_ncar', shuffle=True, seed=42) @@ -823,20 +833,28 @@ def construct_final_curation(self, with_explicit_new_unit_ids=False): def apply_curation(self): + if self.original_analyzer is None: + self.original_analyzer = deepcopy(self.analyzer) + self.original_analyzer.extensions = {} + curation = self.construct_final_curation(with_explicit_new_unit_ids=True) curated_analyzer = apply_curation(self.analyzer, curation) - self.applied_curations.append(curation) - - self.set_analyzer_info(curated_analyzer, None, None) + self.applied_curations.append(curation.model_dump()) self.remove_curation() - self.refresh_colors() + + self.set_analyzer_info(curated_analyzer) + + # for now, don't show externally provided properties after curation + self.displayed_unit_properties = [displayed_property for displayed_property in self.displayed_unit_properties if displayed_property not in self.extra_unit_properties_names] + self.units_table = make_units_table_from_analyzer(self.analyzer) + self.refresh_colors(existing_colors=self.colors) for view in self.views: view.reinitialize() def remove_curation(self): label_definitioins = self.curation_data.get("label_definitions", None) - curation_data = empty_curation_data.copy() + curation_data = deepcopy(empty_curation_data) curation_data["label_definitions"] = label_definitioins self.curation_data = curation_data diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 30c431f6..59402e99 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -295,10 +295,23 @@ def _qt_export_json(self): fd.setViewMode(QT.QFileDialog.Detail) if fd.exec_(): json_file = Path(fd.selectedFiles()[0]) - curation_model = self.controller.construct_final_curation() - with json_file.open("w") as f: - f.write(curation_model.model_dump_json(indent=4)) - self.controller.current_curation_saved = True + if len(self.controller.applied_curations) == 0: + curation_model = self.controller.construct_final_curation() + with json_file.open("w") as f: + f.write(curation_model.model_dump_json(indent=4)) + self.controller.current_curation_saved = True + else: + # Keep this here until `SeqentialCuration` in release of spikeinterface + from spikeinterface.curation.curation_model import SequentialCuration + + current_curation_model = self.controller.construct_final_curation() + applied_curations = self.controller.applied_curations + current_and_applied_curations = applied_curations + [current_curation_model.model_dump()] + + sequential_curation_model = SequentialCuration(curation_steps=current_and_applied_curations) + with json_file.open("w") as f: + f.write(sequential_curation_model.model_dump_json(indent=4)) + self.controller.current_curation_saved = True # PANEL def _panel_make_layout(self): From d8468796fbc2c17cc86d0c59fe6dd060ef6c0fd0 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Mon, 12 Jan 2026 16:07:09 +0000 Subject: [PATCH 08/24] lil fixes --- spikeinterface_gui/controller.py | 9 ++++++--- spikeinterface_gui/correlogramview.py | 9 ++------- spikeinterface_gui/curationview.py | 2 +- spikeinterface_gui/mergeview.py | 15 +++++---------- spikeinterface_gui/probeview.py | 3 --- spikeinterface_gui/spikeamplitudeview.py | 8 ++++---- spikeinterface_gui/utils_global.py | 12 ++++-------- 7 files changed, 22 insertions(+), 36 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 652e502b..6f87c8d1 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -50,6 +50,9 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.current_curation_saved = True self.applied_curations = [] + if extra_unit_properties is None: + self.extra_unit_properties_names = [] + if self.backend == "qt": from .backend_qt import SignalHandler self.signal_handler = SignalHandler(self, parent=parent) @@ -67,11 +70,11 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save self.set_analyzer_info(analyzer) self.units_table = make_units_table_from_analyzer(self.analyzer, extra_properties=extra_unit_properties) - self.extra_unit_properties_names = list(extra_unit_properties.keys()) if displayed_unit_properties is None: displayed_unit_properties = list(_default_displayed_unit_properties) if extra_unit_properties is not None: - displayed_unit_properties += list(extra_unit_properties.keys()) + self.extra_unit_properties_names = list(extra_unit_properties.keys()) + displayed_unit_properties += self.extra_unit_properties_names displayed_unit_properties = [v for v in displayed_unit_properties if v in self.units_table.columns] self.displayed_unit_properties = displayed_unit_properties @@ -839,7 +842,7 @@ def apply_curation(self): curation = self.construct_final_curation(with_explicit_new_unit_ids=True) curated_analyzer = apply_curation(self.analyzer, curation) - self.applied_curations.append(curation.model_dump()) + self.applied_curations.append(curation) self.remove_curation() self.set_analyzer_info(curated_analyzer) diff --git a/spikeinterface_gui/correlogramview.py b/spikeinterface_gui/correlogramview.py index eb2664a4..8e2d585e 100644 --- a/spikeinterface_gui/correlogramview.py +++ b/spikeinterface_gui/correlogramview.py @@ -48,10 +48,10 @@ def _qt_make_layout(self): self.grid = pg.GraphicsLayoutWidget() self.layout.addWidget(self.grid) - def _qt_reinitialize(self): + def _reinitialize(self): self.ccg, self.bins = self.controller.get_correlograms() self.figure_cache = {} - self._qt_refresh() + self._refresh() def _qt_refresh(self): import pyqtgraph as pg @@ -121,11 +121,6 @@ def _panel_make_layout(self): sizing_mode="stretch_both", ) - def _panel_reinitialize(self): - self.ccg, self.bins = self.controller.get_correlograms() - self.figure_cache = {} - self._panel_refresh() - def _panel_refresh(self): import panel as pn import bokeh.plotting as bpl diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 59402e99..119e5341 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -306,7 +306,7 @@ def _qt_export_json(self): current_curation_model = self.controller.construct_final_curation() applied_curations = self.controller.applied_curations - current_and_applied_curations = applied_curations + [current_curation_model.model_dump()] + current_and_applied_curations = applied_curations + [current_curation_model] sequential_curation_model = SequentialCuration(curation_steps=current_and_applied_curations) with json_file.open("w") as f: diff --git a/spikeinterface_gui/mergeview.py b/spikeinterface_gui/mergeview.py index 9867f6cc..ddfdf559 100644 --- a/spikeinterface_gui/mergeview.py +++ b/spikeinterface_gui/mergeview.py @@ -141,6 +141,11 @@ def accept_group_merge(self, group_ids): self.notify_manual_curation_updated() self.refresh() + def _reinitialize(self): + self.proposed_merge_unit_groups = [] + self.merge_info = {} + self._refresh() + ### QT def _qt_get_selected_group_ids(self): inds = self.table.selectedIndexes() @@ -304,11 +309,6 @@ def _qt_on_spike_selection_changed(self): def _qt_on_unit_visibility_changed(self): pass - def _qt_reinitialize(self): - self.proposed_merge_unit_groups = [] - self.merge_info = {} - self._qt_refresh() - ## PANEL def _panel_make_layout(self): import panel as pn @@ -408,11 +408,6 @@ def _panel_refresh(self): self.table.on_click(self._panel_on_click) self.table_area.update(self.table) - def _panel_reinitialize(self): - self.proposed_merge_unit_groups = [] - self.merge_info = {} - self._panel_refresh() - def _panel_compute_merges(self, event): self._compute_merges() diff --git a/spikeinterface_gui/probeview.py b/spikeinterface_gui/probeview.py index 4df724e6..87d6803e 100644 --- a/spikeinterface_gui/probeview.py +++ b/spikeinterface_gui/probeview.py @@ -155,9 +155,6 @@ def _qt_reinitialize(self): brush = [self.get_unit_color(u) for u in self.controller.unit_ids] self.scatter = pg.ScatterPlotItem(pos=unit_positions, pxMode=False, size=10, brush=brush) - xlim0, xlim1, ylim0, ylim1 = self.get_view_bounds() - self.plot.setXRange(xlim0, xlim1) - self.plot.setYRange(ylim0, ylim1) self._qt_refresh() def _qt_refresh(self): diff --git a/spikeinterface_gui/spikeamplitudeview.py b/spikeinterface_gui/spikeamplitudeview.py index 3f6475e2..f8cc393a 100644 --- a/spikeinterface_gui/spikeamplitudeview.py +++ b/spikeinterface_gui/spikeamplitudeview.py @@ -25,6 +25,10 @@ def __init__(self, controller=None, parent=None, backend="qt"): spike_data=spike_data, ) + def _reinitialize(self): + self.spike_data = self.controller.spike_amplitudes + self._refresh() + def _qt_make_layout(self): from .myqt import QT @@ -48,10 +52,6 @@ def _qt_refresh(self): self.plot2.removeItem(n) self.noise_harea = [] - def _reinitialize(self): - self.spike_data = self.controller.spike_amplitudes - self._qt_refresh() - def _qt_add_noise_area(self): import pyqtgraph as pg diff --git a/spikeinterface_gui/utils_global.py b/spikeinterface_gui/utils_global.py index 28b2666c..daab03b7 100644 --- a/spikeinterface_gui/utils_global.py +++ b/spikeinterface_gui/utils_global.py @@ -61,6 +61,10 @@ def get_present_zones_in_half_of_layout(layout_zone, shift): def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strategy, merge_new_id_strategy): + """ + Explicitly adds the new unit ids to `curation_dict` based on the split and merge new id strategies. + These *should* be the ids that would have been generated during `apply_curation` with these strategies. + """ from spikeinterface.core.sorting_tools import generate_unit_ids_for_split, generate_unit_ids_for_merge_group from spikeinterface.curation.curation_model import CurationModel @@ -68,23 +72,15 @@ def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strat curation_model = CurationModel(**curation_dict) old_unit_ids = curation_model.unit_ids - print(f"{sorting=}") - if len(curation_model.splits) > 0: - print(f"{curation_model.splits=}") - print(f"{split_new_id_strategy=}", flush=True) unit_splits = {split.unit_id: split.get_full_spike_indices(sorting) for split in curation_model.splits} new_split_unit_ids = generate_unit_ids_for_split(old_unit_ids, unit_splits, new_unit_ids=None, new_id_strategy=split_new_id_strategy) - print(f"{new_split_unit_ids=}") for split_index, new_unit_ids in enumerate(new_split_unit_ids): curation_dict['splits'][split_index]['new_unit_ids'] = new_unit_ids if len(curation_model.merges) > 0: merge_unit_groups = [m.unit_ids for m in curation_model.merges] - print(f"{merge_unit_groups=}") - print(f"{merge_new_id_strategy=}", flush=True) new_merge_unit_ids = generate_unit_ids_for_merge_group(old_unit_ids, merge_unit_groups, new_unit_ids=None, new_id_strategy=merge_new_id_strategy) - print(f"{new_merge_unit_ids=}") for merge_index, new_unit_id in enumerate(new_merge_unit_ids): curation_dict['merges'][merge_index]['new_unit_id'] = new_unit_id From 2aa9fbb1226dad7dbc87e6d2a11f60e9aa690861 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Tue, 13 Jan 2026 13:01:50 +0000 Subject: [PATCH 09/24] remake visible columns on reinitialize of unitlistview --- spikeinterface_gui/unitlistview.py | 37 ++++++++++++++++-------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index bab72100..cfcbd097 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -40,8 +40,6 @@ def get_selected_unit_ids(self): def _qt_make_layout(self): from .myqt import QT - import pyqtgraph as pg - self.menu = None self.layout = QT.QVBoxLayout() @@ -51,21 +49,7 @@ def _qt_make_layout(self): but.clicked.connect(self._qt_select_columns) tb.addWidget(but) - - visible_cols = [] - for col in self.controller.units_table.columns: - visible_cols.append( - {'name': str(col), 'type': 'bool', 'value': col in self.controller.displayed_unit_properties, 'default': True} - ) - self.visible_columns = pg.parametertree.Parameter.create( name='visible columns', type='group', children=visible_cols) - self.tree_visible_columns = pg.parametertree.ParameterTree(parent=self.qt_widget) - self.tree_visible_columns.header().hide() - self.tree_visible_columns.setParameters(self.visible_columns, showTop=True) - # self.tree_visible_columns.setWindowTitle(u'visible columns') - # self.tree_visible_columns.setWindowFlags(QT.Qt.Window) - self.visible_columns.sigTreeStateChanged.connect(self._qt_on_visible_columns_changed) - self.layout.addWidget(self.tree_visible_columns) - self.tree_visible_columns.hide() + self._qt_set_up_visible_columns() # h = QT.QHBoxLayout() # self.layout.addLayout(h) @@ -129,7 +113,26 @@ def _qt_make_layout(self): self.shortcut_noise.setKey(QT.QKeySequence('n')) self.shortcut_noise.activated.connect(lambda: self._qt_set_default_label('noise')) + def _qt_set_up_visible_columns(self): + + import pyqtgraph as pg + visible_cols = [] + for col in self.controller.units_table.columns: + visible_cols.append( + {'name': str(col), 'type': 'bool', 'value': col in self.controller.displayed_unit_properties, 'default': True} + ) + self.visible_columns = pg.parametertree.Parameter.create( name='visible columns', type='group', children=visible_cols) + self.tree_visible_columns = pg.parametertree.ParameterTree(parent=self.qt_widget) + self.tree_visible_columns.header().hide() + self.tree_visible_columns.setParameters(self.visible_columns, showTop=True) + + self.visible_columns.sigTreeStateChanged.connect(self._qt_on_visible_columns_changed) + self.layout.addWidget(self.tree_visible_columns) + self.tree_visible_columns.hide() + def _qt_reinitialize(self): + + self._qt_set_up_visible_columns() self._qt_full_table_refresh() self._qt_refresh() From a9ffab22a5f60ba5984497b327d23d3f7f9770e7 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 21 Jan 2026 09:48:59 +0000 Subject: [PATCH 10/24] ensure new merge ids know about new split ids --- spikeinterface_gui/utils_global.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/spikeinterface_gui/utils_global.py b/spikeinterface_gui/utils_global.py index daab03b7..f622b34f 100644 --- a/spikeinterface_gui/utils_global.py +++ b/spikeinterface_gui/utils_global.py @@ -1,6 +1,7 @@ import numpy as np from pathlib import Path import os +from copy import copy def get_config_folder() -> Path: """Get the config folder for spikeinterface-gui settings files. @@ -70,13 +71,20 @@ def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strat from spikeinterface.curation.curation_model import CurationModel curation_model = CurationModel(**curation_dict) - old_unit_ids = curation_model.unit_ids + old_unit_ids = copy(curation_model.unit_ids) if len(curation_model.splits) > 0: unit_splits = {split.unit_id: split.get_full_spike_indices(sorting) for split in curation_model.splits} new_split_unit_ids = generate_unit_ids_for_split(old_unit_ids, unit_splits, new_unit_ids=None, new_id_strategy=split_new_id_strategy) + + all_new_unit_ids = [] for split_index, new_unit_ids in enumerate(new_split_unit_ids): curation_dict['splits'][split_index]['new_unit_ids'] = new_unit_ids + all_new_unit_ids = all_new_unit_ids + new_unit_ids + + # update old unit ids with the newly split units + old_unit_ids = np.setdiff1d(old_unit_ids, np.array(list(unit_splits.keys()))) + old_unit_ids = np.concat([old_unit_ids, all_new_unit_ids]) if len(curation_model.merges) > 0: merge_unit_groups = [m.unit_ids for m in curation_model.merges] @@ -84,4 +92,4 @@ def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strat for merge_index, new_unit_id in enumerate(new_merge_unit_ids): curation_dict['merges'][merge_index]['new_unit_id'] = new_unit_id - return curation_dict \ No newline at end of file + return curation_dict From 60819087dabc060f02c6f48b7c8b9d939628bde7 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 25 Mar 2026 13:34:25 +0000 Subject: [PATCH 11/24] get to usable form after 0.104 release --- spikeinterface_gui/controller.py | 131 ++++++++++--------------- spikeinterface_gui/curationview.py | 2 +- spikeinterface_gui/isiview.py | 4 + spikeinterface_gui/mainsettingsview.py | 4 +- spikeinterface_gui/maintemplateview.py | 6 +- spikeinterface_gui/mergeview.py | 1 + 6 files changed, 63 insertions(+), 85 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 9af5ccc2..4a4d7b77 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -88,9 +88,21 @@ def __init__( self.verbose = verbose self.original_analyzer = None + + self.main_settings = _default_main_settings.copy() + if user_main_settings is not None: + self.main_settings.update(user_main_settings) + self.set_analyzer_info(analyzer) self.units_table = make_units_table_from_analyzer(self.analyzer, extra_properties=extra_unit_properties) + # parse events + self.events = None + if events is not None: + self.events = parse_events(events, self, verbose=verbose) + if len(self.events) == 0: + self.events = None + if displayed_unit_properties is None: displayed_unit_properties = list(_default_displayed_unit_properties) if extra_unit_properties is not None: @@ -102,6 +114,10 @@ def __init__( # spikeinterface handle colors in matplotlib style tuple values in range (0,1) self.refresh_colors() + self.curation = curation + self.curation_callback = curation_callback + self.curation_callback_kwargs = curation_callback_kwargs + self._potential_merges = None self.curation = curation # TODO: Reload the dictionary if it already exists @@ -207,10 +223,6 @@ def set_analyzer_info(self, analyzer): self.return_in_uV = self.analyzer.return_in_uV t0 = time.perf_counter() - self.main_settings = _default_main_settings.copy() - if user_main_settings is not None: - self.main_settings.update(user_main_settings) - self.num_channels = self.analyzer.get_num_channels() # this now private and should be access using function self._visible_unit_ids = [self.unit_ids[0]] @@ -282,12 +294,12 @@ def set_analyzer_info(self, analyzer): else: self.spike_amplitudes = None - if "amplitude_scalings" in skip_extensions: + if "amplitude_scalings" in self.skip_extensions: if self.verbose: print('\tSkipping amplitude_scalings') self.amplitude_scalings = None else: - if verbose: + if self.verbose: print('\tLoading amplitude_scalings') sa_ext = analyzer.get_extension('amplitude_scalings') if sa_ext is not None: @@ -295,7 +307,7 @@ def set_analyzer_info(self, analyzer): else: self.amplitude_scalings = None - if "spike_locations" in skip_extensions: + if "spike_locations" in self.skip_extensions: if self.verbose: print('\tSkipping spike_locations') self.spike_depths = None @@ -388,13 +400,6 @@ def set_analyzer_info(self, analyzer): self.num_segments = self.analyzer.get_num_segments() self.sampling_frequency = self.analyzer.sampling_frequency - # parse events - self.events = None - if events is not None: - self.events = parse_events(events, self, verbose=verbose) - if len(self.events) == 0: - self.events = None - t1 = time.perf_counter() if self.verbose: print('Loading extensions took', t1 - t0) @@ -464,74 +469,9 @@ def set_analyzer_info(self, analyzer): self._traces_cached = {} - self.units_table = make_units_table_from_analyzer(analyzer, extra_properties=extra_unit_properties) - - if displayed_unit_properties is None: - displayed_unit_properties = list(_default_displayed_unit_properties) - if extra_unit_properties is not None: - displayed_unit_properties += list(extra_unit_properties.keys()) - displayed_unit_properties = [v for v in displayed_unit_properties if v in self.units_table.columns] - self.displayed_unit_properties = displayed_unit_properties - # set default time info self.update_time_info() - self.curation = curation - self.curation_callback = curation_callback - self.curation_callback_kwargs = curation_callback_kwargs - - if self.curation: - # rules: - # * if user sends curation_data, then it is used - # * otherwise, if curation_data already exists in folder it is used - # * otherwise create an empty one - - if curation_data is not None: - # validate the curation data - curation_data = deepcopy(curation_data) - format_version = curation_data.get("format_version", None) - # assume version 2 if not present - if format_version is None: - raise ValueError("Curation data format version is missing and is required in the curation data.") - try: - validate_curation_dict(curation_data) - except Exception as e: - raise ValueError(f"Invalid curation data.\nError: {e}") - - elif self.analyzer.format == "binary_folder": - json_file = self.analyzer.folder / "spikeinterface_gui" / "curation_data.json" - if json_file.exists(): - with open(json_file, "r") as f: - curation_data = json.load(f) - - elif self.analyzer.format == "zarr": - import zarr - zarr_root = zarr.open(self.analyzer.folder, mode='r') - if "spikeinterface_gui" in zarr_root.keys() and "curation_data" in zarr_root["spikeinterface_gui"].attrs.keys(): - curation_data = zarr_root["spikeinterface_gui"].attrs["curation_data"] - - if curation_data is None: - curation_data = deepcopy(empty_curation_data) - curation_data["unit_ids"] = self.unit_ids.tolist() - - if "label_definitions" not in curation_data: - if label_definitions is not None: - curation_data["label_definitions"] = label_definitions - else: - curation_data["label_definitions"] = default_label_definitions.copy() - - # This will enable the default shortcuts if has default quality labels - self.has_default_quality_labels = False - if "quality" in curation_data["label_definitions"]: - curation_dict_quality_labels = curation_data["label_definitions"]["quality"]["label_options"] - default_quality_labels = default_label_definitions["quality"]["label_options"] - if set(curation_dict_quality_labels) == set(default_quality_labels): - if self.verbose: - print('Curation quality labels are the default ones') - self.has_default_quality_labels = True - - curation_data = Curation(**curation_data).model_dump() - self.curation_data = curation_data def check_is_view_possible(self, view_name): from .viewlist import get_all_possible_views @@ -1014,9 +954,42 @@ def construct_final_curation(self, with_explicit_new_unit_ids=False): d["unit_ids"] = self.unit_ids.tolist() d.update(self.curation_data.copy()) + if with_explicit_new_unit_ids: + split_new_id_strategy = self.main_settings.get('split_new_id_strategy') + merge_new_id_strategy = self.main_settings.get('merge_new_id_strategy') + d = add_new_unit_ids_to_curation_dict(d, self.analyzer.sorting, split_new_id_strategy=split_new_id_strategy, merge_new_id_strategy=merge_new_id_strategy) + model = Curation(**d) return model + def apply_curation(self): + + if self.original_analyzer is None: + self.original_analyzer = deepcopy(self.analyzer) + self.original_analyzer.extensions = {} + + curation = self.construct_final_curation(with_explicit_new_unit_ids=True) + curated_analyzer = apply_curation(self.analyzer, curation) + + self.applied_curations.append(curation) + self.remove_curation() + + self.set_analyzer_info(curated_analyzer) + + # for now, don't show externally provided properties after curation + self.displayed_unit_properties = [displayed_property for displayed_property in self.displayed_unit_properties if displayed_property not in self.extra_unit_properties_names] + self.units_table = make_units_table_from_analyzer(self.analyzer) + self.refresh_colors(existing_colors=self.colors) + + for view in self.views: + view.reinitialize() + + def remove_curation(self): + label_definitioins = self.curation_data.get("label_definitions", None) + curation_data = deepcopy(empty_curation_data) + curation_data["label_definitions"] = label_definitioins + self.curation_data = curation_data + def set_curation_data(self, curation_data): print("Setting curation data") new_curation_data = empty_curation_data.copy() diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 8bbf7078..1f1dad99 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -73,7 +73,7 @@ def _qt_make_layout(self): elif self.controller.curation_can_be_saved(): but = QT.QPushButton("Save in analyzer") tb.addWidget(but) - but.clicked.connect(self.save_curation_in_analyzer) + but.clicked.connect(self.controller.save_curation_in_analyzer) but_apply = QT.QPushButton("Apply curation") tb.addWidget(but_apply) diff --git a/spikeinterface_gui/isiview.py b/spikeinterface_gui/isiview.py index f9fa2938..c894ce02 100644 --- a/spikeinterface_gui/isiview.py +++ b/spikeinterface_gui/isiview.py @@ -25,6 +25,10 @@ def _on_settings_changed(self): self.isi_histograms, self.isi_bins = None, None self.refresh() + def _reinitialize(self): + self.isi_histograms, self.isi_bins = self.controller.get_isi_histograms() + self._refresh() + ## QT ## def _qt_make_layout(self): diff --git a/spikeinterface_gui/mainsettingsview.py b/spikeinterface_gui/mainsettingsview.py index e982dc5b..abdeb9fd 100644 --- a/spikeinterface_gui/mainsettingsview.py +++ b/spikeinterface_gui/mainsettingsview.py @@ -9,8 +9,8 @@ {'name': 'color_mode', 'type': 'list', 'value' : 'color_by_unit', 'limits': ['color_by_unit', 'color_only_visible', 'color_by_visibility']}, {'name': 'use_times', 'type': 'bool', 'value': False}, - {'name': 'merge_new_id_strategy', 'type': 'list', 'limits' : ['take_first', 'append', 'join']}, - {'name': 'split_new_id_strategy', 'type': 'list', 'limits' : ['append', 'split']}, + {'name': 'merge_new_id_strategy', 'type': 'list', 'limits' : ['take_first', 'append', 'join'], 'value': 'take_first'}, + {'name': 'split_new_id_strategy', 'type': 'list', 'limits' : ['append', 'split'], 'value': 'append'}, ] diff --git a/spikeinterface_gui/maintemplateview.py b/spikeinterface_gui/maintemplateview.py index 0849a0b1..4a143eb2 100644 --- a/spikeinterface_gui/maintemplateview.py +++ b/spikeinterface_gui/maintemplateview.py @@ -92,19 +92,19 @@ def _qt_refresh(self): if peak_data is not None: # trough - peak_inds = peak_data[['trough_index']].values + peak_inds = peak_data[['trough_index']].values.astype(int) scatter = pg.ScatterPlotItem(x = times[peak_inds], y = template_high[peak_inds], size=10, pxMode = True, color="white", symbol="t") plot.addItem(scatter) names = ('peak_before', 'peak_after') - peak_inds = peak_data[[f'{k}_index' for k in names]].values + peak_inds = peak_data[[f'{k}_index' for k in names]].values.astype(int) scatter = pg.ScatterPlotItem(x = times[peak_inds], y = template_high[peak_inds], size=10, pxMode = True, color="white", symbol="t1") plot.addItem(scatter) all_names = ('trough', 'peak_before', 'peak_after') - peak_inds = peak_data[[f'{k}_index' for k in all_names]].values + peak_inds = peak_data[[f'{k}_index' for k in all_names]].values.astype(int) # Vertical dotted lines from peak to zero for ind in peak_inds: x = [times[ind], times[ind]] diff --git a/spikeinterface_gui/mergeview.py b/spikeinterface_gui/mergeview.py index 9476cac7..1196d4d6 100644 --- a/spikeinterface_gui/mergeview.py +++ b/spikeinterface_gui/mergeview.py @@ -161,6 +161,7 @@ def accept_group_merge(self, group_ids): self.refresh() def _reinitialize(self): + self.proposed_merge_unit_groups_all = [] self.proposed_merge_unit_groups = [] self.merge_info = {} self._refresh() From 79937a04e78ec2f6917a15ced7067a84e0c79720 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 25 Mar 2026 16:25:35 +0000 Subject: [PATCH 12/24] retain quality labels --- spikeinterface_gui/basescatterview.py | 6 +- spikeinterface_gui/controller.py | 194 ++++++++++++-------------- spikeinterface_gui/curationview.py | 5 +- spikeinterface_gui/unitlistview.py | 3 +- spikeinterface_gui/utils_global.py | 4 +- spikeinterface_gui/view_base.py | 1 - 6 files changed, 99 insertions(+), 114 deletions(-) diff --git a/spikeinterface_gui/basescatterview.py b/spikeinterface_gui/basescatterview.py index c9754f9f..249ea650 100644 --- a/spikeinterface_gui/basescatterview.py +++ b/spikeinterface_gui/basescatterview.py @@ -56,7 +56,7 @@ def get_unit_data(self, unit_id, segment_index=0): return spike_times, spike_data, np.array([1]), np.array([ymin, ymax]), ymin, ymax, inds # avoid clear outliers in the plot and histogram by using percentiles - ymin, ymax = np.percentile(spike_data, [self.settings['display_low_percentiles'], self.settings['display_high_percentiles']]) + ymin, ymax = np.percentile(spike_data[~np.isnan(spike_data)], [self.settings['display_low_percentiles'], self.settings['display_high_percentiles']]) min_bin_size = np.min(np.diff(np.unique(spike_data))) bins = np.linspace(ymin, ymax, self.settings['num_bins']) # if bins are too small, adjust the number of bins to ensure a minimum bin size and avoid jumps in the histogram @@ -329,8 +329,8 @@ def _qt_refresh(self, set_scatter_range=False): # set x range to time range of the current segment for scatter, and max count for histogram # set y range to min and max of visible spike amplitudes if len(ymins) > 0 and (set_scatter_range or not self._first_refresh_done): - ymin = np.min(ymins) - ymax = np.max(ymaxs) + ymin = np.nanmin(ymins) + ymax = np.nanmax(ymaxs) t_start, t_stop = self.controller.get_t_start_t_stop() self.viewBox.setXRange(t_start, t_stop, padding = 0.0) self.viewBox.setYRange(ymin, ymax, padding = 0.0) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 4a4d7b77..348a9da1 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -83,7 +83,6 @@ def __init__( self.signal_handler = SignalHandler(self, parent=parent) self.with_traces = with_traces - self.main_settings = _default_main_settings.copy() self.save_on_compute = save_on_compute self.verbose = verbose @@ -95,6 +94,8 @@ def __init__( self.set_analyzer_info(analyzer) self.units_table = make_units_table_from_analyzer(self.analyzer, extra_properties=extra_unit_properties) + + self.set_curation_info(curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs) # parse events self.events = None @@ -114,81 +115,7 @@ def __init__( # spikeinterface handle colors in matplotlib style tuple values in range (0,1) self.refresh_colors() - self.curation = curation - self.curation_callback = curation_callback - self.curation_callback_kwargs = curation_callback_kwargs - - self._potential_merges = None - self.curation = curation - # TODO: Reload the dictionary if it already exists - if self.curation: - # rules: - # * if user sends curation_data, then it is used - # * otherwise, if curation_data already exists in folder it is used - # * otherwise create an empty one - - if curation_data is not None: - # validate the curation data - format_version = curation_data.get("format_version", None) - # assume version 2 if not present - if format_version is None: - raise ValueError("Curation data format version is missing and is required in the curation data.") - try: - validate_curation_dict(curation_data) - except Exception as e: - raise ValueError(f"Invalid curation data.\nError: {e}") - - if curation_data.get("merges") is None: - curation_data["merges"] = [] - else: - # here we reset the merges for better formatting (str) - existing_merges = curation_data["merges"] - new_merges = [] - for m in existing_merges: - if "unit_ids" not in m: - continue - if len(m["unit_ids"]) < 2: - continue - new_merges = add_merge(new_merges, m["unit_ids"]) - curation_data["merges"] = new_merges - if curation_data.get("splits") is None: - curation_data["splits"] = [] - if curation_data.get("removed") is None: - curation_data["removed"] = [] - - elif self.analyzer.format == "binary_folder": - json_file = self.analyzer.folder / "spikeinterface_gui" / "curation_data.json" - if json_file.exists(): - with open(json_file, "r") as f: - curation_data = json.load(f) - - elif self.analyzer.format == "zarr": - import zarr - zarr_root = zarr.open(self.analyzer.folder, mode='r') - if "spikeinterface_gui" in zarr_root.keys() and "curation_data" in zarr_root["spikeinterface_gui"].attrs.keys(): - curation_data = zarr_root["spikeinterface_gui"].attrs["curation_data"] - - if curation_data is None: - curation_data = deepcopy(empty_curation_data) - curation_data["label_definitions"] = default_label_definitions.copy() - - if curation_data.get("discard_spikes") is None: - curation_data["discard_spikes"] = [] - - self.curation_data = curation_data - - if "label_definitions" not in self.curation_data: - if label_definitions is not None: - self.curation_data["label_definitions"] = label_definitions - - self.has_default_quality_labels = False - if "quality" in self.curation_data["label_definitions"]: - curation_dict_quality_labels = self.curation_data["label_definitions"]["quality"]["label_options"] - default_quality_labels = default_label_definitions["quality"]["label_options"] - if set(curation_dict_quality_labels) == set(default_quality_labels): - if self.verbose: - print('Curation quality labels are the default ones') - self.has_default_quality_labels = True + def check_is_view_possible(self, view_name): from .viewlist import get_all_possible_views @@ -473,30 +400,83 @@ def set_analyzer_info(self, analyzer): self.update_time_info() - def check_is_view_possible(self, view_name): - from .viewlist import get_all_possible_views - possible_class_views = get_all_possible_views() - view_class = possible_class_views[view_name] - if view_class._depend_on is not None: - depencies_ok = all(self.has_extension(k) for k in view_class._depend_on) - if not depencies_ok: - if self.verbose: - print(view_name, 'does not have all dependencies', view_class._depend_on) - return False - return True + def set_curation_info(self, curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs): - def declare_a_view(self, new_view): - assert new_view not in self.views, 'view already declared {}'.format(self) - self.views.append(new_view) - self.signal_handler.connect_view(new_view) - - @property - def channel_ids(self): - return self.analyzer.channel_ids + self.curation = curation + self.curation_callback = curation_callback + self.curation_callback_kwargs = curation_callback_kwargs - @property - def unit_ids(self): - return self.analyzer.unit_ids + self._potential_merges = None + self.curation = curation + # TODO: Reload the dictionary if it already exists + if self.curation: + # rules: + # * if user sends curation_data, then it is used + # * otherwise, if curation_data already exists in folder it is used + # * otherwise create an empty one + + if curation_data is not None: + # validate the curation data + format_version = curation_data.get("format_version", None) + # assume version 2 if not present + if format_version is None: + raise ValueError("Curation data format version is missing and is required in the curation data.") + try: + validate_curation_dict(curation_data) + except Exception as e: + raise ValueError(f"Invalid curation data.\nError: {e}") + + if curation_data.get("merges") is None: + curation_data["merges"] = [] + else: + # here we reset the merges for better formatting (str) + existing_merges = curation_data["merges"] + new_merges = [] + for m in existing_merges: + if "unit_ids" not in m: + continue + if len(m["unit_ids"]) < 2: + continue + new_merges = add_merge(new_merges, m["unit_ids"]) + curation_data["merges"] = new_merges + if curation_data.get("splits") is None: + curation_data["splits"] = [] + if curation_data.get("removed") is None: + curation_data["removed"] = [] + + elif self.analyzer.format == "binary_folder": + json_file = self.analyzer.folder / "spikeinterface_gui" / "curation_data.json" + if json_file.exists(): + with open(json_file, "r") as f: + curation_data = json.load(f) + + elif self.analyzer.format == "zarr": + import zarr + zarr_root = zarr.open(self.analyzer.folder, mode='r') + if "spikeinterface_gui" in zarr_root.keys() and "curation_data" in zarr_root["spikeinterface_gui"].attrs.keys(): + curation_data = zarr_root["spikeinterface_gui"].attrs["curation_data"] + + if curation_data is None: + curation_data = deepcopy(empty_curation_data) + curation_data["label_definitions"] = default_label_definitions.copy() + + if curation_data.get("discard_spikes") is None: + curation_data["discard_spikes"] = [] + + self.curation_data = curation_data + + if "label_definitions" not in self.curation_data: + if label_definitions is not None: + self.curation_data["label_definitions"] = label_definitions + + self.has_default_quality_labels = False + if "quality" in self.curation_data["label_definitions"]: + curation_dict_quality_labels = self.curation_data["label_definitions"]["quality"]["label_options"] + default_quality_labels = default_label_definitions["quality"]["label_options"] + if set(curation_dict_quality_labels) == set(default_quality_labels): + if self.verbose: + print('Curation quality labels are the default ones') + self.has_default_quality_labels = True def get_time(self): """ @@ -953,7 +933,6 @@ def construct_final_curation(self, with_explicit_new_unit_ids=False): d["format_version"] = "2" d["unit_ids"] = self.unit_ids.tolist() d.update(self.curation_data.copy()) - if with_explicit_new_unit_ids: split_new_id_strategy = self.main_settings.get('split_new_id_strategy') merge_new_id_strategy = self.main_settings.get('merge_new_id_strategy') @@ -972,7 +951,7 @@ def apply_curation(self): curated_analyzer = apply_curation(self.analyzer, curation) self.applied_curations.append(curation) - self.remove_curation() + self.remove_curation(curated_analyzer) self.set_analyzer_info(curated_analyzer) @@ -984,10 +963,21 @@ def apply_curation(self): for view in self.views: view.reinitialize() - def remove_curation(self): - label_definitioins = self.curation_data.get("label_definitions", None) + def remove_curation(self, curated_analyzer): + """Removes curation from the controller, retaining quality labels.""" + curation_data = deepcopy(empty_curation_data) + # retain label definitions and 'quality' label + label_definitioins = self.curation_data.get("label_definitions", None) curation_data["label_definitions"] = label_definitioins + + if (quality_labels := curated_analyzer.get_sorting_property('quality')) is not None: + manual_labels = [] + for unit_id, quality_label in zip(curated_analyzer.unit_ids, quality_labels): + manual_labels.append({'unit_id': unit_id, 'labels': {'quality': [quality_label]}}) + + curation_data['manual_labels'] = manual_labels + self.curation_data = curation_data def set_curation_data(self, curation_data): diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 1f1dad99..a9c542aa 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -4,7 +4,7 @@ from .view_base import ViewBase from spikeinterface.core.core_tools import check_json - +from spikeinterface.curation.curation_model import SequentialCuration class CurationView(ViewBase): id = "curation" @@ -301,9 +301,6 @@ def _qt_export_json(self): f.write(curation_model.model_dump_json(indent=4)) self.controller.current_curation_saved = True else: - # Keep this here until `SeqentialCuration` in release of spikeinterface - from spikeinterface.curation.curation_model import SequentialCuration - current_curation_model = self.controller.construct_final_curation() applied_curations = self.controller.applied_curations current_and_applied_curations = applied_curations + [current_curation_model] diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index eff520a7..0dd2b6a5 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -130,7 +130,7 @@ def _qt_set_up_visible_columns(self): def _qt_reinitialize(self): - self._qt_set_up_visible_columns() + #self._qt_set_up_visible_columns() self._qt_full_table_refresh() self._qt_refresh() @@ -227,7 +227,6 @@ def _qt_full_table_refresh(self): self.table.clear() - internal_column_names = ['unit_id', 'visible', 'channel_id'] # internal labels diff --git a/spikeinterface_gui/utils_global.py b/spikeinterface_gui/utils_global.py index f622b34f..d885aa24 100644 --- a/spikeinterface_gui/utils_global.py +++ b/spikeinterface_gui/utils_global.py @@ -68,9 +68,9 @@ def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strat """ from spikeinterface.core.sorting_tools import generate_unit_ids_for_split, generate_unit_ids_for_merge_group - from spikeinterface.curation.curation_model import CurationModel + from spikeinterface.curation.curation_model import Curation - curation_model = CurationModel(**curation_dict) + curation_model = Curation(**curation_dict) old_unit_ids = copy(curation_model.unit_ids) if len(curation_model.splits) > 0: diff --git a/spikeinterface_gui/view_base.py b/spikeinterface_gui/view_base.py index 7447d82f..8bc728dc 100644 --- a/spikeinterface_gui/view_base.py +++ b/spikeinterface_gui/view_base.py @@ -40,7 +40,6 @@ def __init__(self, controller=None, parent=None, backend="qt"): create_settings(self) self.notifier = SignalNotifier(view=self) self.busy = pn.indicators.LoadingSpinner(value=True, size=20, name='busy...') - self.layout = None make_layout() if self._settings is not None: listen_setting_changes(self) From 2034270c58ccf7c914ef6ba9fc291566556744e9 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 25 Mar 2026 16:28:17 +0000 Subject: [PATCH 13/24] move some methods --- spikeinterface_gui/controller.py | 55 +++++++++++++++----------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 348a9da1..dd8622af 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -114,33 +114,6 @@ def __init__( # spikeinterface handle colors in matplotlib style tuple values in range (0,1) self.refresh_colors() - - - - def check_is_view_possible(self, view_name): - from .viewlist import get_all_possible_views - possible_class_views = get_all_possible_views() - view_class = possible_class_views[view_name] - if view_class._depend_on is not None: - depencies_ok = all(self.has_extension(k) for k in view_class._depend_on) - if not depencies_ok: - if self.verbose: - print(view_name, 'does not have all dependencies', view_class._depend_on) - return False - return True - - def declare_a_view(self, new_view): - assert new_view not in self.views, 'view already declared {}'.format(self) - self.views.append(new_view) - self.signal_handler.connect_view(new_view) - - @property - def channel_ids(self): - return self.analyzer.channel_ids - - @property - def unit_ids(self): - return self.analyzer.unit_ids def set_analyzer_info(self, analyzer): @@ -478,6 +451,31 @@ def set_curation_info(self, curation, curation_data, label_definitions, curation print('Curation quality labels are the default ones') self.has_default_quality_labels = True + def check_is_view_possible(self, view_name): + from .viewlist import get_all_possible_views + possible_class_views = get_all_possible_views() + view_class = possible_class_views[view_name] + if view_class._depend_on is not None: + depencies_ok = all(self.has_extension(k) for k in view_class._depend_on) + if not depencies_ok: + if self.verbose: + print(view_name, 'does not have all dependencies', view_class._depend_on) + return False + return True + + def declare_a_view(self, new_view): + assert new_view not in self.views, 'view already declared {}'.format(self) + self.views.append(new_view) + self.signal_handler.connect_view(new_view) + + @property + def channel_ids(self): + return self.analyzer.channel_ids + + @property + def unit_ids(self): + return self.analyzer.unit_ids + def get_time(self): """ Returns selected time and segment index @@ -909,9 +907,6 @@ def compute_isi_histograms(self, window_ms, bin_ms): self.isi_histograms, self.isi_bins = ext.get_data() return self.isi_histograms, self.isi_bins - def get_units_table(self): - return self.units_table - def compute_auto_merge(self, **params): from spikeinterface.curation import compute_merge_unit_groups From 7635447ff2b337dc634da2388493f2be6c4a7bcc Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 25 Mar 2026 16:35:23 +0000 Subject: [PATCH 14/24] clean --- spikeinterface_gui/controller.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index dd8622af..63a3b155 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -111,9 +111,6 @@ def __init__( displayed_unit_properties += self.extra_unit_properties_names displayed_unit_properties = [v for v in displayed_unit_properties if v in self.units_table.columns] self.displayed_unit_properties = displayed_unit_properties - - # spikeinterface handle colors in matplotlib style tuple values in range (0,1) - self.refresh_colors() def set_analyzer_info(self, analyzer): @@ -309,6 +306,9 @@ def set_analyzer_info(self, analyzer): self._extremum_channel = get_template_extremum_channel(self.analyzer, mode="extremum", peak_sign='both', outputs='index') + # spikeinterface handle colors in matplotlib style tuple values in range (0,1) + self.refresh_colors() + # at init, we set the visible channels as the sparsity of the first unit if self.analyzer_sparsity is not None: self.visible_channel_inds = self.analyzer_sparsity.unit_id_to_channel_indices[self.unit_ids[0]].astype("int64") @@ -374,13 +374,11 @@ def set_analyzer_info(self, analyzer): def set_curation_info(self, curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs): - self.curation = curation self.curation_callback = curation_callback self.curation_callback_kwargs = curation_callback_kwargs self._potential_merges = None - self.curation = curation # TODO: Reload the dictionary if it already exists if self.curation: # rules: @@ -390,6 +388,7 @@ def set_curation_info(self, curation, curation_data, label_definitions, curation if curation_data is not None: # validate the curation data + curation_data = deepcopy(curation_data) format_version = curation_data.get("format_version", None) # assume version 2 if not present if format_version is None: From 27b39a764509f1098da77cea77f219ceb0caa53c Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 25 Mar 2026 16:42:33 +0000 Subject: [PATCH 15/24] finish cleaning --- spikeinterface_gui/controller.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 63a3b155..7ed6a185 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -22,7 +22,6 @@ from .curation_tools import add_merge, default_label_definitions, empty_curation_data from .event_tools import parse_events - spike_dtype =[('sample_index', 'int64'), ('unit_index', 'int64'), ('channel_index', 'int64'), ('segment_index', 'int64'), ('visible', 'bool'), ('selected', 'bool'), ('rand_selected', 'bool')] @@ -83,9 +82,10 @@ def __init__( self.signal_handler = SignalHandler(self, parent=parent) self.with_traces = with_traces + self.save_on_compute = save_on_compute - self.verbose = verbose + self.verbose = verbose self.original_analyzer = None self.main_settings = _default_main_settings.copy() @@ -430,6 +430,7 @@ def set_curation_info(self, curation, curation_data, label_definitions, curation if curation_data is None: curation_data = deepcopy(empty_curation_data) + curation_data["unit_ids"] = self.unit_ids.tolist() curation_data["label_definitions"] = default_label_definitions.copy() if curation_data.get("discard_spikes") is None: From c3c93fba53212a9a33f9b4ec550aa33b474d8937 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Wed, 25 Mar 2026 16:53:29 +0000 Subject: [PATCH 16/24] remove mention of discard_spikes --- spikeinterface_gui/controller.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 7ed6a185..6722c025 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -433,9 +433,6 @@ def set_curation_info(self, curation, curation_data, label_definitions, curation curation_data["unit_ids"] = self.unit_ids.tolist() curation_data["label_definitions"] = default_label_definitions.copy() - if curation_data.get("discard_spikes") is None: - curation_data["discard_spikes"] = [] - self.curation_data = curation_data if "label_definitions" not in self.curation_data: From 12932ac3208d924628cd409389b12feb3dda0027 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Thu, 26 Mar 2026 10:41:40 +0000 Subject: [PATCH 17/24] remove old units from probeview --- spikeinterface_gui/curationview.py | 8 +++----- spikeinterface_gui/probeview.py | 3 +++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index a9c542aa..22e19ff6 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -1,9 +1,7 @@ -import json from pathlib import Path from .view_base import ViewBase -from spikeinterface.core.core_tools import check_json from spikeinterface.curation.curation_model import SequentialCuration class CurationView(ViewBase): @@ -75,9 +73,9 @@ def _qt_make_layout(self): tb.addWidget(but) but.clicked.connect(self.controller.save_curation_in_analyzer) - but_apply = QT.QPushButton("Apply curation") - tb.addWidget(but_apply) - but_apply.clicked.connect(self.apply_curation_to_analyzer) + but_apply = QT.QPushButton("Apply curation") + tb.addWidget(but_apply) + but_apply.clicked.connect(self.apply_curation_to_analyzer) but = QT.QPushButton("Export JSON") but.clicked.connect(self._qt_export_json) diff --git a/spikeinterface_gui/probeview.py b/spikeinterface_gui/probeview.py index a6bde08a..27be847d 100644 --- a/spikeinterface_gui/probeview.py +++ b/spikeinterface_gui/probeview.py @@ -151,9 +151,12 @@ def _qt_make_layout(self): def _qt_reinitialize(self): import pyqtgraph as pg + + self.plot.removeItem(self.scatter) unit_positions = self.controller.unit_positions brush = [self.get_unit_color(u) for u in self.controller.unit_ids] self.scatter = pg.ScatterPlotItem(pos=unit_positions, pxMode=False, size=10, brush=brush) + self.plot.addItem(self.scatter) self._qt_refresh() From a7abd8c04997758b79b626c39e2cef3a962b91c4 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Mon, 30 Mar 2026 12:36:35 +0100 Subject: [PATCH 18/24] regen visible columns on reinitialization --- spikeinterface_gui/unitlistview.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index 0dd2b6a5..0b006369 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -130,7 +130,7 @@ def _qt_set_up_visible_columns(self): def _qt_reinitialize(self): - #self._qt_set_up_visible_columns() + self._qt_set_up_visible_columns() self._qt_full_table_refresh() self._qt_refresh() From 2b9d7ed3131304087c8832e3f2f5238165a56868 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Mon, 30 Mar 2026 12:48:34 +0100 Subject: [PATCH 19/24] panel fixes --- spikeinterface_gui/curationview.py | 1 - spikeinterface_gui/traceview.py | 5 +++-- spikeinterface_gui/view_base.py | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 22e19ff6..94714ba3 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -405,7 +405,6 @@ def _panel_make_layout(self): save_button, download_button, apply_button, - submit_button, sizing_mode="stretch_width", ) save_sections = pn.Column( diff --git a/spikeinterface_gui/traceview.py b/spikeinterface_gui/traceview.py index 99e69bb2..8cc903e4 100644 --- a/spikeinterface_gui/traceview.py +++ b/spikeinterface_gui/traceview.py @@ -457,7 +457,7 @@ def _panel_on_event_type_changed(self): self.refresh() def _panel_add_event_lines(self, t1, t2): - if self.event_line is not None: + if self.controller.has_extension("events") and self.event_line is not None: event_samples = self.controller.get_events(self.event_key) segment_index = self.controller.get_time()[1] start_sample, end_sample = self.controller.get_chunk_indices(t1, t2, segment_index) @@ -583,7 +583,8 @@ def _panel_add_event_line(self): self.event_source.data = {"xs": [[evt_time, evt_time]], "ys": [yspan]} def _panel_remove_event_line(self): - self.event_source.data = {"xs": [], "ys": []} + if self.controller.has_extension("events"): + self.event_source.data = {"xs": [], "ys": []} # TODO: pan behavior like Qt? # def _panel_on_pan_start(self, event): diff --git a/spikeinterface_gui/view_base.py b/spikeinterface_gui/view_base.py index 8bc728dc..9714126b 100644 --- a/spikeinterface_gui/view_base.py +++ b/spikeinterface_gui/view_base.py @@ -40,6 +40,8 @@ def __init__(self, controller=None, parent=None, backend="qt"): create_settings(self) self.notifier = SignalNotifier(view=self) self.busy = pn.indicators.LoadingSpinner(value=True, size=20, name='busy...') + + self.layout = None make_layout() if self._settings is not None: listen_setting_changes(self) From f1a8aed6d6a6111eb5cf59f71ccf2d737c831ae4 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Thu, 21 May 2026 17:45:14 +0100 Subject: [PATCH 20/24] Add `iterative_curation` mode --- spikeinterface_gui/controller.py | 8 ++++++-- spikeinterface_gui/curationview.py | 11 ++++------- spikeinterface_gui/main.py | 8 +++++++- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 6722c025..99293448 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -47,6 +47,7 @@ def __init__( verbose=False, save_on_compute=False, curation=False, + iterative_curation=False, curation_data=None, label_definitions=None, with_traces=True, @@ -95,7 +96,7 @@ def __init__( self.set_analyzer_info(analyzer) self.units_table = make_units_table_from_analyzer(self.analyzer, extra_properties=extra_unit_properties) - self.set_curation_info(curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs) + self.set_curation_info(curation, iterative_curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs) # parse events self.events = None @@ -373,7 +374,10 @@ def set_analyzer_info(self, analyzer): self.update_time_info() - def set_curation_info(self, curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs): + def set_curation_info(self, curation, iterative_curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs): + self.iterative_curation = iterative_curation + if self.iterative_curation: + curation = True self.curation = curation self.curation_callback = curation_callback self.curation_callback_kwargs = curation_callback_kwargs diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 94714ba3..81b25e63 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -68,14 +68,11 @@ def _qt_make_layout(self): but = QT.QPushButton("Save curation") tb.addWidget(but) but.clicked.connect(self.controller.save_curation_callback) - elif self.controller.curation_can_be_saved(): - but = QT.QPushButton("Save in analyzer") - tb.addWidget(but) - but.clicked.connect(self.controller.save_curation_in_analyzer) - but_apply = QT.QPushButton("Apply curation") - tb.addWidget(but_apply) - but_apply.clicked.connect(self.apply_curation_to_analyzer) + if self.controller.iterative_curation: + but_apply = QT.QPushButton("Apply curation") + tb.addWidget(but_apply) + but_apply.clicked.connect(self.apply_curation_to_analyzer) but = QT.QPushButton("Export JSON") but.clicked.connect(self._qt_export_json) diff --git a/spikeinterface_gui/main.py b/spikeinterface_gui/main.py index c43cb2c0..e76ad157 100644 --- a/spikeinterface_gui/main.py +++ b/spikeinterface_gui/main.py @@ -21,6 +21,7 @@ def run_mainwindow( mode: str = "desktop", with_traces: bool = True, curation: bool = False, + iterative_curation: bool = False, curation_dict: dict | None = None, label_definitions: dict | None = None, displayed_unit_properties: list | None=None, @@ -57,6 +58,8 @@ def run_mainwindow( If True, traces are displayed curation: bool, default: False If True, the curation panel is displayed + iterative_curation: bool, default: False + If True, a user can iterative curate their analyzer curation_dict: dict | None, default: None The curation dictionary to start from an existing curation label_definitions: dict | None, default: None @@ -154,6 +157,7 @@ def run_mainwindow( backend=backend, verbose=verbose, curation=curation, + iterative_curation=iterative_curation, curation_data=curation_dict, label_definitions=label_definitions, with_traces=with_traces, @@ -319,6 +323,7 @@ def run_mainwindow_cli(): parser.add_argument('--mode', help='Mode desktop or web', default='desktop') parser.add_argument('--no-traces', help='Do not show traces', action='store_true', default=False) parser.add_argument('--curation', help='Enable curation panel', action='store_true', default=False) + parser.add_argument('--iterative_curation', help='Enable iterative curation', action='store_true', default=False) parser.add_argument('--recording', help='Path to a recording file (.json/.pkl) or folder that can be loaded with spikeinterface.load', default=None) parser.add_argument('--recording-base-folder', help='Base folder path for the recording (if .json/.pkl)', default=None) parser.add_argument('--verbose', help='Make the output verbose', action='store_true', default=False) @@ -390,6 +395,7 @@ def run_mainwindow_cli(): mode=args.mode, with_traces=not(args.no_traces), curation=args.curation, + iterative_curation = args.iterative_curation, recording=recording, skip_extensions=skip_extensions_list, verbose=args.verbose, @@ -420,4 +426,4 @@ def find_skippable_extensions(layout_dict): skippable_extensions = list(all_extensions.difference(set(needed_extensions))) - return skippable_extensions \ No newline at end of file + return skippable_extensions From cf1e70d5be0e7dae77dca8270c19966484ce7230 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Thu, 21 May 2026 18:28:38 +0100 Subject: [PATCH 21/24] Fix panel refresh bug --- spikeinterface_gui/curationview.py | 42 +++++++++++++------------- spikeinterface_gui/main.py | 2 +- spikeinterface_gui/maintemplateview.py | 8 ++--- spikeinterface_gui/utils_global.py | 7 ++--- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 81b25e63..be373421 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -364,29 +364,32 @@ def _panel_make_layout(self): ) # Create buttons + + save_buttons = [] if self.controller.curation_callback is not None: save_button_name = "Save curation" save_button_callback = self._panel_save_curation_callback - else: - save_button_name = "Save in analyzer" - save_button_callback = self._panel_save_in_analyzer - save_button = pn.widgets.Button( - name=save_button_name, - button_type="primary", - height=30 - ) - save_button.on_click(save_button_callback) - - apply_button = pn.widgets.Button( - name="Apply curation", - button_type="primary", - height=30 - ) - apply_button.on_click(self._panel_apply_curation_to_analyzer) + save_button = pn.widgets.Button( + name=save_button_name, + button_type="primary", + height=30 + ) + save_button.on_click(save_button_callback) + save_buttons.append(save_button) + + if self.controller.iterative_curation: + apply_button = pn.widgets.Button( + name="Apply curation", + button_type="primary", + height=30 + ) + apply_button.on_click(self._panel_apply_curation_to_analyzer) + save_buttons.append(apply_button) download_button = pn.widgets.FileDownload( button_type="primary", filename="curation.json", callback=self._panel_generate_json, height=30 ) + save_buttons.append(download_button) restore_button = pn.widgets.Button(name="Restore", button_type="primary", height=30) restore_button.on_click(self._panel_restore_units) @@ -399,9 +402,7 @@ def _panel_make_layout(self): # Create layout buttons_save = pn.Row( - save_button, - download_button, - apply_button, + *save_buttons, sizing_mode="stretch_width", ) save_sections = pn.Column( @@ -472,7 +473,7 @@ def _panel_refresh(self): def _panel_ensure_save_warning_message(self): - if self.layout[0].name == "curation_save_warning": + if self.layout[0].name == "curation_save_warning" or self.layout[0].name == "busy...": return import panel as pn @@ -523,7 +524,6 @@ def _panel_apply_curation_to_analyzer(self, event): def _panel_unsplit(self, event): self.unsplit() - def _panel_save_in_analyzer(self, event): self.controller.save_curation_in_analyzer() self.refresh() diff --git a/spikeinterface_gui/main.py b/spikeinterface_gui/main.py index e76ad157..a7ba3d31 100644 --- a/spikeinterface_gui/main.py +++ b/spikeinterface_gui/main.py @@ -59,7 +59,7 @@ def run_mainwindow( curation: bool, default: False If True, the curation panel is displayed iterative_curation: bool, default: False - If True, a user can iterative curate their analyzer + If True, a user can iteratively curate their analyzer curation_dict: dict | None, default: None The curation dictionary to start from an existing curation label_definitions: dict | None, default: None diff --git a/spikeinterface_gui/maintemplateview.py b/spikeinterface_gui/maintemplateview.py index 4a143eb2..5a7550da 100644 --- a/spikeinterface_gui/maintemplateview.py +++ b/spikeinterface_gui/maintemplateview.py @@ -238,7 +238,7 @@ def _panel_refresh(self): if peak_data is not None: # Trough (downward triangle) - trough_inds = peak_data[['trough_index']].values + trough_inds = peak_data[['trough_index']].values.astype(int) fig.scatter( x=times[trough_inds].tolist(), y=template_high[trough_inds].tolist(), @@ -249,7 +249,7 @@ def _panel_refresh(self): # Peaks before/after (upward triangle) names = ('peak_before', 'peak_after') - peak_inds = peak_data[[f'{k}_index' for k in names]].values + peak_inds = peak_data[[f'{k}_index' for k in names]].values.astype(int) fig.scatter( x=times[peak_inds].tolist(), y=template_high[peak_inds].tolist(), @@ -260,7 +260,7 @@ def _panel_refresh(self): # Peaks before/after (upward triangle) all_names = ('trough', 'peak_before', 'peak_after') - peak_inds = peak_data[[f'{k}_index' for k in all_names]].values + peak_inds = peak_data[[f'{k}_index' for k in all_names]].values.astype(int) # Vertical dotted lines from peak to zero for ind in peak_inds: fig.line( @@ -324,4 +324,4 @@ def _panel_refresh(self): x-axis represents time and is in units of milliseconds. y-axis represents the electrical signal. The units depend on your preprocessing steps, but is usually in uV. -""" \ No newline at end of file +""" diff --git a/spikeinterface_gui/utils_global.py b/spikeinterface_gui/utils_global.py index d885aa24..20174d66 100644 --- a/spikeinterface_gui/utils_global.py +++ b/spikeinterface_gui/utils_global.py @@ -3,6 +3,9 @@ import os from copy import copy +from spikeinterface.core.sorting_tools import generate_unit_ids_for_split, generate_unit_ids_for_merge_group +from spikeinterface.curation.curation_model import Curation + def get_config_folder() -> Path: """Get the config folder for spikeinterface-gui settings files. @@ -66,10 +69,6 @@ def add_new_unit_ids_to_curation_dict(curation_dict, sorting, split_new_id_strat Explicitly adds the new unit ids to `curation_dict` based on the split and merge new id strategies. These *should* be the ids that would have been generated during `apply_curation` with these strategies. """ - - from spikeinterface.core.sorting_tools import generate_unit_ids_for_split, generate_unit_ids_for_merge_group - from spikeinterface.curation.curation_model import Curation - curation_model = Curation(**curation_dict) old_unit_ids = copy(curation_model.unit_ids) From 50e7fc212eb9929ab61f349dc163aeea8e701fc8 Mon Sep 17 00:00:00 2001 From: chrishalcrow Date: Fri, 22 May 2026 08:46:54 +0100 Subject: [PATCH 22/24] Re-add save in analyzer in curation mode only --- spikeinterface_gui/curationview.py | 34 +++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 5e41c776..2e5980f9 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -69,6 +69,11 @@ def _qt_make_layout(self): tb.addWidget(but) but.clicked.connect(self.controller.save_curation_callback) + elif self.controller.curation_can_be_saved() and not self.controller.iterative_curation: + but = QT.QPushButton("Save in analyzer") + tb.addWidget(but) + but.clicked.connect(self.controller.save_curation_in_analyzer) + if self.controller.iterative_curation: but_apply = QT.QPushButton("Apply curation") tb.addWidget(but_apply) @@ -366,6 +371,27 @@ def _panel_make_layout(self): # Create buttons save_buttons = [] + + if self.controller.iterative_curation: + apply_button = pn.widgets.Button( + name="Apply curation", + button_type="primary", + height=30 + ) + apply_button.on_click(self._panel_apply_curation_to_analyzer) + save_buttons.append(apply_button) + + if not self.controller.iterative_curation and self.controller.curation_callback is None: + save_button_name = "Save in analyzer" + save_button_callback = self._panel_save_in_analyzer + save_button = pn.widgets.Button( + name=save_button_name, + button_type="primary", + height=30 + ) + save_button.on_click(save_button_callback) + save_buttons.append(save_button) + if self.controller.curation_callback is not None: save_button_name = "Save curation" save_button_callback = self._panel_save_curation_callback @@ -377,14 +403,6 @@ def _panel_make_layout(self): save_button.on_click(save_button_callback) save_buttons.append(save_button) - if self.controller.iterative_curation: - apply_button = pn.widgets.Button( - name="Apply curation", - button_type="primary", - height=30 - ) - apply_button.on_click(self._panel_apply_curation_to_analyzer) - save_buttons.append(apply_button) download_button = pn.widgets.FileDownload( button_type="primary", filename="curation.json", callback=self._panel_generate_json, height=30 From b2737f1ec99785150ad0b5f4939270a7fec66b26 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 23 Jul 2026 16:20:05 +0200 Subject: [PATCH 23/24] fix: existing colors in refresh_colors --- screenshot.png | Bin 258998 -> 0 bytes spikeinterface_gui/controller.py | 15 +++++++++++---- .../tests/test_mainwindow_panel.py | 12 ++++++++---- spikeinterface_gui/tests/test_mainwindow_qt.py | 14 ++++++++++---- spikeinterface_gui/tests/testingtools.py | 4 +++- 5 files changed, 32 insertions(+), 13 deletions(-) delete mode 100644 screenshot.png diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index 3157689e180858d803c7b83a0127118108142d61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258998 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

m 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

5t_sZW5y5fkt;H+G-m>V66eS zvogW7$X0&-3u{?$x0zAhnL8&rQ|yxb8@~^dhji*VUL!B&hsMd^@#bR8h#1 z`clJtD)MHP$i5S3o)pOY7llD;^q+Rq9-8%wdR_U*v$K+vfMA3&75|K#Ip9axo=vB_#T~$c@>?ZRD>{$MUz*Q-2@QE({`$`3 zdy&n`C0B_DjEqlcv<23A0nf+2)=z{!G{Fux0b=LB_KMH-N3XX14fqk|>XB!1gZ>`F zY6gjf26IzcO z(0B}d`bR#W^A8@wHvz7=uk{9D52*lH7E*txE0_Qj^v`a-xcBPc=l)ggKic(bdHtX3 n|E>R51OKam|6epf;@6d1$AQXbm}J)fkx5la>orp0?Wg|(>lXMD diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index 6ecfcabc..ce4c9346 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -326,8 +326,9 @@ def set_analyzer_info(self, analyzer): self.num_spikes = self.analyzer.sorting.count_num_spikes_per_unit(outputs="dict") # print("self.num_spikes", self.num_spikes) - spike_vector = self.analyzer.sorting.to_spike_vector(concatenated=True, extremum_channel_inds=self._extremum_channel) - # spike_vector = self.analyzer.sorting.to_spike_vector(concatenated=True) + spike_vector = self.analyzer.sorting.to_spike_vector( + concatenated=True, main_channel_indices=self.analyzer.get_main_channels(outputs="index", with_dict=False) + ) self.random_spikes_indices = self.analyzer.get_extension("random_spikes").get_data() @@ -611,14 +612,20 @@ def get_divergent_unit_colors(self, num_entries=20): return colors - def refresh_colors(self): + def refresh_colors(self, existing_colors=None): if self.backend == "qt": self._cached_qcolors = {} elif self.backend == "panel": pass if self.main_settings['color_mode'] == 'color_by_unit': - self.colors = self.get_divergent_unit_colors(num_entries=self.main_settings['num_colors']) + unit_colors = self.get_divergent_unit_colors(num_entries=self.main_settings['num_colors']) + if existing_colors is None: + self.colors = unit_colors + else: + for unit_id, unit_color in unit_colors.items(): + if unit_id not in self.colors.keys(): + self.colors[unit_id] = unit_color elif self.main_settings['color_mode'] == 'color_only_visible': unit_colors = self.get_divergent_unit_colors(num_entries=self.main_settings['num_colors']) self.colors = {unit_id: (0.3, 0.3, 0.3, 1.) for unit_id in self.unit_ids} diff --git a/spikeinterface_gui/tests/test_mainwindow_panel.py b/spikeinterface_gui/tests/test_mainwindow_panel.py index 05d5e193..c1a60149 100644 --- a/spikeinterface_gui/tests/test_mainwindow_panel.py +++ b/spikeinterface_gui/tests/test_mainwindow_panel.py @@ -14,13 +14,13 @@ def setup_module(): global test_folder case = test_folder.stem.split('_')[-1] - make_analyzer_folder(test_folder, case=case, unit_dtype="int") + make_analyzer_folder(test_folder, case=case, unit_dtype="str") def teardown_module(): clean_all(test_folder) -def test_mainwindow(start_app=False, verbose=True, curation=False, only_some_extensions=False, events=False, port=0): +def test_mainwindow(start_app=False, verbose=True, curation=False, only_some_extensions=False, events=False, iterative_curation=False, port=0): analyzer = load_sorting_analyzer(test_folder / "sorting_analyzer") @@ -81,7 +81,8 @@ def test_mainwindow(start_app=False, verbose=True, curation=False, only_some_ext layout_preset='default', # address="10.69.168.40", port=port, - events=events_dict + events=events_dict, + iterative_curation=iterative_curation, # user_settings={"mainsettings": {"color_mode": "color_by_visibility", "max_visible_units": 5}} ) return win @@ -112,6 +113,7 @@ def test_launcher(verbose=True): parser = ArgumentParser() parser.add_argument('--dataset', default="small", help='Path to the dataset folder') parser.add_argument('--events', action="store_true", help='Simulate and add events') +parser.add_argument('--iterative', action="store_true", help='Run iterative curation') if __name__ == '__main__': args = parser.parse_args() @@ -123,7 +125,9 @@ def test_launcher(verbose=True): if not test_folder.is_dir(): setup_module() - win = test_mainwindow(start_app=True, verbose=True, curation=True, events=args.events, port=0) + iterative_curation = args.iterative + + win = test_mainwindow(start_app=True, verbose=True, curation=True, events=args.events, port=0, iterative_curation=iterative_curation) # test_launcher(verbose=True) diff --git a/spikeinterface_gui/tests/test_mainwindow_qt.py b/spikeinterface_gui/tests/test_mainwindow_qt.py index 0fbc3ef7..6ae88f67 100644 --- a/spikeinterface_gui/tests/test_mainwindow_qt.py +++ b/spikeinterface_gui/tests/test_mainwindow_qt.py @@ -29,13 +29,13 @@ def setup_module(): global test_folder case = test_folder.stem.split('_')[-1] - make_analyzer_folder(test_folder, case=case, unit_dtype="int") + make_analyzer_folder(test_folder, case=case, unit_dtype="str") def teardown_module(): clean_all(test_folder) -def test_mainwindow(start_app=False, verbose=True, curation=False, only_some_extensions=False, events=False): +def test_mainwindow(start_app=False, verbose=True, curation=False, only_some_extensions=False, events=False, iterative_curation=False): analyzer = load_sorting_analyzer(test_folder / "sorting_analyzer") @@ -105,7 +105,9 @@ def test_mainwindow(start_app=False, verbose=True, curation=False, only_some_ext mode="desktop", start_app=start_app, verbose=verbose, - curation=curation, curation_dict=curation_dict, + curation=curation, + curation_dict=curation_dict, + iterative_curation=iterative_curation, displayed_unit_properties=None, extra_unit_properties=extra_unit_properties, layout_preset='default', @@ -144,6 +146,8 @@ def test_launcher(verbose=True): parser = ArgumentParser() parser.add_argument('--dataset', default="small", help='Path to the dataset folder') parser.add_argument('--events', action="store_true", help='Simulate and add events') +parser.add_argument('--iterative', action="store_true", help='Run iterative curation') + if __name__ == '__main__': args = parser.parse_args() @@ -155,7 +159,9 @@ def test_launcher(verbose=True): if not test_folder.is_dir(): setup_module() - win = test_mainwindow(start_app=True, verbose=True, curation=True, events=args.events) + iterative_curation = args.iterative + + win = test_mainwindow(start_app=True, verbose=True, curation=True, events=args.events, iterative_curation=iterative_curation) # win = test_mainwindow(start_app=True, verbose=True, curation=False) # test_launcher(verbose=True) diff --git a/spikeinterface_gui/tests/testingtools.py b/spikeinterface_gui/tests/testingtools.py index ed0f0a58..b42b87f0 100644 --- a/spikeinterface_gui/tests/testingtools.py +++ b/spikeinterface_gui/tests/testingtools.py @@ -26,7 +26,9 @@ def clean_all(test_folder): # retry after a short delay, to give the OS time to release the file handles time.sleep(0.5) # don't let a failure here cause an otherwise-passing test to fail - shutil.rmtree(folder, ignore_errors=True) + shutil.rmtree(folder, ignore_errors=True) + + def make_analyzer_folder(test_folder, case="small", unit_dtype="str"): clean_all(test_folder) From 5c882a290cac4241e835a7fa84b553d7c0c1cb91 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 23 Jul 2026 17:51:57 +0200 Subject: [PATCH 24/24] add restore_original button and fix panel unitlist settings update --- spikeinterface_gui/backend_panel.py | 7 ++- spikeinterface_gui/controller.py | 19 ++++++- spikeinterface_gui/curationview.py | 17 +++++++ .../tests/test_mainwindow_qt.py | 16 +----- spikeinterface_gui/unitlistview.py | 51 ++++++++++++++++--- 5 files changed, 85 insertions(+), 25 deletions(-) diff --git a/spikeinterface_gui/backend_panel.py b/spikeinterface_gui/backend_panel.py index 9abeaa61..e995416c 100644 --- a/spikeinterface_gui/backend_panel.py +++ b/spikeinterface_gui/backend_panel.py @@ -257,12 +257,15 @@ def make_views(self, user_settings): tabs = [("📊", view.layout)] if view_class._settings is not None: - settings = pn.Param(view.settings._parameterized, sizing_mode="stretch_height", + settings_param = pn.Param(view.settings._parameterized, sizing_mode="stretch_height", name=f"{view_name.capitalize()} settings") + view._panel_settings_widget = settings_param if view_class._need_compute: compute_button = pn.widgets.Button(name="Compute", button_type="primary") compute_button.on_click(view.compute) - settings = pn.Row(settings, compute_button) + settings = pn.Row(settings_param, compute_button) + else: + settings = settings_param tabs.append(("âš™ī¸", settings)) tabs.append(("â„šī¸", info)) diff --git a/spikeinterface_gui/controller.py b/spikeinterface_gui/controller.py index ce4c9346..652b04a5 100644 --- a/spikeinterface_gui/controller.py +++ b/spikeinterface_gui/controller.py @@ -97,6 +97,7 @@ def __init__( self.units_table = make_units_table_from_analyzer(self.analyzer, extra_properties=extra_unit_properties) self.set_curation_info(curation, iterative_curation, curation_data, label_definitions, curation_callback, curation_callback_kwargs) + self.original_curation_data = deepcopy(self.curation_data) # parse events self.events = None @@ -959,7 +960,6 @@ def construct_final_curation(self, with_explicit_new_unit_ids=False): return model def apply_curation(self): - if self.original_analyzer is None: self.original_analyzer = deepcopy(self.analyzer) self.original_analyzer.extensions = {} @@ -972,6 +972,23 @@ def apply_curation(self): self.set_analyzer_info(curated_analyzer) + # for now, don't show externally provided properties after curation + self.displayed_unit_properties = [displayed_property for displayed_property in self.displayed_unit_properties if displayed_property not in self.extra_unit_properties_names] + self.units_table = make_units_table_from_analyzer(self.analyzer) + print(f"new units table columns: {self.units_table.columns}") + self.refresh_colors(existing_colors=self.colors) + + for view in self.views: + view.reinitialize() + + def restore_original_analyzer(self): + if self.original_analyzer is None or len(self.applied_curations) == 0: + return + self.curation_data = deepcopy(self.original_curation_data) + self.applied_curations = [] + + self.set_analyzer_info(self.original_analyzer) + # for now, don't show externally provided properties after curation self.displayed_unit_properties = [displayed_property for displayed_property in self.displayed_unit_properties if displayed_property not in self.extra_unit_properties_names] self.units_table = make_units_table_from_analyzer(self.analyzer) diff --git a/spikeinterface_gui/curationview.py b/spikeinterface_gui/curationview.py index 2e5980f9..587b1ea9 100644 --- a/spikeinterface_gui/curationview.py +++ b/spikeinterface_gui/curationview.py @@ -78,6 +78,9 @@ def _qt_make_layout(self): but_apply = QT.QPushButton("Apply curation") tb.addWidget(but_apply) but_apply.clicked.connect(self.apply_curation_to_analyzer) + but_restore = QT.QPushButton("Restore original") + tb.addWidget(but_restore) + but_restore.clicked.connect(self.restore_original_analyzer) but = QT.QPushButton("Export JSON") but.clicked.connect(self._qt_export_json) @@ -286,6 +289,10 @@ def apply_curation_to_analyzer(self): with self.busy_cursor(): self.controller.apply_curation() + def restore_original_analyzer(self): + with self.busy_cursor(): + self.controller.restore_original_analyzer() + def _qt_export_json(self): from .myqt import QT @@ -380,6 +387,13 @@ def _panel_make_layout(self): ) apply_button.on_click(self._panel_apply_curation_to_analyzer) save_buttons.append(apply_button) + restore_original = pn.widgets.Button( + name="Restore original", + button_type="primary", + height=30 + ) + restore_original.on_click(self._panel_restore_original_analyzer) + save_buttons.append(restore_original) if not self.controller.iterative_curation and self.controller.curation_callback is None: save_button_name = "Save in analyzer" @@ -539,6 +553,9 @@ def _panel_unmerge(self, event): def _panel_apply_curation_to_analyzer(self, event): self.apply_curation_to_analyzer() + def _panel_restore_original_analyzer(self, event): + self.restore_original_analyzer() + def _panel_unsplit(self, event): self.unsplit() diff --git a/spikeinterface_gui/tests/test_mainwindow_qt.py b/spikeinterface_gui/tests/test_mainwindow_qt.py index 6ae88f67..a8668804 100644 --- a/spikeinterface_gui/tests/test_mainwindow_qt.py +++ b/spikeinterface_gui/tests/test_mainwindow_qt.py @@ -9,21 +9,6 @@ from pathlib import Path import numpy as np -import sys - - - -# yep is for testing -yep_layout = dict( - zone1=['curation', 'spikelist'], - zone2=['unitlist', 'mergelist'], - zone3=['trace', 'tracemap', 'spikeamplitude'], - zone4=['similarity'], - zone5=['probe'], - zone6=['ndscatter', ], - zone7=['waveform', 'waveformheatmap', ], - zone8=['correlogram', 'isi'], -) def setup_module(): @@ -31,6 +16,7 @@ def setup_module(): case = test_folder.stem.split('_')[-1] make_analyzer_folder(test_folder, case=case, unit_dtype="str") + def teardown_module(): clean_all(test_folder) diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index 8ea9c9fe..3da98e9a 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -1,6 +1,3 @@ -import time -import numpy as np - from .view_base import ViewBase @@ -52,7 +49,7 @@ def _qt_make_layout(self): but.clicked.connect(self._qt_select_columns) tb.addWidget(but) - self._qt_set_up_visible_columns() + self._qt_setup_visible_columns() # h = QT.QHBoxLayout() # self.layout.addLayout(h) @@ -118,7 +115,7 @@ def _qt_make_layout(self): self.shortcut_noise.setKey(QT.QKeySequence('n')) self.shortcut_noise.activated.connect(lambda: self._qt_set_default_label('noise')) - def _qt_set_up_visible_columns(self): + def _qt_setup_visible_columns(self): import pyqtgraph as pg visible_cols = [] @@ -137,7 +134,7 @@ def _qt_set_up_visible_columns(self): def _qt_reinitialize(self): - self._qt_set_up_visible_columns() + self._qt_setup_visible_columns() self._qt_full_table_refresh() self._qt_refresh() @@ -506,7 +503,8 @@ def _panel_create_table(self): self.controller.channel_ids[self.controller.get_extremum_channel(unit_id)] ) for col in self.controller.displayed_unit_properties: - data[col] = self.controller.units_table[col] + if col in self.controller.units_table.columns: + data[col] = self.controller.units_table[col] df = pd.DataFrame( data=data, @@ -642,6 +640,44 @@ def _panel_on_settings_changed(self): self._panel_refresh_header() + def _panel_setup_visible_columns(self): + from .backend_panel import create_settings, listen_setting_changes + + # Preserve existing column visibility preferences set by the user + existing_values = {} + if hasattr(self, "settings"): + for col in self.controller.units_table.columns: + try: + existing_values[col] = self.settings[col] + except Exception: + pass + + # # Any column not in existing_values is new (added by curation). + # # Add new columns to displayed_unit_properties so they appear by default. + # for col in self.controller.units_table.columns: + # if col not in existing_values: + # self.controller.displayed_unit_properties.append(col) + + # Rebuild the class-level _settings list for all current columns + UnitListView._settings = [ + { + "name": str(col), + "type": "bool", + "value": existing_values.get(col, col in self.controller.displayed_unit_properties), + "default": True, + } + for col in self.controller.units_table.columns + ] + print(UnitListView._settings) + + # Recreate the settings proxy and re-register watchers on the new proxy + create_settings(self) + listen_setting_changes(self) + + # Update the gear-tab pn.Param widget so it reflects the new parameterized object + if hasattr(self, "_panel_settings_widget"): + self._panel_settings_widget.object = self.settings._parameterized + def _panel_refresh_click(self, event): self.table.reset() self.refresh() @@ -670,6 +706,7 @@ def _panel_refresh(self): self._panel_refresh_header() def _panel_reinitialize(self): + self._panel_setup_visible_columns() self._panel_make_layout() self._panel_refresh()

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