Created
June 23, 2022 21:03
-
-
Save jmeyers314/762d1cb9d12e6ed860a1a8d8ea6aacae to your computer and use it in GitHub Desktop.
Rubin Diffraction Spikes
This file contains hidden or 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
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "0fc96351-c77a-4cb5-94cf-c02a905568b5", | |
"metadata": { | |
"execution": { | |
"iopub.execute_input": "2022-06-23T20:54:11.732482Z", | |
"iopub.status.busy": "2022-06-23T20:54:11.730265Z", | |
"iopub.status.idle": "2022-06-23T20:54:12.344896Z", | |
"shell.execute_reply": "2022-06-23T20:54:12.344583Z", | |
"shell.execute_reply.started": "2022-06-23T20:54:11.732332Z" | |
}, | |
"tags": [] | |
}, | |
"outputs": [], | |
"source": [ | |
"import batoid\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"from ipywidgets import interact, FloatSlider, IntText, Checkbox, FloatText\n", | |
"from functools import lru_cache\n", | |
"# %matplotlib widget" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "b1e79ab6-28c5-4783-8e68-58d8f15229b9", | |
"metadata": { | |
"execution": { | |
"iopub.execute_input": "2022-06-23T20:54:12.345824Z", | |
"iopub.status.busy": "2022-06-23T20:54:12.345700Z", | |
"iopub.status.idle": "2022-06-23T20:54:12.391561Z", | |
"shell.execute_reply": "2022-06-23T20:54:12.391220Z", | |
"shell.execute_reply.started": "2022-06-23T20:54:12.345814Z" | |
}, | |
"tags": [] | |
}, | |
"outputs": [], | |
"source": [ | |
"telescope = batoid.Optic.fromYaml(\"LSST_r_baffles.yaml\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "0ecf7486-fbc9-41dd-a31c-c2b7494bfbd8", | |
"metadata": { | |
"execution": { | |
"iopub.execute_input": "2022-06-23T21:01:35.672282Z", | |
"iopub.status.busy": "2022-06-23T21:01:35.671795Z", | |
"iopub.status.idle": "2022-06-23T21:01:36.814788Z", | |
"shell.execute_reply": "2022-06-23T21:01:36.814504Z", | |
"shell.execute_reply.started": "2022-06-23T21:01:35.672240Z" | |
}, | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "f2f41384ea3e4c9499f0e23386fa7184", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"interactive(children=(FloatSlider(value=0.0, description='thx (deg)', max=2.0, min=-2.0, step=0.01), FloatSlid…" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"@lru_cache(10)\n", | |
"def getwf(thx, thy, wavelength, nx):\n", | |
" return batoid.wavefront(\n", | |
" telescope,\n", | |
" np.deg2rad(thx),\n", | |
" np.deg2rad(thy),\n", | |
" wavelength*1e-9,\n", | |
" nx=nx\n", | |
" ).array.mask\n", | |
"\n", | |
"@interact(\n", | |
" theta_x=FloatSlider(value=0, min=-2, max=2, step=0.01, description=\"thx (deg)\"),\n", | |
" theta_y=FloatSlider(value=0, min=-2, max=2, step=0.01, description=\"thy (deg)\"),\n", | |
" wavelength=FloatSlider(value=620.0, min=300.0, max=1100.0, step=1.0, description=\"wavelength (nm)\"),\n", | |
" nx=IntText(value=2048, description=\"nx\"),\n", | |
" diff=Checkbox(value=False, description=\"diff\")\n", | |
")\n", | |
"def pupil(theta_x, theta_y, wavelength, nx, diff):\n", | |
" mask = getwf(theta_x, theta_y, wavelength, nx)\n", | |
"\n", | |
" if diff:\n", | |
" mask = mask | getwf(0, 0, 620, nx=nx)\n", | |
" \n", | |
" plt.figure(figsize=(10, 10))\n", | |
" plt.imshow(mask)\n", | |
" plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "b052b3c5-ec58-4877-a3e8-99295327471d", | |
"metadata": { | |
"execution": { | |
"iopub.execute_input": "2022-06-23T21:01:59.640247Z", | |
"iopub.status.busy": "2022-06-23T21:01:59.639343Z", | |
"iopub.status.idle": "2022-06-23T21:02:01.749741Z", | |
"shell.execute_reply": "2022-06-23T21:02:01.749361Z", | |
"shell.execute_reply.started": "2022-06-23T21:01:59.640199Z" | |
}, | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "51798a13c6c54ed0a1e9a967d3eaa655", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"interactive(children=(FloatSlider(value=0.0, description='thx (deg)', max=2.0, min=-2.0, step=0.01), FloatSlid…" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"@lru_cache(10)\n", | |
"def getpsf(thx, thy, wavelength, rot, nx):\n", | |
" optic = telescope.withGlobalShift((0,0,0)) # make a copy\n", | |
" optic.stopSurface = optic.stopSurface.withLocalRotation(batoid.RotZ(np.deg2rad(rot)))\n", | |
" return batoid.fftPSF(\n", | |
" optic,\n", | |
" np.deg2rad(thx),\n", | |
" np.deg2rad(thy),\n", | |
" wavelength*1e-9,\n", | |
" nx=nx\n", | |
" )\n", | |
"\n", | |
"@interact(\n", | |
" theta_x=FloatSlider(value=0, min=-2, max=2, step=0.01, description=\"thx (deg)\"),\n", | |
" theta_y=FloatSlider(value=0, min=-2, max=2, step=0.01, description=\"thy (deg)\"),\n", | |
" wavelength=FloatSlider(value=620.0, min=300.0, max=1100.0, step=1.0, description=\"wavelength (nm)\"),\n", | |
" rot=FloatSlider(value=15.0, min=-360.0, max=360.0, step=15.0, stepdescription=\"rotation (deg)\"),\n", | |
" nx=IntText(value=2048, description=\"nx\"),\n", | |
" log=Checkbox(value=True, description=\"log scale\"),\n", | |
" vmin=FloatText(value=0),\n", | |
" vmax=FloatText(value=12),\n", | |
")\n", | |
"\n", | |
"def psf(theta_x, theta_y, wavelength, rot, nx, log, vmin, vmax):\n", | |
" lattice = getpsf(theta_x, theta_y, wavelength, rot, nx)\n", | |
" arr = lattice.array\n", | |
" extent0 = 0.5*np.sqrt(np.linalg.det(lattice.primitiveVectors))*np.r_[-1, 1]*arr.shape[0] # meters\n", | |
" extent0 /= 10e-6 # pixels\n", | |
" extent0 *= 0.2 # arcsec\n", | |
"\n", | |
" if log:\n", | |
" arr = np.log10(arr)\n", | |
" plt.figure(figsize=(10, 10))\n", | |
" plt.imshow(arr, cmap='inferno', vmin=vmin, vmax=vmax, extent=[*extent0, *extent0])\n", | |
" plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "fb592d47-6314-4507-80b2-626c16caf572", | |
"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.10.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment