From fbe1b6ba05d9fa0755025a3370f0b920e989ab12 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Sat, 13 Jan 2024 13:47:35 -0500 Subject: [PATCH 01/33] add keyboard commands for moving detectors --- src/py4D_browser/main_window.py | 21 +++++++++ src/py4D_browser/update_views.py | 74 ++++++++++++++++++++++++++------ 2 files changed, 82 insertions(+), 13 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 4277c3a..483b2a7 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -45,6 +45,8 @@ class DataViewer(QMainWindow): update_real_space_view, update_realspace_detector, update_diffraction_detector, + nudge_real_space_selector, + nudge_diffraction_selector, update_annulus_pos, update_annulus_radii, ) @@ -429,3 +431,22 @@ def dropEvent(self, event): if len(files) == 1: print(f"Reieving dropped file: {files[0]}") self.load_file(files[0]) + + def keyPressEvent(self, event): + key = event.key() + + if key in [QtCore.Qt.Key_W, QtCore.Qt.Key_A, QtCore.Qt.Key_S, QtCore.Qt.Key_D]: + self.nudge_diffraction_selector( + dx=-1 if key == QtCore.Qt.Key_W else 1 if key == QtCore.Qt.Key_S else 0, + dy=-1 if key == QtCore.Qt.Key_A else 1 if key == QtCore.Qt.Key_D else 0, + ) + elif key in [ + QtCore.Qt.Key_I, + QtCore.Qt.Key_J, + QtCore.Qt.Key_K, + QtCore.Qt.Key_L, + ]: + self.nudge_real_space_selector( + dx=-1 if key == QtCore.Qt.Key_I else 1 if key == QtCore.Qt.Key_K else 0, + dy=-1 if key == QtCore.Qt.Key_J else 1 if key == QtCore.Qt.Key_L else 0, + ) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 8b7fd52..3b7898a 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -218,13 +218,6 @@ def update_diffraction_space_view(self, reset=False): DP = np.sum(self.datacube.data[slice_x, slice_y], axis=(0, 1)) - # if detector_mode == "Integrating": - # vimg = np.sum(self.datacube.data[:, :, slice_x, slice_y], axis=(2, 3)) - # elif detector_mode == "Maximum": - # vimg = np.max(self.datacube.data[:, :, slice_x, slice_y], axis=(2, 3)) - # else: - # mask = np.zeros((self.datacube.Q_Nx, self.datacube.Q_Ny), dtype=np.bool_) - # mask[slice_x, slice_y] = True else: raise ValueError("Detector shape not recognized") @@ -260,8 +253,10 @@ def update_realspace_detector(self): # Remove existing detector if hasattr(self, "real_space_point_selector"): self.real_space_widget.view.scene().removeItem(self.real_space_point_selector) + self.real_space_point_selector = None if hasattr(self, "real_space_rect_selector"): self.real_space_widget.view.scene().removeItem(self.real_space_rect_selector) + self.real_space_rect_selector = None # Rectangular detector if detector_shape == "Point": @@ -303,16 +298,20 @@ def update_diffraction_detector(self): self.diffraction_space_widget.view.scene().removeItem( self.virtual_detector_point ) + self.virtual_detector_point = None if hasattr(self, "virtual_detector_roi"): self.diffraction_space_widget.view.scene().removeItem(self.virtual_detector_roi) + self.virtual_detector_roi = None if hasattr(self, "virtual_detector_roi_inner"): self.diffraction_space_widget.view.scene().removeItem( self.virtual_detector_roi_inner ) + self.virtual_detector_roi_inner = None if hasattr(self, "virtual_detector_roi_outer"): self.diffraction_space_widget.view.scene().removeItem( self.virtual_detector_roi_outer ) + self.virtual_detector_roi_outer = None # Rectangular detector if detector_shape == "Point": @@ -360,13 +359,13 @@ def update_diffraction_detector(self): self.diffraction_space_widget.getView().addItem(self.virtual_detector_roi_inner) # Connect size/position of inner and outer detectors - self.virtual_detector_roi_outer.sigRegionChangeFinished.connect( + self.virtual_detector_roi_outer.sigRegionChanged.connect( self.update_annulus_pos ) - self.virtual_detector_roi_outer.sigRegionChangeFinished.connect( + self.virtual_detector_roi_outer.sigRegionChanged.connect( self.update_annulus_radii ) - self.virtual_detector_roi_inner.sigRegionChangeFinished.connect( + self.virtual_detector_roi_inner.sigRegionChanged.connect( self.update_annulus_radii ) @@ -384,6 +383,53 @@ def update_diffraction_detector(self): self.update_real_space_view() +def nudge_real_space_selector(self, dx, dy): + if ( + hasattr(self, "real_space_point_selector") + and self.real_space_point_selector is not None + ): + selector = self.real_space_point_selector + elif ( + hasattr(self, "real_space_rect_selector") + and self.real_space_rect_selector is not None + ): + selector = self.real_space_rect_selector + else: + raise RuntimeError("Can't find the real space selector!") + + position = selector.pos() + position[0] += dy + position[1] += dx + + selector.setPos(position) + + +def nudge_diffraction_selector(self, dx, dy): + if ( + hasattr(self, "virtual_detector_point") + and self.virtual_detector_point is not None + ): + selector = self.virtual_detector_point + elif ( + hasattr(self, "virtual_detector_roi") and self.virtual_detector_roi is not None + ): + selector = self.virtual_detector_roi + elif ( + hasattr(self, "virtual_detector_roi_outer") + and self.virtual_detector_roi_outer is not None + ): + selector = self.virtual_detector_roi_outer + else: + raise RuntimeError("Can't find the diffraction space selector!") + + position = selector.pos() + print(selector, position) + position[0] += dy + position[1] += dx + + selector.setPos(position) + + def update_annulus_pos(self): """ Function to keep inner and outer rings of annulus aligned. @@ -393,7 +439,7 @@ def update_annulus_pos(self): # Only outer annulus is draggable; when it moves, update position of inner annulus x0 = self.virtual_detector_roi_outer.pos().x() + R_outer y0 = self.virtual_detector_roi_outer.pos().y() + R_outer - self.virtual_detector_roi_inner.setPos(x0 - R_inner, y0 - R_inner) + self.virtual_detector_roi_inner.setPos(x0 - R_inner, y0 - R_inner, update=False) def update_annulus_radii(self): @@ -402,5 +448,7 @@ def update_annulus_radii(self): if R_outer < R_inner: x0 = self.virtual_detector_roi_outer.pos().x() + R_outer y0 = self.virtual_detector_roi_outer.pos().y() + R_outer - self.virtual_detector_roi_outer.setSize(2 * R_inner + 6) - self.virtual_detector_roi_outer.setPos(x0 - R_inner - 3, y0 - R_inner - 3) + self.virtual_detector_roi_outer.setSize(2 * R_inner + 6, update=False) + self.virtual_detector_roi_outer.setPos( + x0 - R_inner - 3, y0 - R_inner - 3, update=False + ) From a4417e05dac0c08799d70a832f8a14dd0fe4797e Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Sun, 14 Jan 2024 11:28:04 -0500 Subject: [PATCH 02/33] remove debug prints --- src/py4D_browser/update_views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 3b7898a..9399978 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -423,7 +423,6 @@ def nudge_diffraction_selector(self, dx, dy): raise RuntimeError("Can't find the diffraction space selector!") position = selector.pos() - print(selector, position) position[0] += dy position[1] += dx From 8a6d74475362be1521fbb5c66ca4352b8db4b5c1 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Sun, 14 Jan 2024 11:28:30 -0500 Subject: [PATCH 03/33] version bump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a654480..e4fbe30 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "py4D_browser" -version = "0.999995" +version = "0.999999" authors = [ { name="Steven Zeltmann", email="steven.zeltmann@lbl.gov" }, ] From 75fd15eea2b39f1129cc145a9a70116fca148442 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Sun, 14 Jan 2024 11:28:42 -0500 Subject: [PATCH 04/33] update python requirement --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e4fbe30..c0322f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ authors = [ ] description = "A 4D-STEM data browser built on py4DSTEM." readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.10" classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent", From 816fb51fc09dba280f1830325d48d8e6b5de32ab Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Wed, 17 Jan 2024 13:34:10 -0500 Subject: [PATCH 05/33] working but imperfectly formatted scale bar --- src/py4D_browser/main_window.py | 13 +++++ src/py4D_browser/menu_actions.py | 8 ++- src/py4D_browser/scalebar.py | 98 ++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/py4D_browser/scalebar.py diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 483b2a7..436de9e 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -18,6 +18,7 @@ import importlib from py4D_browser.utils import pg_point_roi +from py4D_browser.scalebar import ScaleBar class DataViewer(QMainWindow): @@ -365,6 +366,13 @@ def setup_views(self): self.update_real_space_view ) + # Scalebar + self.diffraction_scale_bar = ScaleBar(pixel_size=1, units="px", width=20) + self.diffraction_scale_bar.setParentItem( + self.diffraction_space_widget.getView() + ) + self.diffraction_scale_bar.anchor((1, 1), (1, 1), offset=(-40, -40)) + # Name and return self.diffraction_space_widget.setWindowTitle("Diffraction Space") @@ -382,6 +390,11 @@ def setup_views(self): partial(self.update_diffraction_space_view, False) ) + # Scalebar, None by default + self.real_space_scale_bar = ScaleBar(pixel_size=1, units='px', width=20) + self.real_space_scale_bar.setParentItem(self.real_space_widget.getView()) + self.real_space_scale_bar.anchor((1,1),(1,1), offset=(-40,-40)) + # Name and return self.real_space_widget.setWindowTitle("Real Space") diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index 2e61631..cad8f6a 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -35,7 +35,7 @@ def load_file(self, filepath, mmap=False, binning=1): self.datacube = py4DSTEM.DataCube( datacubes[0] if mmap else datacubes[0][()] ) - elif extension in [".npy", ".npz"]: + elif extension in [".npy"]: self.datacube = py4DSTEM.DataCube(np.load(filepath)) else: self.datacube = py4DSTEM.import_file( @@ -44,6 +44,12 @@ def load_file(self, filepath, mmap=False, binning=1): binfactor=binning, ) + self.diffraction_scale_bar.pixel_size = self.datacube.calibration.get_Q_pixel_size() + self.diffraction_scale_bar.units = self.datacube.calibration.get_Q_pixel_units() + + self.real_space_scale_bar.pixel_size = self.datacube.calibration.get_R_pixel_size() + self.real_space_scale_bar.units = self.datacube.calibration.get_R_pixel_units() + self.update_diffraction_space_view(reset=True) self.update_real_space_view(reset=True) diff --git a/src/py4D_browser/scalebar.py b/src/py4D_browser/scalebar.py new file mode 100644 index 0000000..26a10cd --- /dev/null +++ b/src/py4D_browser/scalebar.py @@ -0,0 +1,98 @@ +from pyqtgraph import functions as fn +from pyqtgraph import getConfigOption +from pyqtgraph import Point +from PyQt5 import QtCore, QtWidgets +from pyqtgraph import GraphicsObject +from pyqtgraph import GraphicsWidgetAnchor +from pyqtgraph import TextItem +import numpy as np + +__all__ = ["ScaleBar"] + + +class ScaleBar(GraphicsWidgetAnchor, GraphicsObject): + """ + Displays a rectangular bar to indicate the relative scale of objects on the view. + """ + + def __init__( + self, + pixel_size: float, + units: str, + target_relaive_size=0.2, + width=5, + brush=None, + pen=None, + offset=None, + nice_numbers=[1,2,5,10], + ): + GraphicsObject.__init__(self) + GraphicsWidgetAnchor.__init__(self) + self.setFlag(self.GraphicsItemFlag.ItemHasNoContents) + self.setAcceptedMouseButtons(QtCore.Qt.MouseButton.NoButton) + + if brush is None: + brush = getConfigOption("foreground") + self.brush = fn.mkBrush(brush) + self.pen = fn.mkPen(pen) + self._width = width + self._target_relative_size = target_relaive_size + self._nice_numbers = np.array(nice_numbers) + + self.pixel_size = pixel_size + self.units = units + + if offset is None: + offset = (0, 0) + self.offset = offset + + self.bar = QtWidgets.QGraphicsRectItem() + self.bar.setPen(self.pen) + self.bar.setBrush(self.brush) + self.bar.setParentItem(self) + + self.text = TextItem(text="smol", anchor=(0.5, 1)) + self.text.setParentItem(self) + + def changeParent(self): + view = self.parentItem() + if view is None: + return + view.sigRangeChanged.connect(self.updateBar) + self.updateBar() + + def updateBar(self): + view = self.parentItem() + + if view is None: + return + + view_width = view.viewRect().width() * self.pixel_size + target_size = view_width * self._target_relative_size + + exponent = np.floor(np.log10(target_size)) + mantissa = target_size / np.power(10,exponent) + + # Get the "nice" size of the scalebar + nice_size = self._nice_numbers[np.argmin(np.abs(mantissa - self._nice_numbers))] * 10**exponent + + + p1 = view.mapFromViewToItem(self, QtCore.QPointF(0, 0)) + p2 = view.mapFromViewToItem(self, QtCore.QPointF(nice_size, 0)) + w = (p2 - p1).x() + self.bar.setRect(QtCore.QRectF(-w, 0, w, self._width)) + self.text.setPos(-w / 2.0, 0) + self.text.setText(f"{nice_size} {self.units}") + + def boundingRect(self): + return QtCore.QRectF() + + def setParentItem(self, p): + ret = GraphicsObject.setParentItem(self, p) + if self.offset is not None: + offset = Point(self.offset) + anchorx = 1 if offset[0] <= 0 else 0 + anchory = 1 if offset[1] <= 0 else 0 + anchor = (anchorx, anchory) + self.anchor(itemPos=anchor, parentPos=anchor, offset=offset) + return ret From ed7718d72d771eb97d04f693b302aa450f1fa324 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Wed, 17 Jan 2024 13:53:11 -0500 Subject: [PATCH 06/33] format scalebar nicely --- pyproject.toml | 1 + src/py4D_browser/main_window.py | 4 ++-- src/py4D_browser/scalebar.py | 13 ++++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c0322f0..cd430cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ dependencies = [ "matplotlib >= 3.2.2", "PyQt5 >= 5.10", "pyqtgraph >= 0.11", + "sigfig", ] [project.scripts] diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 436de9e..9251166 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -391,9 +391,9 @@ def setup_views(self): ) # Scalebar, None by default - self.real_space_scale_bar = ScaleBar(pixel_size=1, units='px', width=20) + self.real_space_scale_bar = ScaleBar(pixel_size=1, units="px", width=20) self.real_space_scale_bar.setParentItem(self.real_space_widget.getView()) - self.real_space_scale_bar.anchor((1,1),(1,1), offset=(-40,-40)) + self.real_space_scale_bar.anchor((1, 1), (1, 1), offset=(-40, -40)) # Name and return self.real_space_widget.setWindowTitle("Real Space") diff --git a/src/py4D_browser/scalebar.py b/src/py4D_browser/scalebar.py index 26a10cd..c799534 100644 --- a/src/py4D_browser/scalebar.py +++ b/src/py4D_browser/scalebar.py @@ -6,6 +6,7 @@ from pyqtgraph import GraphicsWidgetAnchor from pyqtgraph import TextItem import numpy as np +from sigfig import round __all__ = ["ScaleBar"] @@ -24,7 +25,7 @@ def __init__( brush=None, pen=None, offset=None, - nice_numbers=[1,2,5,10], + nice_numbers=[1, 2, 5, 10], ): GraphicsObject.__init__(self) GraphicsWidgetAnchor.__init__(self) @@ -71,18 +72,20 @@ def updateBar(self): target_size = view_width * self._target_relative_size exponent = np.floor(np.log10(target_size)) - mantissa = target_size / np.power(10,exponent) + mantissa = target_size / np.power(10, exponent) # Get the "nice" size of the scalebar - nice_size = self._nice_numbers[np.argmin(np.abs(mantissa - self._nice_numbers))] * 10**exponent - + nice_size = ( + self._nice_numbers[np.argmin(np.abs(mantissa - self._nice_numbers))] + * 10**exponent + ) p1 = view.mapFromViewToItem(self, QtCore.QPointF(0, 0)) p2 = view.mapFromViewToItem(self, QtCore.QPointF(nice_size, 0)) w = (p2 - p1).x() self.bar.setRect(QtCore.QRectF(-w, 0, w, self._width)) self.text.setPos(-w / 2.0, 0) - self.text.setText(f"{nice_size} {self.units}") + self.text.setText(f"{round(nice_size,sigfigs=1,output_type=str)} {self.units}") def boundingRect(self): return QtCore.QRectF() From 09fcf0a095daa4fc1727fc7b49dd1d0ce819ec6c Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Wed, 17 Jan 2024 14:11:44 -0500 Subject: [PATCH 07/33] add scalebar to FFT and fix bug in all scalebars --- src/py4D_browser/main_window.py | 5 +++++ src/py4D_browser/menu_actions.py | 5 +++++ src/py4D_browser/scalebar.py | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 9251166..2161596 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -409,6 +409,11 @@ def setup_views(self): self.fft_widget = pg.ImageView() self.fft_widget.setImage(np.zeros((512, 512))) + # FFT scale bar is tricky because pixel sizes commonly vary in each direction + self.fft_scale_bar = ScaleBar(pixel_size=1, units="1/px", width=20) + self.fft_scale_bar.setParentItem(self.fft_widget.getView()) + self.fft_scale_bar.anchor((1, 1), (1, 1), offset=(-40, -40)) + # Name and return self.fft_widget.setWindowTitle("FFT of Virtual Image") self.fft_widget.addItem(pg.TextItem("FFT", (200, 200, 200), None, (0, 1))) diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index cad8f6a..ade9a19 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -50,6 +50,11 @@ def load_file(self, filepath, mmap=False, binning=1): self.real_space_scale_bar.pixel_size = self.datacube.calibration.get_R_pixel_size() self.real_space_scale_bar.units = self.datacube.calibration.get_R_pixel_units() + self.fft_scale_bar.pixel_size = ( + 1.0 / self.datacube.calibration.get_R_pixel_size() / self.datacube.R_Ny + ) + self.fft_scale_bar.units = f"1/{self.datacube.calibration.get_R_pixel_units()}" + self.update_diffraction_space_view(reset=True) self.update_real_space_view(reset=True) diff --git a/src/py4D_browser/scalebar.py b/src/py4D_browser/scalebar.py index c799534..6601448 100644 --- a/src/py4D_browser/scalebar.py +++ b/src/py4D_browser/scalebar.py @@ -81,7 +81,9 @@ def updateBar(self): ) p1 = view.mapFromViewToItem(self, QtCore.QPointF(0, 0)) - p2 = view.mapFromViewToItem(self, QtCore.QPointF(nice_size, 0)) + p2 = view.mapFromViewToItem( + self, QtCore.QPointF(nice_size / self.pixel_size, 0) + ) w = (p2 - p1).x() self.bar.setRect(QtCore.QRectF(-w, 0, w, self._width)) self.text.setPos(-w / 2.0, 0) From bb7799326ad5f80c47e9ef80614966c3c4a7d105 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Wed, 17 Jan 2024 15:52:05 -0500 Subject: [PATCH 08/33] attempt to discover calibrations in H5 files for EMD-1.0 and abTEM --- src/py4D_browser/menu_actions.py | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index ade9a19..373c0c5 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -35,6 +35,16 @@ def load_file(self, filepath, mmap=False, binning=1): self.datacube = py4DSTEM.DataCube( datacubes[0] if mmap else datacubes[0][()] ) + + R_size, R_units, Q_size, Q_units = find_calibrations(datacubes[0]) + + self.datacube.calibration.set_R_pixel_size(R_size) + self.datacube.calibration.set_R_pixel_units(R_units) + self.datacube.calibration.set_Q_pixel_size(Q_size) + self.datacube.calibration.set_Q_pixel_units(Q_units) + + else: + raise ValueError("No 4D data detected in the H5 file!") elif extension in [".npy"]: self.datacube = py4DSTEM.DataCube(np.load(filepath)) else: @@ -195,3 +205,36 @@ def get_4D(f, datacubes=None): elif isinstance(f[k], h5py.Group): get_4D(f[k], datacubes) return datacubes + + +def find_calibrations(dset: h5py.Dataset): + # Attempt to find calibrations from an H5 file + R_size, R_units, Q_size, Q_units = 1.0, "pixels", 1.0, "pixels" + + # Does it look like a py4DSTEM file? + try: + if "emd_group_type" in dset.parent.attrs: + R_size = dset.parent["dim0"][1] - dset.parent["dim0"][0] + R_units = dset.parent["dim0"].attrs["units"] + + Q_size = dset.parent["dim3"][1] - dset.parent["dim3"][0] + Q_units = dset.parent["dim3"].attrs["units"] + except: + print( + "This file looked like a py4DSTEM dataset but the dim vectors appear malformed..." + ) + + # Does it look like an abTEM file? + try: + if "sampling" in dset.parent and "units" in dset.parent: + R_size = dset.parent["sampling"][0] + R_units = dset.parent["units"][0].decode() + + Q_size = dset.parent["sampling"][3] + Q_units = dset.parent["units"][3].decode() + except: + print( + "This file looked like an abTEM simulation but the calibrations aren't as expected..." + ) + + return R_size, R_units, Q_size, Q_units From ed900c2e4d05e2c0db2c5f4f187036b23e12ae8b Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Wed, 17 Jan 2024 16:34:51 -0500 Subject: [PATCH 09/33] search for metadata in EMD v1 files instead of Array attrs --- src/py4D_browser/menu_actions.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index 373c0c5..f74f923 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -214,11 +214,28 @@ def find_calibrations(dset: h5py.Dataset): # Does it look like a py4DSTEM file? try: if "emd_group_type" in dset.parent.attrs: - R_size = dset.parent["dim0"][1] - dset.parent["dim0"][0] - R_units = dset.parent["dim0"].attrs["units"] - - Q_size = dset.parent["dim3"][1] - dset.parent["dim3"][0] - Q_units = dset.parent["dim3"].attrs["units"] + # EMD files theoretically store this in the Array, + # but in practice seem to only keep the calibrations + # in the Metadata object, which is separate + + # R_size = dset.parent["dim0"][1] - dset.parent["dim0"][0] + # R_units = dset.parent["dim0"].attrs["units"] + + # Q_size = dset.parent["dim3"][1] - dset.parent["dim3"][0] + # Q_units = dset.parent["dim3"].attrs["units"] + R_size = dset.parent.parent["metadatabundle"]["calibration"][ + "R_pixel_size" + ][()] + R_units = dset.parent.parent["metadatabundle"]["calibration"][ + "R_pixel_units" + ][()].decode() + + Q_size = dset.parent.parent["metadatabundle"]["calibration"][ + "Q_pixel_size" + ][()] + Q_units = dset.parent.parent["metadatabundle"]["calibration"][ + "Q_pixel_units" + ][()].decode() except: print( "This file looked like a py4DSTEM dataset but the dim vectors appear malformed..." From 94b9f84f1cb4e61fc6e2f514e6ff23ca3729fd7a Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 22 Jan 2024 10:29:45 -0500 Subject: [PATCH 10/33] make scale bar a little smaller --- src/py4D_browser/main_window.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 2161596..fcafafd 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -367,7 +367,7 @@ def setup_views(self): ) # Scalebar - self.diffraction_scale_bar = ScaleBar(pixel_size=1, units="px", width=20) + self.diffraction_scale_bar = ScaleBar(pixel_size=1, units="px", width=10) self.diffraction_scale_bar.setParentItem( self.diffraction_space_widget.getView() ) @@ -391,7 +391,7 @@ def setup_views(self): ) # Scalebar, None by default - self.real_space_scale_bar = ScaleBar(pixel_size=1, units="px", width=20) + self.real_space_scale_bar = ScaleBar(pixel_size=1, units="px", width=10) self.real_space_scale_bar.setParentItem(self.real_space_widget.getView()) self.real_space_scale_bar.anchor((1, 1), (1, 1), offset=(-40, -40)) @@ -410,7 +410,7 @@ def setup_views(self): self.fft_widget.setImage(np.zeros((512, 512))) # FFT scale bar is tricky because pixel sizes commonly vary in each direction - self.fft_scale_bar = ScaleBar(pixel_size=1, units="1/px", width=20) + self.fft_scale_bar = ScaleBar(pixel_size=1, units="1/px", width=10) self.fft_scale_bar.setParentItem(self.fft_widget.getView()) self.fft_scale_bar.anchor((1, 1), (1, 1), offset=(-40, -40)) From b95ccba90414278a0ee55a8e117efad0b78e2bef Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 10:57:06 -0500 Subject: [PATCH 11/33] add ability to move faster with keyboard using shift --- src/py4D_browser/main_window.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index fcafafd..1ae6e6a 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -452,11 +452,14 @@ def dropEvent(self, event): def keyPressEvent(self, event): key = event.key() + modifier = event.modifiers() + + speed = 5 if modifier == QtCore.Qt.ShiftModifier else 1 if key in [QtCore.Qt.Key_W, QtCore.Qt.Key_A, QtCore.Qt.Key_S, QtCore.Qt.Key_D]: self.nudge_diffraction_selector( - dx=-1 if key == QtCore.Qt.Key_W else 1 if key == QtCore.Qt.Key_S else 0, - dy=-1 if key == QtCore.Qt.Key_A else 1 if key == QtCore.Qt.Key_D else 0, + dx=speed * (-1 if key == QtCore.Qt.Key_W else 1 if key == QtCore.Qt.Key_S else 0), + dy=speed * (-1 if key == QtCore.Qt.Key_A else 1 if key == QtCore.Qt.Key_D else 0), ) elif key in [ QtCore.Qt.Key_I, @@ -465,6 +468,6 @@ def keyPressEvent(self, event): QtCore.Qt.Key_L, ]: self.nudge_real_space_selector( - dx=-1 if key == QtCore.Qt.Key_I else 1 if key == QtCore.Qt.Key_K else 0, - dy=-1 if key == QtCore.Qt.Key_J else 1 if key == QtCore.Qt.Key_L else 0, + dx=speed*(-1 if key == QtCore.Qt.Key_I else 1 if key == QtCore.Qt.Key_K else 0), + dy=speed*(-1 if key == QtCore.Qt.Key_J else 1 if key == QtCore.Qt.Key_L else 0), ) From b87cea375a2e70b0cf2e431b421392c9d8fa3602 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 11:59:51 -0500 Subject: [PATCH 12/33] add keyboard map help menu --- py4DGUI-keymap.html | 692 ++++++++++++++++++++++++++++ src/py4D_browser/help_menu.py | 40 ++ src/py4D_browser/main_window.py | 8 + src/py4D_browser/menu_actions.py | 4 + src/py4D_browser/py4DGUI-keymap.png | Bin 0 -> 161818 bytes 5 files changed, 744 insertions(+) create mode 100644 py4DGUI-keymap.html create mode 100644 src/py4D_browser/help_menu.py create mode 100644 src/py4D_browser/py4DGUI-keymap.png diff --git a/py4DGUI-keymap.html b/py4DGUI-keymap.html new file mode 100644 index 0000000..95996c2 --- /dev/null +++ b/py4DGUI-keymap.html @@ -0,0 +1,692 @@ +py4DGUI-keymap.html

Keyboard Shortcut Map Maker

py4DGUI-keymap.html

  1. + + +

    Keyboard Shortcuts

    + +
    + +
    +
    +
    +
    + +
    + +
    +
    ESC
    + +
    F1
    +
    F2
    +
    F3
    +
    F4 +
    +
    F5
    +
    F6
    +
    F7
    +
    F8
    +
    F9
    +
    F10
    +
    F11
    +
    F12
    +
    + + +
    +
    + +
    +
    ESC
    +
    ` +
    +
    1
    +
    2
    +
    3
    +
    4
    +
    5
    +
    6
    +
    7
    +
    8 +
    +
    9
    +
    0
    +
    -
    +
    =
    +
    BACKSPACE +
    +
    + +
    +
    TAB
    +
    Q
    +
    WDetector Up
    +
    E
    +
    R
    +
    T
    +
    Y
    +
    U
    +
    ISelector Up
    +
    O
    +
    P
    +
    [ {
    +
    ] }
    +
    \ |
    +
    + +
    +
    CAPSLOCK
    +
    ADetector Left
    +
    SDetector Down
    +
    DDetector Right
    +
    F
    +
    G
    +
    H
    +
    JSelector Left
    +
    KSelector Down
    +
    LSelector Right
    +
    ; :
    +
    ' "
    +
    ENTER
    +
    + +
    +
    SHIFTMove 5 px at once
    +
    Z
    +
    X
    +
    C
    +
    V
    +
    B
    +
    N
    +
    M
    +
    , <
    +
    . >
    +
    / ?
    +
    SHIFT
    +
    + +
    +
    CTRL +
    +
    WIN +
    +
    ALT
    +
    +
    ALT
    +
    FN
    +
    MENU +
    +
    CTRL +
    +
    + +
    + + +
    + + +
    +
    + +
    +
    + PRTSC
    +
    INS
    +
    DEL
    + +
    +
    + +
    +
    + SCRLK
    +
    HOME
    +
    END
    + +
    +
    +
    + +
    +
    PAUSE +
    +
    PGUP
    +
    PGDN
    + +
    +
    +
    + +
    +
\ No newline at end of file diff --git a/src/py4D_browser/help_menu.py b/src/py4D_browser/help_menu.py new file mode 100644 index 0000000..143cd37 --- /dev/null +++ b/src/py4D_browser/help_menu.py @@ -0,0 +1,40 @@ +from PyQt5 import QtGui, QtCore +from PyQt5.QtWidgets import ( + QWidget, + QDialog, + QVBoxLayout, +) +from pathlib import Path + +class KeyboardMapMenu(QDialog): + def __init__(self, parent=None): + super().__init__(parent=parent) + + self.keymap = QtGui.QPixmap(str(Path(__file__).parent.absolute() / "py4DGUI-keymap.png")).scaledToWidth(1500) + label = Label() + + label.setPixmap(self.keymap) + + layout = QVBoxLayout() + layout.addWidget(label) + self.setLayout(layout) + + self.resize(self.keymap.width(), self.keymap.height()) + +# Widget that smoothly resizes Pixmap keeping aspect ratio +class Label(QWidget): + def __init__(self, parent=None): + QWidget.__init__(self, parent=parent) + self.p = QtGui.QPixmap() + + def setPixmap(self, p): + self.p = p + self.update() + + def paintEvent(self, event): + if not self.p.isNull(): + painter = QtGui.QPainter(self) + painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform) + rect = self.rect() + rect.setHeight(int(self.p.height() * rect.width() / self.p.width())) + painter.drawPixmap(rect, self.p) \ No newline at end of file diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 1ae6e6a..43f88d8 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -39,6 +39,7 @@ class DataViewer(QMainWindow): get_savefile_name, export_datacube, export_virtual_image, + show_keyboard_map, ) from py4D_browser.update_views import ( @@ -349,6 +350,13 @@ def setup_menus(self): rs_detector_shape_group.addAction(detector_rectangle_action) self.detector_shape_menu.addAction(detector_rectangle_action) + self.help_menu = QMenu("&Help", self) + self.menu_bar.addMenu(self.help_menu) + + self.keyboard_map_action = QAction("Show &Keyboard Map", self) + self.keyboard_map_action.triggered.connect(self.show_keyboard_map) + self.help_menu.addAction(self.keyboard_map_action) + def setup_views(self): # Set up the diffraction space window. self.diffraction_space_widget = pg.ImageView() diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index f74f923..8668d8c 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -4,6 +4,7 @@ import os import numpy as np import matplotlib.pyplot as plt +from py4D_browser.help_menu import KeyboardMapMenu def load_data_auto(self): @@ -137,6 +138,9 @@ def export_virtual_image(self, im_format: str, im_type: str): with TiffWriter(filename) as tw: tw.write(vimg) +def show_keyboard_map(self): + keymap = KeyboardMapMenu(parent=self) + keymap.open() def show_file_dialog(self) -> str: filename = QFileDialog.getOpenFileName( diff --git a/src/py4D_browser/py4DGUI-keymap.png b/src/py4D_browser/py4DGUI-keymap.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b86da2ef17f6e010ac79b38630ca547e77a83d GIT binary patch literal 161818 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

7-QR_b9MJpg9b=PK^7 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 I(xh}cYpLOg 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 Date: Fri, 2 Feb 2024 12:02:42 -0500 Subject: [PATCH 13/33] update readme with keyboard controls --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8210e73..9e0f833 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,12 @@ The GUI is available on PyPI and conda-forge: ## Usage Run `py4DGUI` in your terminal to open the GUI. Then just drag and drop a 4D-STEM dataset into the window! +Move the virtual detector and the real-space selector using the mouse or using the keyboard shortcuts: WASD moves the detector and IJKL moves the selector, holding down shift to move 5 pixels at a time. + ![Demonstration](/images/demo.gif) +The keyboard map in the Help menu was made using [this tool](https://archie-adams.github.io/keyboard-shortcut-map-maker/) and the map file is in the top level of this repo. + ## About ![py4DSTEM logo](/images/py4DSTEM_logo.png) From bf4e1abe4419559c822d9aaeff174309264a1ec7 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 12:07:14 -0500 Subject: [PATCH 14/33] format with black --- src/py4D_browser/help_menu.py | 8 ++++++-- src/py4D_browser/main_window.py | 20 ++++++++++++++++---- src/py4D_browser/menu_actions.py | 2 ++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/py4D_browser/help_menu.py b/src/py4D_browser/help_menu.py index 143cd37..ad3abeb 100644 --- a/src/py4D_browser/help_menu.py +++ b/src/py4D_browser/help_menu.py @@ -6,11 +6,14 @@ ) from pathlib import Path + class KeyboardMapMenu(QDialog): def __init__(self, parent=None): super().__init__(parent=parent) - self.keymap = QtGui.QPixmap(str(Path(__file__).parent.absolute() / "py4DGUI-keymap.png")).scaledToWidth(1500) + self.keymap = QtGui.QPixmap( + str(Path(__file__).parent.absolute() / "py4DGUI-keymap.png") + ).scaledToWidth(1500) label = Label() label.setPixmap(self.keymap) @@ -21,6 +24,7 @@ def __init__(self, parent=None): self.resize(self.keymap.width(), self.keymap.height()) + # Widget that smoothly resizes Pixmap keeping aspect ratio class Label(QWidget): def __init__(self, parent=None): @@ -37,4 +41,4 @@ def paintEvent(self, event): painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform) rect = self.rect() rect.setHeight(int(self.p.height() * rect.width() / self.p.width())) - painter.drawPixmap(rect, self.p) \ No newline at end of file + painter.drawPixmap(rect, self.p) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 43f88d8..3907138 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -466,8 +466,14 @@ def keyPressEvent(self, event): if key in [QtCore.Qt.Key_W, QtCore.Qt.Key_A, QtCore.Qt.Key_S, QtCore.Qt.Key_D]: self.nudge_diffraction_selector( - dx=speed * (-1 if key == QtCore.Qt.Key_W else 1 if key == QtCore.Qt.Key_S else 0), - dy=speed * (-1 if key == QtCore.Qt.Key_A else 1 if key == QtCore.Qt.Key_D else 0), + dx=speed + * ( + -1 if key == QtCore.Qt.Key_W else 1 if key == QtCore.Qt.Key_S else 0 + ), + dy=speed + * ( + -1 if key == QtCore.Qt.Key_A else 1 if key == QtCore.Qt.Key_D else 0 + ), ) elif key in [ QtCore.Qt.Key_I, @@ -476,6 +482,12 @@ def keyPressEvent(self, event): QtCore.Qt.Key_L, ]: self.nudge_real_space_selector( - dx=speed*(-1 if key == QtCore.Qt.Key_I else 1 if key == QtCore.Qt.Key_K else 0), - dy=speed*(-1 if key == QtCore.Qt.Key_J else 1 if key == QtCore.Qt.Key_L else 0), + dx=speed + * ( + -1 if key == QtCore.Qt.Key_I else 1 if key == QtCore.Qt.Key_K else 0 + ), + dy=speed + * ( + -1 if key == QtCore.Qt.Key_J else 1 if key == QtCore.Qt.Key_L else 0 + ), ) diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index 8668d8c..3c63522 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -138,10 +138,12 @@ def export_virtual_image(self, im_format: str, im_type: str): with TiffWriter(filename) as tw: tw.write(vimg) + def show_keyboard_map(self): keymap = KeyboardMapMenu(parent=self) keymap.open() + def show_file_dialog(self) -> str: filename = QFileDialog.getOpenFileName( self, From 8999793a1eef404faa76f3bbdd074b7f5ae1b86a Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 14:35:31 -0500 Subject: [PATCH 15/33] optional EWPC in FFT viewer --- src/py4D_browser/main_window.py | 20 +++++++++++++++++++- src/py4D_browser/update_views.py | 15 ++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 3907138..78ca52a 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -350,6 +350,23 @@ def setup_menus(self): rs_detector_shape_group.addAction(detector_rectangle_action) self.detector_shape_menu.addAction(detector_rectangle_action) + self.fft_menu = QMenu("FFT View", self) + self.menu_bar.addMenu(self.fft_menu) + + self.fft_source_action_group = QActionGroup(self) + self.fft_source_action_group.setExclusive(True) + img_fft_action = QAction("Virtual Image FFT", self) + img_fft_action.setCheckable(True) + img_fft_action.setChecked(True) + self.fft_menu.addAction(img_fft_action) + self.fft_source_action_group.addAction(img_fft_action) + img_ewpc_action = QAction("EWPC", self) + img_ewpc_action.setCheckable(True) + self.fft_menu.addAction(img_ewpc_action) + self.fft_source_action_group.addAction(img_ewpc_action) + img_fft_action.triggered.connect(self.update_real_space_view) + img_ewpc_action.triggered.connect(self.update_diffraction_space_view) + self.help_menu = QMenu("&Help", self) self.menu_bar.addMenu(self.help_menu) @@ -424,7 +441,8 @@ def setup_views(self): # Name and return self.fft_widget.setWindowTitle("FFT of Virtual Image") - self.fft_widget.addItem(pg.TextItem("FFT", (200, 200, 200), None, (0, 1))) + self.fft_widget_text = pg.TextItem("FFT", (200, 200, 200), None, (0, 1)) + self.fft_widget.addItem(self.fft_widget_text) self.fft_widget.setAcceptDrops(True) self.fft_widget.dragEnterEvent = self.dragEnterEvent diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 9399978..430df12 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -171,9 +171,11 @@ def update_real_space_view(self, reset=False): self.real_space_widget.setImage(new_view.T, autoLevels=True) # Update FFT view - fft = np.abs(np.fft.fftshift(np.fft.fft2(new_view))) ** 0.5 - levels = (np.min(fft), np.percentile(fft, 99.9)) - self.fft_widget.setImage(fft.T, autoLevels=False, levels=levels, autoRange=reset) + if self.fft_source_action_group.checkedAction().text() == "Virtual Image FFT": + fft = np.abs(np.fft.fftshift(np.fft.fft2(new_view))) ** 0.5 + levels = (np.min(fft), np.percentile(fft, 99.9)) + self.fft_widget.setImage(fft.T, autoLevels=False, levels=levels, autoRange=reset) + self.fft_widget_text.setText("Vitual Image FFT") def update_diffraction_space_view(self, reset=False): @@ -234,6 +236,13 @@ def update_diffraction_space_view(self, reset=False): new_view.T, autoLevels=reset, autoRange=reset ) + if self.fft_source_action_group.checkedAction().text() == "EWPC": + log_clip = np.maximum(1e-10,np.percentile(np.maximum(DP,0.0), 0.1)) + fft = np.abs(np.fft.fftshift(np.fft.fft2(np.log(np.maximum(DP,log_clip))))) + levels = (np.min(fft), np.percentile(fft, 99.9)) + self.fft_widget.setImage(fft.T, autoLevels=False, levels=levels, autoRange=reset) + self.fft_widget_text.setText("EWPC") + def update_realspace_detector(self): # change the shape of the detector, then update the view From 60a61daecafafdf8b72f9992360d6688e1cfe90b Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 15:06:01 -0500 Subject: [PATCH 16/33] disable pyqtgraph builtin rightclick menu --- src/py4D_browser/main_window.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 78ca52a..bcfd3b3 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -463,6 +463,10 @@ def setup_views(self): widget.setLayout(layout) self.setCentralWidget(widget) + self.diffraction_space_widget.getView().setMenuEnabled(False) + self.real_space_widget.getView().setMenuEnabled(False) + self.fft_widget.getView().setMenuEnabled(False) + # Handle dragging and dropping a file on the window def dragEnterEvent(self, event): if event.mimeData().hasUrls(): From 6b7f413585a4fa3e5213f4f0c3de20104389db30 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 15:06:16 -0500 Subject: [PATCH 17/33] make auto-contrast happen at more sensible times --- src/py4D_browser/update_views.py | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 430df12..671708e 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -1,6 +1,7 @@ import pyqtgraph as pg import numpy as np import py4DSTEM +from functools import partial from py4D_browser.utils import pg_point_roi, make_detector @@ -168,13 +169,15 @@ def update_real_space_view(self, reset=False): new_view = np.sqrt(np.maximum(vimg, 0)) else: raise ValueError("Mode not recognized") - self.real_space_widget.setImage(new_view.T, autoLevels=True) + self.real_space_widget.setImage(new_view.T, autoLevels=reset, autoRange=reset) # Update FFT view if self.fft_source_action_group.checkedAction().text() == "Virtual Image FFT": fft = np.abs(np.fft.fftshift(np.fft.fft2(new_view))) ** 0.5 levels = (np.min(fft), np.percentile(fft, 99.9)) - self.fft_widget.setImage(fft.T, autoLevels=False, levels=levels, autoRange=reset) + self.fft_widget.setImage( + fft.T, autoLevels=False, levels=levels, autoRange=reset + ) self.fft_widget_text.setText("Vitual Image FFT") @@ -237,10 +240,12 @@ def update_diffraction_space_view(self, reset=False): ) if self.fft_source_action_group.checkedAction().text() == "EWPC": - log_clip = np.maximum(1e-10,np.percentile(np.maximum(DP,0.0), 0.1)) - fft = np.abs(np.fft.fftshift(np.fft.fft2(np.log(np.maximum(DP,log_clip))))) + log_clip = np.maximum(1e-10, np.percentile(np.maximum(DP, 0.0), 0.1)) + fft = np.abs(np.fft.fftshift(np.fft.fft2(np.log(np.maximum(DP, log_clip))))) levels = (np.min(fft), np.percentile(fft, 99.9)) - self.fft_widget.setImage(fft.T, autoLevels=False, levels=levels, autoRange=reset) + self.fft_widget.setImage( + fft.T, autoLevels=False, levels=levels, autoRange=reset + ) self.fft_widget_text.setText("EWPC") @@ -271,7 +276,7 @@ def update_realspace_detector(self): if detector_shape == "Point": self.real_space_point_selector = pg_point_roi(self.real_space_widget.getView()) self.real_space_point_selector.sigRegionChanged.connect( - self.update_diffraction_space_view + partial(self.update_diffraction_space_view, False) ) elif detector_shape == "Rectangular": @@ -280,13 +285,13 @@ def update_realspace_detector(self): ) self.real_space_widget.getView().addItem(self.real_space_rect_selector) self.real_space_rect_selector.sigRegionChangeFinished.connect( - self.update_diffraction_space_view + partial(self.update_diffraction_space_view, False) ) else: raise ValueError("Unknown detector shape! Got: {}".format(detector_shape)) - self.update_diffraction_space_view() + self.update_diffraction_space_view(reset=True) def update_diffraction_detector(self): @@ -328,7 +333,7 @@ def update_diffraction_detector(self): self.diffraction_space_widget.getView() ) self.virtual_detector_point.sigRegionChanged.connect( - self.update_real_space_view + partial(self.update_real_space_view, False) ) elif detector_shape == "Rectangular": @@ -337,7 +342,7 @@ def update_diffraction_detector(self): ) self.diffraction_space_widget.getView().addItem(self.virtual_detector_roi) self.virtual_detector_roi.sigRegionChangeFinished.connect( - self.update_real_space_view + partial(self.update_real_space_view, False) ) # Circular detector @@ -347,7 +352,7 @@ def update_diffraction_detector(self): ) self.diffraction_space_widget.getView().addItem(self.virtual_detector_roi) self.virtual_detector_roi.sigRegionChangeFinished.connect( - self.update_real_space_view + partial(self.update_real_space_view, False) ) # Annular dector @@ -380,16 +385,16 @@ def update_diffraction_detector(self): # Connect to real space view update function self.virtual_detector_roi_outer.sigRegionChangeFinished.connect( - self.update_real_space_view + partial(self.update_real_space_view, False) ) self.virtual_detector_roi_inner.sigRegionChangeFinished.connect( - self.update_real_space_view + partial(self.update_real_space_view, False) ) else: raise ValueError("Unknown detector shape! Got: {}".format(detector_shape)) - self.update_real_space_view() + self.update_real_space_view(reset=True) def nudge_real_space_selector(self, dx, dy): From 0abe61e454780a8dc505963c5ae556b4dd4219ec Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 15:07:09 -0500 Subject: [PATCH 18/33] typo --- src/py4D_browser/update_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 671708e..658a640 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -159,7 +159,7 @@ def update_real_space_view(self, reset=False): raise ValueError("Mode logic gone haywire!") else: - raise ValueError("Oppsie") + raise ValueError("Oopsie") if scaling_mode == "Linear": new_view = vimg From ae9c08c8efaf772de06b5ac3f6e7ee4c3ff227bf Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Fri, 2 Feb 2024 15:26:02 -0500 Subject: [PATCH 19/33] switch text annotations to status bar --- src/py4D_browser/empad2_reader.py | 2 ++ src/py4D_browser/main_window.py | 20 ++++++++++---------- src/py4D_browser/update_views.py | 14 ++++++++------ src/py4D_browser/utils.py | 8 ++++++++ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/py4D_browser/empad2_reader.py b/src/py4D_browser/empad2_reader.py index 5aba496..3fedfe8 100644 --- a/src/py4D_browser/empad2_reader.py +++ b/src/py4D_browser/empad2_reader.py @@ -5,6 +5,7 @@ def set_empad2_sensor(self, sensor_name): self.empad2_calibrations = empad2.load_calibration_data(sensor=sensor_name) + self.statusBar().showMessage(f"{sensor_name} calibrations loaded", 5_000) def load_empad2_background(self): @@ -13,6 +14,7 @@ def load_empad2_background(self): self.empad2_background = empad2.load_background( filepath=filename, calibration_data=self.empad2_calibrations ) + self.statusBar().showMessage("Background data loaded", 5_000) else: QMessageBox.warning( self, "No calibrations loaded!", "Please select a sensor first" diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index bcfd3b3..b1bc44e 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -8,6 +8,7 @@ QHBoxLayout, QSplitter, QActionGroup, + QLabel, ) import pyqtgraph as pg @@ -17,7 +18,7 @@ from pathlib import Path import importlib -from py4D_browser.utils import pg_point_roi +from py4D_browser.utils import pg_point_roi, VLine from py4D_browser.scalebar import ScaleBar @@ -82,7 +83,7 @@ def __init__(self, argv): self.setup_menus() self.setup_views() - self.resize(800, 400) + self.resize(1000, 800) self.show() @@ -378,10 +379,7 @@ def setup_views(self): # Set up the diffraction space window. self.diffraction_space_widget = pg.ImageView() self.diffraction_space_widget.setImage(np.zeros((512, 512))) - self.diffraction_space_view_text = pg.TextItem( - "Slice", (200, 200, 200), None, (0, 1) - ) - self.diffraction_space_widget.addItem(self.diffraction_space_view_text) + self.diffraction_space_view_text = QLabel("Slice") # Create virtual detector ROI selector self.virtual_detector_point = pg_point_roi( @@ -404,10 +402,7 @@ def setup_views(self): # Set up the real space window. self.real_space_widget = pg.ImageView() self.real_space_widget.setImage(np.zeros((512, 512))) - self.real_space_view_text = pg.TextItem( - "Scan pos.", (200, 200, 200), None, (0, 1) - ) - self.real_space_widget.addItem(self.real_space_view_text) + self.real_space_view_text = QLabel("Scan Position") # Add point selector connected to displayed diffraction pattern self.real_space_point_selector = pg_point_roi(self.real_space_widget.getView()) @@ -467,6 +462,11 @@ def setup_views(self): self.real_space_widget.getView().setMenuEnabled(False) self.fft_widget.getView().setMenuEnabled(False) + self.statusBar().addPermanentWidget(VLine()) + self.statusBar().addPermanentWidget(self.diffraction_space_view_text) + self.statusBar().addPermanentWidget(VLine()) + self.statusBar().addPermanentWidget(self.real_space_view_text) + # Handle dragging and dropping a file on the window def dragEnterEvent(self, event): if event.mimeData().hasUrls(): diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 658a640..770062c 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -50,7 +50,7 @@ def update_real_space_view(self, reset=False): # update the label: self.diffraction_space_view_text.setText( - f"[{slice_x.start}:{slice_x.stop},{slice_y.start}:{slice_y.stop}]" + f"Diffraction Space Range: [{slice_x.start}:{slice_x.stop},{slice_y.start}:{slice_y.stop}]" ) if detector_mode == "Integrating": @@ -67,7 +67,9 @@ def update_real_space_view(self, reset=False): x0 = self.virtual_detector_roi.pos()[0] + R y0 = self.virtual_detector_roi.pos()[1] + R - self.diffraction_space_view_text.setText(f"[({x0:.0f},{y0:.0f}),{R:.0f}]") + self.diffraction_space_view_text.setText( + f"Detector Center: ({x0:.0f},{y0:.0f}), Radius: {R:.0f}" + ) mask = make_detector( (self.datacube.Q_Nx, self.datacube.Q_Ny), "circle", ((x0, y0), R) @@ -86,7 +88,7 @@ def update_real_space_view(self, reset=False): R_inner -= 1 self.diffraction_space_view_text.setText( - f"[({x0:.0f},{y0:.0f}),({R_inner:.0f},{R_outer:.0f})]" + f"Detector Center: ({x0:.0f},{y0:.0f}), Radii: ({R_inner:.0f},{R_outer:.0f})" ) mask = make_detector( @@ -105,7 +107,7 @@ def update_real_space_view(self, reset=False): yc = np.clip(yc, 0, self.datacube.Q_Ny - 1) vimg = self.datacube.data[:, :, xc, yc] - self.diffraction_space_view_text.setText(f"[{xc},{yc}]") + self.diffraction_space_view_text.setText(f"Diffraction Pixel: [{xc},{yc}]") else: raise ValueError("Detector shape not recognized") @@ -206,7 +208,7 @@ def update_diffraction_space_view(self, reset=False): xc = np.clip(xc, 0, self.datacube.R_Nx - 1) yc = np.clip(yc, 0, self.datacube.R_Ny - 1) - self.real_space_view_text.setText(f"[{xc},{yc}]") + self.real_space_view_text.setText(f"Real Space Pixel: [{xc},{yc}]") DP = self.datacube.data[xc, yc] elif detector_shape == "Rectangular": @@ -218,7 +220,7 @@ def update_diffraction_space_view(self, reset=False): # update the label: self.real_space_view_text.setText( - f"[{slice_x.start}:{slice_x.stop},{slice_y.start}:{slice_y.stop}]" + f"Real Space Range: [{slice_x.start}:{slice_x.stop},{slice_y.start}:{slice_y.stop}]" ) DP = np.sum(self.datacube.data[slice_x, slice_y], axis=(0, 1)) diff --git a/src/py4D_browser/utils.py b/src/py4D_browser/utils.py index ed95364..3dee80a 100644 --- a/src/py4D_browser/utils.py +++ b/src/py4D_browser/utils.py @@ -1,5 +1,13 @@ import pyqtgraph as pg import numpy as np +from PyQt5.QtWidgets import QFrame + + +class VLine(QFrame): + # a simple vertical divider line + def __init__(self): + super(VLine, self).__init__() + self.setFrameShape(self.VLine | self.Sunken) def pg_point_roi(view_box): From e80674f4cf33ef142cb66b342200808284f72ac1 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Sun, 4 Feb 2024 13:14:06 -0500 Subject: [PATCH 20/33] add simple autoscale buttons to bottom bar --- src/py4D_browser/main_window.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index b1bc44e..5dd3368 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -9,6 +9,7 @@ QSplitter, QActionGroup, QLabel, + QPushButton, ) import pyqtgraph as pg @@ -365,8 +366,10 @@ def setup_menus(self): img_ewpc_action.setCheckable(True) self.fft_menu.addAction(img_ewpc_action) self.fft_source_action_group.addAction(img_ewpc_action) - img_fft_action.triggered.connect(self.update_real_space_view) - img_ewpc_action.triggered.connect(self.update_diffraction_space_view) + img_fft_action.triggered.connect(partial(self.update_real_space_view, False)) + img_ewpc_action.triggered.connect( + partial(self.update_diffraction_space_view, False) + ) self.help_menu = QMenu("&Help", self) self.menu_bar.addMenu(self.help_menu) @@ -386,7 +389,7 @@ def setup_views(self): self.diffraction_space_widget.getView() ) self.virtual_detector_point.sigRegionChanged.connect( - self.update_real_space_view + partial(self.update_real_space_view, False) ) # Scalebar @@ -462,10 +465,20 @@ def setup_views(self): self.real_space_widget.getView().setMenuEnabled(False) self.fft_widget.getView().setMenuEnabled(False) + # Setup Status Bar self.statusBar().addPermanentWidget(VLine()) self.statusBar().addPermanentWidget(self.diffraction_space_view_text) self.statusBar().addPermanentWidget(VLine()) self.statusBar().addPermanentWidget(self.real_space_view_text) + self.statusBar().addPermanentWidget(VLine()) + diffraction_rescale_button = QPushButton("Autoscale Diffraction") + diffraction_rescale_button.clicked.connect( + self.diffraction_space_widget.autoLevels + ) + self.statusBar().addPermanentWidget(diffraction_rescale_button) + realspace_rescale_button = QPushButton("Autoscale Real Space") + realspace_rescale_button.clicked.connect(self.real_space_widget.autoLevels) + self.statusBar().addPermanentWidget(realspace_rescale_button) # Handle dragging and dropping a file on the window def dragEnterEvent(self, event): From 2a4f289580577d586bc509a9978b5c5658484f8f Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 13:00:40 -0500 Subject: [PATCH 21/33] allow autoscale to be locked on --- src/py4D_browser/main_window.py | 20 ++++++++++------ src/py4D_browser/update_views.py | 10 ++++++-- src/py4D_browser/utils.py | 41 +++++++++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 5dd3368..912377c 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -19,7 +19,7 @@ from pathlib import Path import importlib -from py4D_browser.utils import pg_point_roi, VLine +from py4D_browser.utils import pg_point_roi, VLine, LatchingButton from py4D_browser.scalebar import ScaleBar @@ -471,14 +471,20 @@ def setup_views(self): self.statusBar().addPermanentWidget(VLine()) self.statusBar().addPermanentWidget(self.real_space_view_text) self.statusBar().addPermanentWidget(VLine()) - diffraction_rescale_button = QPushButton("Autoscale Diffraction") - diffraction_rescale_button.clicked.connect( + self.diffraction_rescale_button = LatchingButton( + "Autoscale Diffraction", status_bar=self.statusBar() + ) + self.diffraction_rescale_button.activated.connect( self.diffraction_space_widget.autoLevels ) - self.statusBar().addPermanentWidget(diffraction_rescale_button) - realspace_rescale_button = QPushButton("Autoscale Real Space") - realspace_rescale_button.clicked.connect(self.real_space_widget.autoLevels) - self.statusBar().addPermanentWidget(realspace_rescale_button) + self.statusBar().addPermanentWidget(self.diffraction_rescale_button) + self.realspace_rescale_button = LatchingButton( + "Autoscale Real Space", status_bar=self.statusBar() + ) + self.realspace_rescale_button.activated.connect( + self.real_space_widget.autoLevels + ) + self.statusBar().addPermanentWidget(self.realspace_rescale_button) # Handle dragging and dropping a file on the window def dragEnterEvent(self, event): diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 770062c..e95ce87 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -171,7 +171,11 @@ def update_real_space_view(self, reset=False): new_view = np.sqrt(np.maximum(vimg, 0)) else: raise ValueError("Mode not recognized") - self.real_space_widget.setImage(new_view.T, autoLevels=reset, autoRange=reset) + self.real_space_widget.setImage( + new_view.T, + autoLevels=reset or self.realspace_rescale_button.latched, + autoRange=reset, + ) # Update FFT view if self.fft_source_action_group.checkedAction().text() == "Virtual Image FFT": @@ -238,7 +242,9 @@ def update_diffraction_space_view(self, reset=False): raise ValueError("Mode not recognized") self.diffraction_space_widget.setImage( - new_view.T, autoLevels=reset, autoRange=reset + new_view.T, + autoLevels=reset or self.diffraction_rescale_button.latched, + autoRange=reset, ) if self.fft_source_action_group.checkedAction().text() == "EWPC": diff --git a/src/py4D_browser/utils.py b/src/py4D_browser/utils.py index 3dee80a..a871d83 100644 --- a/src/py4D_browser/utils.py +++ b/src/py4D_browser/utils.py @@ -1,6 +1,8 @@ import pyqtgraph as pg import numpy as np -from PyQt5.QtWidgets import QFrame +from PyQt5.QtWidgets import QFrame, QPushButton, QApplication +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtCore import Qt class VLine(QFrame): @@ -10,6 +12,43 @@ def __init__(self): self.setFrameShape(self.VLine | self.Sunken) +class LatchingButton(QPushButton): + """ + Subclass of QPushButton that acts as a momentary button, + unless shift is held down during the click, in which case + it toggles on. + Emits the "activated" signal whenever triggered, and + maintains the "latched" state when latched down. + """ + + activated = pyqtSignal() + + def __init__(self, *args, **kwargs): + self.status_bar = kwargs.pop("status_bar", None) + super().__init__(*args, **kwargs) + self.setCheckable(True) + self.clicked.connect(self.on_click) + self.latched = False + + def on_click(self, *args): + modifiers = QApplication.keyboardModifiers() + + if self.latched: + self.setChecked(False) + self.latched = False + else: + if modifiers == Qt.ShiftModifier: + self.setChecked(True) + self.latched = True + self.activated.emit() + else: + self.setChecked(False) + self.latched = False + self.activated.emit() + if self.status_bar is not None: + self.status_bar.showMessage("Shift+click to keep on", 5_000) + + def pg_point_roi(view_box): """ Point selection. Based in pyqtgraph, and returns a pyqtgraph CircleROI object. From f0ac654851d385ad6f47391b202abe5f2274b4da Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 13:24:54 -0500 Subject: [PATCH 22/33] autoscale on by default --- src/py4D_browser/main_window.py | 4 ++-- src/py4D_browser/utils.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 912377c..3b95a0e 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -472,14 +472,14 @@ def setup_views(self): self.statusBar().addPermanentWidget(self.real_space_view_text) self.statusBar().addPermanentWidget(VLine()) self.diffraction_rescale_button = LatchingButton( - "Autoscale Diffraction", status_bar=self.statusBar() + "Autoscale Diffraction", status_bar=self.statusBar(), latched=True, ) self.diffraction_rescale_button.activated.connect( self.diffraction_space_widget.autoLevels ) self.statusBar().addPermanentWidget(self.diffraction_rescale_button) self.realspace_rescale_button = LatchingButton( - "Autoscale Real Space", status_bar=self.statusBar() + "Autoscale Real Space", status_bar=self.statusBar(), latched=True, ) self.realspace_rescale_button.activated.connect( self.real_space_widget.autoLevels diff --git a/src/py4D_browser/utils.py b/src/py4D_browser/utils.py index a871d83..fb7be24 100644 --- a/src/py4D_browser/utils.py +++ b/src/py4D_browser/utils.py @@ -25,10 +25,13 @@ class LatchingButton(QPushButton): def __init__(self, *args, **kwargs): self.status_bar = kwargs.pop("status_bar", None) + self.latched = kwargs.pop("latched", False) super().__init__(*args, **kwargs) self.setCheckable(True) self.clicked.connect(self.on_click) - self.latched = False + if self.latched: + self.setChecked(True) + self.activated.emit() def on_click(self, *args): modifiers = QApplication.keyboardModifiers() From 986cb2eddc4c21a72436c3dd097e67d76d7b19b0 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 13:26:10 -0500 Subject: [PATCH 23/33] format with black --- src/py4D_browser/main_window.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index 3b95a0e..c1c1044 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -472,14 +472,18 @@ def setup_views(self): self.statusBar().addPermanentWidget(self.real_space_view_text) self.statusBar().addPermanentWidget(VLine()) self.diffraction_rescale_button = LatchingButton( - "Autoscale Diffraction", status_bar=self.statusBar(), latched=True, + "Autoscale Diffraction", + status_bar=self.statusBar(), + latched=True, ) self.diffraction_rescale_button.activated.connect( self.diffraction_space_widget.autoLevels ) self.statusBar().addPermanentWidget(self.diffraction_rescale_button) self.realspace_rescale_button = LatchingButton( - "Autoscale Real Space", status_bar=self.statusBar(), latched=True, + "Autoscale Real Space", + status_bar=self.statusBar(), + latched=True, ) self.realspace_rescale_button.activated.connect( self.real_space_widget.autoLevels From 3fdd242dd88b58cb0058e629b1f1791ef9e85673 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 13:49:55 -0500 Subject: [PATCH 24/33] ensure RAW exports get the unscaled data --- src/py4D_browser/menu_actions.py | 7 ++++++- src/py4D_browser/update_views.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index 3c63522..ffd83ed 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -96,7 +96,7 @@ def export_datacube(self, save_format: str): ) if response == QMessageBox.Cancel: - print("Cancelling due to user guilt") + self.statusBar().showMessage("Cancelling due to user guilt", 5_000) return filename = self.get_savefile_name(save_format) @@ -135,6 +135,11 @@ def export_virtual_image(self, im_format: str, im_type: str): elif im_format == "TIFF (raw)": from tifffile import TiffWriter + vimg = ( + self.unscaled_realspace_image + if im_type == "image" + else self.unscaled_diffraction_image + ) with TiffWriter(filename) as tw: tw.write(vimg) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index e95ce87..e88c3b1 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -171,6 +171,9 @@ def update_real_space_view(self, reset=False): new_view = np.sqrt(np.maximum(vimg, 0)) else: raise ValueError("Mode not recognized") + + self.unscaled_realspace_image = vimg + self.real_space_widget.setImage( new_view.T, autoLevels=reset or self.realspace_rescale_button.latched, @@ -232,6 +235,8 @@ def update_diffraction_space_view(self, reset=False): else: raise ValueError("Detector shape not recognized") + self.unscaled_diffraction_image = DP + if scaling_mode == "Linear": new_view = DP elif scaling_mode == "Log": From a993e3e8f194376265e78cb832d64db3a1ce293c Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 13:51:18 -0500 Subject: [PATCH 25/33] clarify export type names --- src/py4D_browser/main_window.py | 2 +- src/py4D_browser/menu_actions.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index c1c1044..dac2d27 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -140,7 +140,7 @@ def setup_menus(self): # Submenu to export diffraction vdiff_export_menu = QMenu("Export Diffraction Pattern", self) self.file_menu.addMenu(vdiff_export_menu) - for method in ["PNG", "TIFF", "TIFF (raw)"]: + for method in ["PNG (display)", "TIFF (display)", "TIFF (raw)"]: menu_item = vdiff_export_menu.addAction(method) menu_item.triggered.connect( partial(self.export_virtual_image, method, "diffraction") diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index ffd83ed..758ba69 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -124,11 +124,11 @@ def export_virtual_image(self, im_format: str, im_type: str): vimg = view.image vmin, vmax = view.getLevels() - if im_format == "PNG": + if im_format == "PNG (display)": plt.imsave( fname=filename, arr=vimg, vmin=vmin, vmax=vmax, format="png", cmap="gray" ) - elif im_format == "TIFF": + elif im_format == "TIFF (display)": plt.imsave( fname=filename, arr=vimg, vmin=vmin, vmax=vmax, format="tiff", cmap="gray" ) From 561138280c5845073e6499d67bcf1b7bfaac6bb9 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 14:09:44 -0500 Subject: [PATCH 26/33] tentatively use new DPC name, will eventually in-house --- pyproject.toml | 2 +- src/py4D_browser/main_window.py | 2 +- src/py4D_browser/update_views.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index cd430cd..3426704 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ - "py4dstem >= 0.14.3", + "py4dstem >= 0.14.9", "emdfile >= 0.0.11", "h5py", "numpy >= 1.19", diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index dac2d27..b9b118f 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -352,7 +352,7 @@ def setup_menus(self): rs_detector_shape_group.addAction(detector_rectangle_action) self.detector_shape_menu.addAction(detector_rectangle_action) - self.fft_menu = QMenu("FFT View", self) + self.fft_menu = QMenu("FF&T View", self) self.menu_bar.addMenu(self.fft_menu) self.fft_source_action_group = QActionGroup(self) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index e88c3b1..10369af 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -149,7 +149,7 @@ def update_real_space_view(self, reset=False): elif detector_mode == "CoM Angle": vimg = np.arctan2(CoMy, CoMx) elif detector_mode == "iCoM": - dpc = py4DSTEM.process.phase.DPCReconstruction(verbose=False) + dpc = py4DSTEM.process.phase.DPC(verbose=False) dpc.preprocess( force_com_measured=[CoMx, CoMy], plot_rotation=False, From db8b82af4f5ef76609bbf2d9e0f699d52f5638ac Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 14:15:14 -0500 Subject: [PATCH 27/33] fix for new save menu names --- src/py4D_browser/main_window.py | 2 +- src/py4D_browser/menu_actions.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index b9b118f..eade414 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -131,7 +131,7 @@ def setup_menus(self): # Submenu to export virtual image vimg_export_menu = QMenu("Export Virtual Image", self) self.file_menu.addMenu(vimg_export_menu) - for method in ["PNG", "TIFF", "TIFF (raw)"]: + for method in ["PNG (display)", "TIFF (display)", "TIFF (raw)"]: menu_item = vimg_export_menu.addAction(method) menu_item.triggered.connect( partial(self.export_virtual_image, method, "image") diff --git a/src/py4D_browser/menu_actions.py b/src/py4D_browser/menu_actions.py index 758ba69..94ff7c1 100644 --- a/src/py4D_browser/menu_actions.py +++ b/src/py4D_browser/menu_actions.py @@ -121,7 +121,7 @@ def export_virtual_image(self, im_format: str, im_type: str): self.real_space_widget if im_type == "image" else self.diffraction_space_widget ) - vimg = view.image + vimg = view.image.T vmin, vmax = view.getLevels() if im_format == "PNG (display)": @@ -142,6 +142,8 @@ def export_virtual_image(self, im_format: str, im_type: str): ) with TiffWriter(filename) as tw: tw.write(vimg) + else: + raise RuntimeError("Nothing saved! Format not recognized") def show_keyboard_map(self): @@ -168,8 +170,8 @@ def get_savefile_name(self, file_format) -> str: "Raw float32": "RAW File (*.raw *.f32);;Any file (*)", "py4DSTEM HDF5": "HDF5 File (*.hdf5 *.h5 *.emd *.py4dstem);;Any file (*)", "Plain HDF5": "HDF5 File (*.hdf5 *.h5;;Any file (*)", - "PNG": "PNG File (*.png);;Any file (*)", - "TIFF": "TIFF File (*.tiff *.tif *.tff);;Any File (*)", + "PNG (display)": "PNG File (*.png);;Any file (*)", + "TIFF (display)": "TIFF File (*.tiff *.tif *.tff);;Any File (*)", "TIFF (raw)": "TIFF File (*.tiff *.tif *.tff);;Any File (*)", } @@ -177,8 +179,8 @@ def get_savefile_name(self, file_format) -> str: "Raw float32": ".raw", "py4DSTEM HDF5": ".h5", "Plain HDF5": ".h5", - "PNG": ".png", - "TIFF": ".tiff", + "PNG (display)": ".png", + "TIFF (display)": ".tiff", "TIFF (raw)": ".tiff", } From 05172ebe9d5a89350277baff2ff4b56fc9f2dcb8 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 14:19:29 -0500 Subject: [PATCH 28/33] typo --- src/py4D_browser/update_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 10369af..9609caa 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -187,7 +187,7 @@ def update_real_space_view(self, reset=False): self.fft_widget.setImage( fft.T, autoLevels=False, levels=levels, autoRange=reset ) - self.fft_widget_text.setText("Vitual Image FFT") + self.fft_widget_text.setText("Virtual Image FFT") def update_diffraction_space_view(self, reset=False): From 3b6c726df23421bb2cbf9547d94c31591f45bc13 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Mon, 5 Feb 2024 17:31:57 -0500 Subject: [PATCH 29/33] reset FFT range when mode switches --- src/py4D_browser/update_views.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 9609caa..41df316 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -184,10 +184,11 @@ def update_real_space_view(self, reset=False): if self.fft_source_action_group.checkedAction().text() == "Virtual Image FFT": fft = np.abs(np.fft.fftshift(np.fft.fft2(new_view))) ** 0.5 levels = (np.min(fft), np.percentile(fft, 99.9)) + mode_switch = self.fft_widget_text.textItem.toPlainText() != "Virtual Image FFT" + self.fft_widget_text.setText("Virtual Image FFT") self.fft_widget.setImage( - fft.T, autoLevels=False, levels=levels, autoRange=reset + fft.T, autoLevels=False, levels=levels, autoRange=mode_switch ) - self.fft_widget_text.setText("Virtual Image FFT") def update_diffraction_space_view(self, reset=False): @@ -256,10 +257,11 @@ def update_diffraction_space_view(self, reset=False): log_clip = np.maximum(1e-10, np.percentile(np.maximum(DP, 0.0), 0.1)) fft = np.abs(np.fft.fftshift(np.fft.fft2(np.log(np.maximum(DP, log_clip))))) levels = (np.min(fft), np.percentile(fft, 99.9)) + mode_switch = self.fft_widget_text.textItem.toPlainText() != "EWPC" + self.fft_widget_text.setText("EWPC") self.fft_widget.setImage( - fft.T, autoLevels=False, levels=levels, autoRange=reset + fft.T, autoLevels=False, levels=levels, autoRange=mode_switch ) - self.fft_widget_text.setText("EWPC") def update_realspace_detector(self): From 9e94fe9f2b22fa4998638f6226aee4b4d9fb6091 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Tue, 6 Feb 2024 09:13:28 -0500 Subject: [PATCH 30/33] scale FFT to have isotropic pixel size even for non square scans --- src/py4D_browser/update_views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index 41df316..f6281e7 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -189,6 +189,7 @@ def update_real_space_view(self, reset=False): self.fft_widget.setImage( fft.T, autoLevels=False, levels=levels, autoRange=mode_switch ) + self.fft_widget.getImageItem().setRect(0,0,fft.shape[1],fft.shape[1]) def update_diffraction_space_view(self, reset=False): From 54215bdcfc179577e8e251ed5fa10aac6cd68824 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Tue, 6 Feb 2024 09:16:02 -0500 Subject: [PATCH 31/33] autorange after fft update --- src/py4D_browser/update_views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/py4D_browser/update_views.py b/src/py4D_browser/update_views.py index f6281e7..7b7c332 100644 --- a/src/py4D_browser/update_views.py +++ b/src/py4D_browser/update_views.py @@ -189,7 +189,10 @@ def update_real_space_view(self, reset=False): self.fft_widget.setImage( fft.T, autoLevels=False, levels=levels, autoRange=mode_switch ) - self.fft_widget.getImageItem().setRect(0,0,fft.shape[1],fft.shape[1]) + self.fft_widget.getImageItem().setRect(0, 0, fft.shape[1], fft.shape[1]) + if mode_switch: + # Need to autorange after setRect + self.fft_widget.autoRange() def update_diffraction_space_view(self, reset=False): From 1320c4b15e31cf37cb5de2d3452c76fe0b82936d Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Tue, 6 Feb 2024 09:30:08 -0500 Subject: [PATCH 32/33] update README with description of the controls --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e0f833..e68e9d3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,14 @@ The GUI is available on PyPI and conda-forge: ## Usage Run `py4DGUI` in your terminal to open the GUI. Then just drag and drop a 4D-STEM dataset into the window! -Move the virtual detector and the real-space selector using the mouse or using the keyboard shortcuts: WASD moves the detector and IJKL moves the selector, holding down shift to move 5 pixels at a time. +### Controls +* Move the virtual detector and the real-space selector using the mouse or using the keyboard shortcuts: WASD moves the detector and IJKL moves the selector, and holding down shift moves 5 pixels at a time. +* Auto scaling of both views is on by default. Press the "Autoscale" buttons in the bottom right to disable. Press either button to apply automatic scaling once, or Shift + click to lock autoscaling back on. +* Different shapes of virtual detector are available in the "Detector Shape" menu, and different detector responses are available in the "Detector Response" menu. +* The information in the bottom bar contains the details of the virtual detector used to generate the images, and can be entered into py4DSTEM to generate the same image. +* The FFT pane can be switched between displaying the FFT of the virtual image and displaying the [exit wave power cepstrum](https://doi.org/10.1016/j.ultramic.2020.112994). +* Virtual images can be exported either as the scaled and clipped displays shown in the GUI or as raw data. The exact datatype stored in the raw TIFF image depends on both the datatype of the dataset and the type of virtual image being displayed (in particular, integer datatypes are converted internally to floating point to prevent overflows when generating any synthesized virtual images). +* If the [EMPAD-G2 Raw Reader](https://github.com/sezelt/empad2) is installed in the same environment, an extra menu will appear that allows the concatenated binary format data to be background subtracted and calibrated in the GUI. You can also save the calibrated data as an HDF5 file for later analysis. ![Demonstration](/images/demo.gif) From a156fc17ed00e396de5a2e6311ebaac655fd83a5 Mon Sep 17 00:00:00 2001 From: Steven Zeltmann Date: Wed, 7 Feb 2024 11:05:04 -0500 Subject: [PATCH 33/33] update comment --- src/py4D_browser/main_window.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py4D_browser/main_window.py b/src/py4D_browser/main_window.py index eade414..0b4ef66 100644 --- a/src/py4D_browser/main_window.py +++ b/src/py4D_browser/main_window.py @@ -432,7 +432,7 @@ def setup_views(self): self.fft_widget = pg.ImageView() self.fft_widget.setImage(np.zeros((512, 512))) - # FFT scale bar is tricky because pixel sizes commonly vary in each direction + # FFT scale bar self.fft_scale_bar = ScaleBar(pixel_size=1, units="1/px", width=10) self.fft_scale_bar.setParentItem(self.fft_widget.getView()) self.fft_scale_bar.anchor((1, 1), (1, 1), offset=(-40, -40))