Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/source/generate_view_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ def generate_views_rst():
'similarity': 'similarityview.py',
'spikeamplitude': 'spikeamplitudeview.py',
'spikedepth': 'spikedepthview.py',
'amplitudescalings': 'amplitudescalingsview.py',
'tracemap': 'tracemapview.py',
'curation': 'curationview.py',
'spikerate': 'spikerateview.py',
Expand Down
31 changes: 31 additions & 0 deletions spikeinterface_gui/amplitudescalingsview.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from .basescatterview import BaseScatterView


class AmplitudeScalingsView(BaseScatterView):
id = "amplitudescalings"
_depend_on = ["amplitude_scalings"]

def __init__(self, controller=None, parent=None, backend="qt"):
y_label = "Amplitude scaling"
spike_data = controller.amplitude_scalings

BaseScatterView.__init__(
self,
controller=controller,
parent=parent,
backend=backend,
y_label=y_label,
spike_data=spike_data,
)


AmplitudeScalingsView._gui_help_txt = """
## Amplitude Scalings View

Amplitude scalings measure the optimal scaling which should be applied to the template so that
it best matches each spike waveform.

### Controls
- **select** : activate lasso selection to select individual spikes
- **split** or **ctrl+s** : split the selected spikes into a new unit (only if one unit is visible)
"""
12 changes: 11 additions & 1 deletion spikeinterface_gui/basescatterview.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,11 @@ def split(self):
"""
Add a split to the curation data based on the lasso vertices.
"""
if not self.controller.curation:
self.warning(
"You are not in 'curation' mode. Split cannot be performed.")
return

# split is only possible if one unit is visible
visible_unit_ids = self.controller.get_visible_unit_ids()
if len(visible_unit_ids) != 1:
Expand Down Expand Up @@ -178,7 +183,7 @@ def on_use_times_updated(self):
def _qt_make_layout(self):
from .myqt import QT
import pyqtgraph as pg
from .utils_qt import add_stretch_to_qtoolbar
from .utils_qt import add_stretch_to_qtoolbar, qt_shortcut_is_setup

self.layout = QT.QVBoxLayout()

Expand All @@ -197,6 +202,11 @@ def _qt_make_layout(self):
self.split_but.clicked.connect(self.split)
h = QT.QHBoxLayout()
self.layout.addLayout(h)

if not qt_shortcut_is_setup("Ctrl+S"):
shortcut_split = QT.QShortcut(self.qt_widget)
shortcut_split.setKey(QT.QKeySequence("ctrl+s"))
shortcut_split.activated.connect(self.split)

self.graphicsview = pg.GraphicsView()
h.addWidget(self.graphicsview, 3)
Expand Down
13 changes: 13 additions & 0 deletions spikeinterface_gui/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,19 @@ def __init__(self, analyzer=None, backend="qt", parent=None, verbose=False, save
else:
self.spike_amplitudes = None

if "amplitude_scalings" in skip_extensions:
if self.verbose:
print('\tSkipping amplitude_scalings')
self.amplitude_scalings = None
else:
if verbose:
print('\tLoading amplitude_scalings')
sa_ext = analyzer.get_extension('amplitude_scalings')
if sa_ext is not None:
self.amplitude_scalings = sa_ext.get_data()
else:
self.amplitude_scalings = None

if "spike_locations" in skip_extensions:
if self.verbose:
print('\tSkipping spike_locations')
Expand Down
2 changes: 1 addition & 1 deletion spikeinterface_gui/layout_presets.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def get_layout_description(preset_name, layout=None):
default_layout = dict(
zone1=['curation', 'spikelist'],
zone2=['unitlist', 'merge'],
zone3=['trace', 'tracemap', 'spikeamplitude', 'spikedepth', 'spikerate'],
zone3=['trace', 'tracemap', 'spikeamplitude', 'amplitudescalings', 'spikedepth', 'spikerate'],
zone4=[],
zone5=['probe'],
zone6=['ndscatter', 'similarity'],
Expand Down
4 changes: 4 additions & 0 deletions spikeinterface_gui/mergeview.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ def get_table_data(self, include_deleted=False):
return labels, rows

def accept_group_merge(self, group_ids):
if not self.controller.curation:
self.warning("You are not in 'curation' mode. Merge cannot be performed.")
return

success = self.controller.make_manual_merge_if_possible(group_ids)
if not success:
self.warning(
Expand Down
4 changes: 0 additions & 4 deletions spikeinterface_gui/spikeamplitudeview.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ def _qt_make_layout(self):
self.noise_harea = []
if self.settings["noise_level"] and self.controller.has_extension("noise_levels"):
self._qt_add_noise_area()
# add split shortcut, so that it's not duplicated
shortcut_split = QT.QShortcut(self.qt_widget)
shortcut_split.setKey(QT.QKeySequence("ctrl+s"))
shortcut_split.activated.connect(self.split)

def _qt_refresh(self):
super()._qt_refresh()
Expand Down
16 changes: 16 additions & 0 deletions spikeinterface_gui/utils_qt.py
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,23 @@ def find_category(categories, category):
return None


def qt_shortcut_is_setup(shortcut):
"""
Checks the application to see if `shortcut`, e.g. "Ctrl+S", has already
been set by a widget.
"""
from .myqt import QT

# Access the running application instance
app = QT.QApplication.instance()

# Loop through every top-level window (e.g., MainWindows, Dialogs)
for widget in app.allWidgets():
for sc in widget.findChildren(QT.QShortcut):
if sc.key().toString() == shortcut:
return True

return False


if __name__=='__main__':
Expand Down
4 changes: 3 additions & 1 deletion spikeinterface_gui/viewlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from .similarityview import SimilarityView
from .spikeamplitudeview import SpikeAmplitudeView
from .spikedepthview import SpikeDepthView
from .amplitudescalingsview import AmplitudeScalingsView
from .tracemapview import TraceMapView
from .curationview import CurationView
from .mainsettingsview import MainSettingsView
Expand All @@ -24,7 +25,8 @@
ProbeView, MainSettingsView, UnitListView, SpikeRateView, MergeView,
TraceView, TraceMapView, WaveformView, WaveformHeatMapView, ISIView,
CorrelogramView, NDScatterView, SimilarityView, SpikeAmplitudeView,
SpikeDepthView, SpikeRateView, CurationView, MetricsView, SpikeListView
SpikeDepthView, SpikeRateView, CurationView, MetricsView, SpikeListView,
AmplitudeScalingsView,
]

def get_all_possible_views():
Expand Down