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',
) )