Skip to content

Commit

Permalink
Multiprobe (#54)
Browse files Browse the repository at this point in the history
- Add support for working with multiple probes
- Fix probe energy units in cxi reader
- Update detector view to present diffraction dataset as a tree; selecting root displays sum of child diffraction patterns
- Add probe initializer for disk and test patterns
- Reparameterize supergaussian probe initializer using FWHM
- Probe/object controllers live update views while editing parameters
- Autoselect new scan/probe/object after reconstruction
- Add NPZ scan plugin
  • Loading branch information
stevehenke authored May 31, 2023
1 parent 2a54469 commit a2ca34c
Show file tree
Hide file tree
Showing 129 changed files with 2,550 additions and 1,811 deletions.
5 changes: 2 additions & 3 deletions ptychodus/api/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from collections.abc import Iterator
from decimal import Decimal
from pathlib import Path
from typing import Any, Callable, Final, Generic, TypeVar, Union
from typing import Any, Callable, Final, Generic, TypeVar
from uuid import UUID
import configparser
import logging
Expand Down Expand Up @@ -79,8 +79,7 @@ def createIntegerEntry(self, name: str, defaultValue: int) -> SettingsEntry[int]
lambda valueString: int(valueString))
return self._registerEntryIfNonexistent(candidateEntry)

def createRealEntry(self, name: str, defaultValue: Union[str,
Decimal]) -> SettingsEntry[Decimal]:
def createRealEntry(self, name: str, defaultValue: str | Decimal) -> SettingsEntry[Decimal]:
defaultDecimal = Decimal(defaultValue) if isinstance(defaultValue, str) else defaultValue
candidateEntry = SettingsEntry[Decimal](name, defaultDecimal,
lambda valueString: Decimal(valueString))
Expand Down
7 changes: 4 additions & 3 deletions ptychodus/api/tree.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
from __future__ import annotations
from collections.abc import Sequence


class SimpleTreeNode:

def __init__(self, parentItem: SimpleTreeNode | None, itemData: list[str]) -> None:
def __init__(self, parentItem: SimpleTreeNode | None, itemData: Sequence[str]) -> None:
self.parentItem = parentItem
self.itemData = itemData
self.childItems: list[SimpleTreeNode] = list()

@classmethod
def createRoot(cls, itemData: list[str]) -> SimpleTreeNode:
def createRoot(cls, itemData: Sequence[str]) -> SimpleTreeNode:
return cls(None, itemData)

def createChild(self, itemData: list[str]) -> SimpleTreeNode:
def createChild(self, itemData: Sequence[str]) -> SimpleTreeNode:
childItem = SimpleTreeNode(self, itemData)
self.childItems.append(childItem)
return childItem
Expand Down
7 changes: 3 additions & 4 deletions ptychodus/controller/automation.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from __future__ import annotations
from pathlib import Path
from typing import Optional

from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex, QObject, QTimer, QVariant
from PyQt5.QtGui import QFont

from ..api.observer import Observable, Observer
from ..model.automation import (AutomationCore, AutomationDatasetState, AutomationPresenter,
AutomationProcessingPresenter)
from ..view import (AutomationView, AutomationParametersView, AutomationProcessingView,
AutomationWatchdogView)
from ..view.automation import (AutomationView, AutomationParametersView, AutomationProcessingView,
AutomationWatchdogView)
from .data import FileDialogFactory


Expand Down Expand Up @@ -119,7 +118,7 @@ class AutomationProcessingListModel(QAbstractListModel):

def __init__(self,
presenter: AutomationProcessingPresenter,
parent: Optional[QObject] = None) -> None:
parent: QObject | None = None) -> None:
super().__init__(parent)
self._presenter = presenter

Expand Down
31 changes: 12 additions & 19 deletions ptychodus/controller/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ..view import ViewCore
from .automation import AutomationController
from .data import DataParametersController, FileDialogFactory
from .detector import (DatasetImageController, DatasetParametersController, DetectorController)
from .detector import DetectorController
from .object import ObjectImageController, ObjectController
from .probe import ProbeImageController, ProbeController
from .ptychonn import PtychoNNViewControllerFactory
Expand Down Expand Up @@ -38,27 +38,20 @@ def __init__(self, model: ModelCore, view: ViewCore) -> None:
view.settingsEntryView,
self._fileDialogFactory)
self._detectorController = DetectorController.createInstance(
model.detectorPresenter, model.apparatusPresenter,
view.detectorParametersView.detectorView)
self._datasetParametersController = DatasetParametersController.createInstance(
model.diffractionDatasetPresenter, model.activeDiffractionPatternPresenter,
view.detectorParametersView.patternView)
self._datasetImageController = DatasetImageController.createInstance(
model.activeDiffractionPatternPresenter, model.detectorImagePresenter,
view.detectorImageView, self._fileDialogFactory)
self._probeController = ProbeController.createInstance(model.probePresenter,
view.probeView,
model.probeImagePresenter,
view.probeImageView,
self._fileDialogFactory)
model.detectorPresenter, model.apparatusPresenter, model.diffractionDatasetPresenter,
model.detectorImagePresenter, view.detectorView, view.detectorImageView,
self._fileDialogFactory)
self._scanController = ScanController.createInstance(model.scanRepositoryPresenter,
view.scanView, view.scanPlotView,
self._fileDialogFactory)
self._objectController = ObjectController.createInstance(model.objectRepositoryPresenter,
model.objectImagePresenter,
view.objectView,
view.objectImageView,
self._fileDialogFactory)
self._probeController = ProbeController.createInstance(model.apparatusPresenter,
model.probeRepositoryPresenter,
model.probeImagePresenter,
view.probeView, view.probeImageView,
self._fileDialogFactory)
self._objectController = ObjectController.createInstance(
model.apparatusPresenter, model.objectRepositoryPresenter, model.objectImagePresenter,
view.objectView, view.objectImageView, self._fileDialogFactory)
self._dataParametersController = DataParametersController.createInstance(
model.settingsRegistry, model.diffractionDatasetInputOutputPresenter,
model.diffractionDatasetPresenter, model.metadataPresenter, model.patternPresenter,
Expand Down
2 changes: 1 addition & 1 deletion ptychodus/controller/data/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from ...api.observer import Observable, Observer
from ...model.data import DiffractionDatasetInputOutputPresenter, DiffractionDatasetPresenter
from ...view import DataNavigationPage, DatasetView
from ...view.data import DataNavigationPage, DatasetView
from .dialogFactory import FileDialogFactory


Expand Down
2 changes: 1 addition & 1 deletion ptychodus/controller/data/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from ...api.observer import Observable, Observer
from ...model.data import DiffractionDatasetInputOutputPresenter
from ...view import DataNavigationPage, DatasetFileView
from ...view.data import DataNavigationPage, DatasetFileView
from .dialogFactory import FileDialogFactory

logger = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion ptychodus/controller/data/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from ...api.observer import Observable, Observer
from ...model import MetadataPresenter
from ...view import DataNavigationPage, MetadataView
from ...view.data import DataNavigationPage, MetadataView


class MetadataController(Observer):
Expand Down
2 changes: 1 addition & 1 deletion ptychodus/controller/data/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from ...model import MetadataPresenter
from ...model.data import (DiffractionDatasetInputOutputPresenter, DiffractionDatasetPresenter,
DiffractionPatternPresenter)
from ...view import DataParametersView
from ...view.data import DataParametersView
from ..tree import SimpleTreeModel
from .dataset import DatasetController
from .dialogFactory import FileDialogFactory
Expand Down
4 changes: 2 additions & 2 deletions ptychodus/controller/data/patterns.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from ...api.observer import Observable, Observer
from ...model.data import (DiffractionDatasetInputOutputPresenter, DiffractionDatasetPresenter,
DiffractionPatternPresenter)
from ...view import (DataNavigationPage, PatternCropView, PatternLoadView, PatternMemoryMapView,
PatternTransformView, PatternsView)
from ...view.data import (DataNavigationPage, PatternCropView, PatternLoadView,
PatternMemoryMapView, PatternTransformView, PatternsView)
from ..data import FileDialogFactory


Expand Down
197 changes: 0 additions & 197 deletions ptychodus/controller/detector.py

This file was deleted.

5 changes: 5 additions & 0 deletions ptychodus/controller/detector/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .controller import DetectorController

__all__ = [
'DetectorController',
]
Loading

0 comments on commit a2ca34c

Please sign in to comment.