Skip to content

Commit ab17d06

Browse files
adding pyqt6 and switching to qtpy
1 parent e1f99be commit ab17d06

16 files changed

+53
-56
lines changed

.github/workflows/test_and_deploy.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ jobs:
4141
sudo apt-get update
4242
sudo apt-get install -y libdbus-1-3 libxkbcommon-x11-0 libxcb-icccm4 \
4343
libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 \
44-
libxcb-xinerama0 libxcb-xinput0 libxcb-xfixes0 pkg-config libhdf5-103 libhdf5-dev
44+
libxcb-xinerama0 libxcb-xinput0 libxcb-xfixes0 pkg-config libhdf5-103 libhdf5-dev \
45+
libegl1
4546
# strategy borrowed from vispy for installing opengl libs on windows
4647
- name: Install Windows OpenGL
4748
if: runner.os == 'Windows'

setup.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@
1111
"scipy>=1.9.0",
1212
"scikit-learn",
1313
"cellpose",
14+
"scanimage-tiff-reader>=1.4.1"
1415
]
1516

1617
gui_deps = [
17-
"pyqt5",
18-
"pyqt5-tools",
19-
"pyqt5.sip",
18+
"qtpy",
19+
"pyqt6",
20+
"pyqt6.sip",
2021
"pyqtgraph",
2122
]
2223

2324
io_deps = [
24-
"scanimage-tiff-reader>=1.4.1",
2525
"paramiko",
2626
"nd2",
2727
"sbxreader",

suite2p/gui/buttons.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
Copright © 2023 Howard Hughes Medical Institute, Authored by Carsen Stringer and Marius Pachitariu.
33
"""
44
import numpy as np
5-
from PyQt5 import QtGui, QtCore
6-
from PyQt5.QtWidgets import QPushButton, QButtonGroup, QLabel, QLineEdit
5+
from qtpy import QtGui, QtCore
6+
from qtpy.QtWidgets import QPushButton, QButtonGroup, QLabel, QLineEdit
77

88

99
def make_selection(parent):

suite2p/gui/classgui.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import shutil
66

77
import numpy as np
8-
from PyQt5 import QtGui
9-
from PyQt5.QtWidgets import QDialog, QLabel, QPushButton, QMessageBox, QFileDialog, QListWidget, QGridLayout, QWidget, QAbstractItemView
8+
from qtpy import QtGui
9+
from qtpy.QtWidgets import QDialog, QLabel, QPushButton, QMessageBox, QFileDialog, QListWidget, QGridLayout, QWidget, QAbstractItemView
1010

1111
from . import masks
1212
from .. import classification

suite2p/gui/drawroi.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
import numpy as np
88
import pyqtgraph as pg
9-
from PyQt5 import QtGui, QtCore
10-
from PyQt5.QtWidgets import QPushButton, QLabel, QLineEdit, QMainWindow, QGridLayout, QButtonGroup, QMessageBox, QWidget
9+
from qtpy import QtGui, QtCore
10+
from qtpy.QtWidgets import QPushButton, QLabel, QLineEdit, QMainWindow, QGridLayout, QButtonGroup, QMessageBox, QWidget
1111
from matplotlib.colors import hsv_to_rgb
1212
from scipy import stats
1313

suite2p/gui/graphics.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
import numpy as np
55
import pyqtgraph as pg
6-
from PyQt5 import QtCore
6+
from qtpy import QtCore
77
from pyqtgraph import Point
88
from pyqtgraph import functions as fn
99
from pyqtgraph.graphicsItems.ViewBox.ViewBoxMenu import ViewBoxMenu

suite2p/gui/gui2p.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
import numpy as np
77
import pyqtgraph as pg
8-
from PyQt5 import QtGui, QtCore
9-
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout, QCheckBox, QLineEdit, QLabel
8+
from qtpy import QtGui, QtCore
9+
from qtpy.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout, QCheckBox, QLineEdit, QLabel
1010

1111
from . import menus, io, merge, views, buttons, classgui, traces, graphics, masks
1212
from .. import run_s2p, default_ops

suite2p/gui/io.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import os, time
55
import numpy as np
66
import scipy.io
7-
from PyQt5 import QtGui
8-
from PyQt5.QtWidgets import QFileDialog, QMessageBox
7+
from qtpy import QtGui
8+
from qtpy.QtWidgets import QFileDialog, QMessageBox
99

1010
from . import utils, masks, views, graphics, traces, classgui
1111
from .. import io

suite2p/gui/masks.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import matplotlib.cm
66
import numpy as np
77
import pyqtgraph as pg
8-
from PyQt5 import QtGui, QtCore
9-
from PyQt5.QtWidgets import QPushButton, QButtonGroup, QLabel, QComboBox, QLineEdit
8+
from qtpy import QtGui, QtCore
9+
from qtpy.QtWidgets import QPushButton, QButtonGroup, QLabel, QComboBox, QLineEdit
1010
from matplotlib.colors import hsv_to_rgb
1111

1212
import suite2p.gui.merge

suite2p/gui/menus.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""
22
Copright © 2023 Howard Hughes Medical Institute, Authored by Carsen Stringer and Marius Pachitariu.
33
"""
4-
from PyQt5 import QtGui
5-
from PyQt5.QtWidgets import QAction, QMenu
4+
from qtpy import QtGui
5+
from qtpy.QtWidgets import QAction, QMenu
66
from pkg_resources import iter_entry_points
77

88
from . import reggui, drawroi, merge, io, rungui, visualize, classgui

suite2p/gui/merge.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import os
55
import numpy as np
66
import pyqtgraph as pg
7-
from PyQt5 import QtGui
8-
from PyQt5.QtWidgets import QDialog, QLineEdit, QGridLayout, QMessageBox, QLabel, QPushButton, QWidget
7+
from qtpy import QtGui
8+
from qtpy.QtWidgets import QDialog, QLineEdit, QGridLayout, QMessageBox, QLabel, QPushButton, QWidget
99
from scipy import stats
1010

1111
from . import masks, io

suite2p/gui/reggui.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
import numpy as np
99
import pyqtgraph as pg
10-
from PyQt5 import QtGui, QtCore
11-
from PyQt5.QtWidgets import QStyle
12-
from PyQt5.QtWidgets import QMainWindow, QGridLayout, QCheckBox, QLabel, QLineEdit, QSlider, QFileDialog, QPushButton, QToolButton, QButtonGroup, QWidget
10+
from qtpy import QtGui, QtCore
11+
from qtpy.QtWidgets import QStyle
12+
from qtpy.QtWidgets import QMainWindow, QGridLayout, QCheckBox, QLabel, QLineEdit, QSlider, QFileDialog, QPushButton, QToolButton, QButtonGroup, QWidget
1313
from scipy.ndimage import gaussian_filter1d
1414
from natsort import natsorted
1515
from tifffile import imread

suite2p/gui/rungui.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
"""
22
Copright © 2023 Howard Hughes Medical Institute, Authored by Carsen Stringer and Marius Pachitariu.
33
"""
4-
import glob, json, os, shutil, pathlib
4+
import glob, json, os, shutil, pathlib, sys
55
from datetime import datetime
66

77
import numpy as np
88

9-
from PyQt5 import QtGui, QtCore
10-
from PyQt5.QtWidgets import QDialog, QLineEdit, QLabel, QPushButton, QWidget, QGridLayout, QButtonGroup, QComboBox, QTextEdit, QFileDialog
9+
from qtpy import QtGui, QtCore
10+
from qtpy.QtWidgets import QDialog, QLineEdit, QLabel, QPushButton, QWidget, QGridLayout, QButtonGroup, QComboBox, QTextEdit, QFileDialog
1111

1212
from cellpose.models import get_user_models, model_path, MODEL_NAMES
1313

@@ -444,11 +444,14 @@ def run_S2P(self):
444444
shutil.copy(os.path.join(self.ops_path, "ops%d.npy" % self.f), ops_file)
445445
shutil.copy(os.path.join(self.ops_path, "db%d.npy" % self.f), db_file)
446446
self.db = np.load(db_file, allow_pickle=True).item()
447-
print("Running suite2p!")
448-
print("starting process")
449447
print(self.db)
450-
self.process.start('python -u -W ignore -m suite2p --ops "%s" --db "%s"' %
451-
(ops_file, db_file))
448+
print("Running suite2p with command:")
449+
cmd = f"-u -W ignore -m suite2p --ops {ops_file} --db {db_file}"
450+
print("python " + cmd)
451+
self.process.start(sys.executable, cmd.split(" "))
452+
453+
#self.process.start('python -u -W ignore -m suite2p --ops "%s" --db "%s"' %
454+
# (ops_file, db_file))
452455

453456
def stop(self):
454457
self.finish = False

suite2p/gui/traces.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
Copright © 2023 Howard Hughes Medical Institute, Authored by Carsen Stringer and Marius Pachitariu.
33
"""
44
import numpy as np
5-
from PyQt5 import QtGui, QtCore
6-
from PyQt5.QtWidgets import QLabel, QComboBox, QPushButton, QLineEdit, QCheckBox
5+
from qtpy import QtGui, QtCore
6+
from qtpy.QtWidgets import QLabel, QComboBox, QPushButton, QLineEdit, QCheckBox
77

88

99
def plot_trace(parent):

suite2p/gui/views.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
Copright © 2023 Howard Hughes Medical Institute, Authored by Carsen Stringer and Marius Pachitariu.
33
"""
44
import numpy as np
5-
from PyQt5 import QtGui, QtCore
6-
from PyQt5.QtWidgets import QPushButton, QSlider, QButtonGroup, QLabel, QStyle, QStyleOptionSlider, QApplication
7-
from PyQt5.QtGui import QPainter
5+
from qtpy import QtGui, QtCore
6+
from qtpy.QtWidgets import QPushButton, QSlider, QButtonGroup, QLabel, QStyle, QStyleOptionSlider, QApplication
7+
from qtpy.QtGui import QPainter
88

99
from .. import extraction
1010

suite2p/gui/visualize.py

+12-19
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
import numpy as np
88
import pyqtgraph as pg
9-
from PyQt5 import QtGui, QtCore
10-
from PyQt5.QtWidgets import QStyle
11-
from PyQt5.QtWidgets import QWidget, QSlider, QMainWindow, QGridLayout, QStyleOptionSlider, QApplication, QLabel, QLineEdit, QPushButton, QComboBox, QCheckBox
9+
from qtpy import QtGui, QtCore
10+
from qtpy.QtWidgets import QStyle
11+
from qtpy.QtWidgets import QWidget, QSlider, QMainWindow, QGridLayout, QStyleOptionSlider, QApplication, QLabel, QLineEdit, QPushButton, QComboBox, QCheckBox
1212
from matplotlib import cm
1313
from rastermap.rastermap import Rastermap
1414
from scipy.ndimage import gaussian_filter1d
@@ -634,8 +634,8 @@ def activate(self):
634634
#model = np.load(os.path.join(parent.ops["save_path0"], "embedding.npy"))
635635
#model = np.load("embedding.npy", allow_pickle=True).item()
636636
self.isort1 = np.argsort(self.model.embedding[:, 0])
637-
self.u = self.model.u
638-
self.v = self.model.v
637+
self.Usv = self.model.Usv
638+
self.Vsv = self.model.Vsv
639639
self.comboBox.addItem("rastermap")
640640
#self.isort1, self.isort2 = mapping.main(self.sp,None,self.u,self.sv,self.v)
641641

@@ -678,19 +678,16 @@ def compute_map(self):
678678
self.mapOn.setEnabled(False)
679679
self.tic = time.time()
680680
try:
681-
self.model = Rastermap(n_components=ops["n_components"], n_X=ops["n_X"],
682-
nPC=ops["nPC"], init=ops["init"], alpha=ops["alpha"],
683-
K=ops["K"], constraints=ops["constraints"],
684-
annealing=ops["annealing"])
681+
self.model = Rastermap()
685682
self.model.fit(self.sp)
686683
#proc = {"embedding": model.embedding, "uv": [model.u, model.v],
687684
# "ops": ops, "filename": args.S, "train_time": train_time}
688685
#basename, fname = os.path.split(args.S)
689686
#np.save(os.path.join(basename, "embedding.npy"), proc)
690-
print("raster map computed in %3.2f s" % (time.time() - self.tic))
691687
self.activate()
692-
except:
688+
except Exception as e:
693689
print("Rastermap issue: Interrupted by error (not finished)\n")
690+
print(e)
694691
#self.process.start("python -u -W ignore -m rastermap --S %s --ops %s"%
695692
# (spath, opspath))
696693

@@ -740,13 +737,9 @@ def sort_time(self):
740737
"end_time": -1
741738
}
742739
if not hasattr(self, "isort2"):
743-
self.model = Rastermap(n_components=ops["n_components"],
744-
n_X=ops["n_X"], nPC=ops["nPC"],
745-
init=ops["init"], alpha=ops["alpha"],
746-
K=ops["K"], constraints=ops["constraints"],
747-
annealing=ops["annealing"])
748-
unorm = (self.u**2).sum(axis=0)**0.5
749-
self.model.fit(self.sp.T, u=self.v * unorm, v=self.u / unorm)
740+
self.model = Rastermap()
741+
#unorm = (self.u**2).sum(axis=0)**0.5
742+
self.model.fit(self.sp.T, Usv=self.Vsv, Vsv=self.Usv)
750743
self.isort2 = np.argsort(self.model.embedding[:, 0])
751744
self.tsort = self.isort2.astype(np.int32)
752745
else:
@@ -755,7 +748,7 @@ def sort_time(self):
755748

756749
def neural_sorting(self, i):
757750
if i == 0:
758-
self.isort = np.argsort(self.u[:, int(self.PCedit.text()) - 1])
751+
self.isort = np.argsort(self.Usv[:, int(self.PCedit.text()) - 1])
759752
elif i == 1:
760753
self.isort = self.isort1
761754
if i < 2:

0 commit comments

Comments
 (0)