Source code for spinningdiskanalyzer.frontend.pages.threshold

from .threshold_ui import Ui_page
from .page         import Page
from .             import page
from ..            import tasks
from ...           import parameters

from PySide6.QtWidgets import QWidget

from pathlib import Path


[docs] class Threshold(page.ConfirmClose, page.NavRedoNext, Page): """Performs the local thresholding.""" def __init__(self, parent: QWidget = None): # Load user interface design created in Qt Designer. super().__init__(parent) self.ui = Ui_page() self.ui.setupUi(self) # Make sure hiding buttons does not change layout. for button in (self.ui.redo, self.ui.next): size_policy = button.sizePolicy() size_policy.setRetainSizeWhenHidden(True) button.setSizePolicy(size_policy) # Connect signals to slots. self.ui.back.clicked.connect(self.go_back.emit) self.ui.redo.clicked.connect(self.on_redo) self.ui.next.clicked.connect(self.go_next.emit) self.ui.method.currentIndexChanged.connect(self.navigation_update) self.ui.radius.valueChanged.connect(self.navigation_update) self.ui.contrast.valueChanged.connect(self.navigation_update) # Initialize instance attributes. self.task = None
[docs] def parameters_load(self): """Loads parameter values from disk.""" folder = Path(self.parent().select.ui.folder_display.text()) parameters.init(folder/'analysis') section = self.ui.title.text().lower().replace(' ', '_') self.ui.method.setCurrentText(parameters.get(section, 'method')) self.ui.radius.setValue(parameters.get(section, 'radius')) self.ui.contrast.setValue(parameters.get(section, 'contrast'))
[docs] def parameters_save(self): """Saves parameter values to disk.""" if self.parameters_different(): section = self.ui.title.text().lower().replace(' ', '_') parameters.set(section, 'method', self.ui.method.currentText()) parameters.set(section, 'radius', self.ui.radius.value()) parameters.set(section, 'contrast', self.ui.contrast.value()) parameters.save()
[docs] def parameters_different(self): """Returns if parameter values are different in UI than on disk.""" section = self.ui.title.text().lower().replace(' ', '_') old = ( parameters.get(section, 'method'), parameters.get(section, 'radius'), parameters.get(section, 'contrast'), ) now = ( self.ui.method.currentText(), self.ui.radius.value(), self.ui.contrast.value(), ) return (now != old)
[docs] def on_enter(self): """Called when entering the page.""" self.mark_busy() self.parameters_load() self.perform_thresholding()
[docs] def on_redo(self): """Called when the re-do button is clicked.""" self.mark_busy() self.status('Invalidating previous results…') self.parent().invalidate(self) self.perform_thresholding()
[docs] def perform_thresholding(self): """Triggers the local auto-thresholding.""" self.task = tasks.BernsenThreshold() self.task.finished.connect(self.tile_image) self.task.status_update.connect(self.status_update) self.task.status_clear.connect(self.status_clear) folder = Path(self.parent().select.ui.folder_display.text()) source = folder/'analysis'/'foreground.tif' target = folder/'analysis'/'thresholded.tif' radius = self.ui.radius.value() contrast = self.ui.contrast.value() self.task.start(source, target, radius, contrast)
[docs] def tile_image(self): """Triggers tiling of the display image.""" self.task = tasks.TileImage() self.task.finished.connect(self.tasks_done) self.task.status_update.connect(self.status_update) self.task.status_clear.connect(self.status_clear) folder = Path(self.parent().select.ui.folder_display.text()) source = folder/'analysis'/'thresholded.tif' target = folder/'tiles'/'thresholded.dzi' self.task.start(source, target)
[docs] def tasks_done(self): """Finishes up when all background tasks are done.""" self.task = None folder = Path(self.parent().select.ui.folder_display.text()) tiled = folder/'tiles'/'thresholded.dzi' self.ui.viewer.load(tiled) self.status_clear.emit() self.parameters_save() self.mark_ready()
[docs] def invalidate(self): """Invalidates results from this analysis step.""" self.ui.viewer.load(None) self.flush() folder = Path(self.parent().select.ui.folder_display.text()) tasks.delete( ( folder/'analysis'/'thresholded.tif', folder/'tiles'/'thresholded.dzi', folder/'tiles'/'thresholded_files', ) )