diff --git a/README.md b/README.md index 464dfbc1..869a21c1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # maap-documentation -[![Documentation Status](https://readthedocs.org/projects/maap-project/badge/?version=latest)](https://maap-project.readthedocs.io/en/latest/?badge=latest) +[![Documentation Status](https://readthedocs.org/projects/maap-project/badge/?version=latest)](https://maap-project.readthedocs.io/en/latest/?badge=latest) [![DOI](https://zenodo.org/badge/235617200.svg)](https://zenodo.org/doi/10.5281/zenodo.10499174) This repository serves as the technical documentation for interfacing with the MAAP services. diff --git a/docs/source/_static/faq_images/import_granules.png b/docs/source/_static/faq_images/import_granules.png new file mode 100644 index 00000000..3603350a Binary files /dev/null and b/docs/source/_static/faq_images/import_granules.png differ diff --git a/docs/source/_static/faq_images/import_granules_1.png b/docs/source/_static/faq_images/import_granules_1.png deleted file mode 100644 index 3e6361db..00000000 Binary files a/docs/source/_static/faq_images/import_granules_1.png and /dev/null differ diff --git a/docs/source/_static/jobs_ui_access.png b/docs/source/_static/jobs_ui/jobs_ui_access.png similarity index 100% rename from docs/source/_static/jobs_ui_access.png rename to docs/source/_static/jobs_ui/jobs_ui_access.png diff --git a/docs/source/_static/jobs_ui_copy_code.png b/docs/source/_static/jobs_ui/jobs_ui_copy_code.png similarity index 100% rename from docs/source/_static/jobs_ui_copy_code.png rename to docs/source/_static/jobs_ui/jobs_ui_copy_code.png diff --git a/docs/source/_static/jobs_ui_failed_toast.png b/docs/source/_static/jobs_ui/jobs_ui_failed_toast.png similarity index 100% rename from docs/source/_static/jobs_ui_failed_toast.png rename to docs/source/_static/jobs_ui/jobs_ui_failed_toast.png diff --git a/docs/source/_static/jobs_ui_overview.png b/docs/source/_static/jobs_ui/jobs_ui_overview.png similarity index 100% rename from docs/source/_static/jobs_ui_overview.png rename to docs/source/_static/jobs_ui/jobs_ui_overview.png diff --git a/docs/source/_static/jobs_ui_submit.png b/docs/source/_static/jobs_ui/jobs_ui_submit.png similarity index 100% rename from docs/source/_static/jobs_ui_submit.png rename to docs/source/_static/jobs_ui/jobs_ui_submit.png diff --git a/docs/source/_static/jobs_ui_submit_detail.png b/docs/source/_static/jobs_ui/jobs_ui_submit_detail.png similarity index 100% rename from docs/source/_static/jobs_ui_submit_detail.png rename to docs/source/_static/jobs_ui/jobs_ui_submit_detail.png diff --git a/docs/source/_static/jobs_ui_submit_toast.png b/docs/source/_static/jobs_ui/jobs_ui_submit_toast.png similarity index 100% rename from docs/source/_static/jobs_ui_submit_toast.png rename to docs/source/_static/jobs_ui/jobs_ui_submit_toast.png diff --git a/docs/source/_static/jobs_ui/revoke_failed.png b/docs/source/_static/jobs_ui/revoke_failed.png new file mode 100644 index 00000000..635fddf2 Binary files /dev/null and b/docs/source/_static/jobs_ui/revoke_failed.png differ diff --git a/docs/source/_static/jobs_ui/revoke_job.png b/docs/source/_static/jobs_ui/revoke_job.png new file mode 100644 index 00000000..3cb485e8 Binary files /dev/null and b/docs/source/_static/jobs_ui/revoke_job.png differ diff --git a/docs/source/_static/jobs_ui/revoke_successful.png b/docs/source/_static/jobs_ui/revoke_successful.png new file mode 100644 index 00000000..6dfc96a6 Binary files /dev/null and b/docs/source/_static/jobs_ui/revoke_successful.png differ diff --git a/docs/source/getting_started/_static/storage_options_diagram.png b/docs/source/getting_started/_static/storage_options_diagram.png index bc647e24..179ab90a 100644 Binary files a/docs/source/getting_started/_static/storage_options_diagram.png and b/docs/source/getting_started/_static/storage_options_diagram.png differ diff --git a/docs/source/getting_started/getting_started.ipynb b/docs/source/getting_started/getting_started.ipynb index 36295342..03951a3e 100644 --- a/docs/source/getting_started/getting_started.ipynb +++ b/docs/source/getting_started/getting_started.ipynb @@ -136,8 +136,8 @@ "\n", "#### My root folder (fast cloud storage)\n", " - Your Jupyter home directory (`~`) is mounted to `/projects`. Files in here persist across sessions and exist across your workspaces.\n", - " - Use this for code-related items, smaller data storage\n", - " - Git is more likely to behave predictably here compared to other storage\n", + " - Use this for code-related items, smaller data storage (such as Jupyter Notebooks, Python/ R/ Markdown files, etc.)\n", + " - Git is more likely to behave predictably here compared to other storage \n", " - This is also the place to make persistent conda environments (covered in another section), but make sure to not make a conda env inside a git-tracked folder, or if you do add it to the .gitignore. If git is tracking an env, it could cause your workspace to crash. \n", " - Uses local (to Jupyter) file system; generally faster and more reliable for “normal” file operations, but expensive\n", "\n", @@ -145,12 +145,13 @@ "`~/my-private-bucket` is an S3 bucket with persistent storage, but accessible only to you and others in a shared workspace.\n", " \n", " - Use for large data storage\n", - " - It will be slower than the root folder to copy and move files, which is why it is not ideal for storing smaller files that need to be read or written quickly\n", + " - It will be slower than the root folder to copy and move files, which is why it is not ideal for storing smaller files that need to be read or written quickly (e.g. Jupyter Notebooks)\n", "\n", "#### Sharing files: my-public-bucket and shared-buckets\n", "`~/my-public-bucket` is an S3 bucket with persistent storage. It is the same as `~/shared-buckets//` — anything you put in here will be accessible to other users via `~/shared-buckets/` as a read-only file. Likewise, to find shared files from another user, look in `~/shared-buckets/`.\n", "\n", - " - Use for large data storage for files that you want to share across workspaces\n", + " - Use for large data storage for files that you want to share across workspaces \n", + " - Public and shared buckets are not recommended for Jupyter Notebooks\n", "\n", "![Storage options diagram](_static/storage_options_diagram.png)\n", "\n", @@ -161,9 +162,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:root] *", + "display_name": "Python 3.12.0 64-bit", "language": "python", - "name": "conda-root-py" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -175,12 +176,17 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.8" + "version": "3.12.0" }, "metadata": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } + }, + "vscode": { + "interpreter": { + "hash": "7500c3e1c7c786e4ba1e4b4eb7588219b4e35d5153674f92eb3a82672b534f6e" + } } }, "nbformat": 4, diff --git a/docs/source/getting_started/running_at_scale.ipynb b/docs/source/getting_started/running_at_scale.ipynb index 858d0876..c2295829 100644 --- a/docs/source/getting_started/running_at_scale.ipynb +++ b/docs/source/getting_started/running_at_scale.ipynb @@ -80,7 +80,7 @@ "\n", "The Jobs UI will let you run and monitor jobs easily. You can find full documentation in the system reference guide for [the Jobs UI](../system_reference_guide/jobsui.ipynb) or [using maap-py](../system_reference_guide/jobs_maappy.ipynb) with Python in the System Reference Guide FAQs.\n", "\n", - "![job_ui_access](../_static/jobs_ui_access.png)\n", + "![job_ui_access](../_static/jobs_ui/jobs_ui_access.png)\n", "\n", "Some alternative methods of running the job are found below.\n", "\n", diff --git a/docs/source/science/ATL08/ATL08.ipynb b/docs/source/science/ATL08/ATL08.ipynb new file mode 100644 index 00000000..87267e91 --- /dev/null +++ b/docs/source/science/ATL08/ATL08.ipynb @@ -0,0 +1,1394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "71971df7", + "metadata": {}, + "source": [ + "# ATLAS/ICESat-02 ATL08 Access and Visualize\n", + "\n", + "Author: Sumant Jha (MSFC/USRA), Alex Mandel (DevSeed), Jamison French (DevSeed), Rajat Shinde (UAH), Sheyenne Kirkland (UAH)\n", + "\n", + "Date: March 7, 2024\n", + "\n", + "Description: In this example, we'll walk through accessing ATL08 data using both cloud access and through downloading. We'll then explore the data using `H5py`, `h5Glance`, and `xarray`. Finally, we'll visualize some of the data using `xarray`." + ] + }, + { + "cell_type": "markdown", + "id": "1d840225-f6db-4077-bfa3-94b6921e7265", + "metadata": {}, + "source": [ + "## Run This Notebook\n", + "\n", + "To access and run this tutorial within MAAP's Algorithm Development Environment (ADE), please refer to the [\"Getting started with the MAAP\"](https://docs.maap-project.org/en/latest/getting_started/getting_started.html) section of our documentation.\n", + "\n", + "Disclaimer: This tutorial will use an experimental feature to allow access to the DAAC without using EarthDataLogin. This tutorial will need to be ran within MAAP's ADE to allow this experimental feature to work. Running the tutorial outside of the MAAP ADE will result in errors. Additionally, it is recommended to use the `Pangeo` workspace within the MAAP ADE." + ] + }, + { + "cell_type": "markdown", + "id": "ff8efa52-24ef-42ce-b616-4d259039569e", + "metadata": {}, + "source": [ + "## About the Data\n", + "\n", + "This data set (ATL08) contains along-track heights above the WGS84 ellipsoid (ITRF2014 reference frame) for the ground and canopy surfaces. The canopy and ground surfaces are processed in fixed 100 m data segments, which typically contain more than 100 signal photons. The data were acquired by the Advanced Topographic Laser Altimeter System (ATLAS) instrument on board the Ice, Cloud and land Elevation Satellite-2 (ICESat-2) observatory.\n", + "\n", + "```\n", + "Parameter(s): TERRAIN ELEVATION\n", + "Platform(s):ICESat-2\n", + "Sensor(s): ATLAS\n", + "Data Format(s): HDF5\n", + "Temporal Coverage: 14 October 2018 to present\n", + "Temporal Resolution: 91 day\n", + "Spatial Resolution: Varies\n", + "Spatial Reference System(s): WGS 84 EPSG:4326\n", + "Spatial Coverage: N: 90 S: -90 E: 180 W: -180\n", + "```\n", + "\n", + "(Source: [ATL08 v6 Dataset Landing Page](https://nsidc.org/data/atl08/versions/5))\n" + ] + }, + { + "cell_type": "markdown", + "id": "24b1f8cd-53f1-43f6-b85d-1224576e8605", + "metadata": {}, + "source": [ + "## Additional Resources\n", + "- [Earthdata Search](https://search.earthdata.nasa.gov/search?q=atl08&ff=Available%20in%20Earthdata%20Cloud)\n", + "- [ATL08 v6 User Guide](https://nsidc.org/sites/default/files/documents/user-guide/atl08-v006-userguide.pdf)" + ] + }, + { + "cell_type": "markdown", + "id": "d0c3d7fb-6d7f-4027-9c73-15379dfa9d62", + "metadata": {}, + "source": [ + "## Importing and Installing Packages" + ] + }, + { + "cell_type": "markdown", + "id": "bceb37a2", + "metadata": {}, + "source": [ + "The following example uses several packages. If you do not have the following packages, uncomment the code below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a9b3e53-c67b-4294-999a-04e7cc2c149c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# !pip install -q h5py h5glance requests fsspec s3fs h5netcdf" + ] + }, + { + "cell_type": "markdown", + "id": "69ee9aed-39a7-42fa-aa85-e5185a7ffc7f", + "metadata": {}, + "source": [ + "Optional download (do not need to download if you're using the Pangeo workspace. Uncomment if using other workspaces):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9665604-ce0e-47b1-b7b9-5648d62a6b2e", + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install -q rioxarray" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "43dc9655", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import h5py\n", + "from maap.maap import MAAP\n", + "from h5glance import H5Glance\n", + "import requests\n", + "import xarray\n", + "import boto3\n", + "import fsspec" + ] + }, + { + "cell_type": "markdown", + "id": "9a01c263-4b64-4eb5-8844-672456f3fec0", + "metadata": {}, + "source": [ + "## Accessing the Data" + ] + }, + { + "cell_type": "markdown", + "id": "ab76b7e7-408e-45c3-b506-d193cb505aab", + "metadata": {}, + "source": [ + "In this section we'll walk through two different ways to access the data. The first method is to access the data through S3.\n", + "\n", + "The second method is to access it by using `maap-py`, then download the data locally. From there, we will explore some of the data using `h5glance`." + ] + }, + { + "cell_type": "markdown", + "id": "ff2227d4", + "metadata": {}, + "source": [ + "### Example 1: Accessing the Data with S3\n", + "\n", + "We will use role assumption to gain access to the data. To do this, we'll use an experimental feature by setting up a parameter, assuming a role, and get temporary credentials with the assumed role. We'll also set up credentials into fsspec so we can later use `xarray` for data exploration." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "23c1abf0-0369-4833-85ef-3e556409959a", + "metadata": {}, + "outputs": [], + "source": [ + "def assume_role_credentials(ssm_parameter_name):\n", + " # Create a session using your current credentials\n", + " session = boto3.Session()\n", + "\n", + " # Retrieve the SSM parameter\n", + " ssm = session.client('ssm', \"us-west-2\")\n", + " parameter = ssm.get_parameter(\n", + " Name=ssm_parameter_name, \n", + " WithDecryption=True\n", + " )\n", + " parameter_value = parameter['Parameter']['Value']\n", + "\n", + " # Assume the DAAC access role\n", + " sts = session.client('sts')\n", + " assumed_role_object = sts.assume_role(\n", + " RoleArn=parameter_value,\n", + " RoleSessionName='TutorialSession'\n", + " )\n", + "\n", + " # From the response that contains the assumed role, get the temporary \n", + " # credentials that can be used to make subsequent API calls\n", + " credentials = assumed_role_object['Credentials']\n", + "\n", + " return credentials\n", + "\n", + "def fsspec_access(credentials):\n", + " # Pass assumed role credentials into fsspec\n", + " return fsspec.filesystem(\n", + " \"s3\",\n", + " key=credentials['AccessKeyId'],\n", + " secret=credentials['SecretAccessKey'],\n", + " token=credentials['SessionToken']\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9d93b99d-37a3-4f9e-a4e8-4939a8275506", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "s3_fsspec = fsspec_access(assume_role_credentials(\"/iam/maap-data-reader\"))" + ] + }, + { + "cell_type": "markdown", + "id": "6d45ac1b", + "metadata": {}, + "source": [ + "### Example 2: Download Data Locally" + ] + }, + { + "cell_type": "markdown", + "id": "3ffb06f4", + "metadata": {}, + "source": [ + "We are going to use NASA host which is NASA's Common Metadata Repository (CMR) to search for and download ICESat data. \n", + "ICESat's ATL08 data's concept id can be found on https://search.earthdata.nasa.gov/search and looking for 'ATL08' in the search bar. When you check the metadata associated with your search result, you can get the concept_id associated with below tutorial. In this case, the concept_id is `C2613553260-NSIDC_CPRD`. \n", + "\n", + "For this example, we are going to use granule id of `ATL08_20230816182927_08792008_006_01.h5`. This will be in HDF5 format. \n", + "\n", + "With all this information in hand, we are ready to make a query to cmr.earthdata.nasa.gov using `maap-py`. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e87a6048", + "metadata": {}, + "outputs": [], + "source": [ + "maap = MAAP(maap_host='api.maap-project.org')\n", + "\n", + "nasa_host = \"cmr.earthdata.nasa.gov\"\n", + "results = maap.searchGranule(cmr_host=nasa_host,\n", + " concept_id=\"C2613553260-NSIDC_CPRD\",\n", + " readable_granule_name=\"ATL08_20230816182927_08792008_006_01.h5\")" + ] + }, + { + "cell_type": "markdown", + "id": "1b5b0235", + "metadata": {}, + "source": [ + "Let's see how this turned out. Did we get a result?" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "1fff1d07", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'concept-id': 'G2800397933-NSIDC_CPRD',\n", + " 'collection-concept-id': 'C2613553260-NSIDC_CPRD',\n", + " 'revision-id': '2',\n", + " 'format': 'application/echo10+xml',\n", + " 'Granule': {'GranuleUR': 'ATL08_20230816182927_08792008_006_01.h5',\n", + " 'InsertTime': '2023-11-11T10:14:36.642Z',\n", + " 'LastUpdate': '2023-11-11T10:14:36.642Z',\n", + " 'Collection': {'DataSetId': 'ATLAS/ICESat-2 L3A Land and Vegetation Height V006'},\n", + " 'DataGranule': {'SizeMBDataGranule': '106.29328060150146',\n", + " 'ProducerGranuleId': 'ATL08_20230816182927_08792008_006_01.h5',\n", + " 'DayNightFlag': 'UNSPECIFIED',\n", + " 'ProductionDateTime': '2023-09-21T19:57:30.000Z'},\n", + " 'Temporal': {'RangeDateTime': {'BeginningDateTime': '2023-08-16T18:29:24.813Z',\n", + " 'EndingDateTime': '2023-08-16T18:36:27.524Z'}},\n", + " 'Spatial': {'HorizontalSpatialDomain': {'Geometry': {'GPolygon': {'Boundary': {'Point': [{'PointLongitude': '-49.71155',\n", + " 'PointLatitude': '-0.55384'},\n", + " {'PointLongitude': '-51.21715', 'PointLatitude': '-15.49643'},\n", + " {'PointLongitude': '-52.36359', 'PointLatitude': '-26.40442'},\n", + " {'PointLongitude': '-52.43242', 'PointLatitude': '-27.04278'},\n", + " {'PointLongitude': '-52.5585', 'PointLatitude': '-27.03176'},\n", + " {'PointLongitude': '-52.48902', 'PointLatitude': '-26.39347'},\n", + " {'PointLongitude': '-51.3338', 'PointLatitude': '-15.48562'},\n", + " {'PointLongitude': '-49.82395', 'PointLatitude': '-0.54264'},\n", + " {'PointLongitude': '-49.76474', 'PointLatitude': '0.04913'},\n", + " {'PointLongitude': '-49.65236', 'PointLatitude': '0.03773'}]}}}}},\n", + " 'OnlineAccessURLs': {'OnlineAccessURL': [{'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-protected/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.h5',\n", + " 'MimeType': 'application/x-hdf5'},\n", + " {'URL': 's3://nsidc-cumulus-prod-protected/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.h5',\n", + " 'MimeType': 'application/x-hdf5'}]},\n", + " 'OnlineResources': {'OnlineResource': [{'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-protected/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.h5.dmrpp',\n", + " 'Type': 'USER SUPPORT',\n", + " 'MimeType': 'application/vnd.opendap.dap4.dmrpp+xml'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.iso.xml',\n", + " 'Type': 'USER SUPPORT',\n", + " 'MimeType': 'text/xml'},\n", + " {'URL': 's3://nsidc-cumulus-prod-protected/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.h5.dmrpp',\n", + " 'Type': 'USER SUPPORT',\n", + " 'MimeType': 'application/vnd.opendap.dap4.dmrpp+xml'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.iso.xml',\n", + " 'Type': 'USER SUPPORT',\n", + " 'MimeType': 'text/xml'},\n", + " {'URL': 'https://opendap.earthdata.nasa.gov/collections/C2613553260-NSIDC_CPRD/granules/ATL08_20230816182927_08792008_006_01.h5',\n", + " 'Type': 'USER SUPPORT'}]},\n", + " 'AssociatedBrowseImageUrls': {'ProviderBrowseUrl': [{'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.default.default1.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.default.default2.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 'https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.default.default1.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.default.default2.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1l.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt1r.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2l.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt2r.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3l.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.groundtrack.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.h_canopy_abs.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.h_te_median.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.n_ca_photons.jpg',\n", + " 'MimeType': 'image/jpeg'},\n", + " {'URL': 's3://nsidc-cumulus-prod-public/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01_BRW.gt3r.n_te_photons.jpg',\n", + " 'MimeType': 'image/jpeg'}]}}}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_file = results[0]\n", + "data_file" + ] + }, + { + "cell_type": "markdown", + "id": "163283a5", + "metadata": {}, + "source": [ + "Looks like we did get a result and will be able to learn a lot about it from available metadata. Let's download the HDF file locally.\n", + "\n", + "Establish a temporary directory to store the data file and display the path and filename:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "419c6e78", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'./data/ATL08_20230816182927_08792008_006_01.h5'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataDir = './data'\n", + "if not os.path.exists(dataDir): os.mkdir(dataDir)\n", + "data = data_file.getData(dataDir)\n", + "data" + ] + }, + { + "cell_type": "markdown", + "id": "188a7017-ed15-44f4-8d25-9bfe5ca43524", + "metadata": {}, + "source": [ + "## Exploring the Data\n", + "\n", + "There are two different ways we'll open and look at the data:\n", + "1. Using `xarray`\n", + "2. Using `h5py`" + ] + }, + { + "cell_type": "markdown", + "id": "f424754e-5b2e-4b82-ba94-dead8e39b887", + "metadata": {}, + "source": [ + "### 1. xarray" + ] + }, + { + "cell_type": "markdown", + "id": "fd45311f-64ce-4afc-a664-396e33bdf56f", + "metadata": {}, + "source": [ + "First, let's grab the S3 URL for direct access from our results above." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "162ed41f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'s3://nsidc-cumulus-prod-protected/ATLAS/ATL08/006/2023/08/16/ATL08_20230816182927_08792008_006_01.h5'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s3_url = results[0]['Granule']['OnlineAccessURLs']['OnlineAccessURL'][1]['URL']\n", + "s3_url" + ] + }, + { + "cell_type": "markdown", + "id": "6e2308ef-97c6-40a1-9cc8-2ddf77f5538d", + "metadata": {}, + "source": [ + "Now we can open a specific group within the HDF5 file using `xarray`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6d30ef03-4878-4e9b-beef-b535476db455", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:            (delta_time: 18690, ds_geosegments: 5, ds_surf_type: 5)\n",
+       "Coordinates:\n",
+       "  * delta_time         (delta_time) datetime64[ns] 2023-08-16T18:29:24.853128...\n",
+       "    latitude           (delta_time) float32 ...\n",
+       "    longitude          (delta_time) float32 ...\n",
+       "Dimensions without coordinates: ds_geosegments, ds_surf_type\n",
+       "Data variables: (12/41)\n",
+       "    asr                (delta_time) float32 ...\n",
+       "    atlas_pa           (delta_time) float32 ...\n",
+       "    beam_azimuth       (delta_time) float32 ...\n",
+       "    beam_coelev        (delta_time) float32 ...\n",
+       "    brightness_flag    (delta_time) float32 ...\n",
+       "    cloud_flag_atm     (delta_time) float32 ...\n",
+       "    ...                 ...\n",
+       "    snr                (delta_time) float32 ...\n",
+       "    solar_azimuth      (delta_time) float32 ...\n",
+       "    solar_elevation    (delta_time) float32 ...\n",
+       "    surf_type          (delta_time, ds_surf_type) int8 ...\n",
+       "    terrain_flg        (delta_time) float64 ...\n",
+       "    urban_flag         (delta_time) float64 ...\n",
+       "Attributes:\n",
+       "    Description:  Contains data categorized as land at 100 meter intervals.\n",
+       "    data_rate:    Data are stored as aggregates of 100 meters.
" + ], + "text/plain": [ + "\n", + "Dimensions: (delta_time: 18690, ds_geosegments: 5, ds_surf_type: 5)\n", + "Coordinates:\n", + " * delta_time (delta_time) datetime64[ns] 2023-08-16T18:29:24.853128...\n", + " latitude (delta_time) float32 ...\n", + " longitude (delta_time) float32 ...\n", + "Dimensions without coordinates: ds_geosegments, ds_surf_type\n", + "Data variables: (12/41)\n", + " asr (delta_time) float32 ...\n", + " atlas_pa (delta_time) float32 ...\n", + " beam_azimuth (delta_time) float32 ...\n", + " beam_coelev (delta_time) float32 ...\n", + " brightness_flag (delta_time) float32 ...\n", + " cloud_flag_atm (delta_time) float32 ...\n", + " ... ...\n", + " snr (delta_time) float32 ...\n", + " solar_azimuth (delta_time) float32 ...\n", + " solar_elevation (delta_time) float32 ...\n", + " surf_type (delta_time, ds_surf_type) int8 ...\n", + " terrain_flg (delta_time) float64 ...\n", + " urban_flag (delta_time) float64 ...\n", + "Attributes:\n", + " Description: Contains data categorized as land at 100 meter intervals.\n", + " data_rate: Data are stored as aggregates of 100 meters." + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "with s3_fsspec.open(s3_url) as f:\n", + " atl08_track = xarray.open_dataset(f, group='gt1l/land_segments', engine=\"h5netcdf\", phony_dims='sort')\n", + "atl08_track" + ] + }, + { + "cell_type": "markdown", + "id": "11316bbe-637e-46a1-ab06-4f5ac18b0b70", + "metadata": {}, + "source": [ + "### 2. H5py and H5glance\n", + "\n", + "Let's check the available keys and structure of the HDF5 files using `H5py` and `H5glance`. This will use the downloaded file that we saved locally.\n", + "\n", + "Open the file and list the keys:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2bebf474-efdd-44c0-8d1f-74795218712e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['METADATA',\n", + " 'ancillary_data',\n", + " 'ds_geosegments',\n", + " 'ds_metrics',\n", + " 'ds_surf_type',\n", + " 'gt1l',\n", + " 'gt1r',\n", + " 'gt2l',\n", + " 'gt2r',\n", + " 'gt3l',\n", + " 'gt3r',\n", + " 'orbit_info',\n", + " 'quality_assessment']" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "atl08_file = h5py.File(data,'r')\n", + "list(atl08_file.keys())" + ] + }, + { + "cell_type": "markdown", + "id": "61a5f601-319a-4836-915d-61ded1d08877", + "metadata": {}, + "source": [ + "Use `H5glance` module to interactively check all available variables and field that can be used for further analysis and visualizations:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "639bb2f9-2793-4fda-a803-d1a4cdf139c7", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
                                                                        • atl08_region [📋]: 1 entries, dtype: int32
                                                                        • bin_size_h [📋]: 1 entries, dtype: float32
                                                                        • bin_size_n [📋]: 1 entries, dtype: int32
                                                                        • bright_thresh [📋]: 1 entries, dtype: float32
                                                                        • ca_class [📋]: 1 entries, dtype: int32
                                                                        • can_noise_thresh [📋]: 1 entries, dtype: int32
                                                                        • can_stat_thresh [📋]: 1 entries, dtype: float32
                                                                        • canopy20m_thresh [📋]: 1 entries, dtype: int32
                                                                        • canopy_flag_switch [📋]: 1 entries, dtype: int32
                                                                        • canopy_seg [📋]: 1 entries, dtype: int32
                                                                        • class_thresh [📋]: 1 entries, dtype: int32
                                                                        • cloud_filter_switch [📋]: 1 entries, dtype: int32
                                                                        • del_amp [📋]: 1 entries, dtype: float32
                                                                        • del_mu [📋]: 1 entries, dtype: float32
                                                                        • del_sigma [📋]: 1 entries, dtype: float32
                                                                        • dem_filter_switch [📋]: 1 entries, dtype: int32
                                                                        • dem_removal_percent_limit [📋]: 1 entries, dtype: float32
                                                                        • dragann_switch [📋]: 1 entries, dtype: int32
                                                                        • dseg [📋]: 1 entries, dtype: int32
                                                                        • dseg_buf [📋]: 1 entries, dtype: int32
                                                                        • fnlgnd_filter_switch [📋]: 1 entries, dtype: int32
                                                                        • gnd_stat_thresh [📋]: 1 entries, dtype: float32
                                                                        • gthresh_factor [📋]: 1 entries, dtype: float32
                                                                        • h_canopy_perc [📋]: 1 entries, dtype: float32
                                                                        • iter_gnd [📋]: 1 entries, dtype: int32
                                                                        • iter_max [📋]: 1 entries, dtype: int32
                                                                        • lseg [📋]: 1 entries, dtype: int32
                                                                        • lseg_buf [📋]: 1 entries, dtype: int32
                                                                        • lw_filt_bnd [📋]: 1 entries, dtype: int32
                                                                        • lw_gnd_bnd [📋]: 1 entries, dtype: float32
                                                                        • lw_toc_bnd [📋]: 1 entries, dtype: float32
                                                                        • lw_toc_cut [📋]: 1 entries, dtype: float32
                                                                        • max_atl03files [📋]: 1 entries, dtype: int32
                                                                        • max_atl09files [📋]: 1 entries, dtype: int32
                                                                        • max_peaks [📋]: 1 entries, dtype: int32
                                                                        • max_try [📋]: 1 entries, dtype: int32
                                                                        • min_nphs [📋]: 1 entries, dtype: int32
                                                                        • n_dec_mode [📋]: 1 entries, dtype: int32
                                                                        • night_thresh [📋]: 1 entries, dtype: float32
                                                                        • noise_class [📋]: 1 entries, dtype: int32
                                                                        • outlier_filter_switch [📋]: 1 entries, dtype: int32
                                                                        • p_static [📋]: 1 entries, dtype: float32
                                                                        • ph_removal_percent_limit [📋]: 1 entries, dtype: float32
                                                                        • proc_geoseg [📋]: 1 entries, dtype: int32
                                                                        • psf [📋]: 1 entries, dtype: float32
                                                                        • ref_dem_limit [📋]: 1 entries, dtype: float32
                                                                        • ref_finalground_limit [📋]: 1 entries, dtype: float32
                                                                        • relief_hbot [📋]: 1 entries, dtype: float32
                                                                        • relief_htop [📋]: 1 entries, dtype: float32
                                                                        • shp_param [📋]: 1 entries, dtype: float32
                                                                        • sig_rsq_search [📋]: 1 entries, dtype: float32
                                                                        • sseg [📋]: 1 entries, dtype: float32
                                                                        • stat20m_thresh [📋]: 1 entries, dtype: int32
                                                                        • stat_thresh [📋]: 1 entries, dtype: int32
                                                                        • tc_thresh [📋]: 1 entries, dtype: float32
                                                                        • te_class [📋]: 1 entries, dtype: int32
                                                                        • terrain20m_thresh [📋]: 1 entries, dtype: int32
                                                                        • toc_class [📋]: 1 entries, dtype: int32
                                                                        • up_filt_bnd [📋]: 1 entries, dtype: int32
                                                                        • up_gnd_bnd [📋]: 1 entries, dtype: float32
                                                                        • up_toc_bnd [📋]: 1 entries, dtype: float32
                                                                        • up_toc_cut [📋]: 1 entries, dtype: float32
                                                                        • yapc_switch [📋]: 1 entries, dtype: int32
                                                                      • atlas_sdp_gps_epoch [📋]: 1 entries, dtype: float64
                                                                      • control [📋]: 1 entries, dtype: 100000-byte ASCII string
                                                                      • data_end_utc [📋]: 1 entries, dtype: 27-byte ASCII string
                                                                      • data_start_utc [📋]: 1 entries, dtype: 27-byte ASCII string
                                                                      • end_cycle [📋]: 1 entries, dtype: int32
                                                                      • end_delta_time [📋]: 1 entries, dtype: float64
                                                                      • end_geoseg [📋]: 1 entries, dtype: int32
                                                                      • end_gpssow [📋]: 1 entries, dtype: float64
                                                                      • end_gpsweek [📋]: 1 entries, dtype: int32
                                                                      • end_orbit [📋]: 1 entries, dtype: int32
                                                                      • end_region [📋]: 1 entries, dtype: int32
                                                                      • end_rgt [📋]: 1 entries, dtype: int32
                                                                      • granule_end_utc [📋]: 1 entries, dtype: 27-byte ASCII string
                                                                      • granule_start_utc [📋]: 1 entries, dtype: 27-byte ASCII string
                                                                      • qa_at_interval [📋]: 1 entries, dtype: float64
                                                                      • release [📋]: 1 entries, dtype: 80-byte ASCII string
                                                                      • start_cycle [📋]: 1 entries, dtype: int32
                                                                      • start_delta_time [📋]: 1 entries, dtype: float64
                                                                      • start_geoseg [📋]: 1 entries, dtype: int32
                                                                      • start_gpssow [📋]: 1 entries, dtype: float64
                                                                      • start_gpsweek [📋]: 1 entries, dtype: int32
                                                                      • start_orbit [📋]: 1 entries, dtype: int32
                                                                      • start_region [📋]: 1 entries, dtype: int32
                                                                      • start_rgt [📋]: 1 entries, dtype: int32
                                                                      • version [📋]: 1 entries, dtype: 80-byte ASCII string
                                                                          • can_noise [📋]: 18690 entries, dtype: float32
                                                                          • canopy_h_metrics [📋]: 18690 × 18 entries, dtype: float32
                                                                          • canopy_h_metrics_abs [📋]: 18690 × 18 entries, dtype: float32
                                                                          • canopy_openness [📋]: 18690 entries, dtype: float32
                                                                          • canopy_rh_conf [📋]: 18690 entries, dtype: int8
                                                                          • centroid_height [📋]: 18690 entries, dtype: float32
                                                                          • h_canopy [📋]: 18690 entries, dtype: float32
                                                                          • h_canopy_20m [📋]: 18690 × 5 entries, dtype: float32
                                                                          • h_canopy_abs [📋]: 18690 entries, dtype: float32
                                                                          • h_canopy_quad [📋]: 18690 entries, dtype: float32
                                                                          • h_canopy_uncertainty [📋]: 18690 entries, dtype: float32
                                                                          • h_dif_canopy [📋]: 18690 entries, dtype: float32
                                                                          • h_max_canopy [📋]: 18690 entries, dtype: float32
                                                                          • h_max_canopy_abs [📋]: 18690 entries, dtype: float32
                                                                          • h_mean_canopy [📋]: 18690 entries, dtype: float32
                                                                          • h_mean_canopy_abs [📋]: 18690 entries, dtype: float32
                                                                          • h_median_canopy [📋]: 18690 entries, dtype: float32
                                                                          • h_median_canopy_abs [📋]: 18690 entries, dtype: float32
                                                                          • h_min_canopy [📋]: 18690 entries, dtype: float32
                                                                          • h_min_canopy_abs [📋]: 18690 entries, dtype: float32
                                                                          • n_ca_photons [📋]: 18690 entries, dtype: int32
                                                                          • n_toc_photons [📋]: 18690 entries, dtype: int32
                                                                          • photon_rate_can [📋]: 18690 entries, dtype: float32
                                                                          • photon_rate_can_nr [📋]: 18690 entries, dtype: float32
                                                                          • segment_cover [📋]: 18690 entries, dtype: int16
                                                                          • subset_can_flag [📋]: 18690 × 5 entries, dtype: int8
                                                                          • toc_roughness [📋]: 18690 entries, dtype: float32
                                                                          • h_te_best_fit [📋]: 18690 entries, dtype: float32
                                                                          • h_te_best_fit_20m [📋]: 18690 × 5 entries, dtype: float32
                                                                          • h_te_interp [📋]: 18690 entries, dtype: float32
                                                                          • h_te_max [📋]: 18690 entries, dtype: float32
                                                                          • h_te_mean [📋]: 18690 entries, dtype: float32
                                                                          • h_te_median [📋]: 18690 entries, dtype: float32
                                                                          • h_te_min [📋]: 18690 entries, dtype: float32
                                                                          • h_te_mode [📋]: 18690 entries, dtype: float32
                                                                          • h_te_rh25 [📋]: 18690 entries, dtype: float32
                                                                          • h_te_skew [📋]: 18690 entries, dtype: float32
                                                                          • h_te_std [📋]: 18690 entries, dtype: float32
                                                                          • h_te_uncertainty [📋]: 18690 entries, dtype: float32
                                                                          • n_te_photons [📋]: 18690 entries, dtype: int32
                                                                          • photon_rate_te [📋]: 18690 entries, dtype: float32
                                                                          • subset_te_flag [📋]: 18690 × 5 entries, dtype: int8
                                                                          • terrain_slope [📋]: 18690 entries, dtype: float32
                                                                        • asr [📋]: 18690 entries, dtype: float32
                                                                        • atlas_pa [📋]: 18690 entries, dtype: float32
                                                                        • beam_azimuth [📋]: 18690 entries, dtype: float32
                                                                        • beam_coelev [📋]: 18690 entries, dtype: float32
                                                                        • brightness_flag [📋]: 18690 entries, dtype: int8
                                                                        • cloud_flag_atm [📋]: 18690 entries, dtype: int8
                                                                        • cloud_fold_flag [📋]: 18690 entries, dtype: int8
                                                                        • delta_time [📋]: 18690 entries, dtype: float64
                                                                        • delta_time_beg [📋]: 18690 entries, dtype: float64
                                                                        • delta_time_end [📋]: 18690 entries, dtype: float64
                                                                        • dem_flag [📋]: 18690 entries, dtype: int8
                                                                        • dem_h [📋]: 18690 entries, dtype: float32
                                                                        • dem_removal_flag [📋]: 18690 entries, dtype: int8
                                                                        • h_dif_ref [📋]: 18690 entries, dtype: float32
                                                                        • last_seg_extend [📋]: 18690 entries, dtype: float32
                                                                        • latitude [📋]: 18690 entries, dtype: float32
                                                                        • latitude_20m [📋]: 18690 × 5 entries, dtype: float32
                                                                        • layer_flag [📋]: 18690 entries, dtype: int8
                                                                        • longitude [📋]: 18690 entries, dtype: float32
                                                                        • longitude_20m [📋]: 18690 × 5 entries, dtype: float32
                                                                        • msw_flag [📋]: 18690 entries, dtype: int8
                                                                        • n_seg_ph [📋]: 18690 entries, dtype: int32
                                                                        • night_flag [📋]: 18690 entries, dtype: int32
                                                                        • ph_ndx_beg [📋]: 18690 entries, dtype: int64
                                                                        • ph_removal_flag [📋]: 18690 entries, dtype: int8
                                                                        • psf_flag [📋]: 18690 entries, dtype: int8
                                                                        • rgt [📋]: 18690 entries, dtype: int16
                                                                        • sat_flag [📋]: 18690 entries, dtype: int8
                                                                        • segment_id_beg [📋]: 18690 entries, dtype: int32
                                                                        • segment_id_end [📋]: 18690 entries, dtype: int32
                                                                        • segment_landcover [📋]: 18690 entries, dtype: int16
                                                                        • segment_snowcover [📋]: 18690 entries, dtype: int8
                                                                        • segment_watermask [📋]: 18690 entries, dtype: int32
                                                                        • sigma_across [📋]: 18690 entries, dtype: float32
                                                                        • sigma_along [📋]: 18690 entries, dtype: float32
                                                                        • sigma_atlas_land [📋]: 18690 entries, dtype: float32
                                                                        • sigma_h [📋]: 18690 entries, dtype: float32
                                                                        • sigma_topo [📋]: 18690 entries, dtype: float32
                                                                        • snr [📋]: 18690 entries, dtype: float32
                                                                        • solar_azimuth [📋]: 18690 entries, dtype: float32
                                                                        • solar_elevation [📋]: 18690 entries, dtype: float32
                                                                        • surf_type [📋]: 18690 × 5 entries, dtype: int8
                                                                        • terrain_flg [📋]: 18690 entries, dtype: int32
                                                                        • urban_flag [📋]: 18690 entries, dtype: int32
                                                                        • classed_pc_flag [📋]: 4876093 entries, dtype: int8
                                                                        • classed_pc_indx [📋]: 4876093 entries, dtype: int32
                                                                        • d_flag [📋]: 4876093 entries, dtype: int8
                                                                        • delta_time [📋]: 4876093 entries, dtype: float64
                                                                        • ph_h [📋]: 4876093 entries, dtype: float32
                                                                        • ph_segment_id [📋]: 4876093 entries, dtype: int32
                                                                          • can_noise [📋]: 11436 entries, dtype: float32
                                                                          • canopy_h_metrics [📋]: 11436 × 18 entries, dtype: float32
                                                                          • canopy_h_metrics_abs [📋]: 11436 × 18 entries, dtype: float32
                                                                          • canopy_openness [📋]: 11436 entries, dtype: float32
                                                                          • canopy_rh_conf [📋]: 11436 entries, dtype: int8
                                                                          • centroid_height [📋]: 11436 entries, dtype: float32
                                                                          • h_canopy [📋]: 11436 entries, dtype: float32
                                                                          • h_canopy_20m [📋]: 11436 × 5 entries, dtype: float32
                                                                          • h_canopy_abs [📋]: 11436 entries, dtype: float32
                                                                          • h_canopy_quad [📋]: 11436 entries, dtype: float32
                                                                          • h_canopy_uncertainty [📋]: 11436 entries, dtype: float32
                                                                          • h_dif_canopy [📋]: 11436 entries, dtype: float32
                                                                          • h_max_canopy [📋]: 11436 entries, dtype: float32
                                                                          • h_max_canopy_abs [📋]: 11436 entries, dtype: float32
                                                                          • h_mean_canopy [📋]: 11436 entries, dtype: float32
                                                                          • h_mean_canopy_abs [📋]: 11436 entries, dtype: float32
                                                                          • h_median_canopy [📋]: 11436 entries, dtype: float32
                                                                          • h_median_canopy_abs [📋]: 11436 entries, dtype: float32
                                                                          • h_min_canopy [📋]: 11436 entries, dtype: float32
                                                                          • h_min_canopy_abs [📋]: 11436 entries, dtype: float32
                                                                          • n_ca_photons [📋]: 11436 entries, dtype: int32
                                                                          • n_toc_photons [📋]: 11436 entries, dtype: int32
                                                                          • photon_rate_can [📋]: 11436 entries, dtype: float32
                                                                          • photon_rate_can_nr [📋]: 11436 entries, dtype: float32
                                                                          • segment_cover [📋]: 11436 entries, dtype: int16
                                                                          • subset_can_flag [📋]: 11436 × 5 entries, dtype: int8
                                                                          • toc_roughness [📋]: 11436 entries, dtype: float32
                                                                          • h_te_best_fit [📋]: 11436 entries, dtype: float32
                                                                          • h_te_best_fit_20m [📋]: 11436 × 5 entries, dtype: float32
                                                                          • h_te_interp [📋]: 11436 entries, dtype: float32
                                                                          • h_te_max [📋]: 11436 entries, dtype: float32
                                                                          • h_te_mean [📋]: 11436 entries, dtype: float32
                                                                          • h_te_median [📋]: 11436 entries, dtype: float32
                                                                          • h_te_min [📋]: 11436 entries, dtype: float32
                                                                          • h_te_mode [📋]: 11436 entries, dtype: float32
                                                                          • h_te_rh25 [📋]: 11436 entries, dtype: float32
                                                                          • h_te_skew [📋]: 11436 entries, dtype: float32
                                                                          • h_te_std [📋]: 11436 entries, dtype: float32
                                                                          • h_te_uncertainty [📋]: 11436 entries, dtype: float32
                                                                          • n_te_photons [📋]: 11436 entries, dtype: int32
                                                                          • photon_rate_te [📋]: 11436 entries, dtype: float32
                                                                          • subset_te_flag [📋]: 11436 × 5 entries, dtype: int8
                                                                          • terrain_slope [📋]: 11436 entries, dtype: float32
                                                                        • asr [📋]: 11436 entries, dtype: float32
                                                                        • atlas_pa [📋]: 11436 entries, dtype: float32
                                                                        • beam_azimuth [📋]: 11436 entries, dtype: float32
                                                                        • beam_coelev [📋]: 11436 entries, dtype: float32
                                                                        • brightness_flag [📋]: 11436 entries, dtype: int8
                                                                        • cloud_flag_atm [📋]: 11436 entries, dtype: int8
                                                                        • cloud_fold_flag [📋]: 11436 entries, dtype: int8
                                                                        • delta_time [📋]: 11436 entries, dtype: float64
                                                                        • delta_time_beg [📋]: 11436 entries, dtype: float64
                                                                        • delta_time_end [📋]: 11436 entries, dtype: float64
                                                                        • dem_flag [📋]: 11436 entries, dtype: int8
                                                                        • dem_h [📋]: 11436 entries, dtype: float32
                                                                        • dem_removal_flag [📋]: 11436 entries, dtype: int8
                                                                        • h_dif_ref [📋]: 11436 entries, dtype: float32
                                                                        • last_seg_extend [📋]: 11436 entries, dtype: float32
                                                                        • latitude [📋]: 11436 entries, dtype: float32
                                                                        • latitude_20m [📋]: 11436 × 5 entries, dtype: float32
                                                                        • layer_flag [📋]: 11436 entries, dtype: int8
                                                                        • longitude [📋]: 11436 entries, dtype: float32
                                                                        • longitude_20m [📋]: 11436 × 5 entries, dtype: float32
                                                                        • msw_flag [📋]: 11436 entries, dtype: int8
                                                                        • n_seg_ph [📋]: 11436 entries, dtype: int32
                                                                        • night_flag [📋]: 11436 entries, dtype: int32
                                                                        • ph_ndx_beg [📋]: 11436 entries, dtype: int64
                                                                        • ph_removal_flag [📋]: 11436 entries, dtype: int8
                                                                        • psf_flag [📋]: 11436 entries, dtype: int8
                                                                        • rgt [📋]: 11436 entries, dtype: int16
                                                                        • sat_flag [📋]: 11436 entries, dtype: int8
                                                                        • segment_id_beg [📋]: 11436 entries, dtype: int32
                                                                        • segment_id_end [📋]: 11436 entries, dtype: int32
                                                                        • segment_landcover [📋]: 11436 entries, dtype: int16
                                                                        • segment_snowcover [📋]: 11436 entries, dtype: int8
                                                                        • segment_watermask [📋]: 11436 entries, dtype: int32
                                                                        • sigma_across [📋]: 11436 entries, dtype: float32
                                                                        • sigma_along [📋]: 11436 entries, dtype: float32
                                                                        • sigma_atlas_land [📋]: 11436 entries, dtype: float32
                                                                        • sigma_h [📋]: 11436 entries, dtype: float32
                                                                        • sigma_topo [📋]: 11436 entries, dtype: float32
                                                                        • snr [📋]: 11436 entries, dtype: float32
                                                                        • solar_azimuth [📋]: 11436 entries, dtype: float32
                                                                        • solar_elevation [📋]: 11436 entries, dtype: float32
                                                                        • surf_type [📋]: 11436 × 5 entries, dtype: int8
                                                                        • terrain_flg [📋]: 11436 entries, dtype: int32
                                                                        • urban_flag [📋]: 11436 entries, dtype: int32
                                                                        • classed_pc_flag [📋]: 1372978 entries, dtype: int8
                                                                        • classed_pc_indx [📋]: 1372978 entries, dtype: int32
                                                                        • d_flag [📋]: 1372978 entries, dtype: int8
                                                                        • delta_time [📋]: 1372978 entries, dtype: float64
                                                                        • ph_h [📋]: 1372978 entries, dtype: float32
                                                                        • ph_segment_id [📋]: 1372978 entries, dtype: int32
                                                                          • can_noise [📋]: 18612 entries, dtype: float32
                                                                          • canopy_h_metrics [📋]: 18612 × 18 entries, dtype: float32
                                                                          • canopy_h_metrics_abs [📋]: 18612 × 18 entries, dtype: float32
                                                                          • canopy_openness [📋]: 18612 entries, dtype: float32
                                                                          • canopy_rh_conf [📋]: 18612 entries, dtype: int8
                                                                          • centroid_height [📋]: 18612 entries, dtype: float32
                                                                          • h_canopy [📋]: 18612 entries, dtype: float32
                                                                          • h_canopy_20m [📋]: 18612 × 5 entries, dtype: float32
                                                                          • h_canopy_abs [📋]: 18612 entries, dtype: float32
                                                                          • h_canopy_quad [📋]: 18612 entries, dtype: float32
                                                                          • h_canopy_uncertainty [📋]: 18612 entries, dtype: float32
                                                                          • h_dif_canopy [📋]: 18612 entries, dtype: float32
                                                                          • h_max_canopy [📋]: 18612 entries, dtype: float32
                                                                          • h_max_canopy_abs [📋]: 18612 entries, dtype: float32
                                                                          • h_mean_canopy [📋]: 18612 entries, dtype: float32
                                                                          • h_mean_canopy_abs [📋]: 18612 entries, dtype: float32
                                                                          • h_median_canopy [📋]: 18612 entries, dtype: float32
                                                                          • h_median_canopy_abs [📋]: 18612 entries, dtype: float32
                                                                          • h_min_canopy [📋]: 18612 entries, dtype: float32
                                                                          • h_min_canopy_abs [📋]: 18612 entries, dtype: float32
                                                                          • n_ca_photons [📋]: 18612 entries, dtype: int32
                                                                          • n_toc_photons [📋]: 18612 entries, dtype: int32
                                                                          • photon_rate_can [📋]: 18612 entries, dtype: float32
                                                                          • photon_rate_can_nr [📋]: 18612 entries, dtype: float32
                                                                          • segment_cover [📋]: 18612 entries, dtype: int16
                                                                          • subset_can_flag [📋]: 18612 × 5 entries, dtype: int8
                                                                          • toc_roughness [📋]: 18612 entries, dtype: float32
                                                                          • h_te_best_fit [📋]: 18612 entries, dtype: float32
                                                                          • h_te_best_fit_20m [📋]: 18612 × 5 entries, dtype: float32
                                                                          • h_te_interp [📋]: 18612 entries, dtype: float32
                                                                          • h_te_max [📋]: 18612 entries, dtype: float32
                                                                          • h_te_mean [📋]: 18612 entries, dtype: float32
                                                                          • h_te_median [📋]: 18612 entries, dtype: float32
                                                                          • h_te_min [📋]: 18612 entries, dtype: float32
                                                                          • h_te_mode [📋]: 18612 entries, dtype: float32
                                                                          • h_te_rh25 [📋]: 18612 entries, dtype: float32
                                                                          • h_te_skew [📋]: 18612 entries, dtype: float32
                                                                          • h_te_std [📋]: 18612 entries, dtype: float32
                                                                          • h_te_uncertainty [📋]: 18612 entries, dtype: float32
                                                                          • n_te_photons [📋]: 18612 entries, dtype: int32
                                                                          • photon_rate_te [📋]: 18612 entries, dtype: float32
                                                                          • subset_te_flag [📋]: 18612 × 5 entries, dtype: int8
                                                                          • terrain_slope [📋]: 18612 entries, dtype: float32
                                                                        • asr [📋]: 18612 entries, dtype: float32
                                                                        • atlas_pa [📋]: 18612 entries, dtype: float32
                                                                        • beam_azimuth [📋]: 18612 entries, dtype: float32
                                                                        • beam_coelev [📋]: 18612 entries, dtype: float32
                                                                        • brightness_flag [📋]: 18612 entries, dtype: int8
                                                                        • cloud_flag_atm [📋]: 18612 entries, dtype: int8
                                                                        • cloud_fold_flag [📋]: 18612 entries, dtype: int8
                                                                        • delta_time [📋]: 18612 entries, dtype: float64
                                                                        • delta_time_beg [📋]: 18612 entries, dtype: float64
                                                                        • delta_time_end [📋]: 18612 entries, dtype: float64
                                                                        • dem_flag [📋]: 18612 entries, dtype: int8
                                                                        • dem_h [📋]: 18612 entries, dtype: float32
                                                                        • dem_removal_flag [📋]: 18612 entries, dtype: int8
                                                                        • h_dif_ref [📋]: 18612 entries, dtype: float32
                                                                        • last_seg_extend [📋]: 18612 entries, dtype: float32
                                                                        • latitude [📋]: 18612 entries, dtype: float32
                                                                        • latitude_20m [📋]: 18612 × 5 entries, dtype: float32
                                                                        • layer_flag [📋]: 18612 entries, dtype: int8
                                                                        • longitude [📋]: 18612 entries, dtype: float32
                                                                        • longitude_20m [📋]: 18612 × 5 entries, dtype: float32
                                                                        • msw_flag [📋]: 18612 entries, dtype: int8
                                                                        • n_seg_ph [📋]: 18612 entries, dtype: int32
                                                                        • night_flag [📋]: 18612 entries, dtype: int32
                                                                        • ph_ndx_beg [📋]: 18612 entries, dtype: int64
                                                                        • ph_removal_flag [📋]: 18612 entries, dtype: int8
                                                                        • psf_flag [📋]: 18612 entries, dtype: int8
                                                                        • rgt [📋]: 18612 entries, dtype: int16
                                                                        • sat_flag [📋]: 18612 entries, dtype: int8
                                                                        • segment_id_beg [📋]: 18612 entries, dtype: int32
                                                                        • segment_id_end [📋]: 18612 entries, dtype: int32
                                                                        • segment_landcover [📋]: 18612 entries, dtype: int16
                                                                        • segment_snowcover [📋]: 18612 entries, dtype: int8
                                                                        • segment_watermask [📋]: 18612 entries, dtype: int32
                                                                        • sigma_across [📋]: 18612 entries, dtype: float32
                                                                        • sigma_along [📋]: 18612 entries, dtype: float32
                                                                        • sigma_atlas_land [📋]: 18612 entries, dtype: float32
                                                                        • sigma_h [📋]: 18612 entries, dtype: float32
                                                                        • sigma_topo [📋]: 18612 entries, dtype: float32
                                                                        • snr [📋]: 18612 entries, dtype: float32
                                                                        • solar_azimuth [📋]: 18612 entries, dtype: float32
                                                                        • solar_elevation [📋]: 18612 entries, dtype: float32
                                                                        • surf_type [📋]: 18612 × 5 entries, dtype: int8
                                                                        • terrain_flg [📋]: 18612 entries, dtype: int32
                                                                        • urban_flag [📋]: 18612 entries, dtype: int32
                                                                        • classed_pc_flag [📋]: 3117451 entries, dtype: int8
                                                                        • classed_pc_indx [📋]: 3117451 entries, dtype: int32
                                                                        • d_flag [📋]: 3117451 entries, dtype: int8
                                                                        • delta_time [📋]: 3117451 entries, dtype: float64
                                                                        • ph_h [📋]: 3117451 entries, dtype: float32
                                                                        • ph_segment_id [📋]: 3117451 entries, dtype: int32
                                                                          • can_noise [📋]: 10243 entries, dtype: float32
                                                                          • canopy_h_metrics [📋]: 10243 × 18 entries, dtype: float32
                                                                          • canopy_h_metrics_abs [📋]: 10243 × 18 entries, dtype: float32
                                                                          • canopy_openness [📋]: 10243 entries, dtype: float32
                                                                          • canopy_rh_conf [📋]: 10243 entries, dtype: int8
                                                                          • centroid_height [📋]: 10243 entries, dtype: float32
                                                                          • h_canopy [📋]: 10243 entries, dtype: float32
                                                                          • h_canopy_20m [📋]: 10243 × 5 entries, dtype: float32
                                                                          • h_canopy_abs [📋]: 10243 entries, dtype: float32
                                                                          • h_canopy_quad [📋]: 10243 entries, dtype: float32
                                                                          • h_canopy_uncertainty [📋]: 10243 entries, dtype: float32
                                                                          • h_dif_canopy [📋]: 10243 entries, dtype: float32
                                                                          • h_max_canopy [📋]: 10243 entries, dtype: float32
                                                                          • h_max_canopy_abs [📋]: 10243 entries, dtype: float32
                                                                          • h_mean_canopy [📋]: 10243 entries, dtype: float32
                                                                          • h_mean_canopy_abs [📋]: 10243 entries, dtype: float32
                                                                          • h_median_canopy [📋]: 10243 entries, dtype: float32
                                                                          • h_median_canopy_abs [📋]: 10243 entries, dtype: float32
                                                                          • h_min_canopy [📋]: 10243 entries, dtype: float32
                                                                          • h_min_canopy_abs [📋]: 10243 entries, dtype: float32
                                                                          • n_ca_photons [📋]: 10243 entries, dtype: int32
                                                                          • n_toc_photons [📋]: 10243 entries, dtype: int32
                                                                          • photon_rate_can [📋]: 10243 entries, dtype: float32
                                                                          • photon_rate_can_nr [📋]: 10243 entries, dtype: float32
                                                                          • segment_cover [📋]: 10243 entries, dtype: int16
                                                                          • subset_can_flag [📋]: 10243 × 5 entries, dtype: int8
                                                                          • toc_roughness [📋]: 10243 entries, dtype: float32
                                                                          • h_te_best_fit [📋]: 10243 entries, dtype: float32
                                                                          • h_te_best_fit_20m [📋]: 10243 × 5 entries, dtype: float32
                                                                          • h_te_interp [📋]: 10243 entries, dtype: float32
                                                                          • h_te_max [📋]: 10243 entries, dtype: float32
                                                                          • h_te_mean [📋]: 10243 entries, dtype: float32
                                                                          • h_te_median [📋]: 10243 entries, dtype: float32
                                                                          • h_te_min [📋]: 10243 entries, dtype: float32
                                                                          • h_te_mode [📋]: 10243 entries, dtype: float32
                                                                          • h_te_rh25 [📋]: 10243 entries, dtype: float32
                                                                          • h_te_skew [📋]: 10243 entries, dtype: float32
                                                                          • h_te_std [📋]: 10243 entries, dtype: float32
                                                                          • h_te_uncertainty [📋]: 10243 entries, dtype: float32
                                                                          • n_te_photons [📋]: 10243 entries, dtype: int32
                                                                          • photon_rate_te [📋]: 10243 entries, dtype: float32
                                                                          • subset_te_flag [📋]: 10243 × 5 entries, dtype: int8
                                                                          • terrain_slope [📋]: 10243 entries, dtype: float32
                                                                        • asr [📋]: 10243 entries, dtype: float32
                                                                        • atlas_pa [📋]: 10243 entries, dtype: float32
                                                                        • beam_azimuth [📋]: 10243 entries, dtype: float32
                                                                        • beam_coelev [📋]: 10243 entries, dtype: float32
                                                                        • brightness_flag [📋]: 10243 entries, dtype: int8
                                                                        • cloud_flag_atm [📋]: 10243 entries, dtype: int8
                                                                        • cloud_fold_flag [📋]: 10243 entries, dtype: int8
                                                                        • delta_time [📋]: 10243 entries, dtype: float64
                                                                        • delta_time_beg [📋]: 10243 entries, dtype: float64
                                                                        • delta_time_end [📋]: 10243 entries, dtype: float64
                                                                        • dem_flag [📋]: 10243 entries, dtype: int8
                                                                        • dem_h [📋]: 10243 entries, dtype: float32
                                                                        • dem_removal_flag [📋]: 10243 entries, dtype: int8
                                                                        • h_dif_ref [📋]: 10243 entries, dtype: float32
                                                                        • last_seg_extend [📋]: 10243 entries, dtype: float32
                                                                        • latitude [📋]: 10243 entries, dtype: float32
                                                                        • latitude_20m [📋]: 10243 × 5 entries, dtype: float32
                                                                        • layer_flag [📋]: 10243 entries, dtype: int8
                                                                        • longitude [📋]: 10243 entries, dtype: float32
                                                                        • longitude_20m [📋]: 10243 × 5 entries, dtype: float32
                                                                        • msw_flag [📋]: 10243 entries, dtype: int8
                                                                        • n_seg_ph [📋]: 10243 entries, dtype: int32
                                                                        • night_flag [📋]: 10243 entries, dtype: int32
                                                                        • ph_ndx_beg [📋]: 10243 entries, dtype: int64
                                                                        • ph_removal_flag [📋]: 10243 entries, dtype: int8
                                                                        • psf_flag [📋]: 10243 entries, dtype: int8
                                                                        • rgt [📋]: 10243 entries, dtype: int16
                                                                        • sat_flag [📋]: 10243 entries, dtype: int8
                                                                        • segment_id_beg [📋]: 10243 entries, dtype: int32
                                                                        • segment_id_end [📋]: 10243 entries, dtype: int32
                                                                        • segment_landcover [📋]: 10243 entries, dtype: int16
                                                                        • segment_snowcover [📋]: 10243 entries, dtype: int8
                                                                        • segment_watermask [📋]: 10243 entries, dtype: int32
                                                                        • sigma_across [📋]: 10243 entries, dtype: float32
                                                                        • sigma_along [📋]: 10243 entries, dtype: float32
                                                                        • sigma_atlas_land [📋]: 10243 entries, dtype: float32
                                                                        • sigma_h [📋]: 10243 entries, dtype: float32
                                                                        • sigma_topo [📋]: 10243 entries, dtype: float32
                                                                        • snr [📋]: 10243 entries, dtype: float32
                                                                        • solar_azimuth [📋]: 10243 entries, dtype: float32
                                                                        • solar_elevation [📋]: 10243 entries, dtype: float32
                                                                        • surf_type [📋]: 10243 × 5 entries, dtype: int8
                                                                        • terrain_flg [📋]: 10243 entries, dtype: int32
                                                                        • urban_flag [📋]: 10243 entries, dtype: int32
                                                                        • classed_pc_flag [📋]: 1107244 entries, dtype: int8
                                                                        • classed_pc_indx [📋]: 1107244 entries, dtype: int32
                                                                        • d_flag [📋]: 1107244 entries, dtype: int8
                                                                        • delta_time [📋]: 1107244 entries, dtype: float64
                                                                        • ph_h [📋]: 1107244 entries, dtype: float32
                                                                        • ph_segment_id [📋]: 1107244 entries, dtype: int32
                                                                          • can_noise [📋]: 19575 entries, dtype: float32
                                                                          • canopy_h_metrics [📋]: 19575 × 18 entries, dtype: float32
                                                                          • canopy_h_metrics_abs [📋]: 19575 × 18 entries, dtype: float32
                                                                          • canopy_openness [📋]: 19575 entries, dtype: float32
                                                                          • canopy_rh_conf [📋]: 19575 entries, dtype: int8
                                                                          • centroid_height [📋]: 19575 entries, dtype: float32
                                                                          • h_canopy [📋]: 19575 entries, dtype: float32
                                                                          • h_canopy_20m [📋]: 19575 × 5 entries, dtype: float32
                                                                          • h_canopy_abs [📋]: 19575 entries, dtype: float32
                                                                          • h_canopy_quad [📋]: 19575 entries, dtype: float32
                                                                          • h_canopy_uncertainty [📋]: 19575 entries, dtype: float32
                                                                          • h_dif_canopy [📋]: 19575 entries, dtype: float32
                                                                          • h_max_canopy [📋]: 19575 entries, dtype: float32
                                                                          • h_max_canopy_abs [📋]: 19575 entries, dtype: float32
                                                                          • h_mean_canopy [📋]: 19575 entries, dtype: float32
                                                                          • h_mean_canopy_abs [📋]: 19575 entries, dtype: float32
                                                                          • h_median_canopy [📋]: 19575 entries, dtype: float32
                                                                          • h_median_canopy_abs [📋]: 19575 entries, dtype: float32
                                                                          • h_min_canopy [📋]: 19575 entries, dtype: float32
                                                                          • h_min_canopy_abs [📋]: 19575 entries, dtype: float32
                                                                          • n_ca_photons [📋]: 19575 entries, dtype: int32
                                                                          • n_toc_photons [📋]: 19575 entries, dtype: int32
                                                                          • photon_rate_can [📋]: 19575 entries, dtype: float32
                                                                          • photon_rate_can_nr [📋]: 19575 entries, dtype: float32
                                                                          • segment_cover [📋]: 19575 entries, dtype: int16
                                                                          • subset_can_flag [📋]: 19575 × 5 entries, dtype: int8
                                                                          • toc_roughness [📋]: 19575 entries, dtype: float32
                                                                          • h_te_best_fit [📋]: 19575 entries, dtype: float32
                                                                          • h_te_best_fit_20m [📋]: 19575 × 5 entries, dtype: float32
                                                                          • h_te_interp [📋]: 19575 entries, dtype: float32
                                                                          • h_te_max [📋]: 19575 entries, dtype: float32
                                                                          • h_te_mean [📋]: 19575 entries, dtype: float32
                                                                          • h_te_median [📋]: 19575 entries, dtype: float32
                                                                          • h_te_min [📋]: 19575 entries, dtype: float32
                                                                          • h_te_mode [📋]: 19575 entries, dtype: float32
                                                                          • h_te_rh25 [📋]: 19575 entries, dtype: float32
                                                                          • h_te_skew [📋]: 19575 entries, dtype: float32
                                                                          • h_te_std [📋]: 19575 entries, dtype: float32
                                                                          • h_te_uncertainty [📋]: 19575 entries, dtype: float32
                                                                          • n_te_photons [📋]: 19575 entries, dtype: int32
                                                                          • photon_rate_te [📋]: 19575 entries, dtype: float32
                                                                          • subset_te_flag [📋]: 19575 × 5 entries, dtype: int8
                                                                          • terrain_slope [📋]: 19575 entries, dtype: float32
                                                                        • asr [📋]: 19575 entries, dtype: float32
                                                                        • atlas_pa [📋]: 19575 entries, dtype: float32
                                                                        • beam_azimuth [📋]: 19575 entries, dtype: float32
                                                                        • beam_coelev [📋]: 19575 entries, dtype: float32
                                                                        • brightness_flag [📋]: 19575 entries, dtype: int8
                                                                        • cloud_flag_atm [📋]: 19575 entries, dtype: int8
                                                                        • cloud_fold_flag [📋]: 19575 entries, dtype: int8
                                                                        • delta_time [📋]: 19575 entries, dtype: float64
                                                                        • delta_time_beg [📋]: 19575 entries, dtype: float64
                                                                        • delta_time_end [📋]: 19575 entries, dtype: float64
                                                                        • dem_flag [📋]: 19575 entries, dtype: int8
                                                                        • dem_h [📋]: 19575 entries, dtype: float32
                                                                        • dem_removal_flag [📋]: 19575 entries, dtype: int8
                                                                        • h_dif_ref [📋]: 19575 entries, dtype: float32
                                                                        • last_seg_extend [📋]: 19575 entries, dtype: float32
                                                                        • latitude [📋]: 19575 entries, dtype: float32
                                                                        • latitude_20m [📋]: 19575 × 5 entries, dtype: float32
                                                                        • layer_flag [📋]: 19575 entries, dtype: int8
                                                                        • longitude [📋]: 19575 entries, dtype: float32
                                                                        • longitude_20m [📋]: 19575 × 5 entries, dtype: float32
                                                                        • msw_flag [📋]: 19575 entries, dtype: int8
                                                                        • n_seg_ph [📋]: 19575 entries, dtype: int32
                                                                        • night_flag [📋]: 19575 entries, dtype: int32
                                                                        • ph_ndx_beg [📋]: 19575 entries, dtype: int64
                                                                        • ph_removal_flag [📋]: 19575 entries, dtype: int8
                                                                        • psf_flag [📋]: 19575 entries, dtype: int8
                                                                        • rgt [📋]: 19575 entries, dtype: int16
                                                                        • sat_flag [📋]: 19575 entries, dtype: int8
                                                                        • segment_id_beg [📋]: 19575 entries, dtype: int32
                                                                        • segment_id_end [📋]: 19575 entries, dtype: int32
                                                                        • segment_landcover [📋]: 19575 entries, dtype: int16
                                                                        • segment_snowcover [📋]: 19575 entries, dtype: int8
                                                                        • segment_watermask [📋]: 19575 entries, dtype: int32
                                                                        • sigma_across [📋]: 19575 entries, dtype: float32
                                                                        • sigma_along [📋]: 19575 entries, dtype: float32
                                                                        • sigma_atlas_land [📋]: 19575 entries, dtype: float32
                                                                        • sigma_h [📋]: 19575 entries, dtype: float32
                                                                        • sigma_topo [📋]: 19575 entries, dtype: float32
                                                                        • snr [📋]: 19575 entries, dtype: float32
                                                                        • solar_azimuth [📋]: 19575 entries, dtype: float32
                                                                        • solar_elevation [📋]: 19575 entries, dtype: float32
                                                                        • surf_type [📋]: 19575 × 5 entries, dtype: int8
                                                                        • terrain_flg [📋]: 19575 entries, dtype: int32
                                                                        • urban_flag [📋]: 19575 entries, dtype: int32
                                                                        • classed_pc_flag [📋]: 3880512 entries, dtype: int8
                                                                        • classed_pc_indx [📋]: 3880512 entries, dtype: int32
                                                                        • d_flag [📋]: 3880512 entries, dtype: int8
                                                                        • delta_time [📋]: 3880512 entries, dtype: float64
                                                                        • ph_h [📋]: 3880512 entries, dtype: float32
                                                                        • ph_segment_id [📋]: 3880512 entries, dtype: int32
                                                                          • can_noise [📋]: 10803 entries, dtype: float32
                                                                          • canopy_h_metrics [📋]: 10803 × 18 entries, dtype: float32
                                                                          • canopy_h_metrics_abs [📋]: 10803 × 18 entries, dtype: float32
                                                                          • canopy_openness [📋]: 10803 entries, dtype: float32
                                                                          • canopy_rh_conf [📋]: 10803 entries, dtype: int8
                                                                          • centroid_height [📋]: 10803 entries, dtype: float32
                                                                          • h_canopy [📋]: 10803 entries, dtype: float32
                                                                          • h_canopy_20m [📋]: 10803 × 5 entries, dtype: float32
                                                                          • h_canopy_abs [📋]: 10803 entries, dtype: float32
                                                                          • h_canopy_quad [📋]: 10803 entries, dtype: float32
                                                                          • h_canopy_uncertainty [📋]: 10803 entries, dtype: float32
                                                                          • h_dif_canopy [📋]: 10803 entries, dtype: float32
                                                                          • h_max_canopy [📋]: 10803 entries, dtype: float32
                                                                          • h_max_canopy_abs [📋]: 10803 entries, dtype: float32
                                                                          • h_mean_canopy [📋]: 10803 entries, dtype: float32
                                                                          • h_mean_canopy_abs [📋]: 10803 entries, dtype: float32
                                                                          • h_median_canopy [📋]: 10803 entries, dtype: float32
                                                                          • h_median_canopy_abs [📋]: 10803 entries, dtype: float32
                                                                          • h_min_canopy [📋]: 10803 entries, dtype: float32
                                                                          • h_min_canopy_abs [📋]: 10803 entries, dtype: float32
                                                                          • n_ca_photons [📋]: 10803 entries, dtype: int32
                                                                          • n_toc_photons [📋]: 10803 entries, dtype: int32
                                                                          • photon_rate_can [📋]: 10803 entries, dtype: float32
                                                                          • photon_rate_can_nr [📋]: 10803 entries, dtype: float32
                                                                          • segment_cover [📋]: 10803 entries, dtype: int16
                                                                          • subset_can_flag [📋]: 10803 × 5 entries, dtype: int8
                                                                          • toc_roughness [📋]: 10803 entries, dtype: float32
                                                                          • h_te_best_fit [📋]: 10803 entries, dtype: float32
                                                                          • h_te_best_fit_20m [📋]: 10803 × 5 entries, dtype: float32
                                                                          • h_te_interp [📋]: 10803 entries, dtype: float32
                                                                          • h_te_max [📋]: 10803 entries, dtype: float32
                                                                          • h_te_mean [📋]: 10803 entries, dtype: float32
                                                                          • h_te_median [📋]: 10803 entries, dtype: float32
                                                                          • h_te_min [📋]: 10803 entries, dtype: float32
                                                                          • h_te_mode [📋]: 10803 entries, dtype: float32
                                                                          • h_te_rh25 [📋]: 10803 entries, dtype: float32
                                                                          • h_te_skew [📋]: 10803 entries, dtype: float32
                                                                          • h_te_std [📋]: 10803 entries, dtype: float32
                                                                          • h_te_uncertainty [📋]: 10803 entries, dtype: float32
                                                                          • n_te_photons [📋]: 10803 entries, dtype: int32
                                                                          • photon_rate_te [📋]: 10803 entries, dtype: float32
                                                                          • subset_te_flag [📋]: 10803 × 5 entries, dtype: int8
                                                                          • terrain_slope [📋]: 10803 entries, dtype: float32
                                                                        • asr [📋]: 10803 entries, dtype: float32
                                                                        • atlas_pa [📋]: 10803 entries, dtype: float32
                                                                        • beam_azimuth [📋]: 10803 entries, dtype: float32
                                                                        • beam_coelev [📋]: 10803 entries, dtype: float32
                                                                        • brightness_flag [📋]: 10803 entries, dtype: int8
                                                                        • cloud_flag_atm [📋]: 10803 entries, dtype: int8
                                                                        • cloud_fold_flag [📋]: 10803 entries, dtype: int8
                                                                        • delta_time [📋]: 10803 entries, dtype: float64
                                                                        • delta_time_beg [📋]: 10803 entries, dtype: float64
                                                                        • delta_time_end [📋]: 10803 entries, dtype: float64
                                                                        • dem_flag [📋]: 10803 entries, dtype: int8
                                                                        • dem_h [📋]: 10803 entries, dtype: float32
                                                                        • dem_removal_flag [📋]: 10803 entries, dtype: int8
                                                                        • h_dif_ref [📋]: 10803 entries, dtype: float32
                                                                        • last_seg_extend [📋]: 10803 entries, dtype: float32
                                                                        • latitude [📋]: 10803 entries, dtype: float32
                                                                        • latitude_20m [📋]: 10803 × 5 entries, dtype: float32
                                                                        • layer_flag [📋]: 10803 entries, dtype: int8
                                                                        • longitude [📋]: 10803 entries, dtype: float32
                                                                        • longitude_20m [📋]: 10803 × 5 entries, dtype: float32
                                                                        • msw_flag [📋]: 10803 entries, dtype: int8
                                                                        • n_seg_ph [📋]: 10803 entries, dtype: int32
                                                                        • night_flag [📋]: 10803 entries, dtype: int32
                                                                        • ph_ndx_beg [📋]: 10803 entries, dtype: int64
                                                                        • ph_removal_flag [📋]: 10803 entries, dtype: int8
                                                                        • psf_flag [📋]: 10803 entries, dtype: int8
                                                                        • rgt [📋]: 10803 entries, dtype: int16
                                                                        • sat_flag [📋]: 10803 entries, dtype: int8
                                                                        • segment_id_beg [📋]: 10803 entries, dtype: int32
                                                                        • segment_id_end [📋]: 10803 entries, dtype: int32
                                                                        • segment_landcover [📋]: 10803 entries, dtype: int16
                                                                        • segment_snowcover [📋]: 10803 entries, dtype: int8
                                                                        • segment_watermask [📋]: 10803 entries, dtype: int32
                                                                        • sigma_across [📋]: 10803 entries, dtype: float32
                                                                        • sigma_along [📋]: 10803 entries, dtype: float32
                                                                        • sigma_atlas_land [📋]: 10803 entries, dtype: float32
                                                                        • sigma_h [📋]: 10803 entries, dtype: float32
                                                                        • sigma_topo [📋]: 10803 entries, dtype: float32
                                                                        • snr [📋]: 10803 entries, dtype: float32
                                                                        • solar_azimuth [📋]: 10803 entries, dtype: float32
                                                                        • solar_elevation [📋]: 10803 entries, dtype: float32
                                                                        • surf_type [📋]: 10803 × 5 entries, dtype: int8
                                                                        • terrain_flg [📋]: 10803 entries, dtype: int32
                                                                        • urban_flag [📋]: 10803 entries, dtype: int32
                                                                        • classed_pc_flag [📋]: 1146212 entries, dtype: int8
                                                                        • classed_pc_indx [📋]: 1146212 entries, dtype: int32
                                                                        • d_flag [📋]: 1146212 entries, dtype: int8
                                                                        • delta_time [📋]: 1146212 entries, dtype: float64
                                                                        • ph_h [📋]: 1146212 entries, dtype: float32
                                                                        • ph_segment_id [📋]: 1146212 entries, dtype: int32
                                                                      • bounding_polygon_lat1 [📋]: 11 entries, dtype: float64
                                                                      • bounding_polygon_lon1 [📋]: 11 entries, dtype: float64
                                                                      • crossing_time [📋]: 1 entries, dtype: float64
                                                                      • cycle_number [📋]: 1 entries, dtype: int8
                                                                      • lan [📋]: 1 entries, dtype: float64
                                                                      • orbit_number [📋]: 1 entries, dtype: uint16
                                                                      • rgt [📋]: 1 entries, dtype: int16
                                                                      • sc_orient [📋]: 1 entries, dtype: int8
                                                                      • sc_orient_time [📋]: 1 entries, dtype: float64
                                                                      • qa_granule_fail_reason [📋]: 1 entries, dtype: int32
                                                                      • qa_granule_pass_fail [📋]: 1 entries, dtype: int32
                                                                    • ds_geosegments [📋]: 5 entries, dtype: int8
                                                                    • ds_metrics [📋]: 18 entries, dtype: int8
                                                                    • ds_surf_type [📋]: 5 entries, dtype: int32
                                                                  " + ], + "text/plain": [ + "./data/ATL08_20230816182927_08792008_006_01.h5/ (47 attributes)\n", + "├METADATA\t(9 children) (3 attributes)\n", + "├ancillary_data\t(26 children) (2 attributes)\n", + "├ds_geosegments\t[int8: 5] (12 attributes)\n", + "├ds_metrics\t[int8: 18] (12 attributes)\n", + "├ds_surf_type\t[int32: 5] (12 attributes)\n", + "├gt1l\t(2 children) (7 attributes)\n", + "├gt1r\t(2 children) (7 attributes)\n", + "├gt2l\t(2 children) (7 attributes)\n", + "├gt2r\t(2 children) (7 attributes)\n", + "├gt3l\t(2 children) (7 attributes)\n", + "├gt3r\t(2 children) (7 attributes)\n", + "├orbit_info\t(9 children) (2 attributes)\n", + "└quality_assessment\t(2 children) (1 attributes)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "H5Glance(atl08_file)" + ] + }, + { + "cell_type": "markdown", + "id": "1cac457a-515d-4024-8d16-7ab9e62e3237", + "metadata": {}, + "source": [ + "## Visualizing the Data\n", + "\n", + "By looking at the data variables, we can also create a visualization using `xarray`. Let's plot elevation:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "a3decea5-672f-4c74-9e52-a8d11a3ed335", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Dimensions: (delta_time: 18690, ds_geosegments: 5, ds_surf_type: 5)\n", + "Coordinates:\n", + " * delta_time (delta_time) datetime64[ns] 2023-08-16T18:29:24.853128...\n", + " latitude (delta_time) float32 ...\n", + " longitude (delta_time) float32 ...\n", + "Dimensions without coordinates: ds_geosegments, ds_surf_type\n", + "Data variables: (12/41)\n", + " asr (delta_time) float32 ...\n", + " atlas_pa (delta_time) float32 ...\n", + " beam_azimuth (delta_time) float32 ...\n", + " beam_coelev (delta_time) float32 ...\n", + " brightness_flag (delta_time) float32 ...\n", + " cloud_flag_atm (delta_time) float32 ...\n", + " ... ...\n", + " snr (delta_time) float32 ...\n", + " solar_azimuth (delta_time) float32 ...\n", + " solar_elevation (delta_time) float32 ...\n", + " surf_type (delta_time, ds_surf_type) int8 ...\n", + " terrain_flg (delta_time) float64 ...\n", + " urban_flag (delta_time) float64 ...\n", + "Attributes:\n", + " Description: Contains data categorized as land at 100 meter intervals.\n", + " data_rate: Data are stored as aggregates of 100 meters.\n" + ] + }, + { + "data": { + "image/png": "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NQNQmZfoww8/xJgxY1x49u47/1atWhnUIyEhASEhISbbnc1d5z9z5kzUr18fLVu2RGlpKRYuXIiffvoJP/30k0+c/+DBgzF58mQMHz4cb731Fq5cuYIXX3wR//3vfxEaGurS18BmbmiVIifSTf00/vfoo48KIYTIyMgQjz32mEhOThYhISGiadOmYvr06UKr1UrHePTRR0X37t2l+0uWLBHt2rUTERERIjw8XLRo0UJMmTJFFBUVGTz3+vXrRdu2bUVQUJCoX7++wXgCV3Hn+cs9b7169Vxw1lXcdf7du3e3+Lyu5K7X4JNPPhEtW7YUYWFhIioqSrRt21Z89tlnFgefO4M7PwP63DWGyF3n//7774tGjRqJkJAQERsbK7p27Sr++OMPV522xJ1//8OHD4vevXuL0NBQUadOHTFu3DivGT8khBBc7Z6IiIh8HvMQERERkc9jQEREREQ+jwERERER+TwGREREROTzGBARERGRz2NARERERD6PARERERH5PAZEREREbjR16lTccsstiIyMREJCAu677z4cPXrUoIwQApMmTUJycjJCQ0PRo0cPHDx4UHr82rVrGDNmDJo2bYqwsDDUrVsXzz77LHJycgyOc88996Bu3boICQlBrVq1MHToUFy8eFFRPc+fP4+goCApG7urHDx4EP/6179Qv359aDQazJw5U7bchQsXMGTIEMTHxyMsLAw333wz0tLSFD8PAyIiIg9w+vRpaDQaaQkY8h0bNmzAM888g61bt2L16tUoLy9H3759UVBQIJWZNm0aZsyYgdmzZ2PHjh1ISkpCnz59kJeXBwC4ePEiLl68iA8//BD79+/HggULsGLFCowYMcLguXr27IkffvgBR48exU8//YSTJ0/iwQcfVFTPBQsWYNCgQSgsLMSmTZsc9wJYUVhYiIYNG+K9995DUlKSbJns7Gx06dIFgYGBWL58OQ4dOoTp06cjJiZG+RO5OVM2EZHPefTRR8W9995rsK28vFxkZGSIsrIy91SKPEZWVpYAIDZs2CCEEEKr1YqkpCTx3nvvSWWKi4tFdHS0mDNnjtnj/PDDDyIoKMjie+qXX34RGo1GlJaWWqyTVqsVDRs2FCtWrBAvv/yyGD58uMHjuiVDsrOzpW27d+8WAER6erq0be7cuaJOnToiNDRU3HfffWL69OkiOjra4nPrq1evnvjoo49Mtr/88suia9euio8jhy1EREQewN/fH0lJSQYLBpNv0nVzxcXFAahcoDUzMxN9+/aVygQHB6N79+7YvHmzxeNERUWZfU9du3YN3333HTp37ozAwECLdVq3bh0KCwvRu3dvDB06FD/88IPUOqXUpk2b8NRTT+G5557Dnj170KdPH7z77ruqjmHOr7/+ig4dOuChhx5CQkIC2rZti3nz5qk6BgMiIrKqR48eGDNmDMaOHYvY2FgkJiZi7ty5KCgowPDhwxEZGYlGjRph+fLl0j6HDh3C3XffjYiICCQmJmLo0KG4cuWK9PiKFSvQtWtXxMTEID4+HgMGDMDJkyelx3VdSEuXLkXPnj0RFhaGNm3aYMuWLYrqvGDBAsTExODnn39GkyZNEBISgj59+uDcuXNSmZMnT+Lee+9FYmIiIiIicMstt2DNmjUGx/nss8+QmpqKkJAQJCYmGnQv/Pjjj2jdujVCQ0MRHx+P3r17G3RzyJk0aRK+/vpr/PLLL9BoNNBoNFi/fr1Jl9n69euh0WiwcuVKtG3bFqGhobjjjjuQlZWF5cuXo3nz5oiKisLDDz+MwsJC6fhCCEybNg0NGzZEaGgo2rRpgx9//FHRa0buJ4TAuHHj0LVrV7Rq1QoAkJmZCQBITEw0KJuYmCg9Zuzq1auYPHkynnzySZPHXn75ZYSHhyM+Ph5nz57FL7/8YrVeX375Jf7zn//A398fLVu2ROPGjfH999+rOrdZs2bhrrvuwvjx49GkSROMGjUKd911l6pjmHPq1Cl8/vnnSE1NxcqVK/HUU0/h2WefxTfffKP8IHa1LxGRT+jevbuIjIwUkydPFseOHROTJ08Wfn5+4q677hJz584Vx44dE08//bSIj48XBQUF4uLFi6JGjRpiwoQJ4vDhw2LXrl2iT58+omfPntIxf/zxR/HTTz+JY8eOid27d4uBAweK1q1bS6vDp6enCwCiWbNm4vfffxdHjx4VDz74oKhXr56ibqX58+eLwMBA0aFDB7F582axc+dOceutt4rOnTtLZfbs2SPmzJkj9u3bJ44dOyYmTpwoQkJCxJkzZ4QQQuzYsUP4+/uLRYsWidOnT4tdu3aJjz/+WAghxMWLF0VAQICYMWOGSE9PF/v27ROffvqpyMvLs1ivvLw8MWjQIHHnnXeKjIwMkZGRIUpKSqTz3b17txCiqgvitttuExs3bhS7du0SjRs3Ft27dxd9+/YVu3btEn///beIj4836Ep59dVXRbNmzcSKFSvEyZMnxfz580VwcLBYv369sj82udWoUaNEvXr1xLlz56RtmzZtEgDExYsXDco+/vjjol+/fibHyMnJER07dhR33nmnbFfY5cuXxdGjR8WqVatEly5dxN133y2tdt+iRQsRHh4uwsPDxZ133imEECI7O1uEhISInTt3Ssf44IMPRKdOnaT7SrrMbr75ZvHWW28Z1OXjjz+WuszOnDkjPXd4eLh49913TepursssMDDQoD5CCDFmzBhx2223mZQ1hwEREVnVvXt3g/758vJyER4eLoYOHSpty8jIEADEli1bxOuvvy769u1rcIxz584JAOLo0aOyz6EbN7F//34hRFVA9H//939SmYMHDwoA4vDhw1brPH/+fAFAbN26Vdp2+PBhAUBs27bN7H4tWrQQs2bNEkII8dNPP4moqCiRm5trUi4tLU0AEKdPn7ZaF2NyY4jMBURr1qyRykydOlUAECdPnpS2Pfnkk9KXYn5+vggJCRGbN282OPaIESPEww8/rLqe5FqjR48WderUEadOnTLYfvLkSQFA7Nq1y2D7PffcI4YNG2awLTc3V3Tq1En06tVLFBUVWX1O3edS9545ffq0OH78uDh+/Lg4f/68EEKITz/9VAAQ/v7+0j8/Pz8BQBw8eFAIIcSGDRsEAHHt2jXp2Nu3bzcIiNq0aSPefvttg+efOXOmFBCVlZVJz338+HFx9epVk/qaC4jq1q0rRowYYbDts88+E8nJyVZfAx12mRGRIjfddJN029/fH/Hx8WjdurW0Tdecn5WVhbS0NKxbtw4RERHSP91UXV232MmTJzF48GA0bNgQUVFRaNCgAQDg7NmzZp+3Vq1a0nMoERAQgA4dOkj3mzVrhpiYGBw+fBgAUFBQgJdeegktWrRATEwMIiIicOTIEakOffr0Qb169dCwYUMMHToU3333ndQ91aZNG/Tq1QutW7fGQw89hHnz5iE7O1tRvdTQP//ExESEhYWhYcOGBtt0r8ehQ4dQXFyMPn36GLz233zzjUF3JHkWIQRGjx6NpUuXYu3atdJnQadBgwZISkrC6tWrpW2lpaXYsGEDOnfuLG3Lzc1F3759ERQUhF9//RUhISGKnhsASkpKAAD16tVD48aN0bhxY9SuXRtAZXfZCy+8gD179kj/9u7di549e+Krr74CANSsWRMAkJGRIR3beMZks2bNsH37doNtO3fulG4HBARIz924cWNpDJUSXbp0MUlVcOzYMdSrV0/xMTh6j4gUMR50qdFoDLZpNBoAgFarhVarxcCBA/H++++bHEcX1AwcOBApKSmYN28ekpOTodVq0apVK5SWlpp9Xv3nUEq3j9y2F198EStXrsSHH36Ixo0bIzQ0FA8++KBUh8jISOzatQvr16/HqlWr8MYbb2DSpEnYsWMHYmJisHr1amzevBmrVq3CrFmzMHHiRGzbts3kC80exucv93fQvR66///44w/py0wnODjYYXUix3rmmWewaNEi/PLLL4iMjJTGBUVHRyM0NBQajQZjx47FlClTkJqaitTUVEyZMgVhYWEYPHgwACAvLw99+/ZFYWEhFi5ciNzcXOTm5gKoDFb8/f2xfft2bN++HV27dkVsbCxOnTqFN954A40aNUKnTp1k67Znzx7s2rUL3333nUn+oYcffhgTJ07E1KlT0bhxY6SkpGDSpEl45513cPz4cUyfPt2g/JgxY9CtWzfMmDEDAwcOxNq1a7F8+XLZz6i+0tJSHDp0SLp94cIF7NmzBxEREWjcuDEA4Pnnn0fnzp0xZcoUDBo0CNu3b8fcuXMxd+5c5X8IxW1JROSzunfvLp577jmDbXJN1wDEsmXLxKuvviqaNm1qdqzPlStXBADx999/S9v++ecfaX8hTLuQhKgcywBArFu3zmqddV1m+t1jR44cMdjWqlUrgyb8vLw8ER0dbXKuOvn5+SIgIED89NNPJo+Vl5eL2rVri+nTp1ut28iRI8WAAQMMtpnrMtMfkzF//nyTKcpvvvmmaNOmjRCisrskODhYfPPNN1brQJ4DgOy/+fPnS2W0Wq148803RVJSkggODhbdunWTupeFqHq/yP3TdVnt27dP9OzZU8TFxYng4GBRv3598dRTT0ldY3JGjx4tWrRoIftYVlaW8Pf3lz4PGzduFK1btxYhISHi9ttvF//73/9kp93Xrl1bmnb/zjvviKSkJIuvj+6zYfyve/fuBuV+++030apVKxEcHCyaNWsm5s6da/G4xthCREQO98wzz2DevHl4+OGH8eKLL6JGjRo4ceIElixZgnnz5iE2Nhbx8fGYO3cuatWqhbNnz+KVV15xeD0CAwMxZswYfPLJJwgMDMTo0aNx22234dZbbwUANG7cGEuXLsXAgQOh0Wjw+uuvG7Q+/f777zh16hS6deuG2NhY/Pnnn9BqtWjatCm2bduGv/76C3379kVCQgK2bduGy5cvo3nz5lbrVb9+faxcuRJHjx5FfHw8oqOjHXK+kZGRGD9+PJ5//nlotVp07doVubm52Lx5MyIiIvDoo4865HnIscSNbitLNBoNJk2ahEmTJsk+3qNHD6vHad26NdauXauqbrNmzTL7WM2aNVFeXi7d79KlC/bt22dQxrhOI0eOxMiRIw3u61p5zKlfv76i12jAgAEYMGCA1XLmMCAiIodLTk7Gpk2b8PLLL6Nfv34oKSlBvXr1cOedd8LPzw8ajQZLlizBs88+i1atWqFp06b45JNP0KNHD4fWIywsDC+//DIGDx6M8+fPo2vXrtKYBwD46KOP8N///hedO3dGjRo18PLLL0vdDAAQExODpUuXYtKkSSguLkZqaioWL16Mli1b4vDhw/j7778xc+ZM5Obmol69epg+fbqiacQjR47E+vXr0aFDB+Tn52PdunWoX7++Q8558uTJSEhIwNSpU3Hq1CnExMSgXbt2ePXVVx1yfCJ7fPjhh+jTpw/Cw8OxfPlyfP311/jss8/cXS0AgEYoCbuIiLzMggULMHbsWFy/ft3dVSGiGwYNGoT169cjLy8PDRs2xJgxY/DUU0+5u1oA2EJERERELvLDDz+4uwpmcdo9EXmlu+66y2Bquf6/KVOmuLVu5uoVERGBf/75x611IyJ57DIjIq904cIFFBUVyT4WFxenKoeJo504ccLsY7Vr10ZoaKgLa0NESjAgIiIiIp/HLjMiIiLyeQyIiIiIyOcxICIiIiKfx4CIiIiIfB4DIiIiIvJ5DIiIiIjI5zEgIiIiIp/HgIiIiIh83v8DTrplYfEi2MMAAAAASUVORK5CYII=", + "text/plain": [ + "
                                                                  " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "with s3_fsspec.open(s3_url) as f:\n", + " atl08_track = xarray.open_dataset(f, group='gt1l/land_segments', engine=\"h5netcdf\", phony_dims='sort')\n", + " print(atl08_track)\n", + " atl08_track.dem_h.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "dec4d2fc-7a93-419e-9996-4d8d20a8a892", + "metadata": { + "tags": [] + }, + "source": [ + "If we want to plot canopy height, we can also do that:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "8003da8f-ded1-4f52-b6f3-cc9e110be1f5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
                                                                  " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "with s3_fsspec.open(s3_url) as f:\n", + " atl08_track = xarray.open_dataset(f, group='gt1l/land_segments/canopy', engine=\"h5netcdf\", phony_dims='sort')\n", + " atl08_track.h_canopy.plot()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/science/ESA_CCI/ESA_CCI_V4.ipynb b/docs/source/science/ESA_CCI/ESA_CCI_V4.ipynb index 27727306..df6b38a7 100644 --- a/docs/source/science/ESA_CCI/ESA_CCI_V4.ipynb +++ b/docs/source/science/ESA_CCI/ESA_CCI_V4.ipynb @@ -32,6 +32,8 @@ "This dataset comprises estimates of forest Above-Ground Biomass (AGB) for the years 2017, 2018, 2019 and 2020, version 4. They are derived from a combination of Earth Observation (EO) data, depending on the year, from the Copernicus Sentinel-1 mission, Envisat’s ASAR instrument and JAXA’s Advanced Land Observing Satellite (ALOS-1 and ALOS-2), along with additional information from Earth observation sources. The data has been produced as part of the European Space Agency's (ESA's) Climate Change Initiative (CCI) programme by the Biomass CCI team.\n", "\n", "### Additional Resources\n", + "* [Cloud Native Geoguide](https://guide.cloudnativegeo.org/)\n", + "* [Examples of Working with COGs](https://guide.cloudnativegeo.org/cloud-optimized-geotiffs/cogs-examples.html)\n", "* [ESA’s Climate Change Initiative Biomass project](https://climate.esa.int/en/odp/#/project/biomass)\n", "* [xarray Documentation](https://docs.xarray.dev/en/stable/index.html)\n", " " @@ -1582,7 +1584,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.8" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/source/science_examples.rst b/docs/source/science_examples.rst index 3729e8aa..f37edf83 100644 --- a/docs/source/science_examples.rst +++ b/docs/source/science_examples.rst @@ -11,8 +11,9 @@ Science Examples science/GEDI/GEDI_L2B.ipynb science/GEDI/GEDI_L3.ipynb science/GEDI/GEDI_L4A.ipynb - science/GEDI/GEDI_L4B.ipynb + science/GEDI/GEDI_L4B.ipynb science/ATL03/ATL03.ipynb + science/ATL08/ATL08.ipynb science/NISAR/NISAR_access.ipynb science/AfriSAR/AfriSAR_AGB.ipynb science/LVIS/accessing_LVIS_data.ipynb diff --git a/docs/source/system_reference_guide/ade_custom_extensions.rst b/docs/source/system_reference_guide/ade_custom_extensions.rst index caf09bb1..151349ae 100644 --- a/docs/source/system_reference_guide/ade_custom_extensions.rst +++ b/docs/source/system_reference_guide/ade_custom_extensions.rst @@ -1,4 +1,4 @@ -ADE Custom Extensions +Other Custom Extensions ======================================= .. toctree:: diff --git a/docs/source/system_reference_guide/ade_custom_extensions/maap_help.ipynb b/docs/source/system_reference_guide/ade_custom_extensions/maap_help.ipynb index e591685c..554a9ead 100644 --- a/docs/source/system_reference_guide/ade_custom_extensions/maap_help.ipynb +++ b/docs/source/system_reference_guide/ade_custom_extensions/maap_help.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Maap Help Jupyter Extension\n", + "# MAAP Help Jupyter Extension\n", "This Jupyter extension provides an interactive tutorial on a new user's first launch of the ADE and adds MAAP specific information to the help tab. The interactive tutorial can be accessed again from the help menu. " ] }, diff --git a/docs/source/system_reference_guide/faq/import_granules.ipynb b/docs/source/system_reference_guide/faq/import_granules.ipynb index 8d6f6dea..b2ce78d0 100644 --- a/docs/source/system_reference_guide/faq/import_granules.ipynb +++ b/docs/source/system_reference_guide/faq/import_granules.ipynb @@ -7,17 +7,17 @@ "source": [ "# How Do I Import Granules Over From My EARTHDATA Search Into My Jupyter Notebook?\n", "\n", - "Launch EarthData Search by Data Search-> Open EarthData Search. After setting your search parameters or adding layers using the green plus, switch tabs back to your Jupyter notebook. At the top, open the Data Search menu, and select *Paste Search Results*.\n", + "Launch EarthData Search by Data Search-> Open EarthData Search. After setting your search parameters or adding layers using the green plus, switch tabs back to your Jupyter notebook. At the top, open the Data Search menu, and select *Paste Granule Search Results*.\n", "\n", - " ![Import Granules](../../_static/faq_images/import_granules_1.png) \n", + " ![Import Granules](../../_static/faq_images/import_granules.png) \n", " \n", - "Caveat: This call uses the MAAP Python library. Make sure you import it before running the inserted code. You can do this by clicking on the blue “MAAP” text just below your notebook name (circled in red)." + "Caveat: The *Paste Granule Search Query* call uses the MAAP Python library. Make sure you import it before running the inserted code. You can do this by clicking on the blue “MAAP” button just below your notebook name (upper left corner)." ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3.11.1 64-bit", + "display_name": "Python 3.12.2 64-bit", "language": "python", "name": "python3" }, @@ -31,11 +31,11 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.1" + "version": "3.12.2" }, "vscode": { "interpreter": { - "hash": "5c7b89af1651d0b8571dde13640ecdccf7d5a6204171d6ab33e7c296e100e08a" + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" } } }, diff --git a/docs/source/system_reference_guide/jobs_maappy.ipynb b/docs/source/system_reference_guide/jobs_maappy.ipynb index e9e70e66..7b8084ba 100644 --- a/docs/source/system_reference_guide/jobs_maappy.ipynb +++ b/docs/source/system_reference_guide/jobs_maappy.ipynb @@ -75,7 +75,20 @@ "\n", "```\n", "'86fbac52-24b0-4963-8b67-59d0fc09946aSucceeded'\n", - "```" + "```\n", + "\n", + "### Job Status\n", + "Job status may be different between the HySDS Figaro job-monitoring dashboard and the Jobs UI. Below is a mapping of status terms:\n", + "```\n", + "MAAP <- HySDS\n", + "Accepted <- job-queued\n", + "Running <- job-started\n", + "Success <- job-completed\n", + "Failed <- job-offline or job-failed\n", + "job-revoked <- job-revoked (when a queued or running job is stopped before completion)\n", + "\n", + "HySDS state not valid/used in MAAP: job-deduped\n", + "```\n" ] }, { diff --git a/docs/source/system_reference_guide/jobsui.ipynb b/docs/source/system_reference_guide/jobsui.ipynb index a5316b58..ce5cbe47 100644 --- a/docs/source/system_reference_guide/jobsui.ipynb +++ b/docs/source/system_reference_guide/jobsui.ipynb @@ -19,7 +19,7 @@ "\n", "1. From your workspace click on the __View & Submit Jobs__ card on the Launcher tab.\n", "\n", - "![job_ui_access](../_static/jobs_ui_access.png)\n" + "![job_ui_access](../_static/jobs_ui/jobs_ui_access.png)\n" ] }, { @@ -33,7 +33,20 @@ "\n", "Users can sort jobs by queued, start, and end time in ascending/descending order. Users may use the search bar to filter the job list down to jobs containing the user-provided string in any of the fields shown. \n", "\n", - "![jobs_ui_overview](../_static/jobs_ui_overview.png)\n" + "![jobs_ui_overview](../_static/jobs_ui/jobs_ui_overview.png)\n", + "\n", + "### Job Status\n", + "Job status may be different between the HySDS Figaro job-monitoring dashboard and the Jobs UI. Below is a mapping of status terms:\n", + "```\n", + "MAAP <- HySDS\n", + "Accepted <- job-queued\n", + "Running <- job-started\n", + "Success <- job-completed\n", + "Failed <- job-offline or job-failed\n", + "job-revoked <- job-revoked (when a queued or running job is stopped before completion)\n", + "\n", + "HySDS state not valid/used in MAAP: job-deduped\n", + "```\n" ] }, { @@ -73,19 +86,19 @@ ".. note::\n", "Experimental feature: The output data will be put into a folder named for your Algorithm and the Job Tag. You can use the same Job Tag on several jobs (e.g. in a batch) to group related output data in one place. In [maap.py submitJob](jobs_maappy.ipynb#Submit-a-Job) this is the `identifier` field when you use submitJob().\n", "\n", - "![jobs_ui_submit](../_static/jobs_ui_submit.png)\n", + "![jobs_ui_submit](../_static/jobs_ui/jobs_ui_submit.png)\n", "\n", "Algorithms may contain additional inputs that users may have to provide.\n", "\n", - "![jobs_ui_submit_detail](../_static/jobs_ui_submit_detail.png)\n", + "![jobs_ui_submit_detail](../_static/jobs_ui/jobs_ui_submit_detail.png)\n", "\n", "Once all inputs have been provided, the user may click __Submit Job__ to submit the job. If the job was submitted successfully, a toast will appear in the bottom right corner containing the unique job id. Please give the __Submit Job__ button a second to execute. \n", "\n", - "![jobs_ui_submit_toast](../_static/jobs_ui_submit_toast.png)\n", + "![jobs_ui_submit_toast](../_static/jobs_ui/jobs_ui_submit_toast.png)\n", "\n", "If the job failed to submit, a toast will appear indicating the job failed to submit.\n", "\n", - "![jobs_ui_failed_toast](../_static/jobs_ui_failed_toast.png)" + "![jobs_ui_failed_toast](../_static/jobs_ui/jobs_ui_failed_toast.png)" ] }, { @@ -97,7 +110,36 @@ "\n", "Users may fill out the job submission form and - instead of submitting the job - click the __Copy Jupyter Notebook Code__ button to copy the __maap-py__ job submission command to their clipboard to then paste it into a Jupyter notebook.\n", "\n", - "![jobs_ui_copy_code](../_static/jobs_ui_copy_code.png)" + "![jobs_ui_copy_code](../_static/jobs_ui/jobs_ui_copy_code.png)" + ] + }, + { + "cell_type": "markdown", + "id": "84cf6298", + "metadata": {}, + "source": [ + "## Cancel Jobs\n", + "\n", + "Users may cancel queued or running jobs. Queued jobs that are cancelled will be deleted and no longer listed in the __View Jobs__ table. Running jobs that are cancelled will be stopped, but still viewable in the __View Jobs__ table. These jobs will have the status __job-revoked__.\n", + "\n", + ".. note::\n", + "Jobs that are listed as queued in the UI, then cancelled, may remain in the View Jobs table after the cancel request was submitted. This is due to a delay within the DPS between job state change and report of job state change. In these cases, the cancelled job was not really queued but had already started.\n", + "\n", + "1. In the View Jobs table, hover over the job entry you want to cancel to display the action bar.\n", + "\n", + "2. Click the cancel job button.\n", + "\n", + "![jobs_ui_revoke_job](../_static/jobs_ui/revoke_job.png)\n", + "\n", + "Once the cancel request is submitted, a toast will appear in the bottom right of the workspace indicating whether or not the request was successful.\n", + "\n", + "Successful submission:\n", + "![jobs_ui_revoke_success](../_static/jobs_ui/revoke_successful.png)\n", + "\n", + "Unsuccessful submission:\n", + "![jobs_ui_revoke_failed](../_static/jobs_ui/revoke_failed.png)\n", + "\n", + " " ] } ], diff --git a/docs/source/technical_tutorials.rst b/docs/source/technical_tutorials.rst index 45fc6821..785fb9cd 100644 --- a/docs/source/technical_tutorials.rst +++ b/docs/source/technical_tutorials.rst @@ -5,6 +5,7 @@ Technical Tutorials :maxdepth: 2 + technical_tutorials/dps_tutorial/dps_tutorial_demo.ipynb technical_tutorials/searching.rst technical_tutorials/visualizing.rst technical_tutorials/accessing.rst diff --git a/docs/source/technical_tutorials/access/accessing_cod.ipynb b/docs/source/technical_tutorials/access/accessing_cod.ipynb index 323871b5..33b583ea 100644 --- a/docs/source/technical_tutorials/access/accessing_cod.ipynb +++ b/docs/source/technical_tutorials/access/accessing_cod.ipynb @@ -35,6 +35,8 @@ "source": [ "## Additional Resources\n", "\n", + "- [Cloud Native Geoguide](https://guide.cloudnativegeo.org/)\n", + "- [Examples of Working with COGs](https://guide.cloudnativegeo.org/cloud-optimized-geotiffs/cogs-examples.html)\n", "- [Using pystac-client](https://pystac-client.readthedocs.io/en/stable/api.html)\n" ] }, @@ -1156,9 +1158,9 @@ ], "metadata": { "kernelspec": { - "display_name": "gedi_subset", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "gedi_subset" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1170,7 +1172,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/source/technical_tutorials/access/edav_wcs_data.ipynb b/docs/source/technical_tutorials/access/edav_wcs_data.ipynb index 7dab1074..346ffe2c 100644 --- a/docs/source/technical_tutorials/access/edav_wcs_data.ipynb +++ b/docs/source/technical_tutorials/access/edav_wcs_data.ipynb @@ -28,6 +28,8 @@ "metadata": {}, "source": [ "## Additional Resources\n", + "- [Cloud Native Geoguide](https://guide.cloudnativegeo.org/)\n", + "- [Examples of Working with COGs](https://guide.cloudnativegeo.org/cloud-optimized-geotiffs/cogs-examples.html)\n", "- [Raster data handling with Python](https://geoscripting-wur.github.io/PythonRaster/)\n", "- [OWSLib Github](https://github.com/geopython/OWSLib)\n", "- [rioxarray Documentation](https://corteva.github.io/rioxarray)" @@ -440,7 +442,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/alg-reg-2.png b/docs/source/technical_tutorials/dps_tutorial/_static/alg-reg-2.png new file mode 100644 index 00000000..bcac0f75 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/alg-reg-2.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/dps_tutorial_git_repo.png b/docs/source/technical_tutorials/dps_tutorial/_static/dps_tutorial_git_repo.png new file mode 100644 index 00000000..79f740fb Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/dps_tutorial_git_repo.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_1.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_1.png new file mode 100644 index 00000000..ae50899d Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_1.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_2.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_2.png new file mode 100644 index 00000000..93728072 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_2.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_3.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_3.png new file mode 100644 index 00000000..f1c92165 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_3.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_4.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_4.png new file mode 100644 index 00000000..86efea76 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_4.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_5.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_5.png new file mode 100644 index 00000000..d979b8ba Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_5.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_6.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_6.png new file mode 100644 index 00000000..62bc4059 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_register_6.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_submit_1.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_submit_1.png new file mode 100644 index 00000000..fdb446e0 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_submit_1.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_submit_2.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_submit_2.png new file mode 100644 index 00000000..a9516f6d Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_submit_2.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_1.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_1.png new file mode 100644 index 00000000..81335c4b Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_1.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_2.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_2.png new file mode 100644 index 00000000..09a24f6e Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_2.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_3.png b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_3.png new file mode 100644 index 00000000..be70ad88 Binary files /dev/null and b/docs/source/technical_tutorials/dps_tutorial/_static/tutorial_view_3.png differ diff --git a/docs/source/technical_tutorials/dps_tutorial/dps_tutorial_demo.ipynb b/docs/source/technical_tutorials/dps_tutorial/dps_tutorial_demo.ipynb new file mode 100644 index 00000000..1b72d081 --- /dev/null +++ b/docs/source/technical_tutorials/dps_tutorial/dps_tutorial_demo.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Processing System (DPS) Tutorial A to Z" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Authors: Sujen Shah and Rob Tapella\n", + "\n", + "Review and Editing: Chuck Daniels and Rajat Shinde\n", + "\n", + "Date: April, 2024\n", + "\n", + "Description: This DPS tutorial is intended to demonstrate the steps needed to create, register, run, monitor and view outputs of algorithm jobs run at scale. It includes a template repository with various files needed to set up and run a job. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Importing and Installing Packages" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Additional package installation will be included inline, and environment-configuration to support a custom conda environment in DPS is a part of the tutorial below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Before Starting\n", + "\n", + "- This tutorial assumes that you have at least run through the [Getting Started Guide](../../getting_started/getting_started.ipynb) and have set up your MAAP account.\n", + "- This tutorial is made for the Application Development Environment (ADE) \"Basic Stable\" workspace v3.1.4 or later (February 2024 or later).\n", + "- This also assumes that you are familiar with using [Github with MAAP](../../system_reference_guide/work_with_git.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## An Overview of How DPS Works" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The MAAP DPS (Data Processing System) lets you run an Algorithm at scale, in the cloud. It is different from running a Jupyter notebook in that it is non-interactive. Therefore, when migrating a notebook to the DPS it needs to be altered to take all of the input parameters at once as a command-line program. Even if you start with a command-line script, there are best practices to follow when preparing it for the DPS. Once that is done, the Algorithm can be Registered in a way that allows you to execute analysis jobs using a web-based form, where each field is defined during the Registration process.\n", + "\n", + "The DPS will then be able to take a set of inputs and process them at scale. You do not need to worry about scheduling or scaling your jobs. You can also run your DPS Algorithm using the maap.py Python library in a loop to execute a batch of jobs (e.g., 1000 input files and one job per input-file). The DPS will manage the compute resources to handle your request, and you can easily find all of your outputs as each individual job completes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview of this Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Run and Monitor an example Algorithm using the Jobs UI to help anticipate what we will accomplish\n", + "- Clone the demo Algorithm\n", + "- Edit and test your Algorithm code to make sure that it is working in its original form\n", + "- Prepare the Algorithm for DPS by setting up the runtime arguments and pre-run environment set-up\n", + "- Register the Algorithm with the Algorithm UI\n", + "- Run and Monitor the Algorithm using the Jobs UI\n", + "- View the outputs and errors from your run" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run and Monitor an example Algorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you are not familiar with running jobs in the DPS, please try running through the [Jobs UI guide](../../system_reference_guide/jobsui.ipynb) and the [Getting Started Guide](../../getting_started/running_at_scale.ipynb).\n", + "\n", + "This can be helpful because the process of Registering an Algorithm for DPS helps to build the user-interface to Run a Job. By familiarizing yourself with the process of running a Job, the Registration process may become more intuitive." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clone the Demo Algorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will use an example Python-based algorithm for this tutorial. First we need to get the demo code into a Jupyter workspace.\n", + "\n", + "1. For this tutorial, please use a Basic Stable workspace (v3.1.4 or later). \n", + "2. Clone the Github repository at https://github.com/MAAP-Project/dps_tutorial . For the sake of this tutorial, we will assume that the clone is placed into a folder called algorithms in our home folder (i.e., ~/algorithms).\n", + "```\n", + "mkdir ~/algorithms\n", + "cd ~/algorithms\n", + "git clone https://github.com/MAAP-Project/dps_tutorial.git\n", + "```\n", + "\n", + "An algorithm needs to be in a public code-repository in order to register it with the DPS. For this tutorial we will use the `gdal_wrapper` algorithm folder inside the `dps_tutorial` repository code. Now that you have the demonstration code, take a look at the files that are there and then we will be ready to perform a few test-runs before Registering it.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Anatomy of the `gdal_wrapper` algorithm folder in the `dps_tutorial` repo:\n", + "\n", + "- `README.md` to describe the algorithm in Github\n", + "- `build-env.sh`: a shell script that is executed before the algorithm is run; it is used to set up any custom programming libraries used in the algorithm (i.e., a custom conda environment)\n", + "- `environment.yml`: a configuration file used by conda to add any custom libraries; this is used by build-env.sh\n", + "- `gdal_wrapper.py`: a python script that contains the logic of the algorithm\n", + "- `run_gdal.sh`: a shell script that DPS will execute when a run is requested. It calls any relevant python files with the required inputs\n", + "\n", + "![DPS Tutorial Git repository overview](_static/dps_tutorial_git_repo.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Edit and Test your Code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you have an algorithm such as the `gdal_wrapper` test it to make sure that it is running properly. If it runs properly in a Jupyter Terminal window, you are one step closer to registering and running your algorithm in the DPS.\n", + "\n", + "Typically a Jupyter Notebook is run interacively. A DPS algorithm will take all inputs up-front, do the processing, and produce output files. The `gdal_wrapper` script is already set up like a DPS algorithm. Some aspects to note:\n", + "\n", + "- **Python argparse**: Using a library like [argparse](https://docs.python.org/3/library/argparse.html) to accept input parameters helps to make the code more readable and easier to debug when working locally. It provides easy to write user-friendly command-line interface. \n", + "\n", + "- **Logging**: It is a good practice to write out a log file during the execution of your code making it easier to debug. When running on the DPS, any logs written to the `output` directory or written to `stdout` or `stderr` will automatically be preserved. \n", + "\n", + "### Testing the Python script locally within the workspace\n", + "\n", + "Before registering your algorithm you can test it locally to catch common errors related to input parsing and storing output. To test your algorithm locally before registration follow the below steps:\n", + "\n", + "- Deactivate the current python virtual environment and activate the pre-installed conda environment (for the Basic Stable workspace, it is vanilla)\n", + "```\n", + "conda deactivate\n", + "conda activate vanilla\n", + "```\n", + "- Make sure that your runtime conda environment is set up. To do this, run `build-env.sh` in the `gdal_wrapper` folder.\n", + "```\n", + "cd ~/algorithms\n", + "cd dps_tutorial/gdal_wrapper\n", + "./build-env.sh\n", + "```\n", + "- Make a new temporary directory outside your current repository. This is where you will do a test-run of your algorithm with some inputs and outputs.\n", + "```\n", + "mkdir ~/algorithms/dps_test_run\n", + "cd ~/algorithms/dps_test_run\n", + "```\n", + "- Create a directory called `input` and place any input files required by your algorithm. Here you will need to download any input files up-front, and then run your script. Also make an `output` folder. When you have registered your algorithm and run it in DPS, the input file can be passed in as a runtime parameter and DPS will automatically download it as part of the run.\n", + "```\n", + "mkdir input\n", + "mkdir output\n", + "```\n", + "```\n", + "# ls -F\n", + "input/ output/\n", + "```\n", + "- You will need a test GeoTIF file as input. If you do not have one, go to the folder where you'd like to download the example file (assuming you're in the `dps_test_run` folder as above, `cd input`) and use the following aws command (NOTE: if this step fails, it is likely that you are either in a Basic Stable workspace version prior to v3.1.4, or you do not have the vanilla conda environment activated):\n", + "```\n", + "cd input\n", + "```\n", + "```\n", + "aws s3 cp s3://nasa-maap-data-store/file-staging/nasa-map/ESACCI_Biomass_L4_AGB_V4_100m_2020/S40E160_ESACCI-BIOMASS-L4-AGB-MERGED-100m-2020-fv4.0.tif .\n", + "```\n", + "- Once the input directory is set up, `cd ..` back to the `dps_test_run` directory and call your run script. This is the script you would like the DPS to run when your code is executing on the cloud. Note: This assumes you have already built the environment with required custom packages as mentioned in the build-env.sh of your algorithm. We did this above.\n", + "```\n", + "cd ~/algorithms/dps_test_run\n", + "```\n", + "```\n", + "python ../dps_tutorial/gdal_wrapper/gdal_wrapper.py --input_file input/S40E160_ESACCI-BIOMASS-L4-AGB-MERGED-100m-2020-fv4.0.tif --output_file output/TestFile-30.tif --outsize 30\n", + "```\n", + "- Successful output of the script should look like this:\n", + "```\n", + "Installed GDAL Version: 3.6.1\n", + "b'Input file size is 2400, 3600\\n0...10...20...30...40...50...60...70...80...90...100 - done.\\n'\n", + "```\n", + "\n", + "And if you look in your output folder, you will see your output file:\n", + "```\n", + "# ls output/\n", + "TestFile-30.tif\n", + "```\n", + "\n", + "- If all desired outputs are created, you are one step closer to successfully running your algorithm on the DPS. Your core application can be run at a command-line in a non-interactive mode.\n", + "- The next step is to prepare the Algorithm to be run in DPS.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare the Algorithm for DPS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once your scripts are working locally, make sure that they will also work in DPS.\n", + "\n", + "The `gdal_wrapper` files are already prepared for DPS. When running from DPS we will have the `run_gdal.sh` shell script do the execution, so we should test it first:\n", + "```\n", + "cd ~/algorithms/dps_test_run\n", + "```\n", + "```\n", + "../dps_tutorial/gdal_wrapper/run_gdal.sh output_from_shell.tif 25\n", + "```\n", + "\n", + "This should write a similar message to STDOUT that you saw when executing `gdal_wrapper.py` above. You should see an output file that is slightly smaller than the original test run because we chose a smaller value for the `outsize` parameter.\n", + "\n", + "The shell script is wrapping the Python script that we ran above. Note that there are different parameters—-in the shell script we read all the input files from `input/` and write outputs into the `output/` folder. If you read the shell script you will see how this is happening.\n", + "```\n", + "# ../dps_tutorial/gdal_wrapper/run_gdal.sh output_from_shell.tif 25\n", + "Installed GDAL Version: 3.7.0\n", + "b'Input file size is 11250, 11250\\n0...10...20...30...40...50...60...70...80...90...100 - done.\\n'\n", + "\n", + "# ls -alF *\n", + "input:\n", + "total 7696\n", + "drwxr-xr-x 2 root root 6144 Feb 28 15:52 ./\n", + "drwxr-xr-x 4 root root 6144 Feb 28 15:52 ../\n", + "-rw-r--r-- 1 root root 7869236 Jun 7 2023 S40E160_ESACCI-BIOMASS-L4-AGB-MERGED-100m-2020-fv4.0.tif\n", + "\n", + "output:\n", + "total 20488\n", + "drwxr-xr-x 2 root root 6144 Feb 28 15:54 ./\n", + "drwxr-xr-x 4 root root 6144 Feb 28 15:52 ../\n", + "-rw-r--r-- 1 root root 22804732 Feb 28 15:53 TestFile-30.tif\n", + "-rw-r--r-- 1 root root 15834792 Feb 28 15:54 output_from_shell.tif\n", + "```\n", + "\n", + "Some important things to note:\n", + "\n", + "File: `build-env.sh`\n", + "\n", + "- this script is used for installing custom packages using pip or conda \n", + "- can take conda environment definition from `environment.yaml`\n", + "- current practice is to update the default environment for the Container that you're using\n", + "\n", + "File: `run_gdal.sh`\n", + "\n", + "- `run_gdal.sh` is a bash script to call the `gdal_wrapper.py` algorithm: make sure for DPS you have inputs and outputs in the right places. If you look at `run_gdal.sh` you will see that it is reading all the files from the `input/` folder and writing to the `output/` folder.\n", + "- sets the correct python environment for your code to run\n", + "- the best way to execute your algorithm with a custom environment is to use `conda run`, as shown in this script (`conda run --live-stream --name dps_tutorial python ${basedir}/gdal_wrapper.py --input_file ${INPUT_FILENAME} --output_file output/${OUTPUT_FILENAME} --outsize ${REDUCTION_SIZE}`)\n", + "\n", + "Run your scripts as if DPS is executing them:\n", + "\n", + "- activate the default conda environment, in this case `conda activate vanilla`\n", + "- run `build-env.sh` to create or update your custom environment\n", + "- run `run_gdal.sh` to execute your algorithm using the custom environment\n", + "\n", + "Future topics:\n", + "\n", + "- What happens with input and output in DPS\n", + "- How does file management happen?\n", + "- Relative paths vs. absolute for input/output\n", + "- Mimic what’s happening on DPS (basedir)\n", + "- This wrapper `run_gdal.sh` script needs to manage the input files the way that your python script requires them (e.g. pass single file at a time vs. multiple files at once, etc.)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Register the Algorithm with DPS using the Algorithm UI" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0. When you are registering your own algorithm, make sure that all your changes are commited and pushed into Github. The registration process will pull the code from Github as part of registration. In this case, we will simply use the existing demonstration repo.\n", + "1. Open up [Launcher: Register Algorithm](../../getting_started/running_at_scale.ipynb#Register-an-Algorithm) (the same as the Register Algorithm option from the Command Palette)\n", + "2. Fill in the fields as described below.\n", + "\n", + "#### First you fill in the public code-repository information:\n", + "![Code repo information](_static/tutorial_register_1.png)\n", + "\n", + "- The Repository URL is the .git URL. In the demo repository, it is\n", + "```\n", + "https://github.com/MAAP-Project/dps_tutorial.git\n", + "```\n", + "- Repository Branch is used as a version when this algorithm is registered. For your test it is likely `main`\n", + "- The Run and Build Commands must be the full path of the scripts that will be used by the DPS to build and execute the algorithm. Typically these will be the `repository_name/script_name.sh`. In this case we have a run command:\n", + "```\n", + "dps_tutorial/gdal_wrapper/run_gdal.sh\n", + "```\n", + "and a build command:\n", + "```\n", + "dps_tutorial/gdal_wrapper/build-env.sh\n", + "```\n", + "\n", + "#### Then fill in the rest of the algorithm information:\n", + "![Algorithm information](_static/tutorial_register_2.png)\n", + "\n", + "- The Algorithm Name will be the unique identifier for the algorithm in the MAAP system. It can be whatever you want. \n", + "- Algorithm Description is additional free-form text to describe what this algorithm does.\n", + "- Disk Space is the minimum amount of space you expect—including all inputs, scratch, and outputs—it gives the DPS an approximation to help optimize the run.\n", + "- Resource Allocation is a dropdown-selection with some options for memory and CPU of the cloud compute you expect to need.\n", + "- The Container URL is a URL of the Stack (workspace image environment) you are using as a base for the algorithm. The user-interface will pre-fill this with the Container of your current workspace; if this is the correct base workspace for the Algorithm (i.e., you successfully ran the Algorithm in a Terminal without requiring a custom base-Container), then you can leave it as is. In this example we use: `mas.maap-project.org/root/maap-workspaces/base_images/vanilla:main`\n", + "See [the Getting Started guide](../../getting_started/running_at_scale.ipynb#Container-URLs) for more information on Containers.\n", + "\n", + "#### Finally you fill in the input section:\n", + "- There are File Inputs and Positional Inputs (command-line parameters to adjust how the algorithm runs). In our example we have a File Input called `input_file` and two Positional Inputs: an output file called `output_file` and a parameter called `outsize` describing how much file-size reduction we want to get. For each input you can add a Description, a Default Value, and mark whether it’s required or optional.\n", + "\n", + "![Algorithm-Inputs information](_static/tutorial_register_3.png)\n", + "\n", + "4. Press Register and there will a popup dialog with a link to view progress of the registration (you should copy the link and paste it into a new page, or open it in a new browser tab). If you close this modal, you can look for your Algorithm build at https://repo.maap-project.org/root/register-job-hysds-v4/-/jobs/\n", + "![Register confirmation popup information](_static/tutorial_register_4.png)\n", + "\n", + "In order to continue, your Algorithm must be successfully registered. The link from the modal dialog will have a screen with a progress log in it. If it is successful and complete, the bottom of the log will look something like this:\n", + "![Registration process log complete](_static/tutorial_register_5.png)\n", + "\n", + "If the registration process failed, the log will look like the below screenshot. In this case you will need to either ask for help, or scroll back up through the log to see what went wrong.\n", + "![Registration process log failed](_static/tutorial_register_6.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running and Monitoring the Algorithm with the Jobs UI" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once your Algorithm has been fully registered, you can try running a Job.\n", + "\n", + "1. Open the Launcher and select the [Submit Jobs](../../getting_started/running_at_scale.ipynb#Run-the-Algorithm-as-a-Job-and-Monitor-it) icon\n", + "2. Run the job. \n", + "- Choose the Algorithm you just registered using the dropdown menu.\n", + "- The Job Tag can be empty or any list of short terms that you would like to associate with your job. This will help you sort and filter the job list later. It is a comma-separated list of tags.\n", + "- The Resource is likely to be the same as the one you chose when registering the Algorithm. For the tutorial it can be the smallest one (8 GB).\n", + "- The input file can be any GeoTIF file that is accessible by the system. For example, you can browse the [MAAP STAC](https://stac-browser.maap-project.org/collections/ESACCI_Biomass_L4_AGB_V4_100m?.language=en) and find a GeoTIF. For example\n", + "```\n", + "s3://nasa-maap-data-store/file-staging/nasa-map/ESACCI_Biomass_L4_AGB_V4_100m_2020/S40E160_ESACCI-BIOMASS-L4-AGB-MERGED-100m-2020-fv4.0.tif\n", + "```\n", + "- The output file can have any name. It should end with .tif because it will be a GeoTIF also.\n", + "- Outsize is a number from 1 to 100.\n", + "![Submit Job Page](_static/tutorial_submit_1.png)\n", + "\n", + "3. Submit the job and go back to the View tab\n", + "- When you submit you should see a notification in the bottom right, and a note just under the Submit button, saying that it was successful\n", + "![Submit Success Notification](_static/tutorial_submit_2.png)\n", + "- at that point, open the Launcher -> View Jobs icon\n", + "\n", + "4. You can observe the progress of your job while it runs, and the status (complete or fail) when it completes using the View Jobs tab\n", + "![View Jobs Page](_static/tutorial_view_1.png)\n", + "- By selecting a row from the table (top panel) it will show Job Details (in the bottom panel)\n", + "- The status should go from queued to running, to completed or failed\n", + "- Check the Inputs and Outputs sections of the Job Details\n", + "\n", + "5. From the Outputs section, you can copy the path of your output file starting with `dps_outputs` and find it by going to your `~/my-private-bucket` folder and then following the remainder of the path. \n", + "![Copy the Path information](_static/tutorial_view_2.png)\n", + "\n", + "In that folder you will see some JSON files with metadata about the job and the data, as well as the output file (your .tif file).\n", + "![cd to path using Terminal](_static/tutorial_view_3.png)\n", + "\n", + "You can download the output files by browsing to them in the Jupyter file panel and selecting Download from the contextual menu (right-click)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running and Monitoring using the HySDS Jobs UI (Figaro)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This will be described in a future update. HySDS is the data-processing system used to run the jobs. It has a full web application that is used by NASA missions to monitor jobs and data-outputs. If you would like to beta-test this UI with MAAP, please contact Sujen or George." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Registering and Running the Algorithm using maap.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This will be described in a future update. Often larger batch-jobs are run from Python Notebooks rather than the GUI." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting the Outputs of the Job" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Output folder\n", + "\n", + "The DPS treats a folder named `output` specially. Any files stored in this folder will be preserved and uploaded to S3 after the algorithm run is complete. The location of this output will depend on factors like algorithm name, time of run, tags, etc. This output folder can be viewed within your workspace under the `my-private-bucket/dps_output` directory.\n", + "\n", + "The output directory is created relative to your script specified in `run_command` at the time of registration. So to access the directory, simply do something like this in your run script. \n", + "```\n", + "mkdir -p output\n", + "``` \n", + " \n", + "#### Stderr & Stdout \n", + "\n", + "By default, anything written to the stderr and stdout pipes will be stored in files call _stderr and _stdout and placed in your output directory. \n", + "\n", + "#### Logfiles\n", + "\n", + "DPS does not automatically store any logfiles written by your algorithm, if you would like them to be preserved make sure to write them in the output directory. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Frequently Asked Questions (FAQ)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "### What happens with input and output in DPS?\n", + "\n", + "Since the jobs on DPS are run on a machine on the cloud, your local workspace directories are not available. It is important to pass any files required as inputs for your algorithm using the `File` parameter type. \n", + "Any outputs that need to be saved should be placed in a directory called `output`. \n", + "\n", + "When a parameter is registered as a file input, DPS downloads the corresponding value provided by the user as a file and places it in a directory called `input`. \n", + "It is important to note that if the value provided a parameter marked as file during registration is not a valid url, DPS will report an error.\n", + "\n", + "Note: Both `input` and `output` directories are relative to your run script. \n", + " \n", + "### How does file management happen?\n", + "\n", + "File management i.e. files required for input and files stored as outputs on S3 are taken care of by the DPS. To locate the files created as an output from your job, look into the `/projects/my-private-bucket/dps_output` dir on your workspace and navigate to the algorithm type and time of run. \n", + "\n", + "You can also construct the output path of your files by looking at the job info on the Jobs UI or by running \n", + "```maap.getJobResult('job_id')```\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "### What is the basedir variable in the run script example?\n", + "\n", + "As we now know that your job on the DPS runs on a cloud machine, it is not possible to know the absolute path of your script before execution. \n", + "Using \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "is_executing": true + }, + "outputs": [], + "source": [ + "#basedir=$(dirname \"$(readlink -f \"$0\")\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "allows you to get the absolute path of the directory in which your run script is present allowing you to set any other executable paths as required by your algorithm. \n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gedi_subset", + "language": "python", + "name": "gedi_subset" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/source/technical_tutorials/user_data.rst b/docs/source/technical_tutorials/user_data.rst index d235a4c5..a76b102b 100644 --- a/docs/source/technical_tutorials/user_data.rst +++ b/docs/source/technical_tutorials/user_data.rst @@ -5,4 +5,5 @@ User Data :maxdepth: 2 :caption: User Data: - user_data/create-datasets-for-dashboard.ipynb \ No newline at end of file + user_data/create-datasets-for-dashboard.ipynb + user_data/memory-profiling-python.ipynb \ No newline at end of file diff --git a/docs/source/technical_tutorials/user_data/create-datasets-for-dashboard.ipynb b/docs/source/technical_tutorials/user_data/create-datasets-for-dashboard.ipynb index 08d54bc0..43ed897f 100644 --- a/docs/source/technical_tutorials/user_data/create-datasets-for-dashboard.ipynb +++ b/docs/source/technical_tutorials/user_data/create-datasets-for-dashboard.ipynb @@ -48,6 +48,8 @@ "metadata": {}, "source": [ "## Additional Resources\n", + "- [Cloud Native Geoguide](https://guide.cloudnativegeo.org/)\n", + "- [Examples of Working with COGs](https://guide.cloudnativegeo.org/cloud-optimized-geotiffs/cogs-examples.html)\n", "- [Rio Tiler Colors](https://cogeotiff.github.io/rio-tiler/colormap/)\n", "- [Matplotlib Colors](https://matplotlib.org/stable/tutorials/colors/colormaps.html) " ] @@ -1195,7 +1197,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.8" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/source/technical_tutorials/user_data/demo_memory_profiling.py b/docs/source/technical_tutorials/user_data/demo_memory_profiling.py new file mode 100644 index 00000000..33f1e5cf --- /dev/null +++ b/docs/source/technical_tutorials/user_data/demo_memory_profiling.py @@ -0,0 +1,24 @@ +from memory_profiler import profile + +@profile +def my_function(): + # Include each line of the script which needs to be profiled + # under this function + + return 0 + +@profile +def my_other_function(): + # Include each line of the script which needs to be profiled + # under this function + + return 0 + +def main(): + my_function() + my_other_function() + + #... + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/docs/source/technical_tutorials/user_data/demo_memory_profiling_logging.py b/docs/source/technical_tutorials/user_data/demo_memory_profiling_logging.py new file mode 100644 index 00000000..7ed1ae8e --- /dev/null +++ b/docs/source/technical_tutorials/user_data/demo_memory_profiling_logging.py @@ -0,0 +1,27 @@ +from memory_profiler import profile + +fp=open('memory_profiler.log','w+') +@profile(stream=fp) +def my_function(): + # Include each line of the script which needs to be profiled + # under this function + + return 0 + +@profile(stream=fp) +def my_other_function(): + # Include each line of the script which needs to be profiled + # under this function + + return 0 + +def main(): + my_function() + my_other_function() + + #... + +if __name__ == "__main__": + main() + + \ No newline at end of file diff --git a/docs/source/technical_tutorials/user_data/memory-profiling-python.ipynb b/docs/source/technical_tutorials/user_data/memory-profiling-python.ipynb new file mode 100644 index 00000000..6347f8a2 --- /dev/null +++ b/docs/source/technical_tutorials/user_data/memory-profiling-python.ipynb @@ -0,0 +1,278 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8f399a66-d82e-4210-a08e-4501903b6e2b", + "metadata": { + "tags": [] + }, + "source": [ + "# Memory Profiling Python Scripts in the MAAP ADE\n", + "\n", + "Authors: Rajat Shinde (UAH), Alex Mandel (DevSeed), Jamison French (DevSeed), Sheyenne Kirkland (UAH), Brian Freitag (NASA MSFC), Chuck Daniels (DevSeed)\n", + "\n", + "Date: February 7, 2024\n", + "\n", + "Description: Memory profiling your Python script is a good practice to understand the resource requirements. This is useful when you have working code and you want to estimate the size of the DPS worker to be used. Additionally, it is helpful to optimize the code for resource requirements. \n", + "\n", + "In this tutorial, we will use [memory-profiler](https://pypi.org/project/memory-profiler/) for profiling a sample Python script [demo_memory_profiling.py](./demo_memory_profiling.py). We also see how to log the output to a `.log` file. \n", + "\n", + "### Run This Notebook\n", + "To access and run this tutorial within MAAP's Algorithm Development Environment (ADE), please refer to the [\"Getting started with the MAAP\"](https://docs.maap-project.org/en/latest/getting_started/getting_started.html) section of our documentation.\n", + "\n", + "Disclaimer: It is highly recommended to run a tutorial within MAAP's ADE, which already includes packages specific to MAAP, such as maap-py. Running the tutorial outside of the MAAP ADE may lead to errors.\n", + "\n", + "### Additional Resources\n", + "\n", + "1. [https://github.com/pythonprofilers/memory_profiler](https://github.com/pythonprofilers/memory_profiler)" + ] + }, + { + "cell_type": "markdown", + "id": "24efa20c-66e9-45d2-bc6d-695b38329158", + "metadata": {}, + "source": [ + "### Installation \n", + "\n", + "We will begin by installing `memory-profiler` in the current working environment." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c54089e1-d6ec-4386-95da-06fdd3c357cb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting memory-profiler\n", + " Using cached memory_profiler-0.61.0-py3-none-any.whl (31 kB)\n", + "Requirement already satisfied: psutil in /opt/conda/envs/vanilla/lib/python3.10/site-packages (from memory-profiler) (5.9.7)\n", + "Installing collected packages: memory-profiler\n", + "Successfully installed memory-profiler-0.61.0\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "# !pip install -U memory-profiler" + ] + }, + { + "cell_type": "markdown", + "id": "5a3baaf1-8d1b-4e61-9798-f205fc2648fd", + "metadata": {}, + "source": [ + "### Add Decorator \n", + "\n", + "Typically, line-by-line memory usage is required for analyzing code. For this example, we are creating dummy functions to be profiled, named `my_function` and `my_other_function`. \n", + "\n", + "You may add the `@profile` decorator to individual functions that you want to profile. This allows you to limit which parts of your program are profiled, thus limiting the volume of profiling output.\n", + "\n", + "However, this requires you to modify your code. If you wish to avoid modifying your code, particularly when it is not yet obvious which parts of your code may be consuming too much memory, simply add the `-m memory_profiler` to the python command." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f4c9941c-e8b8-4c3c-b545-a173284248d8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ERROR: Could not find file /tmp/ipykernel_314/3429381877.py\n", + "ERROR: Could not find file /tmp/ipykernel_314/3429381877.py\n" + ] + } + ], + "source": [ + "from memory_profiler import profile\n", + "\n", + "@profile\n", + "def my_function():\n", + " # Perform some potentially memory-intensive computation\n", + " \n", + " return 0\n", + "\n", + "@profile\n", + "def my_other_function():\n", + " # Perform some potentially memory-intensive computation\n", + " \n", + " return 0\n", + "\n", + "def main():\n", + " my_function()\n", + " my_other_function()\n", + " \n", + " #...\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()" + ] + }, + { + "cell_type": "markdown", + "id": "de6a276c-78a9-4769-9fa8-f387deaac9de", + "metadata": {}, + "source": [ + "### Running Memory Profiler \n", + "\n", + "For understanding how to run memory profiler on an existing Python script from a Jupyter notebook, we copied the code snippet from above to a file named `demo_memory_profiling.py` in the working directory. After executing the Python script, we can see the details about memory usage and increment due to a particular line in the output." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "dababd0c-74e8-4b26-ae15-f25ccbac3c0e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: /projects/maap-documentation/docs/source/technical_tutorials/user_data/demo_memory_profiling.py\n", + "\n", + "Line # Mem usage Increment Occurrences Line Contents\n", + "=============================================================\n", + " 6 43.6 MiB 43.6 MiB 1 @profile\n", + " 7 def my_function():\n", + " 8 # Include each line of the script which needs to be profiled\n", + " 9 # under this function\n", + " 10 \n", + " 11 43.6 MiB 0.0 MiB 1 return 0\n", + "\n", + "\n", + "Filename: /projects/maap-documentation/docs/source/technical_tutorials/user_data/demo_memory_profiling.py\n", + "\n", + "Line # Mem usage Increment Occurrences Line Contents\n", + "=============================================================\n", + " 13 43.6 MiB 43.6 MiB 1 @profile\n", + " 14 def my_other_function():\n", + " 15 # Include each line of the script which needs to be profiled\n", + " 16 # under this function\n", + " 17 \n", + " 18 43.6 MiB 0.0 MiB 1 return 0\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# With @profile decorator in the script\n", + "\n", + "!python demo_memory_profiling.py" + ] + }, + { + "cell_type": "markdown", + "id": "8122d39c-d7d8-4db4-9b08-b89280ee24ce", + "metadata": {}, + "source": [ + "### Logging the Output\n", + "\n", + "By default, the output can be seen in the cell output or on the command line as standard output. This can be changed to store the output in a log file. For more details, it is recommended to follow the [documentation](https://github.com/pythonprofilers/memory_profiler?tab=readme-ov-file#reporting)." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "24518fe3-973e-4c23-ba46-afb04da2815e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ERROR: Could not find file /tmp/ipykernel_314/1328302985.py\n", + "ERROR: Could not find file /tmp/ipykernel_314/1328302985.py\n" + ] + } + ], + "source": [ + "fp=open('memory_profiler.log','w+')\n", + "@profile(stream=fp)\n", + "def my_function():\n", + " # Perform some potentially memory-intensive computation\n", + " \n", + " return 0\n", + "\n", + "@profile(stream=fp)\n", + "def my_other_function():\n", + " # Perform some potentially memory-intensive computation\n", + " \n", + " return 0\n", + "\n", + "def main():\n", + " my_function()\n", + " my_other_function()\n", + " \n", + " #...\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()" + ] + }, + { + "cell_type": "markdown", + "id": "56291280-e0ad-409b-bce2-0c96c07664e7", + "metadata": {}, + "source": [ + "To test the logging, we will run memory profiling on the `demo_memory_profiling_logging.py` script saved in the working directory." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "98bbc844-b02a-4269-ad13-f8361157be52", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!python demo_memory_profiling_logging.py" + ] + }, + { + "cell_type": "markdown", + "id": "c8a2b85d-9da8-4246-927b-00cf4e20f296", + "metadata": {}, + "source": [ + "After executing the above script, we can see that the memory profiling output is saved in the `memory_profiler.log` file. You can also log profiling output to different log files for different functions by defining a separate logging file in the argument `fp`. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "vanilla", + "language": "python", + "name": "vanilla" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/technical_tutorials/visualization/interval_color_mapping.ipynb b/docs/source/technical_tutorials/visualization/interval_color_mapping.ipynb index dc7ace14..907a8c0b 100644 --- a/docs/source/technical_tutorials/visualization/interval_color_mapping.ipynb +++ b/docs/source/technical_tutorials/visualization/interval_color_mapping.ipynb @@ -37,6 +37,8 @@ "metadata": {}, "source": [ "## Additional Resources \n", + "- [Cloud Native Geoguide](https://guide.cloudnativegeo.org/)\n", + "- [Examples of Working with COGs](https://guide.cloudnativegeo.org/cloud-optimized-geotiffs/cogs-examples.html)\n", "- [Predefined Color Maps](https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html)\n", "- [CSS RGBA Colors](https://www.w3schools.com/css/css3_colors.asp)\n", "- [Using Python Zip Function](https://www.w3schools.com/python/ref_func_zip.asp)\n" @@ -465,7 +467,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.11.2 64-bit", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -479,7 +481,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.10.13" }, "vscode": { "interpreter": {