Skip to content

Commit 56a58d6

Browse files
authored
Merge pull request #195 from chrishalcrow/check-needed-extensions
Only load required extensions
2 parents b2ce195 + cb092d3 commit 56a58d6

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

spikeinterface_gui/backend_panel.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,9 @@ def listen_setting_changes(view):
185185

186186
class PanelMainWindow:
187187

188-
def __init__(self, controller, layout_preset=None, layout=None, user_settings=None):
188+
def __init__(self, controller, layout_dict=None, user_settings=None):
189189
self.controller = controller
190-
self.layout_preset = layout_preset
191-
self.layout = layout
190+
self.layout_dict = layout_dict
192191
self.verbose = controller.verbose
193192

194193
self.make_views(user_settings)
@@ -258,7 +257,7 @@ def create_main_layout(self):
258257

259258
pn.extension("gridstack")
260259

261-
preset = get_layout_description(self.layout_preset, self.layout)
260+
preset = self.layout_dict
262261

263262
layout_zone = {}
264263
for zone, view_names in preset.items():

spikeinterface_gui/backend_qt.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,12 @@ def stop_listen_setting_changes(view):
141141
class QtMainWindow(QT.QMainWindow):
142142
main_window_closed = QT.pyqtSignal(object)
143143

144-
def __init__(self, controller, parent=None, layout_preset=None, layout=None, user_settings=None):
144+
def __init__(self, controller, parent=None, layout_dict=None, user_settings=None):
145145
QT.QMainWindow.__init__(self, parent)
146146

147147
self.controller = controller
148148
self.verbose = controller.verbose
149-
self.layout_preset = layout_preset
150-
self.layout = layout
149+
self.layout_dict = layout_dict
151150

152151
self.make_views(user_settings)
153152
self.create_main_layout()
@@ -206,7 +205,7 @@ def create_main_layout(self):
206205

207206
self.setDockNestingEnabled(True)
208207

209-
preset = get_layout_description(self.layout_preset, self.layout)
208+
preset = self.layout_dict
210209

211210
widgets_zone = {}
212211
for zone, view_names in preset.items():

spikeinterface_gui/layout_presets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def _check_valid_layout_dict(layout_dict):
3434
list_of_possible_class_views = list(possible_class_views.keys())
3535
if class_view not in list_of_possible_class_views:
3636
raise KeyError(f"View '{class_view}' in layout dictionary not equal to a valid View. "\
37-
"Valid views are {list_of_possible_class_views}")
37+
f"Valid views are {list_of_possible_class_views}")
3838

3939
def get_layout_description(preset_name, layout=None):
4040
if isinstance(layout, dict):

spikeinterface_gui/main.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77

88
from spikeinterface import load_sorting_analyzer, load
99
from spikeinterface.core.core_tools import is_path_remote
10+
from spikeinterface.core.sortinganalyzer import get_available_analyzer_extensions
1011
from .utils_global import get_config_folder
12+
from spikeinterface_gui.layout_presets import get_layout_description
1113

1214
import spikeinterface_gui
1315
from spikeinterface_gui.controller import Controller
14-
16+
from spikeinterface_gui.viewlist import possible_class_views
1517

1618
def run_mainwindow(
1719
analyzer,
@@ -121,6 +123,11 @@ def run_mainwindow(
121123
if verbose:
122124
import time
123125
t0 = time.perf_counter()
126+
127+
layout_dict = get_layout_description(layout_preset, layout)
128+
if skip_extensions is None:
129+
skip_extensions = find_skippable_extensions(layout_dict)
130+
124131
controller = Controller(
125132
analyzer, backend=backend, verbose=verbose,
126133
curation=curation, curation_data=curation_dict,
@@ -146,7 +153,7 @@ def run_mainwindow(
146153

147154
app = mkQApp()
148155

149-
win = QtMainWindow(controller, layout_preset=layout_preset, layout=layout, user_settings=user_settings)
156+
win = QtMainWindow(controller, layout_dict=layout_dict, user_settings=user_settings)
150157
win.setWindowTitle('SpikeInterface GUI')
151158
# Set window icon
152159
icon_file = Path(__file__).absolute().parent / 'img' / 'si.png'
@@ -158,7 +165,7 @@ def run_mainwindow(
158165

159166
elif backend == "panel":
160167
from .backend_panel import PanelMainWindow, start_server
161-
win = PanelMainWindow(controller, layout_preset=layout_preset, layout=layout, user_settings=user_settings)
168+
win = PanelMainWindow(controller, layout_dict=layout_dict, user_settings=user_settings)
162169

163170
if start_app or panel_window_servable:
164171
win.main_layout.servable(title='SpikeInterface GUI')
@@ -349,3 +356,25 @@ def run_mainwindow_cli():
349356
disable_save_settings_button=disable_save_settings_button,
350357
)
351358

359+
def find_skippable_extensions(layout_dict):
360+
"""
361+
Returns the extensions which don't need to be loaded, depending on which views the user
362+
wants to load. Does this by taking all possible extensions, then removing any which are
363+
needed by a view.
364+
"""
365+
366+
all_extensions = set(get_available_analyzer_extensions())
367+
368+
view_per_zone = list(layout_dict.values())
369+
list_of_views = [view for zone_views in view_per_zone for view in zone_views]
370+
371+
needed_extensions = ['unit_locations']
372+
373+
for view in list_of_views:
374+
extensions_view_depend_on = possible_class_views[view]._depend_on
375+
if extensions_view_depend_on is not None:
376+
needed_extensions += extensions_view_depend_on
377+
378+
skippable_extensions = list(all_extensions.difference(set(needed_extensions)))
379+
380+
return skippable_extensions

0 commit comments

Comments
 (0)