Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adding interpolation order flag for shifting, default bicubic #703

Merged
merged 1 commit into from
Jan 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion py4DSTEM/process/phase/direct_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ def preprocess(
bf_disk_padding_px: int = 0,
dp_mask: np.ndarray = None,
in_place_datacube_modification: bool = False,
shifting_interpolation_order: int = 3,
fit_function: str = "plane",
plot_center_of_mass: str = "default",
plot_rotation: bool = True,
Expand Down Expand Up @@ -354,6 +355,8 @@ def preprocess(
in_place_datacube_modification: bool, optional
If True, the datacube will be preprocessed in-place. Note this is not possible
when either crop_patterns or positions_mask are used.
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
fit_function: str, optional
2D fitting function for CoM fitting. One of 'plane','parabola','bezier_two'
plot_center_of_mass: str, optional
Expand Down Expand Up @@ -527,6 +530,7 @@ def preprocess(
None,
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
return_intensities_instead=True,
)

Expand Down Expand Up @@ -583,7 +587,7 @@ def preprocess(
self._vacuum_probe_intensity,
-probe_x0,
-probe_y0,
bilinear=False,
bilinear=True,
device=device,
)

Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/magnetic_ptychographic_tomography.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -264,6 +265,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -496,6 +499,7 @@ def preprocess(
self._positions_mask[index],
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

self._mean_diffraction_intensity.append(mean_diffraction_intensity_temp)
Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/magnetic_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -252,6 +253,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -559,6 +562,7 @@ def preprocess(
self._positions_mask[index],
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

self._mean_diffraction_intensity.append(mean_diffraction_intensity_temp)
Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/mixedstate_multislice_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -311,6 +312,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -498,6 +501,7 @@ def preprocess(
self._positions_mask,
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

# explicitly transfer arrays to storage
Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/mixedstate_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -257,6 +258,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -444,6 +447,7 @@ def preprocess(
self._positions_mask,
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

# explicitly transfer arrays to storage
Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/multislice_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -285,6 +286,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -472,6 +475,7 @@ def preprocess(
self._positions_mask,
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

# explicitly transfer arrays to storage
Expand Down
33 changes: 23 additions & 10 deletions py4DSTEM/process/phase/parallax.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from py4DSTEM.process.utils.utils import electron_wavelength_angstrom
from py4DSTEM.visualize import return_scaled_histogram_ordering
from scipy.linalg import polar
from scipy.ndimage import distance_transform_edt
from scipy.ndimage import distance_transform_edt, shift
from scipy.special import comb

try:
Expand Down Expand Up @@ -316,6 +316,7 @@ def preprocess(
normalize_images: bool = True,
normalize_order=0,
descan_correction_fit_function: str = None,
shifting_interpolation_order: int = 3,
force_rotation_angle_deg: float = 0,
force_transpose: bool = None,
aligned_bf_image_guess: np.ndarray = None,
Expand Down Expand Up @@ -354,6 +355,8 @@ def preprocess(
descan_correction_fit_function: str, optional
If not None, descan correction will be performed using fit function.
One of "constant", "plane", "parabola", or "bezier_two".
shifting_interpolation_order: int, optional
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
plot_average_bf: bool, optional
If True, plots the average bright field image, using defocus_guess
realspace_mask: np.array, optional
Expand Down Expand Up @@ -433,15 +436,25 @@ def preprocess(

for rx in range(intensities_shifted.shape[0]):
for ry in range(intensities_shifted.shape[1]):
intensity_shifted = get_shifted_ar(
intensities_np[rx, ry],
-com_fitted_x[rx, ry] + center_x,
-com_fitted_y[rx, ry] + center_y,
bilinear=False,
device="cpu",
)

intensities_shifted[rx, ry] = intensity_shifted
if shifting_interpolation_order == 1:
# faster but may lead to gridding artifacts
intensities_shifted[rx, ry] = get_shifted_ar(
intensities_np[rx, ry].astype(np.float32),
-com_fitted_x[rx, ry] + center_x,
-com_fitted_y[rx, ry] + center_y,
bilinear=True,
device="cpu",
)
else:
intensities_shifted[rx, ry] = shift(
intensities_np[rx, ry].astype(np.float32),
(
-com_fitted_x[rx, ry] + center_x,
-com_fitted_y[rx, ry] + center_y,
),
order=shifting_interpolation_order,
mode="grid-wrap",
)

intensities = xp.asarray(intensities_shifted, xp.float32)

Expand Down
30 changes: 22 additions & 8 deletions py4DSTEM/process/phase/phase_base_class.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import numpy as np
from mpl_toolkits.axes_grid1 import ImageGrid
from py4DSTEM.visualize import show_complex
from scipy.ndimage import zoom
from scipy.ndimage import shift, zoom

try:
import cupy as cp
Expand Down Expand Up @@ -1352,6 +1352,7 @@ def _normalize_diffraction_intensities(
positions_mask,
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=3,
return_intensities_instead=False,
):
"""
Expand All @@ -1371,6 +1372,10 @@ def _normalize_diffraction_intensities(
If True, patterns are cropped to avoid wrap around of patterns
in_place_datacube_modification: bool
If True, the diffraction intensities are modified in-place
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
return_intensities_instead: bool
If True, function returns shifted intensities instead of amplitudes. Used in SSB.

Returns
-------
Expand Down Expand Up @@ -1434,13 +1439,22 @@ def _normalize_diffraction_intensities(
if not positions_mask[rx, ry]:
continue

intensities = get_shifted_ar(
diff_intensities[rx, ry],
-com_fitted_x[rx, ry],
-com_fitted_y[rx, ry],
bilinear=False,
device="cpu",
)
if shifting_interpolation_order == 1:
# faster but may lead to gridding artifacts
intensities = get_shifted_ar(
diff_intensities[rx, ry].astype(np.float32),
-com_fitted_x[rx, ry],
-com_fitted_y[rx, ry],
bilinear=True,
device="cpu",
)
else:
intensities = shift(
diff_intensities[rx, ry].astype(np.float32),
(-com_fitted_x[rx, ry], -com_fitted_y[rx, ry]),
order=shifting_interpolation_order,
mode="grid-wrap",
)

mean_intensity += np.sum(intensities)
if return_intensities_instead:
Expand Down
2 changes: 1 addition & 1 deletion py4DSTEM/process/phase/ptychographic_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -1077,7 +1077,7 @@ def _initialize_probe(
vacuum_probe_intensity,
-probe_x0,
-probe_y0,
bilinear=False,
bilinear=True,
device=device,
)

Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/ptychographic_tomography.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -416,6 +417,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -652,6 +655,7 @@ def preprocess(
self._positions_mask[index],
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

self._mean_diffraction_intensity.append(mean_diffraction_intensity_temp)
Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/singleslice_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -229,6 +230,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -417,6 +420,7 @@ def preprocess(
self._positions_mask,
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

# explicitly transfer arrays to storage
Expand Down
2 changes: 1 addition & 1 deletion py4DSTEM/process/phase/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ def evaluate_aperture(
xp.asarray(self._vacuum_probe_intensity, dtype=xp.float32),
self._origin[0],
self._origin[1],
bilinear=False,
bilinear=True,
device=self._device,
)
else:
Expand Down
4 changes: 4 additions & 0 deletions py4DSTEM/process/phase/xray_magnetic_ptychography.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ def preprocess(
self,
diffraction_intensities_shape: Tuple[int, int] = None,
reshaping_method: str = "bilinear",
shifting_interpolation_order: int = 3,
padded_diffraction_intensities_shape: Tuple[int, int] = None,
region_of_interest_shape: Tuple[int, int] = None,
dp_mask: np.ndarray = None,
Expand Down Expand Up @@ -250,6 +251,8 @@ def preprocess(
If None, no resampling of diffraction intenstities is performed
reshaping_method: str, optional
Method to use for reshaping, either 'bin, 'bilinear', or 'fourier' (default)
shifting_interpolation_order: int
Spline interpolation order used in shifting DPs to origin. Default is bi-cubic.
padded_diffraction_intensities_shape: (int,int), optional
Padded diffraction intensities shape.
If None, no padding is performed
Expand Down Expand Up @@ -557,6 +560,7 @@ def preprocess(
self._positions_mask[index],
crop_patterns,
in_place_datacube_modification,
shifting_interpolation_order=shifting_interpolation_order,
)

self._mean_diffraction_intensity.append(mean_diffraction_intensity_temp)
Expand Down
Loading