Holger Frey
6 years ago
6 changed files with 274 additions and 380 deletions
@ -0,0 +1,186 @@
@@ -0,0 +1,186 @@
|
||||
from pathlib import Path |
||||
|
||||
home = Path.home() |
||||
|
||||
|
||||
import sys |
||||
from PyQt5.QtWidgets import ( |
||||
QApplication, |
||||
QMainWindow, |
||||
QPushButton, |
||||
QDesktopWidget, |
||||
QHBoxLayout, |
||||
QVBoxLayout, |
||||
QWidget, |
||||
QLabel, |
||||
QLineEdit, |
||||
QGridLayout, |
||||
QFileDialog, |
||||
) |
||||
from PyQt5.QtGui import QIcon, QIntValidator |
||||
|
||||
from .workflows import ( |
||||
prescan_workflow, |
||||
image_workflow, |
||||
data_workflow, |
||||
cached_data_workflow, |
||||
postprocessing_workflow, |
||||
) |
||||
|
||||
|
||||
class MtorImageAnalysis(QWidget): |
||||
def __init__(self): |
||||
super().__init__() |
||||
self.init_ui() |
||||
|
||||
def init_ui(self): |
||||
|
||||
# analysis parameters |
||||
self.analysis_parameters = None |
||||
|
||||
# directory browser |
||||
self.dir_label = QLabel("Image Folder") |
||||
self.dir_btn = QPushButton("Browse") |
||||
self.dir_btn.clicked.connect(self.get_tif_dir) |
||||
self.dir_selected = QLabel() |
||||
|
||||
# roi input fields |
||||
self.roi_top_label = QLabel("Top edge of ROI") |
||||
self.roi_top_input = QLineEdit() |
||||
self.roi_top_input.setValidator(QIntValidator()) |
||||
self.roi_top_input.textChanged.connect(self.check_button_state) |
||||
|
||||
self.roi_left_label = QLabel("Left edge of ROI") |
||||
self.roi_left_input = QLineEdit() |
||||
self.roi_left_input.setValidator(QIntValidator()) |
||||
self.roi_left_input.textChanged.connect(self.check_button_state) |
||||
|
||||
self.roi_right_label = QLabel("Right edge of ROI") |
||||
self.roi_right_input = QLineEdit() |
||||
self.roi_right_input.setValidator(QIntValidator()) |
||||
self.roi_right_input.textChanged.connect(self.check_button_state) |
||||
|
||||
self.roi_bottom_label = QLabel("Bottom edge of ROI") |
||||
self.roi_bottom_input = QLineEdit() |
||||
self.roi_bottom_input.setValidator(QIntValidator()) |
||||
self.roi_bottom_input.textChanged.connect(self.check_button_state) |
||||
|
||||
# action buttons |
||||
self.btn_run = QPushButton("Run", self) |
||||
self.btn_run.setEnabled(False) |
||||
self.btn_run.clicked.connect(self.run_analysis) |
||||
|
||||
self.btn_exit = QPushButton("Exit", self) |
||||
self.btn_exit.clicked.connect(QApplication.instance().quit) |
||||
|
||||
# Layout |
||||
grid = QGridLayout() |
||||
grid.setSpacing(10) |
||||
|
||||
grid.addWidget(self.dir_label, 1, 0) |
||||
grid.addWidget(self.dir_btn, 1, 1) |
||||
|
||||
grid.addWidget(self.dir_selected, 2, 0, 1, 2) |
||||
|
||||
grid.addWidget(QLabel(), 3, 0, 1, 2) |
||||
|
||||
grid.addWidget(self.roi_top_label, 4, 0) |
||||
grid.addWidget(self.roi_top_input, 4, 1) |
||||
|
||||
grid.addWidget(self.roi_right_label, 5, 0) |
||||
grid.addWidget(self.roi_right_input, 5, 1) |
||||
|
||||
grid.addWidget(self.roi_bottom_label, 6, 0) |
||||
grid.addWidget(self.roi_bottom_input, 6, 1) |
||||
|
||||
grid.addWidget(self.roi_left_label, 7, 0) |
||||
grid.addWidget(self.roi_left_input, 7, 1) |
||||
|
||||
grid.addWidget(QLabel(), 8, 0, 1, 2) |
||||
|
||||
grid.addWidget(self.btn_exit, 9, 0) |
||||
grid.addWidget(self.btn_run, 9, 1) |
||||
|
||||
self.setLayout(grid) |
||||
#self.resize(350, 300) |
||||
self.center_window_on_desktop() |
||||
self.setWindowTitle("mTor Image Analysis") |
||||
self.setWindowIcon(QIcon("web.png")) |
||||
|
||||
# helpers |
||||
self.dir_selected.setText("/Users/holgerfrey/Developer/mtor/mtor-bilder") |
||||
self.roi_top_input.setText("50") |
||||
self.roi_right_input.setText("875") |
||||
self.roi_bottom_input.setText("300") |
||||
self.roi_left_input.setText("725") |
||||
|
||||
self.show() |
||||
|
||||
def center_window_on_desktop(self): |
||||
cp = QDesktopWidget().availableGeometry().center() |
||||
fg = self.frameGeometry() |
||||
fg.moveCenter(cp) |
||||
self.move(fg.topLeft()) |
||||
|
||||
def get_tif_dir(self): |
||||
dlg = QFileDialog(directory=str(home)) |
||||
dlg.setFileMode(QFileDialog.Directory) |
||||
|
||||
if dlg.exec_(): |
||||
filenames = dlg.selectedFiles() |
||||
folder = Path(filenames[0]) |
||||
items = (i for i in folder.iterdir() if not i.stem.startswith(".")) |
||||
tifs = [i for i in items if i.suffix == ".tif"] |
||||
if len(tifs) == 0: |
||||
self.dir_selected.setText("") |
||||
self.check_button_state() |
||||
else: |
||||
self.dir_selected.setText(filenames[0]) |
||||
self.check_button_state() |
||||
|
||||
|
||||
def check_button_state(self): |
||||
values = self.get_values() |
||||
self.btn_run.setEnabled(all(values)) |
||||
|
||||
def get_values(self): |
||||
fields = [ |
||||
(self.dir_selected, str), |
||||
(self.roi_top_input, int), |
||||
(self.roi_right_input, int), |
||||
(self.roi_bottom_input, int), |
||||
(self.roi_left_input, int), |
||||
] |
||||
result = [] |
||||
for field, func in fields: |
||||
raw_data = field.text().strip() |
||||
if raw_data: |
||||
if func is int: |
||||
# in qt5, a point as 1000 separator is allowed |
||||
raw_data = raw_data.replace(".", "") |
||||
result.append(func(raw_data)) |
||||
else: |
||||
result.append(None) |
||||
return tuple(result) |
||||
|
||||
def run_analysis(self): |
||||
parameters = self.get_values() |
||||
if all(parameters): |
||||
self.analysis_parameters = parameters |
||||
self.hide() |
||||
QApplication.instance().quit() |
||||
|
||||
|
||||
def run_gui(): |
||||
app = QApplication(sys.argv) |
||||
mia = MtorImageAnalysis() |
||||
app.exec_() |
||||
|
||||
if mia.analysis_parameters is not None: |
||||
analysis_parameters = tuple( (p for p in mia.analysis_parameters) ) |
||||
pw = prescan_workflow(*analysis_parameters) |
||||
iw = image_workflow(pw.parameters) |
||||
dw = data_workflow(iw.data, iw.parameters) |
||||
fw = postprocessing_workflow(dw.data, dw.parameters) # noqa: F841 |
||||
|
||||
sys.exit() |
Loading…
Reference in new issue