diff --git a/.gitignore b/.gitignore index ea4c46c..ec5e6fe 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ build/* dist */example_data/* *.h5 -.DS_Store \ No newline at end of file +.DS_Store +.ipynb_checkpoints \ No newline at end of file diff --git a/examples/fancy_ptycho_inline.ipynb b/examples/fancy_ptycho_inline.ipynb new file mode 100644 index 0000000..f5cab0f --- /dev/null +++ b/examples/fancy_ptycho_inline.ipynb @@ -0,0 +1,151 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "286054ce", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import cdtools\n", + "import torch as t\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "955bb242-e2ed-47c3-919c-1ea690681445", + "metadata": {}, + "outputs": [], + "source": [ + "# Load and inspect a dataset\n", + "\n", + "filename = 'example_data/lab_ptycho_data.cxi'\n", + "dataset = cdtools.datasets.Ptycho2DDataset.from_cxi(filename)\n", + "\n", + "dataset.inspect();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82f71fb4-f013-46bb-817b-1973ba23336a", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize a model from the dataset and move it to the GPU.\n", + "\n", + "model = cdtools.models.FancyPtycho.from_dataset(\n", + " dataset,\n", + " n_modes=3, # Use 3 incoherently mixing probe modes\n", + " oversampling=2, # Simulate the probe on a 2xlarger real-space array\n", + " probe_support_radius=120, # Force the probe to 0 outside a radius of 120 pix\n", + " propagation_distance=5e-3, # Propagate the initial probe guess by 5 mm\n", + " units='mm', # Set the units for the live plots\n", + " obj_view_crop=-50, # Expands the field of view in the object plot by 50 pix,\n", + ")\n", + "\n", + "if t.cuda.is_available():\n", + " model.to(device='cuda')\n", + " dataset.get_as(device='cuda')\n", + "\n", + "# Then, create a reconstructor object and view the initialized model\n", + "\n", + "recon = cdtools.reconstructors.AdamReconstructor(model, dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e22a65e-280b-428d-a6f5-f3206d22110b", + "metadata": {}, + "outputs": [], + "source": [ + "# Workaround reconstruction pattern for interactive plotting in jupyter:\n", + "# First, a standalone cell to plot the current model state\n", + "\n", + "model.inspect(dataset, replot_all=True);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81a768b5", + "metadata": {}, + "outputs": [], + "source": [ + "# Second, a cell for running the reconstruction. With this pattern, it is safe\n", + "# to interrupt the kernel. Then, the cell above can be re-run to refresh the plots.\n", + "while model.epoch < 50:\n", + " for loss in recon.optimize(1, lr=0.02, batch_size=10):\n", + " print(model.report())\n", + "\n", + "while model.epoch < 100:\n", + " for loss in recon.optimize(1, lr=0.005, batch_size=10):\n", + " print(model.report())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "237e9286-b6cf-41dc-aeb0-89abfe59b37c", + "metadata": {}, + "outputs": [], + "source": [ + "# Save out the results\n", + "\n", + "model.save_to_h5('lab_ptycho_reconstruction.h5', dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f1565b6", + "metadata": {}, + "outputs": [], + "source": [ + "# Finalize the plotting and create the comparison plot\n", + "\n", + "# This orthogonalizes the recovered probe modes. It is best to do so\n", + "# after saving the results, if you intend to initialize any further\n", + "# reconstructions with the probe.\n", + "model.tidy_probes()\n", + "\n", + "# Final plotting\n", + "model.inspect(dataset)\n", + "model.compare(dataset);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63ec3aa4-0d1c-4775-9fb2-3002d404faa4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/fancy_ptycho_interactive.ipynb b/examples/fancy_ptycho_interactive.ipynb new file mode 100644 index 0000000..0e9adad --- /dev/null +++ b/examples/fancy_ptycho_interactive.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "286054ce", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib widget\n", + "import cdtools\n", + "import torch as t\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "955bb242-e2ed-47c3-919c-1ea690681445", + "metadata": {}, + "outputs": [], + "source": [ + "# Load and inspect a dataset\n", + "\n", + "filename = 'example_data/lab_ptycho_data.cxi'\n", + "dataset = cdtools.datasets.Ptycho2DDataset.from_cxi(filename)\n", + "\n", + "dataset.inspect();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82f71fb4-f013-46bb-817b-1973ba23336a", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize a model from the dataset and move it to the GPU.\n", + "\n", + "model = cdtools.models.FancyPtycho.from_dataset(\n", + " dataset,\n", + " n_modes=3, # Use 3 incoherently mixing probe modes\n", + " oversampling=2, # Simulate the probe on a 2xlarger real-space array\n", + " probe_support_radius=120, # Force the probe to 0 outside a radius of 120 pix\n", + " propagation_distance=5e-3, # Propagate the initial probe guess by 5 mm\n", + " units='mm', # Set the units for the live plots\n", + " obj_view_crop=-50, # Expands the field of view in the object plot by 50 pix,\n", + ")\n", + "\n", + "if t.cuda.is_available():\n", + " model.to(device='cuda')\n", + " dataset.get_as(device='cuda')\n", + "\n", + "# Then, create a reconstructor object and view the initialized model\n", + "\n", + "recon = cdtools.reconstructors.AdamReconstructor(model, dataset)\n", + "model.inspect(dataset);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81a768b5", + "metadata": {}, + "outputs": [], + "source": [ + "# Workaround reconstruction pattern for interactive plotting in jupyter:\n", + "\n", + "# With this pattern, it is safe to interrupt the kernel. Doing so will\n", + "# trigger an update of the plots, at which point the current state can\n", + "# be viewed. Then this cell can be re-run to continue the reconstruction\n", + "while model.epoch < 50:\n", + " for loss in recon.optimize(1, lr=0.02, batch_size=10):\n", + " print(model.report())\n", + " model.inspect(dataset, min_interval=10)\n", + "\n", + "while model.epoch < 100:\n", + " for loss in recon.optimize(1, lr=0.005, batch_size=10):\n", + " print(model.report())\n", + " model.inspect(dataset, min_interval=10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "237e9286-b6cf-41dc-aeb0-89abfe59b37c", + "metadata": {}, + "outputs": [], + "source": [ + "# Save out the results\n", + "\n", + "model.save_to_h5('lab_ptycho_reconstruction.h5', dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f1565b6", + "metadata": {}, + "outputs": [], + "source": [ + "# Finalize the plotting and create the comparison plot\n", + "\n", + "# This orthogonalizes the recovered probe modes. It is best to do so\n", + "# after saving the results, if you intend to initialize any further\n", + "# reconstructions with the probe.\n", + "model.tidy_probes()\n", + "\n", + "# Final plotting\n", + "model.inspect(dataset)\n", + "model.compare(dataset);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63ec3aa4-0d1c-4775-9fb2-3002d404faa4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}