From 87abd0d4962df76992ad3131175039c6aeb39089 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 09:25:27 -0500 Subject: [PATCH 01/38] video-tutorials/time_series_video.ipynb: remove execute bit --- video-tutorials/time_series_video.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 video-tutorials/time_series_video.ipynb diff --git a/video-tutorials/time_series_video.ipynb b/video-tutorials/time_series_video.ipynb old mode 100755 new mode 100644 From 3719aad39fd5bd7b0c16a5b1930e5b706728343b Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 09:26:26 -0500 Subject: [PATCH 02/38] data: move aas-tutorials/data/* here for consistency --- {aas-tutorials/data => data}/SgrTriax_DYN.dat | 0 {aas-tutorials/data => data}/SgrTriax_orbit.dat | 0 {aas-tutorials/data => data}/grb_table.ecsv | 0 {aas-tutorials/data => data}/k2_table.ecsv | 0 {aas-tutorials/data => data}/sn_2011fe_500.fits | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {aas-tutorials/data => data}/SgrTriax_DYN.dat (100%) rename {aas-tutorials/data => data}/SgrTriax_orbit.dat (100%) rename {aas-tutorials/data => data}/grb_table.ecsv (100%) rename {aas-tutorials/data => data}/k2_table.ecsv (100%) rename {aas-tutorials/data => data}/sn_2011fe_500.fits (100%) diff --git a/aas-tutorials/data/SgrTriax_DYN.dat b/data/SgrTriax_DYN.dat similarity index 100% rename from aas-tutorials/data/SgrTriax_DYN.dat rename to data/SgrTriax_DYN.dat diff --git a/aas-tutorials/data/SgrTriax_orbit.dat b/data/SgrTriax_orbit.dat similarity index 100% rename from aas-tutorials/data/SgrTriax_orbit.dat rename to data/SgrTriax_orbit.dat diff --git a/aas-tutorials/data/grb_table.ecsv b/data/grb_table.ecsv similarity index 100% rename from aas-tutorials/data/grb_table.ecsv rename to data/grb_table.ecsv diff --git a/aas-tutorials/data/k2_table.ecsv b/data/k2_table.ecsv similarity index 100% rename from aas-tutorials/data/k2_table.ecsv rename to data/k2_table.ecsv diff --git a/aas-tutorials/data/sn_2011fe_500.fits b/data/sn_2011fe_500.fits similarity index 100% rename from aas-tutorials/data/sn_2011fe_500.fits rename to data/sn_2011fe_500.fits From 14189eabbf45faffb33c4f190828353d61da985e Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 09:26:40 -0500 Subject: [PATCH 03/38] data/grb_table_lite.ecsv: remove another execute bit --- data/grb_table_lite.ecsv | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 data/grb_table_lite.ecsv diff --git a/data/grb_table_lite.ecsv b/data/grb_table_lite.ecsv old mode 100755 new mode 100644 From dfdeb5838eecbfad9125b722e4e082db5f384e30 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 09:32:01 -0500 Subject: [PATCH 04/38] Workshops: rename from aas-tutorial and tidy up contents --- .../aas231_tutorial.ipynb => Workshops/2018.01 - AAS231.ipynb | 0 .../aas233_tutorial.ipynb => Workshops/2019.01 - AAS233.ipynb | 0 .../aas234_tutorial.ipynb => Workshops/2019.06 - AAS234.ipynb | 0 .../adass29_tutorial.ipynb => Workshops/2019.10 - ADASS29.ipynb | 0 .../2019.11 - Petabytes to Science 3.ipynb | 0 .../aas235_tutorial.ipynb => Workshops/2020.01 - AAS235.ipynb | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename aas-tutorials/aas231_tutorial.ipynb => Workshops/2018.01 - AAS231.ipynb (100%) rename aas-tutorials/aas233_tutorial.ipynb => Workshops/2019.01 - AAS233.ipynb (100%) rename aas-tutorials/aas234_tutorial.ipynb => Workshops/2019.06 - AAS234.ipynb (100%) rename aas-tutorials/adass29_tutorial.ipynb => Workshops/2019.10 - ADASS29.ipynb (100%) rename aas-tutorials/petabytes3_tutorial.ipynb => Workshops/2019.11 - Petabytes to Science 3.ipynb (100%) rename aas-tutorials/aas235_tutorial.ipynb => Workshops/2020.01 - AAS235.ipynb (100%) diff --git a/aas-tutorials/aas231_tutorial.ipynb b/Workshops/2018.01 - AAS231.ipynb similarity index 100% rename from aas-tutorials/aas231_tutorial.ipynb rename to Workshops/2018.01 - AAS231.ipynb diff --git a/aas-tutorials/aas233_tutorial.ipynb b/Workshops/2019.01 - AAS233.ipynb similarity index 100% rename from aas-tutorials/aas233_tutorial.ipynb rename to Workshops/2019.01 - AAS233.ipynb diff --git a/aas-tutorials/aas234_tutorial.ipynb b/Workshops/2019.06 - AAS234.ipynb similarity index 100% rename from aas-tutorials/aas234_tutorial.ipynb rename to Workshops/2019.06 - AAS234.ipynb diff --git a/aas-tutorials/adass29_tutorial.ipynb b/Workshops/2019.10 - ADASS29.ipynb similarity index 100% rename from aas-tutorials/adass29_tutorial.ipynb rename to Workshops/2019.10 - ADASS29.ipynb diff --git a/aas-tutorials/petabytes3_tutorial.ipynb b/Workshops/2019.11 - Petabytes to Science 3.ipynb similarity index 100% rename from aas-tutorials/petabytes3_tutorial.ipynb rename to Workshops/2019.11 - Petabytes to Science 3.ipynb diff --git a/aas-tutorials/aas235_tutorial.ipynb b/Workshops/2020.01 - AAS235.ipynb similarity index 100% rename from aas-tutorials/aas235_tutorial.ipynb rename to Workshops/2020.01 - AAS235.ipynb From 5d7e89321faf44202c5a8abd837bdd82847f3358 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 09:34:49 -0500 Subject: [PATCH 05/38] Bulk rename non-workshop notebooks --- first-tutorials/basic.ipynb => Basic.ipynb | 0 first-tutorials/FITS_Images.ipynb => FITS Images.ipynb | 0 video-tutorials/fits_video.ipynb => FITS Video Tutorial.ipynb | 0 first-tutorials/kepler2_fovs.ipynb => K2 FOVs.ipynb | 0 .../NASA_Exoplanet_Archive.ipynb => NASA Exoplanet Archive.ipynb | 0 first-tutorials/planet_layers.ipynb => Planet Layers.ipynb | 0 ...solar_system_simulation.ipynb => Solar System Simulation.ipynb | 0 first-tutorials/spitzer_fov.ipynb => Spitzer FOV.ipynb | 0 ...me_series_video.ipynb => Timeseries Layer Video Tutorial.ipynb | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename first-tutorials/basic.ipynb => Basic.ipynb (100%) rename first-tutorials/FITS_Images.ipynb => FITS Images.ipynb (100%) rename video-tutorials/fits_video.ipynb => FITS Video Tutorial.ipynb (100%) rename first-tutorials/kepler2_fovs.ipynb => K2 FOVs.ipynb (100%) rename first-tutorials/NASA_Exoplanet_Archive.ipynb => NASA Exoplanet Archive.ipynb (100%) rename first-tutorials/planet_layers.ipynb => Planet Layers.ipynb (100%) rename first-tutorials/solar_system_simulation.ipynb => Solar System Simulation.ipynb (100%) rename first-tutorials/spitzer_fov.ipynb => Spitzer FOV.ipynb (100%) rename video-tutorials/time_series_video.ipynb => Timeseries Layer Video Tutorial.ipynb (100%) diff --git a/first-tutorials/basic.ipynb b/Basic.ipynb similarity index 100% rename from first-tutorials/basic.ipynb rename to Basic.ipynb diff --git a/first-tutorials/FITS_Images.ipynb b/FITS Images.ipynb similarity index 100% rename from first-tutorials/FITS_Images.ipynb rename to FITS Images.ipynb diff --git a/video-tutorials/fits_video.ipynb b/FITS Video Tutorial.ipynb similarity index 100% rename from video-tutorials/fits_video.ipynb rename to FITS Video Tutorial.ipynb diff --git a/first-tutorials/kepler2_fovs.ipynb b/K2 FOVs.ipynb similarity index 100% rename from first-tutorials/kepler2_fovs.ipynb rename to K2 FOVs.ipynb diff --git a/first-tutorials/NASA_Exoplanet_Archive.ipynb b/NASA Exoplanet Archive.ipynb similarity index 100% rename from first-tutorials/NASA_Exoplanet_Archive.ipynb rename to NASA Exoplanet Archive.ipynb diff --git a/first-tutorials/planet_layers.ipynb b/Planet Layers.ipynb similarity index 100% rename from first-tutorials/planet_layers.ipynb rename to Planet Layers.ipynb diff --git a/first-tutorials/solar_system_simulation.ipynb b/Solar System Simulation.ipynb similarity index 100% rename from first-tutorials/solar_system_simulation.ipynb rename to Solar System Simulation.ipynb diff --git a/first-tutorials/spitzer_fov.ipynb b/Spitzer FOV.ipynb similarity index 100% rename from first-tutorials/spitzer_fov.ipynb rename to Spitzer FOV.ipynb diff --git a/video-tutorials/time_series_video.ipynb b/Timeseries Layer Video Tutorial.ipynb similarity index 100% rename from video-tutorials/time_series_video.ipynb rename to Timeseries Layer Video Tutorial.ipynb From d5c42da0d5b4a02fa307f824e11a73e45d7512a6 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:32:51 -0500 Subject: [PATCH 06/38] Basic.ipynb: rewrite and add the crucial separate-pane instructions --- Basic.ipynb | 37 +++++++++++++--------------- data/separate-pane-instructions.jpg | Bin 0 -> 70286 bytes 2 files changed, 17 insertions(+), 20 deletions(-) create mode 100644 data/separate-pane-instructions.jpg diff --git a/Basic.ipynb b/Basic.ipynb index 6c041d6..6a6fdb1 100644 --- a/Basic.ipynb +++ b/Basic.ipynb @@ -4,16 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Using WorldWide Telescope inside the Jupyter notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook shows how to start up the WorldWide Telescope Jupyter widget, and how to subsequently modify its properties. You can find out more about using pywwt in the [documentation](http://pywwt.readthedocs.io).\n", + "## Barebones pywwt Notebook Template\n", "\n", - "We start off by importing the ``WWTJupyterWidget`` class:" + "This is the most basic way to get a [pywwt][pywwt] \"widget\" open in a Jupyter notebook or JupyterLab environment. Start off by importing the `WWTJupyterWidget` class:\n", + "\n", + "[pywwt]: https://pywwt.readthedocs.io/" ] }, { @@ -29,15 +24,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We then use this class to create the widget (note that the second ``wwt`` is needed to actually show the contents of the widget):" + "Then create an instance of the widget. Crucially, the second line (containing just `wwt`) causes the widget to be activated in your notebook, and not just assigned to a variable for later use." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "wwt = WWTJupyterWidget()\n", @@ -48,7 +41,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once the widget appears, you can then use the ``wwt`` object to change the visual settings, interact with WorldWide Telescope, and create annotations:" + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremeley** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "\n", + "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", + "\n", + "Finally, here's a tiny bit of sample code that controls the widget:" ] }, { @@ -59,9 +56,9 @@ "source": [ "from astropy import units as u\n", "from astropy.coordinates import SkyCoord\n", - "M31 = SkyCoord('00h42m44.330s +41d16m07.50s')\n", - "wwt.center_on_coordinates(M31, fov=10 * u.deg)\n", - "wwt.add_circle(M31, radius=1 * u.deg)\n", + "m31 = SkyCoord('00h42m44.330s +41d16m07.50s')\n", + "wwt.center_on_coordinates(m31, fov=10 * u.deg)\n", + "wwt.add_circle(m31, radius=1 * u.deg)\n", "wwt.constellation_figures = True" ] }, @@ -69,7 +66,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "You can find out more about interacting with the ``wwt`` object in [Basic controls](http://pywwt.readthedocs.io/en/latest/settings.html) and [Showing annotations](http://pywwt.readthedocs.io/en/latest/annotations.html)." + "Learn more about how to use pywwt at [our documentation](https://pywwt.readthedocs.io) or [our YouTube channel](https://www.youtube.com/playlist?list=PLozhKWk-h8YDYSRHzeLmznlQZHM29F18i)!" ] } ], @@ -89,9 +86,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/data/separate-pane-instructions.jpg b/data/separate-pane-instructions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..570f6cf6119e917c8462c26b3a10ebca4bb2a882 GIT binary patch literal 70286 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 literal 0 HcmV?d00001 From 908006a8d187c7d2f5b69b8ca920b273e2675079 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:33:13 -0500 Subject: [PATCH 07/38] Barebones.ipynb: rename from Basic.ipynb --- Basic.ipynb => Barebones.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Basic.ipynb => Barebones.ipynb (100%) diff --git a/Basic.ipynb b/Barebones.ipynb similarity index 100% rename from Basic.ipynb rename to Barebones.ipynb From 81931937df81f6400797d62d128bd9f55f48d5c2 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:35:12 -0500 Subject: [PATCH 08/38] FITS Images.ipynb: delete -- other notebooks are more thorough --- FITS Images.ipynb | 137 ---------------------------------------------- 1 file changed, 137 deletions(-) delete mode 100644 FITS Images.ipynb diff --git a/FITS Images.ipynb b/FITS Images.ipynb deleted file mode 100644 index cf398d0..0000000 --- a/FITS Images.ipynb +++ /dev/null @@ -1,137 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualizing FITS images on the sky\n", - "\n", - "In this notebook, we will visualize a WISE 12µm image towards the [Westerhout 5 star forming region](https://en.wikipedia.org/wiki/Westerhout_5), and we will take a look at some of the advanced visualization options.\n", - "\n", - "### Setting up the WWT widget\n", - "\n", - "We first import the ``WWTJupyterWidget`` class:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pywwt.jupyter import WWTJupyterWidget" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and we use this class to create the widget (note that the second ``wwt`` is needed to actually show the contents of the widget):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wwt = WWTJupyterWidget()\n", - "wwt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding an image data layer\n", - "\n", - "We are now ready to add the image data to WWT. We start off by calling ``add_image_layer`` to create the layer, and specify the name of the file:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "layer = wwt.layers.add_image_layer(os.path.join('..', 'data', 'w5.fits'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "WWT will automatically pan to the image. We can now show some controls to help us fine tune the appearance of the image:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "layer.controls" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here you can change the colormap, stretch, opacity (which you can use to compare the image to the background, or to another image). You can then also set the min/max of the stretch, and use the slider at the bottom to fine tune these values.\n", - "\n", - "If you prefer, you can also change these parameters programmatically:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "layer.cmap = 'plasma'\n", - "layer.vmin = 400\n", - "layer.vmax = 2000\n", - "layer.stretch = 'sqrt'\n", - "layer.opacity = 0.9" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that when you make the change programmatically, the control widgets update to mirror what you did. Fancy!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Credits\n", - "\n", - "This notebook was prepared by Thomas Robitaille." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 0de48427e46a48fa738e87c9555b0ba49ef85d1e Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:40:50 -0500 Subject: [PATCH 09/38] FITS Video Tutorial.ipynb: refresh --- FITS Video Tutorial.ipynb | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/FITS Video Tutorial.ipynb b/FITS Video Tutorial.ipynb index 44e5921..bf59197 100644 --- a/FITS Video Tutorial.ipynb +++ b/FITS Video Tutorial.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Loading and manipulating FITS files with `pywwt`." + "# Loading and manipulating FITS files with `pywwt`" ] }, { @@ -42,7 +42,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "_We download a FITS image of a galaxy in the infrared using `astroquery`._" + "We download a FITS image of a galaxy in the infrared using `astroquery`." ] }, { @@ -87,9 +87,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "*If you're using JupyterLab, right-click to the side of the viewer after it loads and select \"Create New View for Output.\"*\n", - "
\n", - "*Then, examine the area around the image by clicking and dragging the viewer or by pressing 'I', 'J', 'K', and 'L' as directional keys. Pinch in/out or press 'Z'/'X' to zoom.*" + "If you're using JupyterLab, right-click to the side of the viewer after it loads and select \"Create New View for Output.\":\n", + "\n", + "![](data/separate-pane-instructions.jpg)\n", + "\n", + "Examine the area around the image by clicking and dragging the viewer or by pressing 'I', 'J', 'K', and 'L' as directional keys. Pinch in/out or press 'Z'/'X' to zoom." ] }, { @@ -115,7 +117,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "*It's also possible to upload a local FITS image by providing the relative path to the file as the argument for* `add_image_layer()` -- *see the additional content at the end of the notebook for an example.*" + "It's also possible to upload a local FITS image by providing the relative path to the file as the argument for `add_image_layer()` — see the additional content at the end of the notebook for an example." ] }, { @@ -124,7 +126,7 @@ "source": [ "## Manipulate the image in `pywwt`.\n", "\n", - "_We test different values for each of the image layer's attributes. We end by choosing background layers that help visualize the galaxy in three wavelengths at once._" + "We test different values for each of the image layer's attributes. We end by choosing background layers that help visualize the galaxy in three wavelengths at once." ] }, { @@ -251,14 +253,15 @@ "metadata": {}, "outputs": [], "source": [ - "img2 = wwt.layers.add_image_layer('../data/m101_swiftx.fits')" + "img2 = wwt.layers.add_image_layer('data/m101_swiftx.fits')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "_This file was also created with `astroquery` through the following code:_\n", + "This file was also created with `astroquery` with the following code:\n", + "\n", "```\n", "img_list2 = SkyView.get_images(position='SN 2011FE', survey='SwiftXRTCnt', pixels=140)`\n", "img_list2[0].writeto('data/m101_swift')\n", @@ -285,9 +288,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If you're on our [BinderHub website](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/) or have pulled our [`pywwt-notebooks` GitHub repository](https://github.com/WorldWideTelescope/pywwt-notebooks/) to your local machine, [try this notebook](../aas-tutorials/aas234_tutorial.ipynb) on using `astropy` `Tables` to create data layers in `pywwt` next.\n", - "\n", - "Otherwise, you can find out more about adding layers [in our documentation](https://pywwt.readthedocs.io/en/stable/layers.html) and contact us with any comments or questions at the [WorldWide Telescope Forum](https://wwt-forum.org/) or by opening an issue or pull request at [`pywwt`'s main GitHub repository](https://github.com/WorldWideTelescope/pywwt). Thank you for trying out this example notebook on working with FITS images in `pywwt`." + "You can find out more about adding layers [in our documentation](https://pywwt.readthedocs.io/en/stable/layers.html) and contact us with any comments or questions at the [WorldWide Telescope Forum](https://wwt-forum.org/) or by opening an issue or pull request at [`pywwt`'s main GitHub repository](https://github.com/WorldWideTelescope/pywwt). Thank you for trying out this example notebook on working with FITS images in `pywwt`." ] }, { @@ -316,7 +317,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, From 18a02323e270e75e3ad8c9e8eeaa144e950c4230 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:42:21 -0500 Subject: [PATCH 10/38] Videos/2019.09 - Opening FITS images with pywwt.ipynb: rename --- .../2019.09 - Opening FITS images with pywwt.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename FITS Video Tutorial.ipynb => Videos/2019.09 - Opening FITS images with pywwt.ipynb (100%) diff --git a/FITS Video Tutorial.ipynb b/Videos/2019.09 - Opening FITS images with pywwt.ipynb similarity index 100% rename from FITS Video Tutorial.ipynb rename to Videos/2019.09 - Opening FITS images with pywwt.ipynb From 078a7a0084bc5c925b6e12b663d619f7da20a355 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:49:43 -0500 Subject: [PATCH 11/38] K2 FOVs.ipynb: delete -- superseded by FOV support --- K2 FOVs.ipynb | 114 -------------------------------------------------- 1 file changed, 114 deletions(-) delete mode 100644 K2 FOVs.ipynb diff --git a/K2 FOVs.ipynb b/K2 FOVs.ipynb deleted file mode 100644 index b66fc09..0000000 --- a/K2 FOVs.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pywwt.jupyter import WWTJupyterWidget\n", - "from astropy.coordinates import SkyCoord, concatenate \n", - "from astropy import units as u\n", - "import requests\n", - "wwt = WWTJupyterWidget()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "wwt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "k2_json = requests.get('https://github.com/KeplerGO/K2FootprintFiles/raw/master/json/k2-footprint.json')\n", - "k2_dict = k2_json.json()\n", - "channels = k2_dict['c12']['channels']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#wwt.clear_annotations()\n", - "\n", - "for index in channels:\n", - " ras = channels[str(index)]['corners_ra']\n", - " decs = channels[str(index)]['corners_dec']\n", - " corners = SkyCoord(ras, decs, unit=u.deg,)\n", - " wwt.add_polygon(corners, line_width=1.5*u.pixel, fill=True,\n", - " fill_color='silver', opacity=.1)\n", - " \n", - "wwt.center_on_coordinates(corners[0], fov = 30 * u.deg)\n", - "wwt.crosshairs = False" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wwt.background = 'Digitized Sky Survey (Color)'\n", - "#wwt.background = 'Tycho (Synthetic, Optical)' # for zoom\n", - "wwt.foreground = 'Planck Dust & Gas'\n", - "wwt.foreground_opacity = .5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "k2_138 = SkyCoord('23:15:47.77','-10:50:58.91',unit=(u.hourangle,u.deg))\n", - "print(corners[0], k2_138)\n", - "#wwt.center_on_coordinates(k2_138, fov=60*u.deg, instant=False)\n", - "wwt.center_on_coordinates(k2_138, fov=1*u.deg, instant=False)\n", - "wwt.add_circle(k2_138, fill=False, radius = 10*u.arcsec)\n", - "#wwt.render('k2_138.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Credits\n", - "\n", - "This notebook was prepared by O. Justin Otor with contributions from Thomas Robitaille." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 3290e0ab724d41626fde9eada7d7451bec66ce59 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:54:48 -0500 Subject: [PATCH 12/38] Barebones.ipynb: iterate right-click instructions --- Barebones.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Barebones.ipynb b/Barebones.ipynb index 6a6fdb1..969520e 100644 --- a/Barebones.ipynb +++ b/Barebones.ipynb @@ -45,6 +45,8 @@ "\n", "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", "\n", + "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth.\n", + "\n", "Finally, here's a tiny bit of sample code that controls the widget:" ] }, From a15af97fba92ebf26113ce764b9836905032e995 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 10:56:58 -0500 Subject: [PATCH 13/38] NASA Exoplanet Archive.ipynb: update and polish --- NASA Exoplanet Archive.ipynb | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/NASA Exoplanet Archive.ipynb b/NASA Exoplanet Archive.ipynb index ddfe12f..bc9a3c7 100644 --- a/NASA Exoplanet Archive.ipynb +++ b/NASA Exoplanet Archive.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Visualizing the NASA exoplanet archive" + "## Visualizing the NASA Exoplanet Archive" ] }, { @@ -31,7 +31,8 @@ "source": [ "import os\n", "from astropy.table import Table\n", - "exoplanets = Table.read(os.path.join('..', 'data', 'planets_2019.09.30_16.25.03.votable'))" + "\n", + "exoplanets = Table.read(os.path.join('data', 'planets_2019.09.30_16.25.03.votable'))" ] }, { @@ -72,7 +73,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "and we use this class to create the widget (note that the second ``wwt`` is needed to actually show the contents of the widget):" + "and we use this class to create the pywwt \"widget\". Crucially, the second line (containing just `wwt`) is needed to insert the widget into the notebook, and not just assign it to a variable." ] }, { @@ -89,6 +90,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremeley** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "\n", + "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", + "\n", + "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth.\n", + "\n", "### Adding a tabular data layer\n", "\n", "We are now ready to add the data to WWT. We start off by calling ``add_table_layer`` to create the layer:" @@ -318,9 +325,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 54d7e0fd9768588651022c5464a096e2d7145aed Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:01:18 -0500 Subject: [PATCH 14/38] Oops, fix "extremeley" --- Barebones.ipynb | 2 +- NASA Exoplanet Archive.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Barebones.ipynb b/Barebones.ipynb index 969520e..95ec08c 100644 --- a/Barebones.ipynb +++ b/Barebones.ipynb @@ -41,7 +41,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremeley** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", "\n", "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", "\n", diff --git a/NASA Exoplanet Archive.ipynb b/NASA Exoplanet Archive.ipynb index bc9a3c7..8b48388 100644 --- a/NASA Exoplanet Archive.ipynb +++ b/NASA Exoplanet Archive.ipynb @@ -90,7 +90,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremeley** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", "\n", "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", "\n", From 4a4c16b1e3441def10b21774bff3e2b01a12bb44 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:02:56 -0500 Subject: [PATCH 15/38] Planet Layers.ipynb: polish a bit --- Planet Layers.ipynb | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Planet Layers.ipynb b/Planet Layers.ipynb index 56ce884..a22561a 100644 --- a/Planet Layers.ipynb +++ b/Planet Layers.ipynb @@ -11,9 +11,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This notebook shows how to show data in the WorldWide Telescope Jupyter widget, specifically on the surface of a planet. You can find out more about using pywwt in the [documentation](http://pywwt.readthedocs.io).\n", + "This notebook shows how to plot tabular data on the surface of a planet using the AAS WorldWide Telescope through [pywwt](https://pywwt.readthedocs.io/). You can find out more about using pywwt in the [documentation](https://pywwt.readthedocs.io).\n", "\n", - "We start off by importing the ``WWTJupyterWidget`` class:" + "Start off by importing the `WWTJupyterWidget` class:" ] }, { @@ -29,15 +29,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We then use this class to create the widget (note that the second ``wwt`` is needed to actually show the contents of the widget):" + "We use this class to create the pywwt \"widget\". Crucially, the second line below (containing just `wwt`) is needed to insert the widget into the notebook, and not just assign it to a variable:" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "wwt = WWTJupyterWidget()\n", @@ -48,7 +46,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once the widget appears, you can then use the ``wwt`` object to change the current view to the Earth:" + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "\n", + "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", + "\n", + "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth.\n", + "\n", + "Once the widget appears, you can then use the `wwt` object to change the current view to the Earth:" ] }, { @@ -113,9 +117,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 549e34fd433fb6bbbe8e40101e7ac449e2bfdace Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:14:40 -0500 Subject: [PATCH 16/38] Solar System Simulation.ipynb: twiddle and use the WWT internal clock --- Solar System Simulation.ipynb | 80 ++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/Solar System Simulation.ipynb b/Solar System Simulation.ipynb index 18538d4..7466c89 100644 --- a/Solar System Simulation.ipynb +++ b/Solar System Simulation.ipynb @@ -1,17 +1,16 @@ { "cells": [ { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "from pywwt.jupyter import WWTJupyterWidget\n", - "from astropy.coordinates import SkyCoord, concatenate\n", - "from astropy import units as u\n", - "from astropy.time import Time\n", - "import time\n", - "wwt = WWTJupyterWidget()" + "# A Simple Solar System Simulation\n", + "\n", + "This notebook demonstrates some basic controls of the [pywwt] Jupyter widget in its 3D (really, 4D) Solar System mode.\n", + "\n", + "[pywwt]: https://pywwt.readthedocs.io/\n", + "\n", + "First, we import the necessary modules:" ] }, { @@ -20,9 +19,36 @@ "metadata": {}, "outputs": [], "source": [ + "from pywwt.jupyter import WWTJupyterWidget\n", + "from astropy.coordinates import SkyCoord\n", + "from astropy import units as u\n", + "from astropy.time import Time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we create the interactive pywwt \"widget\" and show it in the notebook:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt = WWTJupyterWidget()\n", "wwt" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Turn on the 3D Solar System mode and adjust a few view parameters, including significantly exaggerating the size of the planets to make them more visible:" + ] + }, { "cell_type": "code", "execution_count": null, @@ -30,9 +56,15 @@ "outputs": [], "source": [ "wwt.set_view('Solar System')\n", - "wwt.solar_system.scale = 99\n", - "wwt.solar_system.track_object('sun')\n", - "wwt.solar_system.orbits = False" + "wwt.solar_system.scale = 99 # scale up the planet size very unrealistically!\n", + "wwt.solar_system.track_object('sun')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Choose a nice angle that will show several planets:" ] }, { @@ -44,21 +76,21 @@ "wwt.center_on_coordinates(SkyCoord(339.32980758, 20.78999814, unit=u.deg), fov=.6*u.deg)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, set the time of WWT's internal clock and adjust its rate to make the planets move at a nice pace:" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "# show three earth months of the SS in 2019\n", - "tm = Time('2019-07-01')\n", - "tm.format = 'jd'\n", - "start = tm.value\n", - "\n", - "while(tm.value - start <= 92):\n", - " wwt.set_current_time(tm)\n", - " time.sleep(.1)\n", - " tm = Time(tm.value + .5, format='jd')" + "wwt.set_current_time(Time('2019-07-01'))\n", + "wwt.play_time(rate=300000) # 300,000 times faster than real time" ] }, { @@ -67,7 +99,7 @@ "source": [ "## Credits\n", "\n", - "This notebook was prepared by O. Justin Otor with contributions from Thomas Robitaille." + "This notebook was prepared by O. Justin Otor with contributions from Thomas Robitaille and Peter K. G. Williams." ] } ], @@ -87,9 +119,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 840b7d55f8caf449002543e68432e1e39927944c Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:17:21 -0500 Subject: [PATCH 17/38] Spitzer FOV.ipynb: delete -- qt based and doesn't look great --- Spitzer FOV.ipynb | 91 ----------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 Spitzer FOV.ipynb diff --git a/Spitzer FOV.ipynb b/Spitzer FOV.ipynb deleted file mode 100644 index bf3db7c..0000000 --- a/Spitzer FOV.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from astropy import units as u\n", - "from astropy.coordinates import SkyCoord\n", - "from astropy.table import Table" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pywwt.qt import WWTQtClient" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data = Table.read('data/spitzer.tbl', format='ascii.ipac')\n", - "\n", - "modes = sorted(set(data['Instrument/Mode']))\n", - "\n", - "colors = ['blue', 'purple', 'pink', 'red', 'green']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wwt = WWTQtClient(block_until_ready=True)\n", - "wwt.foreground_opacity = 1.0\n", - "wwt.center_on_coordinates(SkyCoord.from_name('M31'), fov=5 * u.deg)\n", - "\n", - "for row in data[::5]:\n", - " coords = SkyCoord([row['ra1'], row['ra2'], row['ra3'], row['ra4']],\n", - " [row['dec1'], row['dec2'], row['dec3'], row['dec4']], unit='deg')\n", - " poly = wwt.add_polygon(coords)\n", - " poly.line_color = colors[modes.index(row['Instrument/Mode'])]\n", - " poly.fill_color = colors[modes.index(row['Instrument/Mode'])]\n", - " poly.fill = True\n", - " poly.opacity = 0.1\n", - " poly.hover_label = True\n", - " poly.label = 'AOR {}'.format(row['AORKEY'])\n", - "\n", - "wwt.wait()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Credits\n", - "\n", - "This notebook was prepared by O. Justin Otor with contributions from Thomas Robitaille." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 0827837cc97a56c367b76112a646c11f281a7b10 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:22:00 -0500 Subject: [PATCH 18/38] Timeseries Layer Video Tutorial.ipynb: revisit for new organization --- Timeseries Layer Video Tutorial.ipynb | 31 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Timeseries Layer Video Tutorial.ipynb b/Timeseries Layer Video Tutorial.ipynb index 3d4a1b1..1ff4153 100644 --- a/Timeseries Layer Video Tutorial.ipynb +++ b/Timeseries Layer Video Tutorial.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Visualizing time series data with `pywwt`." + "# Visualizing Time Series Data with `pywwt`" ] }, { @@ -48,9 +48,15 @@ "metadata": {}, "outputs": [], "source": [ - "bursts = Table.read('../data/grb_table_lite.ecsv',\n", - " format='ascii.ecsv')\n", - "bursts" + "bursts = Table.read('../data/grb_table_lite.ecsv', format='ascii.ecsv')\n", + "bursts # print out out to get a sense of what the data are like" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Adjust the date formatting to match what WWT accepts:" ] }, { @@ -81,6 +87,17 @@ "wwt" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "\n", + "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", + "\n", + "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth." + ] + }, { "cell_type": "code", "execution_count": null, @@ -170,9 +187,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If you're on our [BinderHub website](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/) or have pulled our [`pywwt-notebooks` GitHub repository](https://github.com/WorldWideTelescope/pywwt-notebooks/) to your local machine, try the example in [this notebook](../aas-tutorials/aas233_tutorial.ipynb) on plotting K2's footprint and yield in `pywwt` next. (The notebook you just read is an updated version of the second example in that file.)\n", - "\n", - "Otherwise, you can find out more about adding layers [in our documentation](https://pywwt.readthedocs.io/en/stable/layers.html) and contact us with any comments or questions at the [WorldWide Telescope Forum](https://wwt-forum.org/) or by opening an issue or pull request at [`pywwt`'s main GitHub repository](https://github.com/WorldWideTelescope/pywwt). Thank you for trying out this example notebook on visualizing time series data in `pywwt`." + "You can find out more about adding layers [in our documentation](https://pywwt.readthedocs.io/en/stable/layers.html) and contact us with any comments or questions at the [WorldWide Telescope Forum](https://wwt-forum.org/) or by opening an issue or pull request at [`pywwt`'s main GitHub repository](https://github.com/WorldWideTelescope/pywwt). Thank you for trying out this example notebook on visualizing time series data in `pywwt`." ] }, { @@ -201,7 +216,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, From 031743a1e7e6da414bf6351845df4694bf170d33 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:22:33 -0500 Subject: [PATCH 19/38] Videos/2019.10 - Timeseries Tables in pywwt.ipynb: rename from top directory --- .../2019.10 - Timeseries Tables in pywwt.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Timeseries Layer Video Tutorial.ipynb => Videos/2019.10 - Timeseries Tables in pywwt.ipynb (100%) diff --git a/Timeseries Layer Video Tutorial.ipynb b/Videos/2019.10 - Timeseries Tables in pywwt.ipynb similarity index 100% rename from Timeseries Layer Video Tutorial.ipynb rename to Videos/2019.10 - Timeseries Tables in pywwt.ipynb From 68139b6bc60649cf752bcba982d66be61116ed2f Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:23:17 -0500 Subject: [PATCH 20/38] Videos/2019.09 - Opening FITS images with pywwt.ipynb: fix data path --- Videos/2019.09 - Opening FITS images with pywwt.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Videos/2019.09 - Opening FITS images with pywwt.ipynb b/Videos/2019.09 - Opening FITS images with pywwt.ipynb index bf59197..ddc1e8c 100644 --- a/Videos/2019.09 - Opening FITS images with pywwt.ipynb +++ b/Videos/2019.09 - Opening FITS images with pywwt.ipynb @@ -253,7 +253,7 @@ "metadata": {}, "outputs": [], "source": [ - "img2 = wwt.layers.add_image_layer('data/m101_swiftx.fits')" + "img2 = wwt.layers.add_image_layer('../data/m101_swiftx.fits')" ] }, { From eda4b2fa9fb798aa55039674332773f6a176ed47 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:28:12 -0500 Subject: [PATCH 21/38] README.md: sync up with reorg --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5d746a7..51347bd 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,18 @@ any of the following links will launch an example notebook in the cloud: [AAS]: https://aas.org/ [WorldWide Telescope]: http://www.worldwidetelescope.org/ -* [Add a simple overlaid annotation](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/first-tutorials/basic.ipynb) -* [Visualizing the NASA exoplanet archive](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/first-tutorials/NASA_Exoplanet_Archive.ipynb) -* [Explore which parts of the sky have been observed by the NASA K2 mission](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/first-tutorials/kepler2_fovs.ipynb) -* [Plot earthquake data on the surface of the Earth](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/first-tutorials/planet_layers.ipynb) -* [Animate the motions of the Solar System planets in 3D](http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/first-tutorials/solar_system_simulation.ipynb) +* [Visualizing the NASA exoplanet archive][nasa-exo] +* [Plot earthquake data on the surface of the Earth][earthquakes] +* [Animate the motions of the Solar System planets in 3D][sol-sys-sim] + +[nasa-exo]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/NASA%20Exoplanet%20Archive.ipynb +[earthquakes]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/Planet%20Layers.ipynb +[sol-sys-sim]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/Solar%20System%20Simulation.ipynb *Note: it is usually fast to launch these notebooks, but if updates were recently merged into this repository, you may have to wait a few minutes for the backing software images to be rebuilt.* - ## Testing the BinderHub infrastructure locally If you’d like to make changes to this repository and want to test how they’ll From 5441be4624317156a9d11c218f07df4e6caf723a Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:33:03 -0500 Subject: [PATCH 22/38] Workshops/2018.01 - AAS231.ipynb: add disclaimer and get it sorta working --- Workshops/2018.01 - AAS231.ipynb | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Workshops/2018.01 - AAS231.ipynb b/Workshops/2018.01 - AAS231.ipynb index c476c3e..4cc0a0d 100644 --- a/Workshops/2018.01 - AAS231.ipynb +++ b/Workshops/2018.01 - AAS231.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AAS231 WWT Workshop Notebook (January 2018; Washington, DC)\n", + "\n", + "*Please note: these notebooks are preserved for posterity but not kept up-to-date, so you might run into issues with older notebooks.*" + ] + }, { "cell_type": "code", "execution_count": null, @@ -17,9 +26,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "wwt" @@ -31,7 +38,6 @@ "metadata": {}, "outputs": [], "source": [ - "print(layers.keys())\n", "print(type(sorted(wwt._available_layers)))" ] }, @@ -131,8 +137,8 @@ "metadata": {}, "outputs": [], "source": [ - "available_layers = {}\n", - "#available_layers['visible'] = {'twomass': {'full_name': '2mass survey', 'thumbnail': None},'iras': {'full_name': 'iras', 'thumbnail': None}}\n", + "#available_layers = {}\n", + "available_layers['visible'] = {'twomass': {'full_name': '2mass survey', 'thumbnail': None},'iras': {'full_name': 'iras', 'thumbnail': None}}\n", " \n", "class ImageryLayers:\n", " def __init__(self, layers_dict):\n", @@ -456,9 +462,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 365e7019d911c30ae5fa06fd43683f73b4eae83b Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 11:38:08 -0500 Subject: [PATCH 23/38] Workshops/2019.01 - AAS233.ipynb: update and add disclaimer --- Workshops/2019.01 - AAS233.ipynb | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Workshops/2019.01 - AAS233.ipynb b/Workshops/2019.01 - AAS233.ipynb index 69333c8..9a6194c 100644 --- a/Workshops/2019.01 - AAS233.ipynb +++ b/Workshops/2019.01 - AAS233.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AAS233 WWT Workshop Notebook (January 2019; Seattle, WA)\n", + "\n", + "*Please note: these notebooks are preserved for posterity but not kept up-to-date, so you might run into issues with older notebooks.*" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -72,8 +81,8 @@ "metadata": {}, "outputs": [], "source": [ - "xarch = NasaExoplanetArchive.get_confirmed_planets_table()\n", - "xarch.keep_columns(['pl_hostname', 'pl_letter', 'st_dist', 'ra', 'dec'])" + "# xarch = NasaExoplanetArchive.get_confirmed_planets_table()\n", + "# xarch.keep_columns(['pl_hostname', 'pl_letter', 'st_dist', 'ra', 'dec'])" ] }, { @@ -82,8 +91,7 @@ "metadata": {}, "outputs": [], "source": [ - "#xarch = Table.read('https://raw.githubusercontent.com/WorldWideTelescope/pywwt-notebooks/master/aas-tutorials/data/k2_table.ecsv',\n", - "# format='ascii.ecsv')" + "xarch = Table.read('../data/k2_table.ecsv', format='ascii.ecsv')" ] }, { @@ -279,15 +287,12 @@ "metadata": {}, "outputs": [], "source": [ - "bursts = Table.read('https://raw.githubusercontent.com/WorldWideTelescope/pywwt-notebooks/master/aas-tutorials/data/grb_table.ecsv',\n", - " format='ascii.ecsv')" + "bursts = Table.read('../data/grb_table.ecsv', format='ascii.ecsv')" ] }, { "cell_type": "markdown", - "metadata": { - "scrolled": false - }, + "metadata": {}, "source": [ "*(Again, open a new cell above this one and see what the table looks like by entering `bursts` and running it.)*" ] @@ -527,9 +532,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 3a9ebb94515098ac5f8a5f0f6ba9759941405524 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 14:43:02 -0500 Subject: [PATCH 24/38] Workshops/2019.06 - AAS234.ipynb: freshen --- Workshops/2019.06 - AAS234.ipynb | 43 ++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/Workshops/2019.06 - AAS234.ipynb b/Workshops/2019.06 - AAS234.ipynb index 66025ed..b75caf8 100644 --- a/Workshops/2019.06 - AAS234.ipynb +++ b/Workshops/2019.06 - AAS234.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AAS234 WWT Workshop Notebook (June 2019; St. Loui, MO)\n", + "\n", + "*Please note: these notebooks are preserved for posterity but not kept up-to-date, so you might run into issues with older notebooks.*" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -43,15 +52,6 @@ "from pywwt.jupyter import WWTJupyterWidget" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**If you're using Jupyter Lab, after running the next cell to create the `wwt` object, right-click the white area to the right of the viewer and select \"Create New View for Output.\"**\n", - "\n", - "This will create a new area with a viewer that you can view at all times, even as you can scroll through the rest of notebook. Try to avoid having both viewers on the screen at the same time to avoid glitchiness." - ] - }, { "cell_type": "code", "execution_count": null, @@ -62,6 +62,17 @@ "wwt" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "\n", + "![Right click and select \"Create New View for Output\"](../data/separate-pane-instructions.jpg)\n", + "\n", + "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -86,8 +97,8 @@ "metadata": {}, "outputs": [], "source": [ - "xarch = NasaExoplanetArchive.get_confirmed_planets_table()\n", - "xarch.keep_columns(['pl_hostname', 'pl_letter', 'st_dist', 'ra', 'dec'])" + "#xarch = NasaExoplanetArchive.get_confirmed_planets_table()\n", + "#xarch.keep_columns(['pl_hostname', 'pl_letter', 'st_dist', 'ra', 'dec'])" ] }, { @@ -96,9 +107,9 @@ "metadata": {}, "outputs": [], "source": [ - "#xarch = Table.read('https://raw.githubusercontent.com/WorldWideTelescope/'\n", - "# 'pywwt-notebooks/master/aas-tutorials/data/k2_table.ecsv',\n", - "# format='ascii.ecsv')" + "xarch = Table.read('https://raw.githubusercontent.com/WorldWideTelescope/'\n", + " 'pywwt-notebooks/master/aas-tutorials/data/k2_table.ecsv',\n", + " format='ascii.ecsv')" ] }, { @@ -765,9 +776,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 811923434254273bb809b1a71e27a3f72ce09533 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 14:48:15 -0500 Subject: [PATCH 25/38] Workshops/2019.10 - ADASS29.ipynb: freshen --- Workshops/2019.10 - ADASS29.ipynb | 99 +++++++------------------------ 1 file changed, 21 insertions(+), 78 deletions(-) diff --git a/Workshops/2019.10 - ADASS29.ipynb b/Workshops/2019.10 - ADASS29.ipynb index 50c4092..173d057 100644 --- a/Workshops/2019.10 - ADASS29.ipynb +++ b/Workshops/2019.10 - ADASS29.ipynb @@ -6,6 +6,10 @@ "source": [ "# Welcome to the ADASS29 interactive visualization tutorial!\n", "\n", + "## Oct 2019; Groningen, NL\n", + "\n", + "*Please note: these notebooks are preserved for posterity but not kept up-to-date, so you might run into issues with older notebooks.*\n", + "\n", "Here are some helpful links:\n", "\n", "- [The tutorial landing page](https://wwt-forum.org/t/researcher-workshop-wwt-adass29-groningen-netherlands-2019-october-6/70)\n", @@ -23,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -39,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -57,29 +61,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "WWTJupyterWidget(layout=Layout(align_self='stretch', height='400px'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "wwt = WWTJupyterWidget()\n", "wwt" @@ -98,6 +82,8 @@ "3. Still in this notebook pane, left-click on the blue bar next to the WWT widget area. It should hide.\n", "4. If you like, click-and-drag the notebook tab that says \"Output View\" to move it to a different area of the screen. I like it at the top.\n", "\n", + "![Right click and select \"Create New View for Output\"](../data/separate-pane-instructions.jpg)\n", + "\n", "Stop here so we can bring it back together and introduce the first activity.\n", "\n", "---" @@ -674,19 +660,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Filename: (No file associated with this HDUList)\n", - "No. Name Ver Type Cards Dimensions Format\n", - " 0 PRIMARY 1 PrimaryHDU 141 (500, 500) float32 \n" - ] - } - ], + "outputs": [], "source": [ "from astroquery.skyview import SkyView\n", "\n", @@ -705,18 +681,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/a/lib/python3.7/site-packages/reproject/interpolation/core_celestial.py:26: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", - " if not np.issubdtype(array.dtype, np.float):\n" - ] - } - ], + "outputs": [], "source": [ "twomass_layer = wwt.layers.add_image_layer(twomass_img)" ] @@ -835,24 +802,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "50a95d0baf1b4860b1c6f4f1984ad755", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "WWTJupyterWidget(layout=Layout(align_self='stretch', height='400px'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "wwt2 = WWTJupyterWidget()\n", "wwt2" @@ -869,18 +821,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/a/lib/python3.7/site-packages/reproject/interpolation/core_celestial.py:26: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", - " if not np.issubdtype(array.dtype, np.float):\n" - ] - } - ], + "outputs": [], "source": [ "twomass_layer2 = wwt2.layers.add_image_layer(twomass_img)\n", "swift_layer2 = wwt2.layers.add_image_layer(datapath('m101_swiftx.fits'), opacity=0.5, cmap='plasma')" @@ -897,7 +840,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1017,7 +960,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, From ffed35eb8ace4922fd45013db5b89e15bc12ce49 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 14:52:55 -0500 Subject: [PATCH 26/38] Workshops/2019.11 - Petabytes to Science 3.ipynb: freshen --- Workshops/2019.11 - Petabytes to Science 3.ipynb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Workshops/2019.11 - Petabytes to Science 3.ipynb b/Workshops/2019.11 - Petabytes to Science 3.ipynb index 2f792b3..8bf55ec 100644 --- a/Workshops/2019.11 - Petabytes to Science 3.ipynb +++ b/Workshops/2019.11 - Petabytes to Science 3.ipynb @@ -6,6 +6,10 @@ "source": [ "# Welcome to the Petabytes-3 WWT vizualization tutorial!\n", "\n", + "## Nov 2019; Cambridge, MA, USA\n", + "\n", + "*Please note: these notebooks are preserved for posterity but not kept up-to-date, so you might run into issues with older notebooks.*\n", + "\n", "Here are some helpful links:\n", "\n", "- [The tutorial landing page](https://wwt-forum.org/t/researcher-workshop-wwt-petabytes-to-science-3-boston-usa-2019-nov-8/86/2)\n", @@ -78,6 +82,8 @@ "3. Still in this notebook pane, left-click on the blue bar next to the WWT widget area. It should hide.\n", "4. If you like, click-and-drag the notebook tab that says \"Output View\" to move it to a different area of the screen. I like it at the top.\n", "\n", + "![Right click and select \"Create New View for Output\"](../data/separate-pane-instructions.jpg)\n", + "\n", "Stop here so we can bring it back together and introduce the first activity.\n", "\n", "---" @@ -954,7 +960,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, From 6912a28dc4caa8cb4aea0f1db54cc89e6de29d08 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 14:58:41 -0500 Subject: [PATCH 27/38] Workshops/2020.01 - AAS235.ipynb: freshen --- Workshops/2020.01 - AAS235.ipynb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Workshops/2020.01 - AAS235.ipynb b/Workshops/2020.01 - AAS235.ipynb index 2959122..3f3743d 100644 --- a/Workshops/2020.01 - AAS235.ipynb +++ b/Workshops/2020.01 - AAS235.ipynb @@ -6,6 +6,10 @@ "source": [ "# Welcome to the AAS235 pyWWT tutorial!\n", "\n", + "## Jan 2020; Honolulu, HI, USA\n", + "\n", + "*Please note: these notebooks are preserved for posterity but not kept up-to-date, so you might run into issues with older notebooks.*\n", + "\n", "Here are some helpful links:\n", "\n", "- [The tutorial landing page](https://wwt-forum.org/t/researcher-workshop-wwt-aas235-honolulu-usa-2020-january-5/71)\n", @@ -44,8 +48,8 @@ "outputs": [], "source": [ "def datapath(*args):\n", - " from os.path import join\n", - " return join('..', 'data', *args)" + " from os.path import join, pardir\n", + " return join(pardir, 'data', *args)" ] }, { @@ -78,6 +82,8 @@ "3. Still in this notebook pane, left-click on the blue bar next to the WWT widget area. It should hide.\n", "4. If you like, click-and-drag the notebook tab that says \"Output View\" to move it to a different area of the screen. I like it at the top.\n", "\n", + "![Right click and select \"Create New View for Output\"](../data/separate-pane-instructions.jpg)\n", + "\n", "Stop here so we can bring it back together and introduce the first activity.\n", "\n", "---" @@ -858,7 +864,7 @@ "\n", "**Note**: alas, we *also* have a race condition bug that sometimes pops up here. You might need to reload the page for the images to appear.\n", "\n", - "Other one-liner web servers might work, but not all of them serve file with the correct `Content-Type` headers, which is needed for everything to work here.\n", + "Other one-liner web servers might work, but not all of them serve files with the correct `Content-Type` headers, which is needed for everything to work here.\n", "\n", "---" ] From 00bc84c62508abba0f1c5cb9b29a9903a74f3068 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 16:27:45 -0500 Subject: [PATCH 28/38] Videos/2019.09 - Opening FITS images with pywwt.ipynb: fix image link --- Videos/2019.09 - Opening FITS images with pywwt.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Videos/2019.09 - Opening FITS images with pywwt.ipynb b/Videos/2019.09 - Opening FITS images with pywwt.ipynb index ddc1e8c..c15724d 100644 --- a/Videos/2019.09 - Opening FITS images with pywwt.ipynb +++ b/Videos/2019.09 - Opening FITS images with pywwt.ipynb @@ -89,7 +89,7 @@ "source": [ "If you're using JupyterLab, right-click to the side of the viewer after it loads and select \"Create New View for Output.\":\n", "\n", - "![](data/separate-pane-instructions.jpg)\n", + "![](../data/separate-pane-instructions.jpg)\n", "\n", "Examine the area around the image by clicking and dragging the viewer or by pressing 'I', 'J', 'K', and 'L' as directional keys. Pinch in/out or press 'Z'/'X' to zoom." ] From f2849c5b7b351a8be7b37da7b3d95e9af32a5e40 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 11 Feb 2020 16:30:57 -0500 Subject: [PATCH 29/38] Start Here.ipynb: add this --- Start Here.ipynb | 111 ++++++++++++++++++ ...o_stacked_406x158_black-on-transparent.png | Bin 0 -> 36079 bytes 2 files changed, 111 insertions(+) create mode 100644 Start Here.ipynb create mode 100644 data/wwt-logo_stacked_406x158_black-on-transparent.png diff --git a/Start Here.ipynb b/Start Here.ipynb new file mode 100644 index 0000000..1ebbb2e --- /dev/null +++ b/Start Here.ipynb @@ -0,0 +1,111 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![AAS WorldWide Telescope logo](data/wwt-logo_stacked_406x158_black-on-transparent.png)\n", + "\n", + "# Example notebooks for pywwt\n", + "\n", + "Welcome! Here you’ll find notebooks for the [pywwt] package, which provides access to the [AAS] [WorldWide Telescope] inside Python and Jupyter environments.\n", + "\n", + "[pywwt]: https://pywwt.readthedocs.org/ \n", + "[AAS]: https://aas.org/\n", + "[WorldWide Telescope]: http://www.worldwidetelescope.org/\n", + "\n", + "### Feature Tutorials\n", + "\n", + "These notebooks tour some of the features of [pywwt]:\n", + "\n", + "* [**Visualizing the NASA exoplanet archive**][nasa-exo]\n", + "* [**Plot earthquake data on the surface of the Earth**][earthquakes]\n", + "* [**Animate the motions of the Solar System planets in 3D**][sol-sys-sim]\n", + "\n", + "[nasa-exo]: ./NASA%20Exoplanet%20Archive.ipynb\n", + "[earthquakes]: ./Planet%20Layers.ipynb\n", + "[sol-sys-sim]: ./Solar%20System%20Simulation.ipynb\n", + "\n", + "### Video Tutorials\n", + "\n", + "A selection of our notebooks come with YouTube videos showing how they were created!\n", + "\n", + "- **Timeseries Data Tables**: [video](https://youtu.be/cL9Hd7cKnNU), [notebook](./Videos/2019.10%20-%20Timeseries%20Tables%20in%20pywwt.ipynb) (Oct 2019)\n", + "- **Opening FITS Images**: [video](https://www.youtube.com/watch?v=ZxKvIAAjCeU), [notebook](./Videos/2019.09%20-%20Opening%20FITS%20images%20with%20pywwt.ipynb) (Sep 2019)\n", + "\n", + "*Please note that, since producing each video takes a lot of work, these materials are not frequently updated, so you may run into issues with older ones.*\n", + "\n", + "### Workshop Tutorials\n", + "\n", + "These notebooks were created for WWT instructional workshops presented at various conferences:\n", + "\n", + "- [**AAS 235**](./Workshops/2020.01%20-%20AAS235.ipynb) (Jan 2020; Honolulu, HI, USA)\n", + "- [**Petabytes to Science 3**](./Workshops/2019.11%20-%20Petabytes%20to%20Science%203.ipynb) (Nov 2019; Cambridge, MA, USA)\n", + "- [**ADASS 29**](./Workshops/2019.10%20-%20ADASS29.ipynb) (Oct 2019; Groningen, NL)\n", + "- [**AAS 234**](./Workshops/2019.06%20-%20AAS234.ipynb) (Jun 2019; St. Louis, MO, USA)\n", + "- [**AAS 233**](./Workshops/2019.01%20-%20AAS233.ipynb) (Jan 2019; Seattle, WA, USA)\n", + "- [**AAS 231**](./Workshops/2018.01%20-%20AAS231.ipynb) (Jan 2018; Washington, DC, USA)\n", + "\n", + "*Please note that these notebooks are being preserved for posterity but are not updated as pywwt evolves, so you may run into issues with older ones.*\n", + "\n", + "\n", + "## Credits\n", + "\n", + "Authorship information for each notebook is included in a statement at the end of each. If you [contribute][github] improvements to an existing notebook, you are strongly encouraged to add your name!\n", + "\n", + "\n", + "## Taking the Next Step\n", + "\n", + "Want to get more involved in the AAS WorldWide Telescope community? Here are some next steps you can take:\n", + "\n", + "- Want to stay up to date? Sign up for our newsletter: \n", + "- ... or follow us on social media:\n", + " - [@wwtelescope](https://twitter.com/wwtelescope) on Twitter\n", + " - [AASWorldWideTelescope](http://www.youtube.com/c/AASWorldWideTelescope) on YouTube\n", + " - [@wwtelescope](http://www.youtube.com/c/AASWorldWideTelescope) on Facebook\n", + "- Have questions or want to share ideas? Join our discussion forum: \n", + "- Want to explore WWT technology in depth? Visit the WWT Contributor Hub: \n", + "- To contribute to this notebook collection, visit the [WorldWideTelescope/pywwt-notebooks][github] repository on GitHub.\n", + "\n", + "[github]: https://github.com/WorldWideTelescope/pywwt-notebooks/\n", + "\n", + "\n", + "## Acknowledgments\n", + "\n", + "The AAS WorldWide Telescope system is a [.NET Foundation] project managed by\n", + "the non-profit [American Astronomical Society] (AAS). Work on WWT has been\n", + "supported by the AAS, the US [National Science Foundation] (grants [1550701]\n", + "and [1642446]), the [Gordon and Betty Moore Foundation], and [Microsoft].\n", + "\n", + "[.NET Foundation]: https://dotnetfoundation.org/\n", + "[American Astronomical Society]: https://aas.org/\n", + "[National Science Foundation]: https://www.nsf.gov/\n", + "[1550701]: https://www.nsf.gov/awardsearch/showAward?AWD_ID=1550701\n", + "[1642446]: https://www.nsf.gov/awardsearch/showAward?AWD_ID=1642446\n", + "[Gordon and Betty Moore Foundation]: https://www.moore.org/\n", + "[Microsoft]: https://www.microsoft.com/\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/wwt-logo_stacked_406x158_black-on-transparent.png b/data/wwt-logo_stacked_406x158_black-on-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..49642b5b3a9c7a857d0fc0a8e3d5de5bf10f0dbb GIT binary patch literal 36079 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 Date: Tue, 11 Feb 2020 16:35:18 -0500 Subject: [PATCH 30/38] README.md: update to point to the Start Here hub rather than individual notebooks --- README.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 51347bd..afd3ea6 100644 --- a/README.md +++ b/README.md @@ -2,24 +2,20 @@ This repository contains example notebooks for the [pywwt](https://pywwt.readthedocs.org) package, which provides access to the -[AAS] [WorldWide Telescope] inside Python and Jupyter environments. Clicking -any of the following links will launch an example notebook in the cloud: +[AAS] [WorldWide Telescope] inside Python and Jupyter environments. [AAS]: https://aas.org/ [WorldWide Telescope]: http://www.worldwidetelescope.org/ -* [Visualizing the NASA exoplanet archive][nasa-exo] -* [Plot earthquake data on the surface of the Earth][earthquakes] -* [Animate the motions of the Solar System planets in 3D][sol-sys-sim] +🚀🚀 [**Click here to run these examples in the cloud!**][launch] 🚀🚀 -[nasa-exo]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/NASA%20Exoplanet%20Archive.ipynb -[earthquakes]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/Planet%20Layers.ipynb -[sol-sys-sim]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/Solar%20System%20Simulation.ipynb +[launch]: http://binder.wwt-forum.org/v2/gh/WorldWideTelescope/pywwt-notebooks/master?urlpath=lab/tree/Start%20Here.ipynb -*Note: it is usually fast to launch these notebooks, but if updates were +*Note: it is usually fast to launch a notebook server, but if updates were recently merged into this repository, you may have to wait a few minutes for the backing software images to be rebuilt.* + ## Testing the BinderHub infrastructure locally If you’d like to make changes to this repository and want to test how they’ll From bc860f7e121159dc61f377fd11aec726e9ea6852 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 09:16:09 -0500 Subject: [PATCH 31/38] First Steps.ipynb: rename from Barebones.ipynb --- Barebones.ipynb => First Steps.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Barebones.ipynb => First Steps.ipynb (100%) diff --git a/Barebones.ipynb b/First Steps.ipynb similarity index 100% rename from Barebones.ipynb rename to First Steps.ipynb From 5dd27f21fe5f7b4cf79241518f0ecefe9d52bfae Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 10:20:56 -0500 Subject: [PATCH 32/38] First Steps.ipynb: revamp this to be a solid introduction --- First Steps.ipynb | 308 ++++++++++++++++++++++++++++++++++++++++++++-- Start Here.ipynb | 9 ++ 2 files changed, 304 insertions(+), 13 deletions(-) diff --git a/First Steps.ipynb b/First Steps.ipynb index 95ec08c..d441646 100644 --- a/First Steps.ipynb +++ b/First Steps.ipynb @@ -4,11 +4,24 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Barebones pywwt Notebook Template\n", + "# First Steps With pywwt\n", "\n", - "This is the most basic way to get a [pywwt][pywwt] \"widget\" open in a Jupyter notebook or JupyterLab environment. Start off by importing the `WWTJupyterWidget` class:\n", + "This notebook walks you through how to open a [pywwt] viewer \"widget\" in your Jupyter notebook or JupyterLab environment, and the basic ways that you can control the viewer. [pywwt] visualizes astronomical data and imagery in context using the [AAS] [WorldWide Telescope] rendering engine.\n", "\n", - "[pywwt]: https://pywwt.readthedocs.io/" + "[pywwt]: https://pywwt.readthedocs.io/\n", + "[AAS]: https://aas.org/\n", + "[WorldWide Telescope]: http://worldwidetelescope.org/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creating the Widget\n", + "\n", + "If you want to use `pywwt` in a notebook, the first step is always to import the [WWTJupyterWidget] class:\n", + "\n", + "[WWTJupyterWidget]: https://pywwt.readthedocs.io/en/stable/api/pywwt.jupyter.WWTJupyterWidget.html" ] }, { @@ -24,7 +37,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Then create an instance of the widget. Crucially, the second line (containing just `wwt`) causes the widget to be activated in your notebook, and not just assigned to a variable for later use." + "If you're running this notebook in the cloud, this command should *definitely* work — which, in this case, means that it will run without printing any error messages or warnings. If you get an `ImportError` error, your notebook session isn't able to load the `pywwt` Python module for some reason. The most straightforward reason might be that you haven't installed it — if that's the case, visit [the pywwt installation instructions](https://pywwt.readthedocs.io/en/stable/installation.html).\n", + "\n", + "Next we create an instance of the widget and assign it to a variable, conventionally named `wwt`. You’ll use this variable to control the viewer programmatically:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt = WWTJupyterWidget()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(If the first command succeeded, this one *really* ought to work. If an error occurs, [file an issue on the pywwt GitHub repository](https://github.com/WorldWideTelescope/pywwt/issues/new) and someone will help you.)\n", + "\n", + "To actually create a WWT viewer, just “run” a notebook cell containing the widget variable and nothing else:" ] }, { @@ -33,7 +66,6 @@ "metadata": {}, "outputs": [], "source": [ - "wwt = WWTJupyterWidget()\n", "wwt" ] }, @@ -41,13 +73,190 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "*If you're using JupyterLab* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", + "A window should appear that looks like a big black box. It might look like something isn't working, but if you click-and-drag inside the window, you should eventually see the galaxy swing into view. WWT is running inside your browser!\n", + "\n", + "If instead you just see a line of text that looks something like:\n", + "```\n", + "WWTJupyterWidget()\n", + "```\n", + "that means that the `pywwt` widget framework is not properly set up within your Jupyter environment — at the moment, additional setup needs to occur beyond simply installing the `pywwt` module. See [the pywwt installation instructions](https://pywwt.readthedocs.io/en/stable/installation.html) for guidance about how to set up the integration.\n", + "\n", + "## Side-By-Side Code and Viz\n", + "\n", + "*If you're using [JupyterLab](https://jupyterlab.readthedocs.io/)* and not just a plain Jupyter notebook, you can move the WWT view to a separate window pane. This is **extremely** useful since it lets you keep on typing code without scrolling WWT out of view. Here's how you do that:\n", "\n", "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", "\n", "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth.\n", "\n", - "Finally, here's a tiny bit of sample code that controls the widget:" + "You can then click-and-drag the tab corresponding to the new pywwt viewer and stick it to any side of your browser window that you wish.\n", + "\n", + "Finally, if you click the blue bar next to the viewer back in this notebook, you will hide it, decluttering your code." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Navigating the pywwt Viewer\n", + "\n", + "Here are the ways you can navigate around inside the pywwt viewer:\n", + "\n", + "- To pan around, click-and-drag the mouse like you would in an app like Google Maps\n", + " - Or, you can pan around by pressing the keys `i`, `j`, `k`, and `l`\n", + "- To zoom in and out, you can use the scroll wheel on your mouse, if you have one\n", + " - Or you can use a two-finger scroll on a Mac mouse or touchpad\n", + " - Or you can press the keys `z` and `x` to zoom in and out, respectively\n", + " - Or in some cases the Page-Up and Page-Down keys should work\n", + "- In the standard sky exploration mode, you can *roll* the angle of the viewer by holding down the Control key and then click-and-dragging.\n", + "- In the planet viewer mode, the Control-click-drag action will change the angle of the camera relative to the planetary surface\n", + "\n", + "If you ever get your viewer into a funky state that you can't escape, try:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.reset_view()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or close your widget window and create a new `wwt` variable." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Changing the Background Imagery\n", + "\n", + "By default, the pywwt viewer opens in a 2D \"sky mode\" showing a terapixel optical map of the entire sky, derived from the [Digitized Sky Survey](https://en.wikipedia.org/wiki/Digitized_Sky_Survey). Running the following cell will create some controls in your notebook that will let you choose a different all-sky map, or even blend between two maps:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.layer_controls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Changing the Viewer Mode\n", + "\n", + "The pywwt viewer can do more than just 2D sky exploration, however. This command will change the view to the 3D “Solar System” mode, which is actually a misnomer since it allows 3D exploration of much more than just the Solar System:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.set_view('solar system')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you enter this mode, keep on zooming out as far as you can go. The view will seem to stall once the solar system shrinks into a dot, but if you keep on going, you’ll eventually see the local stars move in 3D, then an artist’s conception of the Milky Way, then relatively nearby galaxies from the SDSS catalog. (The last of these might take some time to appear since the viewer needs to first download all of the galaxy data, then create a fairly intensive 3D rendering data structure.)\n", + "\n", + "To get back to the 2D sky mode, use:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.set_view('sky')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also view the major planets as 3D spheres:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.set_view('earth')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This mode allows you to overlay data on planetary surfaces and view topography with [DEM](https://en.wikipedia.org/wiki/Digital_elevation_model) maps. Check out Mars!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.set_view('mars')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Controlling the View Position\n", + "\n", + "You can command the pywwt viewer to look at a specific location. To demonstrate this, let's switch back to Sky Mode:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.set_view('sky')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can set the location using [AstroPy SkyCoord](https://docs.astropy.org/en/stable/coordinates/index.html) objects, so all of the flexibility of those objects is available for free:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from astropy.coordinates import SkyCoord\n", + "\n", + "wwt.center_on_coordinates(SkyCoord.from_name('M31'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or:" ] }, { @@ -57,18 +266,91 @@ "outputs": [], "source": [ "from astropy import units as u\n", - "from astropy.coordinates import SkyCoord\n", - "m31 = SkyCoord('00h42m44.330s +41d16m07.50s')\n", - "wwt.center_on_coordinates(m31, fov=10 * u.deg)\n", - "wwt.add_circle(m31, radius=1 * u.deg)\n", - "wwt.constellation_figures = True" + "\n", + "wwt.center_on_coordinates(\n", + " SkyCoord(ra = 13.1284*u.deg, dec = 56.6241*u.deg), \n", + " fov = 3*u.deg, # specifies the zoom level by setting the viewer's angular height\n", + " instant = False, # pan smoothly instead of moving abruptly\n", + ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Learn more about how to use pywwt at [our documentation](https://pywwt.readthedocs.io) or [our YouTube channel](https://www.youtube.com/playlist?list=PLozhKWk-h8YDYSRHzeLmznlQZHM29F18i)!" + "# Controlling the Clock\n", + "\n", + "We say that the pywwt viewer is actually four-dimensional, not just three-dimensional, since it has an internal clock that is integrated into the simulation: planet positions are calculated to high accuracy and data rendering can take into account the current time.\n", + "\n", + "To demonstrate this, let’s switch back to the Solar System Mode:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.set_view('solar system')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can set the time using [AstroPy Time](https://docs.astropy.org/en/stable/time/) objects:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from astropy.time import Time\n", + "\n", + "wwt.set_current_time(Time('1999-01-01'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can change the rate at which the clock runs:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.play_time(rate=3000000) # advance the WWT clock at 3,000,000 times realtime" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And you can pause it altogether:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.pause_time()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Next Steps\n", + "\n", + "Now that you’ve been introduced to the basics of the pywwt viewer, how about going back to the [Start Here](./Start%20Here.ipynb) notebook and trying some of our more in-depth tutorials?" ] } ], diff --git a/Start Here.ipynb b/Start Here.ipynb index 1ebbb2e..dea2bcc 100644 --- a/Start Here.ipynb +++ b/Start Here.ipynb @@ -18,10 +18,12 @@ "\n", "These notebooks tour some of the features of [pywwt]:\n", "\n", + "* [**First Steps**][first-steps] — getting acquainted with the basics of the pywwt viewer\n", "* [**Visualizing the NASA exoplanet archive**][nasa-exo]\n", "* [**Plot earthquake data on the surface of the Earth**][earthquakes]\n", "* [**Animate the motions of the Solar System planets in 3D**][sol-sys-sim]\n", "\n", + "[first-steps]: ./First%20Steps.ipynb\n", "[nasa-exo]: ./NASA%20Exoplanet%20Archive.ipynb\n", "[earthquakes]: ./Planet%20Layers.ipynb\n", "[sol-sys-sim]: ./Solar%20System%20Simulation.ipynb\n", @@ -85,6 +87,13 @@ "[Gordon and Betty Moore Foundation]: https://www.moore.org/\n", "[Microsoft]: https://www.microsoft.com/\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 9be5e01d7d7c235d6d2ea35401a3a52330c2fd3b Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 10:26:27 -0500 Subject: [PATCH 33/38] Start Here.ipynb: try to hone the feature tutorial headlines --- Start Here.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Start Here.ipynb b/Start Here.ipynb index dea2bcc..1bd1c27 100644 --- a/Start Here.ipynb +++ b/Start Here.ipynb @@ -19,9 +19,9 @@ "These notebooks tour some of the features of [pywwt]:\n", "\n", "* [**First Steps**][first-steps] — getting acquainted with the basics of the pywwt viewer\n", - "* [**Visualizing the NASA exoplanet archive**][nasa-exo]\n", - "* [**Plot earthquake data on the surface of the Earth**][earthquakes]\n", - "* [**Animate the motions of the Solar System planets in 3D**][sol-sys-sim]\n", + "* [**Visualizing Data Tables: the NASA Exoplanet Archive**][nasa-exo] — pl\n", + "* [**The Time Axis: Animating the Motions of the Solar System Planets in 3D**][sol-sys-sim]\n", + "* [**Visualizing Planetary Data: Earthquakes**][earthquakes]\n", "\n", "[first-steps]: ./First%20Steps.ipynb\n", "[nasa-exo]: ./NASA%20Exoplanet%20Archive.ipynb\n", From d5184a5c597135d5af2cc2273e841f12fa6f5e75 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 10:44:16 -0500 Subject: [PATCH 34/38] GRBs Over Time.ipynb: extract the GRB demo into a feature tutorial --- GRBs Over Time.ipynb | 320 +++++++++++++++++++++++++++++++++++++++++++ Start Here.ipynb | 8 +- 2 files changed, 325 insertions(+), 3 deletions(-) create mode 100644 GRBs Over Time.ipynb diff --git a/GRBs Over Time.ipynb b/GRBs Over Time.ipynb new file mode 100644 index 0000000..e266f8d --- /dev/null +++ b/GRBs Over Time.ipynb @@ -0,0 +1,320 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Time Axis: GRBs Over Time\n", + "\n", + "This notebook will demonstrate some of what you can do with WWT’s clock using a dataset of [gamma-ray burst](https://en.wikipedia.org/wiki/Gamma-ray_burst) events." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 1: Starting up pywwt\n", + "\n", + "The first thing to do is to open up a pywwt window in this notebook session. As is generally the case, we have to start with some Python imports:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pywwt.jupyter import WWTJupyterWidget" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll also set up a utility function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def datapath(*args):\n", + " from os.path import join\n", + " return join('data', *args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, create a widget and display it inline. (That's why the final line is a bare `wwt`.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt = WWTJupyterWidget()\n", + "wwt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If everything is working correctly, the above command should create a pywwt viewer that looks mostly like a black box. If you’re using the JupyterLab environment rather than a plain Jupyter notebook, it is *strongly recommended* that you move the viewer to its own window pane so that you can have your code and viz side-by-side:\n", + "\n", + "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", + "\n", + "If you don't get a menu or the menu doesn’t look like the one pictured, you are probably not using JupyterLab and will have to move the viewer cell down as you work your way through the notebook. See the [First Steps](./First%20Steps.ipynb) notebook for more information and troubleshooting tips if you don’t get a viewer at all." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 2: Loading tabular data with a time-series axis\n", + "\n", + "Now that the viewer is set up, we need some data. First, some imports:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from astropy.coordinates import SkyCoord\n", + "from astropy.table import Table\n", + "from astropy.time import Time, TimeDelta\n", + "from astropy import units as u\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we'll load up a table of GRB data. We'll print out the first few rows to get a sense of the data structure. In this case it's pretty simple." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bursts = Table.read(datapath('grb_table_lite.ecsv'), format='ascii.ecsv')\n", + "bursts[:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The WWT engine doesn't know enough to know that the Julian Date values above are actually dates (and not just some random floating-point measurements), so we convert them to the ISO8601 format:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bursts['dates_ISOT'] = Time(bursts['dates_JD'], format='jd').isot\n", + "bursts[:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 3: Plotting Data in (2+1)D\n", + "\n", + "To start showing the data, we create a \"table layer\":" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layer = wwt.layers.add_table_layer(\n", + " table = bursts, \n", + " frame = 'Sky', \n", + " lon_att = 'ra', # treat the column named \"ra\" as a longitude coordinate\n", + " lat_att = 'dec', # likewise for the column named \"dec\"\n", + " size_scale=200\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's tell the engine that we want to pay attention to the time axis of the table. **This will make all of the points disappear**, since the engine's clock is synchronized to your computer — it's plotting data for the current year, and our GRBs only go up to 2014." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layer.time_series = True\n", + "layer.time_att = 'dates_ISOT'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can check the engine's clock using the `get_current_time()` method:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.get_current_time()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's demonstrate that things are actually working by centering on the first GRB in both space *and* time — setting the WWT clock to just before it goes off." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "first_grb = bursts[0]\n", + "start_pos = SkyCoord(first_grb['ra'], first_grb['dec'], unit=u.deg)\n", + "start_time = Time(first_grb['dates_ISOT'], format='isot') - TimeDelta(5 * u.second)\n", + "\n", + "wwt.center_on_coordinates(start_pos)\n", + "wwt.set_current_time(start_time)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should see a white dot appear in the screen center after five seconds!\n", + "\n", + "The WWT timeseries support has the concept of a \"decay time\". Points that appear on the screen slowly fade over the decay timescale — according to the WWT simulation clock, that is, not wallclock time. The default is 16 days. That's a bit short for visualizing GRBs, so let's make it longer:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layer.time_decay = 1 * u.yr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's speed time up to see the GRBs pop off over time. If you find the right patch of the sky (namely, the ecliptic), you might also see the Sun and planets moving around at enhanced speed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.play_time(rate=3e6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you've had your fill, the following function call will reset the clock to run at real time:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.play_time()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How much time passed inside WWT?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.get_current_time() - start_time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Credits\n", + "\n", + "This notebook was prepared by:\n", + "\n", + "- O. Justin Otor\n", + "- Peter K. G. Williams\n", + "\n", + "With thanks to Mark SubbaRao for creating the first version of this demonstration." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Start Here.ipynb b/Start Here.ipynb index 1bd1c27..22eb3bf 100644 --- a/Start Here.ipynb +++ b/Start Here.ipynb @@ -19,12 +19,14 @@ "These notebooks tour some of the features of [pywwt]:\n", "\n", "* [**First Steps**][first-steps] — getting acquainted with the basics of the pywwt viewer\n", - "* [**Visualizing Data Tables: the NASA Exoplanet Archive**][nasa-exo] — pl\n", - "* [**The Time Axis: Animating the Motions of the Solar System Planets in 3D**][sol-sys-sim]\n", - "* [**Visualizing Planetary Data: Earthquakes**][earthquakes]\n", + "* [**Visualizing Data Tables: the NASA Exoplanet Archive**][nasa-exo] — plotting data in 2D and 3D\n", + "* [**The Time Axis: Gamma-Ray Bursts**][grbs] — adding a time axis to your data tables\n", + "* [**The Time Axis: Animating the Motions of the Solar System Planets in 3D**][sol-sys-sim] — a quick demonstration of the WWT clock\n", + "* [**Visualizing Planetary Data: Earthquakes**][earthquakes] — plotting data on a planetary surface\n", "\n", "[first-steps]: ./First%20Steps.ipynb\n", "[nasa-exo]: ./NASA%20Exoplanet%20Archive.ipynb\n", + "[grbs]: ./GRBs%20Over%20Time.ipynb\n", "[earthquakes]: ./Planet%20Layers.ipynb\n", "[sol-sys-sim]: ./Solar%20System%20Simulation.ipynb\n", "\n", From ce7ba2a4be329fcd3e033c1858ac897b74b962f6 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 10:50:23 -0500 Subject: [PATCH 35/38] NASA Exoplanet Archive.ipynb: link to GRBs Over Time --- NASA Exoplanet Archive.ipynb | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/NASA Exoplanet Archive.ipynb b/NASA Exoplanet Archive.ipynb index 8b48388..42e3fd4 100644 --- a/NASA Exoplanet Archive.ipynb +++ b/NASA Exoplanet Archive.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Visualizing the NASA Exoplanet Archive" + "# Visualizing the NASA Exoplanet Archive" ] }, { @@ -18,7 +18,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Loading the tabular data\n", + "---\n", + "\n", + "## Step 1: Loading the tabular data\n", "\n", "We start off by loading the table using the [astropy.table](https://docs.astropy.org/en/stable/table/) module:" ] @@ -55,7 +57,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Setting up the WWT widget\n", + "---\n", + "\n", + "## Step 2: Setting up the WWT widget\n", "\n", "We now import the ``WWTJupyterWidget`` class:" ] @@ -96,7 +100,9 @@ "\n", "If you don't get a menu when you right-click, or the menu doesn't look like the one pictured, you are using a plain Jupyter notebook and will have to scroll back and forth.\n", "\n", - "### Adding a tabular data layer\n", + "---\n", + "\n", + "## Step 3: Adding a tabular data layer\n", "\n", "We are now ready to add the data to WWT. We start off by calling ``add_table_layer`` to create the layer:" ] @@ -303,6 +309,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "---\n", + "\n", + "## What's Next\n", + "\n", + "To see how to plot a data table that contains a time axis, check out the [GRBs Over Time](./GRBs%20Over%20Time.ipynb) tutorial." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", "## Credits\n", "\n", "This notebook was prepared by Thomas Robitaille." From 0706764c35e934b363a2b1e48516b82176484b52 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 11:00:20 -0500 Subject: [PATCH 36/38] Visualizing Imagery.ipynb: extract the image overlay tutorial --- Start Here.ipynb | 9 +- Visualizing Imagery.ipynb | 357 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 359 insertions(+), 7 deletions(-) create mode 100644 Visualizing Imagery.ipynb diff --git a/Start Here.ipynb b/Start Here.ipynb index 22eb3bf..2284ca4 100644 --- a/Start Here.ipynb +++ b/Start Here.ipynb @@ -20,12 +20,14 @@ "\n", "* [**First Steps**][first-steps] — getting acquainted with the basics of the pywwt viewer\n", "* [**Visualizing Data Tables: the NASA Exoplanet Archive**][nasa-exo] — plotting data in 2D and 3D\n", + "* [**Visualizing Imagery: W5 and SN2011fe**][imagery] — visualizing FITS data\n", "* [**The Time Axis: Gamma-Ray Bursts**][grbs] — adding a time axis to your data tables\n", "* [**The Time Axis: Animating the Motions of the Solar System Planets in 3D**][sol-sys-sim] — a quick demonstration of the WWT clock\n", "* [**Visualizing Planetary Data: Earthquakes**][earthquakes] — plotting data on a planetary surface\n", "\n", "[first-steps]: ./First%20Steps.ipynb\n", "[nasa-exo]: ./NASA%20Exoplanet%20Archive.ipynb\n", + "[imagery]: ./Visualizing%20Imagery.ipynb\n", "[grbs]: ./GRBs%20Over%20Time.ipynb\n", "[earthquakes]: ./Planet%20Layers.ipynb\n", "[sol-sys-sim]: ./Solar%20System%20Simulation.ipynb\n", @@ -89,13 +91,6 @@ "[Gordon and Betty Moore Foundation]: https://www.moore.org/\n", "[Microsoft]: https://www.microsoft.com/\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/Visualizing Imagery.ipynb b/Visualizing Imagery.ipynb new file mode 100644 index 0000000..3a97029 --- /dev/null +++ b/Visualizing Imagery.ipynb @@ -0,0 +1,357 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualizing Image Data\n", + "\n", + "This notebook will demonstrate how to load and visualize astronomical images in the pywwt viewer." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 1: Starting up pywwt\n", + "\n", + "The first thing to do is to open up a pywwt window in this notebook session. As is generally the case, we have to start with some Python imports:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pywwt.jupyter import WWTJupyterWidget" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll also set up a utility function to help us load data files stored alongside this notebook:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def datapath(*args):\n", + " from os.path import join\n", + " return join('data', *args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, create a widget and display it inline. (That's why the final line is a bare `wwt`.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt = WWTJupyterWidget()\n", + "wwt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If everything is working correctly, the above command should create a pywwt viewer that looks mostly like a black box. If you’re using the JupyterLab environment rather than a plain Jupyter notebook, it is *strongly recommended* that you move the viewer to its own window pane so that you can have your code and viz side-by-side:\n", + "\n", + "![Right click and select \"Create New View for Output\"](data/separate-pane-instructions.jpg)\n", + "\n", + "If you don't get a menu or the menu doesn’t look like the one pictured, you are probably not using JupyterLab and will have to move the viewer cell down as you work your way through the notebook. See the [First Steps](./First%20Steps.ipynb) notebook for more information and troubleshooting tips if you don’t get a viewer at all." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 2: Visualizing a Local FITS file\n", + "\n", + "We'll start by visualizing a WISE 12µm image towards the [Westerhout 5 star forming region](https://en.wikipedia.org/wiki/Westerhout_5) and taking a look at some of the advanced visualization options.\n", + "\n", + "Images, like data tables, are represented in WWT as \"layers\" that can be added to the view. With a standard FITS file, all you need to do is provide a pathname:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layer = wwt.layers.add_image_layer(datapath('w5.fits'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The viewer will automatically center and zoom to the image you've loaded. You may get a warning from the `reproject` module; this can safely be ignored.\n", + "\n", + "\"Printing\" the following variable will create a set of widgets that let you adjust how the data are visualized:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layer.controls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The image color scaling is controlled by the sliders in the \"Fine min/max\" row; the \"Coarse min/max\" boxes control the bounds that are placed on the range of those sliders.\n", + "\n", + "You should try sliding the image opacity back and forth to check the agreement between the morphology of the W5 image and the WWT all-sky map.\n", + "\n", + "All of the parameters that are controlled by the widgets above can be manipulated programmatically as well. Let's set a bunch of them at once:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "layer.cmap = 'plasma'\n", + "layer.vmin = 400\n", + "layer.vmax = 1000\n", + "layer.stretch = 'sqrt'\n", + "layer.opacity = 0.9" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the settings in the widgets adjusted automatically to match what you entered. Fancy!\n", + "\n", + "After you're done playing around, let's reset the WWT widget:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.reset()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 3: Loading data from remote sources\n", + "\n", + "Because pywwt is a Python module, not a standalone application, it gains a lot of power by being able to integrate with other components of the modern, Web-oriented astronomical software ecosystem.\n", + "\n", + "For instance, it is easy to use the Python module [astroquery](https://astroquery.readthedocs.io/en/latest/) to load in data directly from archive queries, without the requirement to save any files locally. Let's fetch 2MASS Ks-band images of the field of supernova 2011fe. This might take a little while since the Python kernel needs to download the data from MAST." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from astroquery.skyview import SkyView\n", + "\n", + "img_list = SkyView.get_images(\n", + " position='SN 2011FE', \n", + " survey='2MASS-K', \n", + " pixels=500 # you can adjust the size if you want\n", + ")\n", + "assert len(img_list) == 1 # there's only one matching item in this example\n", + "twomass_img = img_list[0]\n", + "twomass_img.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Once the FITS data are available, we can display them in pywwt using the same command as before:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "twomass_layer = wwt.layers.add_image_layer(twomass_img)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once again you should see the view automatically center on your image. Let's adjust the background imagery to be more relevant:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.background = wwt.imagery.ir.twomass\n", + "wwt.foreground_opacity = 0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "pywwt provides interactive controls to let you adjust the parameters of the contextual imagery that's being shown. Try choosing different sets of all-sky imagery and adjusting the blend between them:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.layer_controls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are some settings that we like:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.background = wwt.imagery.visible.sdss\n", + "wwt.foreground = wwt.imagery.gamma.fermi\n", + "wwt.foreground_opacity = .5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we'll load up another image of the same field that came from *Swift*, this time stored as a local file as in the previous step:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swift_layer = wwt.layers.add_image_layer(datapath('m101_swiftx.fits'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create controls to adjust all of the visualization parameters. If you want to go wild, you can overlay data from four different wavelengths in this one view!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.layer_controls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "twomass_layer.controls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swift_layer.controls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Next Steps\n", + "\n", + "To learn how to display data tables along with your imagery, start with the [NASA Exoplanet Archive](./NASA%20Exoplanet%20Archive.ipynb) tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Credits\n", + "\n", + "This notebook was prepared by:\n", + "\n", + "- O. Justin Otor\n", + "- Thomas Robitaille\n", + "- Peter K. G. Williams" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 1124befb2f26e31b9b12fbca80e047d98302c124 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Wed, 12 Feb 2020 11:38:22 -0500 Subject: [PATCH 37/38] Creating Interactive Figures.ipynb: add this --- .gitignore | 1 + Creating Interactive Figures.ipynb | 276 +++++++++++++++++++++++++++++ Start Here.ipynb | 2 + 3 files changed, 279 insertions(+) create mode 100644 Creating Interactive Figures.ipynb diff --git a/.gitignore b/.gitignore index f845886..9f818d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .ipynb_checkpoints/ Untitled*.ipynb +figure.zip diff --git a/Creating Interactive Figures.ipynb b/Creating Interactive Figures.ipynb new file mode 100644 index 0000000..8eed786 --- /dev/null +++ b/Creating Interactive Figures.ipynb @@ -0,0 +1,276 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creating Interactive Figures\n", + "\n", + "This notebook will demonstrate how you can use pywwt to create [interactive figures](https://journals.aas.org/graphics-guide/#interactive_figures) suitable for submission to a journal such as [*The Astrophysical Journal*](https://apj.aas.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 1: Starting up pywwt\n", + "\n", + "The first thing to do is to open up pywwt in this notebook. *Due to current technical limitations, the procedure is somewhat different than the one that we recommend for general usage.* However, the beginning is the same as usual: a `pywwt.jupyter` import:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pywwt.jupyter import WWTJupyterWidget" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll also set up a utility function to help us locate data files stored alongside this notebook:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def datapath(*args):\n", + " from os.path import join\n", + " return join('data', *args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we’ll create a viewer widget and display it inline. (That's why the final line is a bare `wwt`.)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt = WWTJupyterWidget()\n", + "wwt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*It might look like you got a black screen but it's probably OK.* Click your mouse in the widget view and drag to either side. You should see the Milky Way scroll into view!\n", + "\n", + "**Unlike usual**, we won't separate the viewer into its own pane, because that currently breaks the functionality demonstrated here. If you get annoyed with scrolling back and forth, you can drag the above cell down as you work your way through the notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 2: Inserting Some Data\n", + "\n", + "An interactive figure should presumably have some data in it to show off. Here, we'll just load up some of the data used in the other tutorials to show the general principles.\n", + "\n", + "We'll start by displaying a WISE 12µm image towards the [Westerhout 5 star forming region](https://en.wikipedia.org/wiki/Westerhout_5):\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "w5_img = wwt.layers.add_image_layer(datapath('w5.fits'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now is a good time to play around with the visualization parameters of the image, if you'd like. Executing the following line will create some UI elements that let you tune the colormap, stretch, and so on:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "w5_img.controls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Likewise you can control the settings used for the all-sky contextual imagery:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.layer_controls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 3: Exporting to standalone HTML\n", + "\n", + "pywwt, like all Jupyter widgets, is at its heart web-based. We've been working on building the technology to extract the visualizations that you create from Jupyter into standalone web assets that can be included anywhere that you can host HTML + JavaScript + CSS. This trio of technologies is exactly how [interactive figures](https://journals.aas.org/graphics-guide/#interactive_figures) in the AAS journals work!\n", + "\n", + "Once you've set up your viewer, exporting is easy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wwt.save_as_html_bundle('figure.zip')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After a few seconds, you should see a file named `figure.zip` appear in the folder view sidebar to the left of this notebook. What's cool is that *even if you're running this notebook in the cloud*, you can right-click that file and select \"Download\" to save the Zip bundle to your local machine.\n", + "\n", + "If you were to open up this Zip file and inspect its contents, you'd see that it contains an `index.html` file, some JavaScript, and a `data` directory containing a FITS file correspond to the image that you just loaded into your view." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Example 1: Submitting the figure to a journal\n", + "\n", + "It’s a bit beyond the scope of this notebook to describe the full submission process here. But the key thing is that the `figure.zip` file has virtually everything you need to include an interacting figure in an [AAS journal](journals.aas.org/). See [this blog post by Peter Williams](https://newton.cx/~peter/2019/creating-aas-interactive-figures/) for a detailed guide involving similar files created with the [AAS Timeseries Tool](https://aas-timeseries.readthedocs.io/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Example 2: Including the figure on a personal website\n", + "\n", + "The same files that you submit to a journal can also be included on your own website, if your authoring platform allows you to upload arbitrary files and use HTML [`\n", + " \n", + "\n", + "```\n", + "\n", + "Most of this is just boilerplate — the key is the `