From 2845d31db73b6668ebc186a15f2ab8e97e33d3fb Mon Sep 17 00:00:00 2001 From: Atika-Syeda Date: Tue, 21 Nov 2023 10:47:42 -0500 Subject: [PATCH 1/7] Remove numba warnings --- facemap/gui/gui.py | 6 +++--- facemap/gui/ops_user.npy | Bin 415 -> 419 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/facemap/gui/gui.py b/facemap/gui/gui.py index 34d4059..d863937 100644 --- a/facemap/gui/gui.py +++ b/facemap/gui/gui.py @@ -35,9 +35,7 @@ from facemap import process, roi, utils from facemap.gui import ( - cluster, guiparts, - help_windows, io, menus, neural_activity_window, @@ -1286,7 +1284,9 @@ def process_ROIs(self): savepath = self.save_path else: savepath = None - if self.motSVD_checkbox.isChecked() or self.movSVD_checkbox.isChecked(): + print("Checking if ROIs are set") + if self.motSVD_checkbox.isChecked() or self.movSVD_checkbox.isChecked() or len(self.ROIs) > 0: + print("Processing ROIs") savename = process.run( self.filenames, GUIobject=QtWidgets, parent=self, savepath=savepath ) diff --git a/facemap/gui/ops_user.npy b/facemap/gui/ops_user.npy index e1ba391899d101d559bd9e38f98f2b5fb29d4a7d..b145bf96fc24029d8da6e49646c9495c9b433e6c 100755 GIT binary patch delta 67 zcmbQwyqI}|52Kzo0|SG8Mt*LpeqwQDYD%JhL1{r|PJCisVoqgoX0d)sVo`Q{QEGC2 WQA%cB`s6Z3MUKwW#F9dhBs~E43>QHF delta 63 zcmZ3?JfC@k52Kbk0|SG8Mt*LpesM`rW?p(uVv@c~etBL_equ_oesN-MK~8FXZhl#2 S>f|a$MUIZr#F9dhBs~C>`W1`- From e0e2f246440b2513086d3ad4c020104bea3ef1f2 Mon Sep 17 00:00:00 2001 From: Atika Ibrahim Syeda <47366160+Atika-Syeda@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:14:31 -0500 Subject: [PATCH 2/7] Update test_and_deploy.yml --- .github/workflows/test_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index e3466db..9bcb8c4 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -20,7 +20,7 @@ jobs: runs-on: ${{ matrix.platform }} strategy: matrix: - platform: [ubuntu-latest, windows-latest, macos-latest] + platform: [ubuntu-latest, windows-latest, macos-12, macos-latest] python-version: [3.8, 3.9, "3.10"] steps: From 6af274206cfc5a9a565624c66a47a873caece939 Mon Sep 17 00:00:00 2001 From: Atika Ibrahim Syeda <47366160+Atika-Syeda@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:15:52 -0500 Subject: [PATCH 3/7] Update test_and_deploy.yml --- .github/workflows/test_and_deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 9bcb8c4..55be443 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -12,6 +12,7 @@ on: pull_request: branches: - main + - dev workflow_dispatch: jobs: From a5b796f3ed37a7c8460795df5b9af15d97b340fa Mon Sep 17 00:00:00 2001 From: Atika Ibrahim Syeda <47366160+Atika-Syeda@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:16:59 -0500 Subject: [PATCH 4/7] Update test_and_deploy.yml --- .github/workflows/test_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 55be443..8e2e99d 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -7,12 +7,12 @@ on: push: branches: - main + - dev tags: - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 pull_request: branches: - main - - dev workflow_dispatch: jobs: From 4c7e10f83e90083909f1ea8dec02f617e8eb8569 Mon Sep 17 00:00:00 2001 From: Atika Ibrahim Syeda <47366160+Atika-Syeda@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:21:15 -0500 Subject: [PATCH 5/7] Update test_and_deploy.yml --- .github/workflows/test_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 8e2e99d..249abd0 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -21,7 +21,7 @@ jobs: runs-on: ${{ matrix.platform }} strategy: matrix: - platform: [ubuntu-latest, windows-latest, macos-12, macos-latest] + platform: [ubuntu-latest, windows-latest, macos-13] python-version: [3.8, 3.9, "3.10"] steps: From e0db1910e2930797c4afca1a8ef1ee80ad7e670f Mon Sep 17 00:00:00 2001 From: Atika-Syeda Date: Mon, 21 Jul 2025 10:59:07 -0400 Subject: [PATCH 6/7] Added saccade loading --- facemap/gui/gui.py | 54 +++++++++++++++++++++++++++++++++++++++++++- facemap/gui/io.py | 18 +++++++++++++++ facemap/gui/menus.py | 6 +++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/facemap/gui/gui.py b/facemap/gui/gui.py index 705f4c8..85f89a7 100644 --- a/facemap/gui/gui.py +++ b/facemap/gui/gui.py @@ -30,9 +30,9 @@ QStatusBar, QToolButton, QWidget, + QGraphicsItemGroup ) from scipy.stats import skew, zscore - from facemap import process, roi, utils from facemap.gui import ( guiparts, @@ -265,6 +265,7 @@ def __init__( self.cframe = 0 self.traces1 = None self.traces2 = None + self.saccade_data = None ## Pose plot self.pose_scatterplot = pg.ScatterPlotItem(hover=True) @@ -939,6 +940,7 @@ def reset(self): self.keypoints_vtick = None self.svd_plot_vtick = None self.neural_win = None + self.saccade_data = None def pupil_sigma_change(self): self.pupil_sigma = float(self.sigma_box.text()) @@ -2012,9 +2014,59 @@ def plot_trace(self, wplot, proctype, wroi, color, keypoints_group_selected=None pen=pg.mkPen(color=(255, 255, 255), width=2, movable=True), ) selected_plot.addItem(self.keypoints_vtick) + if self.saccade_data is not None: + self.plot_saccade_data() selected_plot.setLimits(xMin=0, xMax=self.nframes) return tr + def plot_saccade_data(self): + """ + Plot saccade data on the SVD traces plot as a single toggleable item. + """ + if self.saccade_data is not None: + # Extract saccade data + saccade = self.saccade_data['Saccade'][0, 0].squeeze() + + # Check if saccade data matches the number of frames + if saccade.shape[0] != self.nframes: + print("Saccade data shape does not match the number of frames.") + return + + # Find start and end indices for saccades + sac_start_idx = np.where(np.diff(saccade) == 1)[0] + 1 + sac_end_idx = np.where(np.diff(saccade) == -1)[0] + 1 + + # Remove any existing saccade overlays to avoid duplication + if hasattr(self, 'saccade_vspan_items') and self.saccade_vspan_items: + for item in self.saccade_vspan_items: + self.svd_traces_plot.removeItem(item) + + # Create a list to store the saccade region items + self.saccade_vspan_items = [] + + # Add vertical spans for each saccade + for start, end in zip(sac_start_idx, sac_end_idx): + if start < end and end < self.nframes: + # Create a LinearRegionItem for the saccade + vspan = pg.LinearRegionItem( + values=(start, end), # Start and end positions + brush=pg.mkBrush(255, 255, 255, 50), # Semi-transparent white + movable=False, # Non-movable + ) + + # Add the region to the plot + self.svd_traces_plot.addItem(vspan) + + # Keep track of added items for later removal + self.saccade_vspan_items.append(vspan) + else: + print("No saccade data available.") + + def toggle_saccade_vspans(self, show): + # Toggles visibility of the saccade vspans group + if hasattr(self, 'saccade_vspan_group'): # Check if the group exists + self.saccade_vspan_group.setVisible(show) + def on_click_svd_plot(self, event): """ Update vtick position of svd plot when user clicks diff --git a/facemap/gui/io.py b/facemap/gui/io.py index 38a4953..ba54401 100644 --- a/facemap/gui/io.py +++ b/facemap/gui/io.py @@ -354,6 +354,24 @@ def load_movies(parent, filelist=None): parent.load_keypoints_from_videodir() return good +def load_saccade(parent): + path = QFileDialog.getOpenFileName(parent, "Select a file", filter="MAT (*.mat)") + # Check if path exists + if path[0]: + try: + import scipy.io + + saccade_data = scipy.io.loadmat(path[0]) + parent.saccade_data = saccade_data['eye_movement_data'] + parent.update_status_bar("Saccade data loaded") + parent.plot_saccade_data() + except Exception as e: + msg = QMessageBox(parent) + msg.setIcon(QMessageBox.Icon.Warning) + msg.setText("Error loading saccade data: " + str(e)) + msg.setStandardButtons(QMessageBox.StandardButton.Ok) + msg.exec_() + def load_npy_file(parent, allow_mat=False): # Open a file dialog to select a folder diff --git a/facemap/gui/menus.py b/facemap/gui/menus.py index 3d5e8af..6291705 100644 --- a/facemap/gui/menus.py +++ b/facemap/gui/menus.py @@ -23,6 +23,11 @@ def mainmenu(parent): load_proc.triggered.connect(lambda: io.open_proc(parent)) parent.addAction(load_proc) + # Load saccade data + load_saccade = QAction("Load saccade data", parent) + load_saccade.triggered.connect(lambda: io.load_saccade(parent)) + parent.addAction(load_saccade) + # Set output folder set_output_folder = QAction("Set output folder", parent) set_output_folder.setShortcut("Ctrl+S") @@ -95,6 +100,7 @@ def mainmenu(parent): file_menu.addAction(open_file) file_menu.addAction(open_folder) file_menu.addAction(load_proc) + file_menu.addAction(load_saccade) file_menu.addAction(set_output_folder) pose_menu = main_menu.addMenu("Pose") From 482ec1bfb548a1b90145450c488ff6aee46c5f8b Mon Sep 17 00:00:00 2001 From: Atika Ibrahim Syeda <47366160+Atika-Syeda@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:20:22 -0400 Subject: [PATCH 7/7] Remove libhdf5-103 for latest ubuntu --- .github/workflows/test_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 249abd0..33529e0 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -40,7 +40,7 @@ jobs: sudo apt-get update sudo apt-get install -y libdbus-1-3 libxkbcommon-x11-0 libxcb-icccm4 \ libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 \ - libxcb-xinerama0 libxcb-xinput0 libxcb-xfixes0 pkg-config libhdf5-103 libhdf5-dev \ + libxcb-xinerama0 libxcb-xinput0 libxcb-xfixes0 pkg-config libhdf5-dev \ libegl1 - name: Install dependencies run: |