Source code for spinningdiskanalyzer.frontend.pages.background

from .background_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 Background(page.ConfirmClose, page.NavRedoNext, Page): """Performs the background correction.""" 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) # 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'))
[docs] def parameters_save(self): """Saves parameter values to disk.""" section = self.ui.title.text().lower().replace(' ', '_') if self.parameters_different(): parameters.set(section, 'method', self.ui.method.currentText()) parameters.set(section, 'radius', self.ui.radius.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'), ) now = ( self.ui.method.currentText(), self.ui.radius.value(), ) return (now != old)
[docs] def on_enter(self): """Called when entering the page.""" self.mark_busy() self.parameters_load() self.correct_background()
[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.correct_background()
[docs] def correct_background(self): """Triggers background correction of the compressed images.""" self.task = tasks.RollBall() self.task.finished.connect(self.stitch_images) 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()) sources = folder/'analysis'/'compressed' targets = folder/'analysis'/'foreground' radius = self.ui.radius.value() self.task.start(sources, targets, radius)
[docs] def stitch_images(self): """Triggers stitching the background-corrected images.""" self.task = tasks.StitchImages() 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()) sources = folder/'analysis'/'foreground' target = folder/'analysis'/'foreground.tif' self.task.start(sources, target)
[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'/'foreground.tif' target = folder/'tiles'/'foreground.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'/'foreground.dzi' self.ui.viewer.load(tiled) 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'/'foreground', folder/'analysis'/'foreground.tif', folder/'tiles'/'foreground.dzi', folder/'tiles'/'foreground_files', ) )