-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs: update docstrings and docs example output image
- Loading branch information
Eoghan O'Connell
committed
Aug 26, 2024
1 parent
97e7c5c
commit 93618fb
Showing
11 changed files
with
129 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,3 @@ | ||
sphinx==4.3.0 | ||
sphinxcontrib.bibtex>=2.0 | ||
sphinx_rtd_theme==1.0 | ||
|
||
sphinx | ||
sphinxcontrib.bibtex | ||
sphinx_rtd_theme |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,51 +1,73 @@ | ||
"""Fourier Transform options available | ||
"""Fourier Transform interfaces available | ||
This example visualizes the different backends and packages available to the | ||
user for performing Fourier transforms. | ||
- PyFFTW is initially slow, but over many FFTs is very quick. | ||
- CuPy using CUDA can be very fast, but is currently limited because we are | ||
transferring one image at a time to the GPU. | ||
""" | ||
import time | ||
import matplotlib.pylab as plt | ||
import numpy as np | ||
import qpretrieve | ||
from skimage.restoration import unwrap_phase | ||
|
||
# load the experimental data | ||
edata = np.load("./data/hologram_cell.npz") | ||
|
||
# get the available fft interfaces | ||
interfaces_available = qpretrieve.fourier.get_available_interfaces() | ||
|
||
prange = (-1, 5) | ||
frange = (0, 12) | ||
|
||
results = {} | ||
n_transforms = 100 | ||
|
||
# one transform | ||
results_1 = {} | ||
for fft_interface in interfaces_available: | ||
t0 = time.time() | ||
holo = qpretrieve.OffAxisHologram(data=edata["data"], | ||
fft_interface=fft_interface) | ||
holo.run_pipeline(filter_name="disk", filter_size=1/2) | ||
holo.run_pipeline(filter_name="disk", filter_size=1 / 2) | ||
bg = qpretrieve.OffAxisHologram(data=edata["bg_data"]) | ||
bg.process_like(holo) | ||
phase = unwrap_phase(holo.phase - bg.phase) | ||
mask = np.log(1 + np.abs(holo.fft_filtered)) | ||
results[fft_interface.__name__] = mask, phase | ||
t1 = time.time() | ||
results_1[fft_interface.__name__] = t1 - t0 | ||
num_interfaces = len(results_1) | ||
|
||
num_filters = len(results) | ||
# multiple transforms (should see speed increase for PyFFTW) | ||
results = {} | ||
for fft_interface in interfaces_available: | ||
t0 = time.time() | ||
for _ in range(n_transforms): | ||
holo = qpretrieve.OffAxisHologram(data=edata["data"], | ||
fft_interface=fft_interface) | ||
holo.run_pipeline(filter_name="disk", filter_size=1 / 2) | ||
bg = qpretrieve.OffAxisHologram(data=edata["bg_data"]) | ||
bg.process_like(holo) | ||
t1 = time.time() | ||
results[fft_interface.__name__] = t1 - t0 | ||
num_interfaces = len(results) | ||
|
||
# plot the properties of `qpi` | ||
fig = plt.figure(figsize=(8, 22)) | ||
fft_interfaces = list(results.keys()) | ||
speed_1 = list(results_1.values()) | ||
speed = list(results.values()) | ||
|
||
for row, name in enumerate(results): | ||
ax1 = plt.subplot(num_filters, 2, 2*row+1) | ||
ax1.set_title(name, loc="left") | ||
ax1.imshow(results[name][0], vmin=frange[0], vmax=frange[1]) | ||
fig, axes = plt.subplots(1, 2, figsize=(8, 5)) | ||
ax1, ax2 = axes | ||
labels = [fftstr[9:] for fftstr in fft_interfaces] | ||
|
||
ax2 = plt.subplot(num_filters, 2, 2*row+2) | ||
map2 = ax2.imshow(results[name][1], cmap="coolwarm", | ||
vmin=prange[0], vmax=prange[1]) | ||
plt.colorbar(map2, ax=ax2, fraction=.046, pad=0.02, label="phase [rad]") | ||
ax1.bar(range(num_interfaces), height=speed_1, color='lightseagreen') | ||
ax1.set_xticks(range(num_interfaces), labels=labels, | ||
rotation=45) | ||
ax1.set_ylabel("Speed (s)") | ||
ax1.set_title("1 Transform") | ||
|
||
ax1.axis("off") | ||
ax2.axis("off") | ||
ax2.bar(range(num_interfaces), height=speed, color='lightseagreen') | ||
ax2.set_xticks(range(num_interfaces), labels=labels, | ||
rotation=45) | ||
ax2.set_ylabel("Speed (s)") | ||
ax2.set_title(f"{n_transforms} Transforms") | ||
|
||
plt.suptitle("Speed of FFT Interfaces") | ||
plt.tight_layout() | ||
plt.show() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import scipy as sp | ||
import cupy as cp | ||
import cupyx.scipy.fft as cufft | ||
|
||
from .base import FFTFilter | ||
|
||
|
||
class FFTFilterCupy(FFTFilter): | ||
"""Wraps the cupy Fourier transform and uses it via the scipy backend | ||
""" | ||
is_available = True | ||
# sp.fft.set_backend(cufft) | ||
|
||
def _init_fft(self, data): | ||
"""Perform initial Fourier transform of the input data | ||
Parameters | ||
---------- | ||
data: 2d real-valued np.ndarray | ||
Input field to be refocused | ||
Returns | ||
------- | ||
fft_fdata: 2d complex-valued ndarray | ||
Fourier transform `data` | ||
""" | ||
data_gpu = cp.asarray(data) | ||
# likely an inefficiency here, could use `set_global_backend` | ||
with sp.fft.set_backend(cufft): | ||
fft_gpu = sp.fft.fft2(data_gpu) | ||
fft_cpu = fft_gpu.get() | ||
return fft_cpu | ||
|
||
def _ifft(self, data): | ||
"""Perform inverse Fourier transform""" | ||
data_gpu = cp.asarray(data) | ||
with sp.fft.set_backend(cufft): | ||
ifft_gpu = sp.fft.ifft2(data_gpu) | ||
ifft_cpu = ifft_gpu.get() | ||
return ifft_cpu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters